0

早上好。我是新来的。在发布之前,我搜索了类似的问题,但我发现仅使用不同的编程语言类似的问题,但是发现的问题不完整。

好的,我的问题是找到一个 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 步。

因此,所有步骤都存储在内存中,这很好。

我的问题是:我如何创建 GBM 的 m 个不同实现(即重复我之前的步骤 m 次,将 m 作为输入给出)并为它们中的每一个自动创建一个图?

我认为应该考虑一些循环,但我是初学者,我不知道如何做到这一点。

我想我可以创建一个 n 维数组,在其中存储 GBM 步骤,绘制它们,然后重复 m 次;问题是我想念这门语言,我正在学习它,但这需要时间,一些帮助可能会有用。

仅从图形的角度来看,最终结果应该是这样的(我指定了图形 pov,因为在链接中有数字,所有的工作都是逐个单元格完成的,正如我之前所说,我需要避免这种情况)。

非常感谢。


更新:感谢 Tehscript,我的问题得到了部分解决。他/她好心提供的代码允许将 m 个 GBM 中的每一个的 n 步存储在一个数组数组中。因此仍然是解决我的问题的最后一步:如何绘制这些数据?

4

1 回答 1

2

最后在函数内部,将函数定义为数组

GBMSimulation = SimVar()

然后使用以下代码并让您的函数创建另一个数组。

编辑:您可以从单元格 A1、B1、C1、.. 中输入变量,如果您在下面取消注释,您将在您的 excel 中获得这些结果,就像您的 excel 一样。您也可以制作图表。此外,如果您想以 0.01 (总共 100(101?)次)循环 0 到 1,您可以使用step 0.01例如:(for i = 0 To 1 step 0.01我应该是双倍的 - ps:尝试将其声明为 long,看看会发生什么:)

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
于 2017-05-03T16:00:28.817 回答