我正在VBA中编写MonteCarlo模拟。这是代码:
Sub Simular()
Dim i As Integer
Dim j As Integer
Dim simulacion As Integer
Dim iterar As Single
Dim mu As Double
Dim varianza As Double
Dim aleat As Double
Dim cantidad As Double
Dim fecha As Date
simulacion = Sheet8.Cells(2, 3)
mu = Sheet8.Cells(7, 3)
varianza = Sheet8.Cells(8, 3)
cantidad = Sheet8.Cells(10, 3)
fecha = WorksheetFunction.WorkDay(Sheet8.Cells(4, 2), cantidad)
Sheet8.Cells(15, 4) = fecha
Sheet8.Cells(1, 2) = cantidad
Sheet8.Cells(3, 3) = Sheet8.Cells(1, 3)
For j = 1 To 10000 'number of simulation
iterar = Sheet8.Cells(15, 3)
For i = 1 To 231 'workdays
aleat = Rnd()
iterar = iterar * Exp((mu - 1 / 2 * varianza) + WorksheetFunction.Power(varianza, 0.5) * WorksheetFunction.Power(1, 0.5) * WorksheetFunction.Norm_Inv(aleat, 0, 1))
'Sheet8.Cells(10030 + j, 12 + i) = aleat
'Sheet8.Cells(17 + j, 12 + i) = iterar
Next i
Sheet8.Cells(17 + j, 4) = iterar
Next j
End Sub
问题在于总是重复3种不同的模拟。例如,当我输入mu = 1/252(利率)时,第一次模拟的第一个数字是5,570,当我再次运行模拟时,那些模拟的第一个数字是9,610,第三个数字是72,23。第四次是5,570,所以它重复。我不知道为什么,因为rnd()
数字,所有都必须不同。
此外,在第三个模拟中,出现一条消息,指出无法获得工作表类的“normsinv属性”
我尝试了很多东西,但我没有发现错误!
感谢您的帮助! :)
答案 0 :(得分:0)
你试过了吗?
Application.Worksheetfunction.NormInv(aleat,0,1)
或者,如果您一直在寻找平均值为0且std dev为1的逆正态分布,您可以使用:
Application.Worksheetfunction.NormsInv(aleat)
至于你的rnd()问题,你是否尝试过直接在你的normsinv函数中使用rnd()?或者,在设置aleat = rnd()之前的行中,尝试:
Randomize
这将重置函数rnd()的种子数。