我有以下用于使用随机过程模拟股票价格的代码
C:/Users/Ghenja/AppData/Local/opencv/build/OpenCVConfig.cmake
在这段代码中,我通过在Next处放置一个断点来运行调试,整个For循环工作正常。问题是在完成循环后函数退出并且单元格中显示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
错误。
我无法弄清楚这段代码有什么问题。 如果有人能帮助我,我将感激不尽。
答案 0 :(得分: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
我看到了两个问题和一个建议。
其中一个数组stock
来自0..252
,但您将值分配给1..253
,以便崩溃。
还有一个可能的整数除法导致dt=0.0
。我更新了定义,使意图明确表示在从整数转换为double之后进行除法。最后,我将幻数252移动到常数。