我正在寻找完全矢量化我所拥有的模型,用于平均还原波动率过程 - 也就是Ornstein-Uhlenbeck过程。
我跟着这里的代码:http://nakamuraseminars.org/nsblog/2014/06/21/monte-carlo-in-python-an-example/,它有一个相似但不同的等式。
import pandas as pd
import numpy as np
def OU_estimation(M=100000, N=25, T=25, sigma=.1, mu=1, lambda_est=1, S0=1):
dt = T/N # simulation time step
S = np.zeros((M,N+1))
S[:,0] = S0
for n in range(N):
#Partially vectorized
eps = np.random.normal(0, 1, (M))
S[:,n+1] = S[:,n] + lambda_est*(mu - S[:,n])*dt + sigma*eps
df = pd.DataFrame(S)
return df
由于代码当前是部分矢量化的,它会迭代所采取的步骤数,它已经很快了。我希望看看它是否可以作为更多的学习经验完全矢量化
答案 0 :(得分:2)
如果您只计算最后一列,则可以以矢量化方式进行:
def OU_lastcol(M=100000, N=25, T=25, sigma=.1, mu=1, lambda_est=1, S0=1):
dt = T/N
c = (1-lambda_est*dt)
cv = c**np.arange(N)[::-1]
R = np.random.normal(lambda_est*mu*dt, sigma, (M,N))
SN = np.dot(R, cv) + S0*c**N
return SN
这比使用默认参数的循环代码执行速度快得多,所以你可以说在这种情况下使用循环对性能没什么影响。但是对于比N
大得多的M
,循环开销开始显示..