我习惯于以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)
答案 0 :(得分:1)
我认为你几乎就在那里。
e = f['Adj Close'].ewm(span=10, min_periods=10)
将生成您要找的内容。您可能需要使用adjust = True和其他parameters来使其与for循环的结果完全匹配。但如果你比较
e.tail(10)
d.tail(10)
你会看到ewma的(可能不同的)起点不再重要,最新的结果完全匹配。