Python 技术指标EMA算法
算法由python-技术指标-ema算法改进而来
原算法
def get_EMA(df,a):
for i in range(len(df)):
if i==0:
df.ix[i,'ema']=df.ix[i,'close']
if i>0:
df.ix[i,'ema']=(1-a)*df.ix[i-1,'close']+a*df.ix[i,'close']
return df
由于pandas库更新后,.ix已经不适用了,所以官方提供了更好的写法
df.ix[ I ,’ ema ‘] = df.loc[df.index[ I ] , ’ ema ‘]
所以修改后:
def get_EMA(df,a):
for i in range(len(cps)):
if i == 0:
cps.loc[cps.index[i], 'ema'] = cps.loc[cps.index[i], 'close']
if i > 0:
cps.loc[cps.index[i], 'ema'] = ((days - 1) * cps.loc[cps.index[i] - 1, 'ema'] + 2 * cps.loc[
cps.index[i], 'close']) / (days + 1)
ema = list(cps['ema'])
return ema
用过之后发现pandas库似乎效率太低了,每次运行的时候都会卡1-2秒,不知道是不是我自己电脑的原因,所以我自己改了一下实现,把卡顿问题解决了,更新后代码如下:
# 获取EMA数据 , cps:close_prices 收盘价集合 days:日期 days=5 5日线
def get_EMA(cps, days):
emas = cps.copy() # 创造一个和cps一样大小的集合
for i in range(len(cps)):
if i == 0:
emas[i] = cps[i]
if i > 0:
emas[i] = ((days - 1) * emas[i - 1] + 2 * cps[i]) / (days + 1)
return emas