19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。
接下来继续说说A股平滑异同移动平均线(MACD)实现。
在 A 股市场中,平滑异同移动平均线(MACD)是一种常用的技术指标,用于衡量股票的价格趋势和动量。MACD 结合了移动平均线的趋势跟踪特性和动量变化,通过快线、慢线、以及柱状图的相互关系,帮助交易者判断买卖信号。以下是针对 A 股的平滑异同移动平均线(MACD)实现,利用 Python 和 Tushare 获取数据并计算 MACD。
1. MACD 的基本组成
-
快线(DIF):通常为 12 日指数移动平均线(EMA)减去 26 日 EMA。
-
信号线(DEA):通常为 DIF 的 9 日 EMA。
-
柱状图(Histogram):DIF 与信号线的差值,用于判断市场的多空力量。
2. 获取 A 股数据
使用 Tushare 获取 A 股的股票数据,确保你有 Tushare 的 API token。
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
# 设置 Tushare token
ts.set_token('your_tushare_token')
pro = ts.pro_api()
# 获取 A 股的日线数据(以贵州茅台为例)
def get_a_stock_data(stock_code, start_date, end_date):
df = pro.daily(ts_code=stock_code, start_date=start_date, end_date=end_date)
df = df[['trade_date', 'close']]
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
df = df.sort_index()
return df
# 获取贵州茅台(600519.SH)的日线数据
stock_code = '600519.SH'
start_date = '20200101'
end_date = '20221231'
stock_data = get_a_stock_data(stock_code, start_date, end_date)
3. 计算 MACD 指标
# 计算 MACD 指标
def calculate_macd(data, short_window=12, long_window=26, signal_window=9):
"""
计算 MACD 指标。
:param data: 股票数据的 pandas DataFrame,必须包含 'close' 列
:param short_window: 短期 EMA 的窗口大小,默认为 12
:param long_window: 长期 EMA 的窗口大小,默认为 26
:param signal_window: 信号线 EMA 的窗口大小,默认为 9
:return: 包含 MACD 指标的 DataFrame
"""
# 计算短期和长期的指数移动平均线 (EMA)
data['ema_short'] = data['close'].ewm(span=short_window, adjust=False).mean()
data['ema_long'] = data['close'].ewm(span=long_window, adjust=False).mean()
# 计算 DIF (快线)
data['DIF'] = data['ema_short'] - data['ema_long']
# 计算 DEA (信号线),即 DIF 的 9 日 EMA
data['DEA'] = data['DIF'].ewm(span=signal_window, adjust=False).mean()
# 计算 MACD 柱状图
data['MACD'] = data['DIF'] - data['DEA']
return data
# 计算贵州茅台的 MACD 指标
stock_data = calculate_macd(stock_data)
# 打印结果
data[['close', 'DIF', 'DEA', 'MACD']]
# 绘制 MACD 图表
plt.figure(figsize=(12, 8))
plt.subplot(2, 1, 1)
plt.plot(stock_data.index, stock_data['close'], label='Close Price', color='blue')
plt.title(f'{stock_code} Close Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
plt.subplot(2, 1, 2)
plt.plot(stock_data.index, stock_data['DIF'], label='DIF', color='blue')
plt.plot(stock_data.index, stock_data['DEA'], label='DEA', color='red')
plt.bar(stock_data.index, stock_data['MACD'], label='MACD Histogram', color='green', alpha=0.5)
plt.title('MACD Indicator')
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.grid()
plt.tight_layout()
plt.show()
4. 代码解释
-
获取数据:我们使用 Tushare 的
pro.daily
接口获取贵州茅台的日线数据,数据包括收盘价。 -
计算短期和长期 EMA:使用
ewm()
函数计算短期(12 日)和长期(26 日)指数移动平均线。 -
DIF 和 DEA:DIF 是短期 EMA 和长期 EMA 的差值,DEA 是 DIF 的 9 日 EMA,用于平滑快线的波动。
-
MACD 柱状图:柱状图表示 DIF 与 DEA 之间的差值,通常用于判断市场多空力量的转换。
5. 使用 MACD 的交易信号
-
金叉(买入信号):当 DIF 向上突破 DEA 时,称为金叉,通常被视为买入信号,意味着市场可能进入上涨趋势。
-
死叉(卖出信号):当 DIF 向下突破 DEA 时,称为死叉,通常被视为卖出信号,意味着市场可能进入下跌趋势。
-
MACD 柱状图:当柱状图由负转正时,说明市场多头力量增强;当柱状图由正转负时,说明市场空头力量增加。
6. 总结
平滑异同移动平均线(MACD)是 A 股市场中广泛使用的技术分析工具,通过分析快慢线和柱状图的变化,可以帮助交易者判断市场的趋势方向和动量强度。MACD 的优势在于结合了趋势和动量的分析,从而减少了单纯依靠移动平均线可能出现的虚假信号。在实际应用中,MACD 常与其他技术指标(如 RSI、布林带等)结合使用,以增强交易策略的可靠性。