2016-07-25 74 views
0

我習慣於指數移動平均線(EMA)正在計算following方式:使用熊貓和EWMA

SMA: 10 period sum/10 

Multiplier: (2/(Time periods + 1)) = (2/(10 + 1)) = 0.1818 (18.18%) 

EMA: {Close - EMA(previous day)} x multiplier + EMA(previous day). 

然而,當我運行pd.ewma(df['Close'])我沒有看到這種方法相匹配的輸出。

下面的代碼給了我期待的答案,但需要更長的時間才能運行。

任何人都有什麼指示什麼是正確的方式來利用這個庫給我輸出我期待?

import pandas.io.data as web 

import datetime 
import pandas as pd 
start = datetime.datetime(2010, 1, 1) 

end = datetime.datetime.today() 
f = web.DataReader("SPY", 'yahoo', start, end) 
f['sma']=pd.rolling_mean(f['Adj Close'],10) 
days=10. 
alpha=(2./(days+1.)) 
d={} 

for x in f[(f['sma']>0)].index: 
    if len(d)==0: 
     d[x] = f[(f.index==x)]['sma'].values[0] 
    else: 
     d[x] = (f[(f.index==x)]['Adj Close'].values[0] - d[dt_prior])*alpha + d[dt_prior] 

    dt_prior = x 
pd.Series(d) 
+1

你的代碼似乎是從一個不斷更新的Web服務中讀取數據。你能提供一些最小的,可重複的例子,預期的結果和實際結果? – Mephy

回答

1

我覺得你差不多就靠你自己了。

e = f['Adj Close'].ewm(span=10, min_periods=10) 

將生成您正在查找的內容。您可能需要調整adjust = True和其他parameters以使其與您for循環的結果完全匹配。但是,如果您比較

e.tail(10) 
d.tail(10) 

您會看到ewma的起點(可能不同)不再重要,最新結果完全匹配。