Python计算MACD的误区

Python计算MACD的误区

指数函数是重要的基本初等函数之一。一般地,y=a^x函数(a为常数且以a>0,a≠1)叫做指数函数,函数的定义域是 R 。

df['EMA_short'] = df['收盘价_复权'].ewm(span=12, adjust=False).mean()
df['EMA_long'] = df['收盘价_复权'].ewm(span=26, adjust=False).mean()

span=12不能实现取出过去12天的数据。
alpha=2/(1+span),span=12意味着df[‘EMA_short’]中每个数都由上一个df[‘EMA_short’]和df[‘收盘价_复权’]生成,上一个df[‘EMA_short’]的权重为11/13,df[‘收盘价_复权’]的权重为2/13
Python计算MACD的误区_第1张图片
同样的数据,上图为上面方法计算的MACD,下图为下面方法计算出的MACD,结果并不相同。
Python计算MACD的误区_第2张图片
Python计算MACD的误区_第3张图片
同样,上下图是两种不同方法的ema,12日线和36日线。
Python计算MACD的误区_第4张图片

正确的代码应该如下:

# 计算MACD
df['EMA_short'] = df['收盘价_复权'].ewm(com=1, adjust=False).mean()
df['EMA_long'] = df['收盘价_复权'].ewm(com=1, adjust=False).mean()
#com等于1相当于权重为1/2,权重为1/(com+1)
#df['EMA_short']中每个数都由上一个df['EMA_short']和df['收盘价_复权']生成,权重各为1/2

df['EMA_short'] = df['EMA_short'].rolling(12).mean()
df['EMA_long'] = df['EMA_long'].rolling(36).mean()
#rolling可以通过滚动,拿出近12日的值,再做平均值,即得到ema
#ewm函数得到的是加权后的值,通过rolling.mean才是ema(指数加权移动平均)

com等于1相当于权重为1/2,权重为1/(com+1)
df[‘EMA_short’]中每个数都由上一个df[‘EMA_short’]和df[‘收盘价_复权’]生成,权重各为1/2
rolling可以通过滚动,拿出近12日的值,再做平均值,即得到ema
ewm函数得到的是加权后的值,通过rolling.mean才是ema(指数加权移动平均)

完整代码:

import pandas as pd
import matplotlib.pyplot as plt


# 读入股票数据
df = pd.read_csv('sh600000.csv', encoding='gbk', parse_dates=['交易日期']).iloc[4000:]

# 计算复权因子
df['复权因子'] = (df['收盘价'] / df['前收盘价']).cumprod()
df['收盘价_复权'] = df['复权因子'] * (df.iloc[-1]['收盘价'] / df.iloc[-1]['复权因子'])

# 计算MACD
df['EMA_short'] = df['收盘价_复权'].ewm(com=1, adjust=False).mean()
df['EMA_long'] = df['收盘价_复权'].ewm(com=1, adjust=False).mean()
#com等于1相当于权重为1/2,权重为1/(com+1)
#df['EMA_short']中每个数都由上一个df['EMA_short']和df['收盘价_复权']生成,权重各为1/2

df['EMA_short'] = df['EMA_short'].rolling(12).mean()
df['EMA_long'] = df['EMA_long'].rolling(36).mean()
#rolling可以通过滚动,拿出近12日的值,再做平均值,即得到ema
#ewm函数得到的是加权后的值,通过rolling.mean才是ema(指数加权移动平均)

plt.figure()
plt.plot(df['EMA_short'],'b')
plt.plot(df['EMA_long'],'k')

df['DIF'] = df['EMA_short'] - df['EMA_long']
df['DEA'] = df['DIF'].ewm(span=9, adjust=False).mean()
df['MACD'] = (df['DIF'] - df['DEA']) * 2
plt.figure()
plt.bar(df['MACD'].index,df['MACD'].values)
print(df.head())

你可能感兴趣的:(python,量化学习,python,算法)