我写了一些非常简单的代码来模拟股票价格,假设它的日波动在-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)
答案 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()