2014-07-26 85 views
2

我正在尋找完全向量化的模型,我有一個平均回覆波動過程 - 又名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 

由於代碼當前是部分向量化的,因此它會迭代所採取的步驟數,它已經非常快。我期待,看看它是否可以完全矢量更多的學習經驗

+1

BTW(M)== M,構建一個元組,你需要昏迷(M,) –

+0

我不關注。你能更好地解釋你正在指出什麼嗎?你認爲逗號需要放在哪裏? – DataSwede

+0

@RikPoggi是(我認爲)指的是以'eps = ...'開始的行中的'(M)'。函數'.normal'需要一個元組。爲了創建一個長度爲1的元組,你需要輸入一個逗號,如下所示:'(M,)' – Dan

回答

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循環開銷開始顯示..