2016-12-02 4 views
0

を返さずに終了するループのためにI以下のこのコードでは確率過程VBA:値

Function varswap1(s0, r0, sigma0, t) As Double 
    Rnd (-10) 
    Randomize (999) 

Dim i As Integer, j As Integer, r As Double 
Dim stock() As Double, dt As Double 
Dim per As Integer 
    per = WorksheetFunction.Round(t * 252, 0) 

    ReDim stock(per) 
    stock(1) = s0 
    dt = 1/252 

    For i = 1 To per 
    stock(i + 1) = stock(i) * Exp((r0 - 0.5 * sigma0^2) * dt + sigma0 * Sqr(dt) * WorksheetFunction.NormSInv(Rnd())) 
    Next 

    varswap1 = WorksheetFunction.Average(stock) 
End Function 

を使用して株価をシミュレートするためのコードのための作品、私は次のと全体にブレークポイントを配置することにより、デバッグを実行していForループは絶対にうまく動作しています。問題は、関数が終了し、#VALUE!エラーがセルに表示されるループを完了した後です。

このコードで何が問題なのかわかりません。 誰かが私を助けてくれれば感謝します。

+3

'stock'は' per'要素しか持たない(そしてゼロに基づいている)ため、2番目から最後までのループの反復では、 'stock(i + 1)'を評価しようとするときに添字エラーを与える必要があります。 – Comintern

+0

@Cominternはそれを釘付けにしました - また 'Average()'は計算するために最大255の値しか受け付けません。 –

+0

はい。どうもありがとうございます。 – Chinmay

答えて

0

はこれを試してみてください:

Const n As Integer = 252 

Function varswap1(s0, r0, sigma0, t) As Double 
    Rnd (-10) 
    Randomize (999) 

Dim i As Integer, j As Integer, r As Double 
Dim stock() As Double, dt As Double 
Dim per As Integer 
    per = WorksheetFunction.Round(t * n, 0) 

    ReDim stock(per) 
    stock(0) = s0 ' First item in the array has index 0 
    dt = 1#/n ' Avoid integer division, 1/252 = 0 

    For i = 1 To per 
    'Each stock depends on the previous stock value: 
    stock(i) = stock(i - 1) * Exp((r0 - 0.5 * sigma0^2) * dt + sigma0 * Sqr(dt) * WorksheetFunction.NormSInv(Rnd())) 
    Next 

    varswap1 = WorksheetFunction.Average(stock) 
End Function 

私は2つの問題点と一つの提案を見ました。

1つは配列stockから0..252になりますが、値を1..253に割り当ててクラッシュします。

dt=0.0という結果の整数除算もあります。私は、整数から倍精度への変換の後に除算が行われることを明確にするために、定義を更新しました。最後に、マジックナンバー252を定数に移動しました。