用VBA绘制GBM的轨迹

时间:2017-05-03 15:30:42

标签: vba excel-vba stochastic-process excel

早安。我是新来的。在发布之前,我已经搜索过类似的问题,但我发现只有不同的编程语言类似,但是发现的问题不完整。

好吧,我的问题是找到一个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个步骤存储在数组阵列中。因此,为了解决我的问题仍然是最后一步:我如何绘制这些数据?

1 个答案:

答案 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