我正在尝试一个相当简单的函数来计算Excel VBA中的指数加权移动平均波动率following。不过,我认为我的功能有些错误,我无法查明,因为我没有得到正确的解决方案。计算指数加权移动平均数
Function EWMA(numbers As Range, Lambda As Single) As Double
Dim mean As Double
Dim x As Double
Dim c As Range
Dim n As Integer
mean = WorksheetFunction.Average(numbers)
n = WorksheetFunction.Count(numbers)
For Each c In numbers
x = x + (Lambda^(n - c.Count)) * ((c.Value - mean)^2)
Next c
EWMA = (1 - Lambda) * x
End Function
我使用的值与目标挥发度(使用电子表格EWMA计算)是here。
我在做什么错?
更新:用罗恩·罗森菲尔德的解决方案:
Option Explicit
Function EWMA(Zero As Range, Lambda As Double) As Double
Dim vZero As Variant
Dim SumWtdRtn As Double
Dim I As Long
Dim vPrices As Variant
Dim LogRtn As Double, RtnSQ As Double, WT As Double, WtdRtn As Double
vZero = Zero
For I = 2 To UBound(vZero, 1)
vPrices = 1/((1 + vZero(I, 1))^(3/12))
LogRtn = Log(vPrices(I - 1, 1)/vPrices(I, 1))
RtnSQ = LogRtn^2
WT = (1 - Lambda) * Lambda^(I - 2)
WtdRtn = WT * RtnSQ
SumWtdRtn = SumWtdRtn + WtdRtn
Next I
EWMA = SumWtdRtn^(1/2)
End Function
我的猜测是你的一个变量不是它应该是的。添加一个断点并比较每个变量与它应该是什么。 –
这实际上是一个比Excel问题更重要的数学问题。您需要向我们展示您期望的值与您获得的价值,否则您需要等待某人加入数学和Excel解决方案。 –
C.Count将始终为1.我假设你希望它每次代码循环时增加1。你需要在循环中添加一个计数器来适应。 –