我试图填充,然后基于一个相当大的数组执行计算。这是为了填充二叉树来计算期权价格,所以在填充数组后我需要执行重复计算,所以我更喜欢在我的数组中有3个维度,以便在代码中进一步简化参考。第一个维度是已经过的期数,第二个维度是价格上涨的数量,第三个维度是价格下降的数量。
Dim arr() As Double
Dim periods As Integer
Dim p As Long, i As Long
Dim u As Double, d As Double
Dim iniprice As Double
Let periods = 400
Let iniprice = 100
Let u = 1.1
Let d = 0.9
ReDim arr(0 To periods, 0 To periods, 0 To periods)
Let arr(0, 0, 0) = iniprice
For p = 1 To UBound(arr, 1)
For i = 0 To p
arr(p, i, p - i) = WorksheetFunction.RoundDown(arr(0, 0, 0) * u ^ i * d ^ (p - i), 2)
Next i
Next p
这是一个限制源于我的PC上可用的RAM量(目前有8Gb),还是VBA本身的限制?由于一个期间通常是一天,因此期间值1000是正常的(252天= 1个交易年)。
我还注意到我有很多未使用的值,因为我只想填充具有此格式arr(p,i,pi)的值,诸如arr(10,10,10)之类的值将为0.我想非常感谢对此的解决方法。
您可以尝试使用单个查找列来表示3D阵列(不是最好的方法,但有助于解决内存错误):
Dim periods As Integer
Dim p As Long, i As Long
Dim u As Double, d As Double
Dim iniprice As Double
Dim d1 As Long, d2 As Long, d3 As Long, someRow As Long
Dim fndRange As Range
Let periods = 400
Let iniprice = 100
Let u = 1.1
Let d = 0.9
' Col A will be your lookup in format "X-X-X", Col B will hold values
With Sheets("some sheet")
.Range("B1") = iniprice
For d1 = 0 To periods
For d2 = 0 To periods
For d3 = 0 To periods
.Range("A" & someRow).Value = d1 & "-" & d2 & "-" & d3
someRow = someRow + 1
Next
Next
Next
End With
For p = 1 To periods
For i = 0 To p
Set fndRange = Sheets("some sheet").Columns(1).Find(p & "-" & i & "-" & (p-1))
fndRange.Offset(0,1).Value = WorksheetFunction.RoundDown(iniprice * u ^ i * d ^ (p - i), 2)
Next i
Next p