早安。我是新来的。在发布之前,我已经搜索过类似的问题,但我发现只有不同的编程语言类似,但是发现的问题不完整。
好吧,我的问题是找到一个VBA代码,一旦在Excel中召回,它只需要几何布朗运动(GBM)参数(初始股票价值s,期限t,波动率z,无风险利率r) ,分红q,步数n),我需要重现的轨迹数m。 作为输出,我不想看到没有数字,只有一个叠加的m轨迹图。
问题在于,我无法逐个单元地(然后携带)直接写入它,因为从计算能力的角度来看,它太复杂了;它可以让你做出15个轨迹,而不是更多。 因此,解决方案是在VBA中工作。
我的第一步是
Function GBMSimulation(s As Double, t As Double, z As Double, r As Double, q As Double, n As Double) As Variant
Dim dt, e, dlns, SimVar() As Double
ReDim SimVar(n + 1)
dt = t / n
SimVar(0) = s
For i = 1 To n
Randomize
e = WorksheetFunction.NormSInv(Rnd())
dlns = (r - q - z ^ 2 / 2) * dt + z * e * dt ^ 0.5
SimVar(i) = SimVar(i - 1) * Exp(dlns)
Next i
GBMSimulation = SimVar(n)
End Function
此代码有效;我的意思是,它给出了一个数字,这是ONE gbm的第n步。
更改
GBMSimulation = SimVar(n)
与
GBMSimulation = SimVar(i)
我会获得特定 gbm。
的第i步因此,所有步骤都存储在内存中,这很好。
我的问题是:我如何创建m个不同的GBM实现(即重复我之前的步骤m次,m作为输入)并且每个实现自动创建一个情节?
我认为应该考虑一些循环,但我是初学者而且我不知道如何做到这一点。
我以为我可以创建一个n维数组,其中存储GBM步骤,绘制它们,然后重复m次;问题是我错过了语言,我学习它,但它需要时间,一些帮助可能有用。
仅从图形视点开始,最终结果应为like this(我指定了图形pov,因为在链接中有数字,所有工作都是逐个单元格完成的,正如我之前所说的那样需要避免这种情况。)
非常感谢。
更新:感谢Tehscript解决了我的问题。 他/她友好提供的代码允许将每个m GBM的n个步骤存储在数组阵列中。因此,为了解决我的问题仍然是最后一步:我如何绘制这些数据?
答案 0 :(得分:1)
最后在函数内部,将函数定义为数组
GBMSimulation = SimVar()
然后使用以下代码并使用您的函数创建另一个数组。
编辑:您可以从单元格A1,B1,C1,...输入变量。如果您在下面取消注释,您将在Excel中获得这些结果,就像您的Excel一样。你也可以制作一张图表。此外,如果你想将0到1循环0.01(总共100(101?)次),你可以使用step 0.01
例如:for i = 0 To 1 step 0.01
(我应该是双倍的ps:尝试声明它的长度和看看会发生什么:)
Sub ArrayofArrays()
Dim i As Long, j As Long, m As Long, n As Double, s As Double, t As Double, z As Double, r As Double, q As Double
With Sheets("Sheet1")
m = .Range("A1").Value
n = .Range("B1").Value
s = .Range("C1").Value
t = .Range("D1").Value
z = .Range("E1").Value
r = .Range("F1").Value
q = .Range("G1").Value
End With
ReDim Arr(m)
For i = 0 To m
Arr(i) = GBMSimulation(s, t, z, r, q, n)
Next i
For i = 0 To m
For j = 0 To n
Debug.Print Arr(i)(j)
'Cells(i + 2, j + 1) = Arr(i)(j)
Next j
Next i
End Sub