一、前言
MACD(Moving Average Convergence Divergence,指数平滑异同移动平均线)是最受欢迎的技术指标之一,被称为"指标之王"。它由Gerald Appel在1970年代提出,至今仍被广泛使用。
本文将介绍:
- MACD指标的组成和含义
- MACD的计算方法
- 如何使用MACD进行交易决策
- Python实现MACD计算和信号判断
二、为什么选择天勤量化(TqSdk)
计算技术指标需要可靠的K线数据源。**天勤量化(TqSdk)**不仅提供高质量的行情数据,还内置了常用技术指标计算函数:
| 优势 | 说明 |
|---|---|
| 数据质量高 | 实时行情数据稳定可靠,K线数据完整准确 |
| 内置指标库 | tqsdk.tafunc模块提供MA、EMA、MACD、BOLL等常用指标 |
| pandas友好 | K线数据直接返回DataFrame,方便使用pandas处理 |
| 实时更新 | 数据自动推送更新,无需手动刷新 |
安装方法:
pipinstalltqsdk快期账户:使用TqSdk需要注册快期账户(免费),访问 https://www.shinnytech.com 注册。
三、MACD基础知识
3.1 MACD的组成
MACD指标由三部分组成:
| 组成部分 | 名称 | 含义 |
|---|---|---|
| DIF | 快线/差离值 | 短期EMA与长期EMA的差值,反映短期动能 |
| DEA | 慢线/信号线 | DIF的移动平均,用于产生交易信号 |
| MACD柱 | 柱状图 | DIF与DEA的差值,直观显示多空力量 |
3.2 MACD计算公式
| 指标 | 计算方法 | 默认参数 |
|---|---|---|
| DIF | EMA(收盘价, 12) - EMA(收盘价, 26) | 快线12,慢线26 |
| DEA | EMA(DIF, 9) | 信号线周期9 |
| MACD柱 | (DIF - DEA) × 2 | - |
参数说明:
- 12:短期EMA周期
- 26:长期EMA周期
- 9:DEA平滑周期
3.3 MACD的市场含义
| 状态 | 含义 |
|---|---|
| DIF > 0 | 短期均线在长期均线上方,市场偏多 |
| DIF < 0 | 短期均线在长期均线下方,市场偏空 |
| MACD柱 > 0(红柱) | 多头动能,DIF在DEA上方 |
| MACD柱 < 0(绿柱) | 空头动能,DIF在DEA下方 |
四、计算MACD
4.1 使用pandas手动计算
#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:计算MACD指标 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))# 获取K线数据klines=api.get_kline_serial("SHFE.rb2501",60,200)api.wait_update()# 计算MACD# 1. 计算短期和长期EMAklines["ema12"]=klines["close"].ewm(span=12,adjust=False).mean()klines["ema26"]=klines["close"].ewm(span=26,adjust=False).mean()# 2. 计算DIF(快线)klines["dif"]=klines["ema12"]-klines["ema26"]# 3. 计算DEA(慢线/信号线)klines["dea"]=klines["dif"].ewm(span=9,adjust=False).mean()# 4. 计算MACD柱状图klines["macd"]=(klines["dif"]-klines["dea"])*2# 打印结果print("MACD指标计算结果:")print(klines[["datetime","close","dif","dea","macd"]].tail(10))api.close()运行结果示例:
MACD指标计算结果: datetime close dif dea macd 190 2024-12-17 14:50:00 3205.0 8.52 6.31 4.42 191 2024-12-17 14:51:00 3206.0 9.15 6.88 4.54 ...4.2 使用TqSdk内置函数
TqSdk提供了内置的macd函数,使用更加简洁:
fromtqsdkimportTqApi,TqAuthfromtqsdk.tafuncimportmacd api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2501",60,200)api.wait_update()# 使用内置macd函数dif,dea,m=macd(klines["close"],12,26,9)klines["dif"]=dif klines["dea"]=dea klines["macd"]=mprint(klines[["datetime","close","dif","dea","macd"]].tail(10))api.close()五、MACD交易信号
5.1 金叉与死叉
MACD最常用的交易信号是DIF与DEA的交叉:
| 信号 | 条件 | 操作建议 |
|---|---|---|
| 金叉 | DIF从下向上穿越DEA | 考虑做多 |
| 死叉 | DIF从上向下穿越DEA | 考虑做空 |
| 零轴上方金叉 | 在零轴上方发生金叉 | 更强的买入信号 |
| 零轴下方死叉 | 在零轴下方发生死叉 | 更强的卖出信号 |
5.2 金叉死叉判断代码
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2501",60,200)api.wait_update()# 计算MACDklines["ema12"]=klines["close"].ewm(span=12,adjust=False).mean()klines["ema26"]=klines["close"].ewm(span=26,adjust=False).mean()klines["dif"]=klines["ema12"]-klines["ema26"]klines["dea"]=klines["dif"].ewm(span=9,adjust=False).mean()# 判断金叉(DIF上穿DEA)klines["golden_cross"]=(klines["dif"]>klines["dea"])&\(klines["dif"].shift(1)<=klines["dea"].shift(1))# 判断死叉(DIF下穿DEA)klines["death_cross"]=(klines["dif"]<klines["dea"])&\(klines["dif"].shift(1)>=klines["dea"].shift(1))# 输出信号signals=klines[klines["golden_cross"]|klines["death_cross"]]print("MACD金叉死叉信号:")print("-"*60)foridx,rowinsignals.tail(5).iterrows():signal_type="金叉 (买入信号)"ifrow["golden_cross"]else"死叉 (卖出信号)"zone="零轴上方"ifrow["dif"]>0else"零轴下方"print(f"{row['datetime']}|{signal_type}|{zone}| 价格:{row['close']:.0f}")api.close()5.3 零轴信号
零轴(即DIF=0和DEA=0的位置)也有重要参考意义:
# 获取最新MACD数据latest=klines.iloc[-1]dif=latest["dif"]dea=latest["dea"]print("MACD零轴分析:")print("-"*40)ifdif>0anddea>0:print("当前状态: MACD在零轴上方")print("市场解读: 多头市场,趋势偏强")elifdif<0anddea<0:print("当前状态: MACD在零轴下方")print("市场解读: 空头市场,趋势偏弱")else:print("当前状态: MACD在零轴附近")print("市场解读: 多空转换区,需要观察")六、MACD柱状图分析
6.1 柱状图的含义
MACD柱状图直观反映了多空力量的变化:
| 柱状图状态 | 含义 |
|---|---|
| 红柱(>0) | 多头动能,DIF > DEA |
| 绿柱(<0) | 空头动能,DIF < DEA |
| 柱子变长 | 趋势动能增强 |
| 柱子变短 | 趋势动能减弱 |
6.2 柱状图趋势分析代码
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2501",60,100)api.wait_update()# 计算MACDklines["ema12"]=klines["close"].ewm(span=12,adjust=False).mean()klines["ema26"]=klines["close"].ewm(span=26,adjust=False).mean()klines["dif"]=klines["ema12"]-klines["ema26"]klines["dea"]=klines["dif"].ewm(span=9,adjust=False).mean()klines["macd"]=(klines["dif"]-klines["dea"])*2# 分析最近5根MACD柱状图latest_bars=klines["macd"].tail(5).tolist()print("最近5根MACD柱状图:")print("-"*40)fori,barinenumerate(latest_bars):direction="红柱 +"ifbar>0else"绿柱 -"bar_visual="*"*int(abs(bar)/2)print(f" 第{i+1}根:{bar:>7.2f}{direction}{bar_visual}")# 判断柱状图趋势print("-"*40)ifall(latest_bars[i]>latest_bars[i-1]foriinrange(1,len(latest_bars))):print("趋势: MACD柱状图持续放大(动能增强)")elifall(latest_bars[i]<latest_bars[i-1]foriinrange(1,len(latest_bars))):print("趋势: MACD柱状图持续缩小(动能减弱)")else:print("趋势: MACD柱状图无明显规律")api.close()七、MACD背离
7.1 什么是MACD背离
MACD背离是一种重要的反转信号:
| 背离类型 | 定义 | 信号含义 |
|---|---|---|
| 顶背离 | 价格创新高,但DIF没有创新高 | 上涨动能减弱,可能见顶 |
| 底背离 | 价格创新低,但DIF没有创新低 | 下跌动能减弱,可能见底 |
7.2 背离的使用注意事项
- 背离不等于立即反转- 背离只是警示信号,不是买卖信号
- 需要确认- 配合其他指标或形态确认
- 趋势中谨慎使用- 强势趋势中可能出现多次背离后才反转
八、实时MACD监控
fromtqsdkimportTqApi,TqAuthimportdatetime api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2501",60,100)print("实时MACD监控,按Ctrl+C停止...")print("="*70)prev_dif=Noneprev_dea=NonewhileTrue:api.wait_update()ifapi.is_changing(klines.iloc[-1],"close"):# 重新计算MACDclose=klines["close"]ema12=close.ewm(span=12,adjust=False).mean()ema26=close.ewm(span=26,adjust=False).mean()dif=(ema12-ema26).iloc[-1]dea=(ema12-ema26).ewm(span=9,adjust=False).mean().iloc[-1]macd_bar=(dif-dea)*2# 判断信号signal=""ifprev_difisnotNoneandprev_deaisnotNone:ifdif>deaandprev_dif<=prev_dea:signal=">>> 金叉!"elifdif<deaandprev_dif>=prev_dea:signal=">>> 死叉!"now=datetime.datetime.now().strftime("%H:%M:%S")bar_str="+"*int(abs(macd_bar)/2)ifmacd_bar>0else"-"*int(abs(macd_bar)/2)print(f"[{now}] DIF:{dif:>7.1f}DEA:{dea:>7.1f}MACD:{macd_bar:>7.1f}{bar_str}{signal}")prev_dif=dif prev_dea=dea九、总结
9.1 MACD组成
| 组成部分 | 含义 | 计算方法 |
|---|---|---|
| DIF | 快线,反映短期动能 | EMA12 - EMA26 |
| DEA | 慢线,DIF的平滑 | EMA(DIF, 9) |
| MACD柱 | DIF和DEA的差值 | (DIF - DEA) × 2 |
9.2 MACD交易信号
| 信号类型 | 条件 | 操作建议 |
|---|---|---|
| 金叉 | DIF上穿DEA | 考虑做多 |
| 死叉 | DIF下穿DEA | 考虑做空 |
| 零轴上方金叉 | 更强的买入信号 | 重点关注 |
| 零轴下方死叉 | 更强的卖出信号 | 重点关注 |
9.3 使用注意事项
- MACD是趋势跟踪指标,在趋势行情中表现较好
- 在震荡行情中可能产生较多假信号
- 建议配合其他指标使用,提高准确率
- 不要单独依赖任何一个指标进行交易决策
下一步学习:
- 布林带指标的计算和应用
- RSI指标的计算和应用
免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。
更多资源:
- 天勤量化官网:https://www.shinnytech.com
- GitHub开源地址:https://github.com/shinnytech/tqsdk-python
- 官方文档:https://doc.shinnytech.com/tqsdk/latest