3

R コードを使用して株価シミュレーションを実行する必要があります。問題は、コードが少し遅いことです。基本的に、各時間ステップ (毎日) の株価をシミュレートし、それを行列に保存する必要があります。

ストック過程が幾何ブラウン運動であると仮定した例

for(j in 1:100000){
    for(i in 1:252){
        S[i] <- S[i-1]*exp((r-v^2/2)*dt+v*sqrt(dt)*rnorm(1))
    }
    U[j,] <- S
}

コードを改善して高速化するための提案はありますか?

4

1 に答える 1

2

を仮定するとS[0] = 1、次のように U を構築できます。

Ncols <- 252

Nrows <- 100000

U <- matrix(exp((r-v^2/2)*dt+v*sqrt(dt)*rnorm(Ncols*Nrows)), ncol=Ncols, nrow=Nrows)

U <- do.call(rbind, lapply(1:Nrows, function(j)cumprod(U[j,])))

編集:ジョシュアとベンの提案を使用:

製品バージョン:

U <- matrix(exp((r-v^2/2)*dt+v*sqrt(dt)*rnorm(Ncols*Nrows)), ncol=Ncols, nrow=Nrows)

U <- t(apply(U, 1, cumprod))

合計バージョン:

V <- matrix((r-v^2/2)*dt+v*sqrt(dt)*rnorm(Ncols*Nrows), ncol=Ncols, nrow=Nrows)

V <- exp( t(apply(V, 1, cumsum)) )

編集:@Paulの提案による:

各提案の実行時間 (10^5 ではなく 10000 行を使用):

使用するapply + cumprod

 user  system elapsed 
0.61    0.01    0.62 

使用するapply + cumsum

 user  system elapsed 
0.61    0.02    0.63 

OPのオリジナルコードを使う

 user  system elapsed 
67.38    0.00   67.52 

注: 上記の時間は の 3 番目の小節ですsystem.time。各コードの最初の 2 つの測定値は破棄されました。r <- sqrt(2)v <- sqrt(3)およびを使用しましdt <- piた。彼の元のコードでは、S[i-1]forifelse(i==1,1,S[i-1])と preallocatedも置き換えましたU

于 2013-03-20T21:43:18.703 に答える