如何在Python中简化简单的股价模拟过程?

时间:2019-07-10 19:22:53

标签: python python-3.x vectorization

我写了一些非常简单的代码来模拟股票价格,假设它的日波动在-2%和+ 2%之间(这过于简单,但出于演示目的,我认为这比使用GMB公式更容易)。

我的问题是运行速度很慢,我了解这是因为我正在使用双循环。据我了解,我也许可以使用矢量化,但我不知道如何使用。

基本上,我做的是假设一年中有256个交易日创建100个模拟,每天将以前的股价乘以0.98至1.02之间的一个随机数。

我目前使用嵌套的for循环进行此操作。当我收集到这不好时,但是作为一个新手,我很难进行矢量化处理。我已经在线阅读了有关它的内容,并且从基本的理解上,而不是使用循环,您将尝试将它们都转换为矩阵并使用矩阵乘法,但是我不确定如何在此处应用它。谁能指出我正确的方向?

from numpy import exp, sqrt, log, linspace
from random import gauss
from random import uniform
import pandas as pd


nsims = 100
stpx = 100
days = 256
mainframe = pd.DataFrame(0, index = list(range(1,days)), columns = list(range(1,nsims)))
mainframe.iloc[0] = stpx
for i in range(0, nsims-1):
    for x in range(1, days-1):
        mainframe.iloc[x, i] = mainframe.iloc[x-1, i]* uniform(.98, 1.02)

2 个答案:

答案 0 :(得分:0)

当一个计算依赖于先前计算的结果时,矢量化可能很棘手,例如在这种情况下,第x天需要知道第x-1天的结果。我不会说这不可能完成,因为很可能有人可以找到一种方法,但是这是我的解决方案,至少摆脱了一个循环。我们仍然循环运行几天,但是我们通过生成一个随机数数组并利用numpy的逐元素乘法(比使用循环快得多)来一次完成所有100个仿真:

您将需要添加以下导入:

import numpy as np

然后用这个单循环替换嵌套循环:

for x in range(1, days-1):
    mainframe.iloc[x] = mainframe.iloc[x-1] * np.random.uniform(0.98, 1.02, nsims-1)

编辑以添加:因为您使用的是一个非常简单的公式,仅涉及基本乘法,所以实际上您可以通过生成随机数字矩阵,使用numpy的累加乘积函数逐列并将其乘以来摆脱两个循环。一个DataFrame,其中每个值均始于100。但是,如果您开始使用更复杂的公式,则我不确定这种方法是否可行。无论如何,这里是

import pandas as pd
import numpy as np

nsims = 100
stpx = 100
days = 256

mainframe = pd.DataFrame(stpx, index=list(range(1, days)), columns=list(range(1, nsims)))
rand_matrix = np.random.uniform(0.98, 1.02, (days-2, nsims-1)).cumprod(axis=0)
mainframe.iloc[1:] *= rand_matrix

答案 1 :(得分:0)

我找到了一个非常好的解决方案,基于 haar 小波!

这个想法是从一些从某个点开始的线性数据开始:

u = np.linspace(-1.0, 1.0, n)

并在此之上添加 haar 小波,为了确保第一个和最后一个点是固定的,haar 小波必须包含在窗口中(此处为 [1:1023] 初始样本为 1024 )

#!/usr/bin/env python3

import random

import numpy as np
import matplotlib.pyplot as plt

n = 1024
k = 0.1

i = list(range(1, n-1))
u = np.linspace(-1.0, 1.0, n)
plt.figure()
plt.plot(u)

for m in range(1000) :
    random.shuffle(i)
    a, b, c, d = i[:4]
    e = 1 if d % 2 == 0 else -1
    v = np.zeros((n,))
    v[a:b] = k * e
    v[b:c] = -k * e
    u = u + v

plt.plot(u)
plt.savefig("haar_stock.png")
plt.show()

example of haar based stock simulation