2016-07-25 77 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的起点(可能不同)不再重要,最新结果完全匹配。