2016-12-02 1 views
0

을 반환하지 않고 종료 루프를 들어 나는 다음이 코드에서 확률 과정 ​​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' 요소 만 가지고 있고 (0을 기반으로하기 때문에) 두 번째에서 마지막 루프 반복은'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 

나는 두 가지 문제와 하나 개의 제안을 보았다.

하나는 배열 stock0..252에서 나오지만 값은 1..253으로 지정되어 충돌합니다.

dt=0.0의 결과로 가능한 정수 나누기도 있습니다. 나눗셈이 정수에서 두배로 변환 된 후에 이루어질 것이라는 의도를 명확히하기 위해 정의를 업데이트했습니다. 마지막으로, 매직 넘버 252를 상수로 옮겼습니다.