使用熊猫和EWMA

时间:2016-07-25 02:07:22

标签: python pandas

我习惯于以following的方式计算指数移动平均线(EMA):

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 个答案:

答案 0 :(得分:1)

我认为你几乎就在那里。

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

将生成您要找的内容。您可能需要使用adjust = True和其他parameters来使其与for循环的结果完全匹配。但如果你比较

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

你会看到ewma的(可能不同的)起点不再重要,最新的结果完全匹配。