我正在嘗試一個相當簡單的函數來計算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。你需要在循環中添加一個計數器來適應。 –