2014-07-26 5 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

튜플을 생성하려면 튜플을 빌드하는 데 코마 (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 일 경우 루프 오버 헤드가 표시되기 시작합니다.