2017-05-03 107 views
0

早安。我是新来的。在发布之前,我已经搜索了类似的问题,但是我发现只有使用不同的编程语言才能发现类似的问题,但是发现的问题并不完整绘图轨迹与VBA

好吧,我的问题是要找到它,在Excel中一次回忆起VBA代码,它离我只有几何布朗运动(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 

此代码的工作;我的意思是,它给出了一个数字,这是1Gbm的第n个步骤。

更改

GBMSimulation = SimVar(n) 

GBMSimulation = SimVar(i) 

我想获得的该特定 GBM的第i个步骤。

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

我的问题是:如何创建一个GBM的m个不同的实现(即重复我以前的步骤m次,m作为输入),并为他们每个人自动创建一个情节?

我认为应该考虑一些周期,但我是一个初学者,我不知道该怎么做。

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

只有从图形的角度来看,最终的结果应该是like this(我指定图形pov,因为在链接中有数字,所有的工作是逐个单元格制作的,正如我之前所说的,我需要避免这个)。

非常感谢。


UPDATE:问题已经部分解决了感谢信给Tehscript。 他/她友情提供的代码,允许存储在数组的数组每个米GBM中的n步骤。因此,为了解决我的问题仍然是最后一步:我如何绘制这些数据?

+0

您可以让该函数返回一个数组并使用此函数来获得数组数组。 – Tehscript

+0

@Tehscript:谢谢你的提示;然而,我真的是一个初学者,我可以请你轻轻地告诉我一点点吗? 谢谢 – Joe

+0

我真的不知道要使用什么数字,所以我用了所有的数字 – Tehscript

回答

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 
+0

好的,首先非常感谢。 – Joe

+0

好的,我做到了。 正如我告诉过你的,我是初学者,所以我请你温柔地耐心等待。 看来,这段代码的最终结果是存储(通过Debug.Print命令)每个轨迹的所有GBM步骤。 从这里,我看到我可以通过使用立即窗口恢复这些数据,但打开它,什么也没有出现。所以在这一点上,我怎样才能使用我的数据来获得情节? – Joe

+0

Debug.print是显示输出的命令。最终结果存储在Arr()2维数组中。像这样:Arr((a1,a2,a3 ....),(b1,b2,b3 ....)等等...)。如果你想显示a1,它是Arr(0)(0)。我想要显示b3,它是Arr(1)(2)。请注意,计数从0开始,而不是从1开始。使用2个嵌套for循环,您可以通过Arr(i)(j)显示所有输出。通过使用此输出,您可以将它们显示在单元格中,将它们绘制在图表中,无论您想要什么。 – Tehscript