2016-11-23 164 views
4

我想驗證熊貓的ewm.std計算,以便我可以實現我的代碼的一步更新。以下是代碼問題的完整描述。熊貓ewm.std計算

mrt = pd.Series(np.random.randn(1000)) 
N = 100 
a = 2/(1+N) 
bias = (2-a)/2/(1-a) 
x = mrt.iloc[-2] 
ma = mrt.ewm(span=N).mean().iloc[-3] 
var = mrt.ewm(span=N).var().iloc[-3] 
ans = mrt.ewm(span=N).std().iloc[-2] 
print(np.sqrt(bias*(1-a) * (var + a * (x- ma)**2)), ans) 

(1.1352524643949702,1.1436193844674576)

我已經使用標準制劑。有人能告訴我爲什麼這兩個值不應該是一樣的嗎?即大熊貓如何計算指數加權標準?

編輯:Julien的答案後 - 讓我再舉一個用例。我正在繪製由熊貓計算的var的比率,並使用從熊貓ewm協方差的Cython代碼推斷出的公式I.這個比例應該是1.(我猜我的公式有問題,如果有人可以指出)。

mrt = pd.Series(np.random.randn(1000)) 

N = 100 
a = 2./(1+N) 
bias = (2-a)/2./(1-a) 
mewma = mrt.ewm(span=N).mean() 

var_pandas = mrt.ewm(span=N).var() 
var_calculated = bias * (1-a) * (var_pandas.shift(1) + a * (mrt-mewma.shift(1))**2) 

(var_calculated/var_pandas).plot() 

該圖顯示問題清楚。

plot of the ratio after the initial values are removed

編輯2:通過試驗和錯誤,我想通了正確的公式:

var_calculated = (1-a) * (var_pandas.shift(1) + bias * a * (mrt-mewma.shift(1))**2) 

但我不認爲它應該是正確的!有人可以說明這一點嗎?

+1

潛在重複[此questi上](http://stackoverflow.com/questions/37924377/does-pandas-calculate-ewm-wrong)? –

+0

@JulienMarrec No.我可以確切地驗證ewma。我在ewmstd獲得冠軍。 –

+0

ewm在此定義:[window.py#L1387](https://github.com/pandas-dev/pandas/blob/master/pandas/core/window.py#L1387)。 ewm.std調用是[here](https://github.com/pandas-dev/pandas/blob/master/pandas/core/window.py#L1555).-然後去_zqrst [here]( https://github.com/pandas-dev/pandas/blob/master/pandas/core/window.py#L1761) –

回答

3

你的問題其實實際上減少了大熊貓如何計算ewm.var()

In [1]: 
(np.sqrt(mrt.ewm(span=span).var()) == mrt.ewm(span=span).std())[1:].value_counts() 

Out[1]: 
True 999 
dtype: int64 

所以在你上面的例子:ans == np.sqrt(mrt.ewm(span=N).var().iloc[-2])

爲了研究它是如何計算ewmvar(),它是通過調用emcovinput_x=input_y=mrt


如果我們檢查的第一要素:

mrt.ewm(span=span).var()[:2].values 
> array([nan, 0.00555309]) 

現在,使用emcov程序,並將其應用於我們的特定情況:

x0 = mrt.iloc[0] 
x1 = mrt.iloc[1] 
x2 = mrt.iloc[2] 

# mean_x and mean_y are both the same, here we call it y 
# This is the same as mrt.ewm(span=span).mean(), I verified that too 
y0 = x0 
# y1 = mrt.ewm(span=span).mean().iloc[1] 
y1 = ((1-alpha)*y0 + x1)/(1+(1-alpha)) 
#y2 = (((1-alpha)**2+(1-alpha))*y1 + x2)/(1 + (1-alpha) + (1-alpha)**2) 

cov0 = 0 

cov1 = (((1-alpha) * (cov0 + ((y0 - y1)**2))) + 
       (1 * ((x1 - y1)**2)))/(1 + (1-alpha)) 

# new_wt = 1, sum_wt0 = (1-alpha), sum_wt2 = (1-alpha)**2 
sum_wt = 1+(1-alpha) 
sum_wt2 =1+(1-alpha)**2 


numerator = sum_wt * sum_wt # (1+(1-alpha))^2 = 1 + 2(1-alpha) + (1-alpha)^2 
denominator = numerator - sum_wt2 # # 2*(1-alpha) 


print(np.nan,cov1*(numerator/denominator)) 

>(nan, 0.0055530905712123432) 
+0

謝謝Julien。我認爲你做的很好。你能確認你是否在最後一步得到相同的平等嗎?請參閱上面的問題編輯。 –

+0

是的,確認。 –

+0

謝謝!所以我的配方有一些麻煩。通過試驗和錯誤,我發現正確的公式應該是var_calculated =(1-a)*(var_pandas.shift(1)+ bias * a *(mrt-mewma.shift(1))** 2)。這給了完全匹配!但我不知道爲什麼:)感謝所有的麻煩@Julien –