一、MACD指标入门
MACD(Moving Average Convergence Divergence)指标称为指数平滑异同移动平均线指标,是由Geral Apple所创造,用来跟踪股价运行趋势、判断股票买卖时机的技术分析工具。
MACD指标由DIFF线(Difference线,收盘价短期/长期指数平滑移动平均线间的差)、DEA线(Difference Exponential Average线,DIFF线的M日指数平滑移动平均线)、MACD柱线和零轴“三线一轴”组成。投资者通过这“三线一轴”的交叉、背离、突破、支撑和阻碍等方式来对股价进行分析、判断。
1.1、MACD指标的特点
(1)MACD指标来源于股价的指数移动平均线EMA,具有均线指标稳定/能追随趋势的特点,可以对市场动能做出客观的反映。同时,MACD指标去掉了均线有时频繁发出假信号的缺陷,使得指标在对中长期趋势的把握上准确率较高,深受趋势型投资者的欢迎。
(2)MACD指标实际上围绕两个离差值进行分析,是市场动能最直接的反映。两个离差值,一个是DIFF线,是快慢均线的差值,可以理解为股价上涨或下跌的速度;另一个是MACD柱线,是快慢DIFF线的差值(DIFF-DEA),可以理解为股价上涨或下跌的加速度。
(3)MACD指标的滞后性:该指标剔除了股价短期上下波动的影响,主要反映市场中长期趋势,对股价短期走势的反映往往较为滞后,远不如K线形态那样及时。
(4)MACD指标不适合超短线投资者使用,不适合在盘整行情中使用。在盘整行情中,MACD指标一般会围绕着零轴上下运动,频繁发出交易信号,这些信号大多属于无效信号。
1.2、DIFF和DEA线
(1)DIFF线与DEA线的计算过程
MACD指标默认参数为12/26/9。按照这样的参数,DIFF线和DEA线的计算过程分为以下三步:
第一步,计算指数移动平均值EMA。
其中12日EMA值为:
E
M
A
=
2
12
+
1
∗
今日收盘价
+
12
−
1
12
+
1
∗
昨日
E
M
A
(
12
)
EMA = \frac{2}{12+1}*今日收盘价+ \frac{12-1}{12+1}*昨日EMA(12)
EMA=12+12∗今日收盘价+12+112−1∗昨日EMA(12)
26日EMA值为:
E
M
A
=
2
26
+
1
∗
今日收盘价
+
26
−
1
26
+
1
∗
昨日
E
M
A
(
26
)
EMA = \frac{2}{26+1}*今日收盘价+ \frac{26-1}{26+1}*昨日EMA(26)
EMA=26+12∗今日收盘价+26+126−1∗昨日EMA(26)
第二步,计算离差值DIFF
D
I
F
F
=
E
M
A
(
12
)
−
E
M
A
(
26
)
DIFF = EMA(12)-EMA(26)
DIFF=EMA(12)−EMA(26)
第三步,计算DIFF的9日平滑移动平均值DEA
今日
D
E
A
(
M
A
C
D
)
=
2
9
+
1
∗
今日
D
I
F
F
+
9
−
1
9
+
1
∗
昨日
D
E
A
今日DEA(MACD)= \frac{2}{9+1}*今日DIFF+ \frac{9-1}{9+1}*昨日DEA
今日DEA(MACD)=9+12∗今日DIFF+9+19−1∗昨日DEA
通过该计算公式可以看出,DIFF实际上是12日EMA与26日EMA的差值,而DEA则是DIFF的9日平滑移动平均线。
(2)DIFF线和DEA线的用法
DIFF线本质上是快慢均线的差值,该值的变动是对股价上涨和下跌速度最直观的描述,投资者在实践中可以将其理解为股价动能运动情况,DEA线由于是DIFF线的移动平均线,自然也具有这一特征。
在实战中,根据DIFF线/DEA线的值和位置,可以将他们的用法分类:
DIFF值 | DIFF位置 | DEA值 | DEA位置 | 市场状态 | 操作 |
---|---|---|---|---|---|
大于0 | 向上移动 | 大于0 | 向上移动 | 上涨动能强劲,股价处于多头行情 | 做多或持股待涨 |
小于0 | 向上移动 | 小于0 | 向上移动 | 上涨动能正在增加,可能会出现上涨走势,但是否反转还需要继续观察 | 少量买入股票或观望 |
大于0 | 向下移动 | 大于0 | 向下移动 | 下跌动能逐步增加,股价可能出现下跌趋势,但是否反转还需要继续观察 | 卖出部分股票或观望 |
小于0 | 向下移动 | 小于0 | 向下移动 | 下跌动能强劲,股价处于下跌趋势 | 持币观望 |
通过DIFF线和DEA线对股价进行研判,除需要了解位置和数值之外,时间也是一个重要的考量因素。
当DIFF线和DEA线在零轴上方运行时,如果持续时间很长,就表明股价长时间地处于上涨趋势,此时上涨动能很强,除非DIFF线或DEA线出现非常明显的转势信号(如跌破零轴或多次顶背离),否则上涨趋势仍将延续。投资者要注意顺势而为,持股的投资者要注意不要急匆匆的卖出股票。
同理,当DIFF线和DEA线在零轴下方运行时,如果持续时间很长,就表明股价长时间地处于下跌趋势,下跌动能很强。此时除非出现明显的反转信号,否则不能判断上涨趋势的到来,投资者要注意持币观望,不能贸然进场。
当DIFF线和DEA线在零轴上方向下移动时,投资者要注意两点:
(1)除非DIFF线和DEA线彻底跌破零轴,否则不能判断上涨趋势结束。
(2)DIFF线和DEA线回到零轴之后,往往出现盘整走势。此时DIFF线将围绕着零轴上下不断震荡。
1.3、MACD柱线
(1)MACD柱线的由来
MACD柱线是由DIFF线和DEA线衍生出来的另一指标线,其计算公式为:
M
A
C
D
柱线
=
2
∗
(
D
I
F
F
−
D
E
A
)
MACD柱线 = 2*(DIFF-DEA)
MACD柱线=2∗(DIFF−DEA)
MACD柱线实际上是DIFF线和DEA线差值的放大。
(2)MACD柱线的用法
柱线是对DIFF线变化快慢程度(DIFF线与DEA线的差值)的一种度量,而DIFF线则是对股价变动快慢程度的一种度量,因此可以把柱线看作为股价涨跌的加速度,并由此来理解它的各种用法。
MACD柱颜色 | MACD柱趋势 | 市场状态 | 操作 |
---|---|---|---|
红色 | 持续发散 | 表明上涨动能较强,股市处于急速上涨行情中 | 持股待涨或短线买入 |
红色 | 持续收敛 | 表明上涨动能开始衰减,投资者要警惕下跌趋势形成 | 当MACD柱变色或柱线与股价顶背离,就可离场 |
在把握这个用法是,投资者需要注意以下三个关键点:
(1)MACD柱线为红色且持续发散时,股价一般正在快速上涨中,此时买入往往抢不到好的价位;
(2)MACD柱线开始逐渐缩小时,投资者不必着急卖出,此时股价往往正在缓慢上涨;但在动能衰减的过程中,DIFF线也回调,才是真正需要警惕的离场信号。
(3)在卖出的时候,“MACD柱变色”的可靠性不如“MACD柱线与股价顶背离”高(股价创新高,但是MACD柱没有创新高);
MACD柱颜色 | MACD柱趋势 | 市场状态 | 操作 |
---|---|---|---|
绿色 | 持续发散 | 表明市场正处于急速下跌阶段 | 持币观望或卖出股票 |
绿色 | 持续收敛 | 表明市场下跌动能衰减 | 等柱线变色或者柱线与股价出现底背离的时候,少量进行长线战略建仓,等上涨趋势确定后,再大举入场 |
投资者再运用柱线是,除了以上四种情况外,还有注意以下几个重要看点:
(1)柱线主要用来研判DIFF的走势,通过柱线的起伏变动可以方便地得知DIFF地变动趋势。当柱线由绿转红时,意味着DIFF线向上突破DEA线,出现了金叉;当柱线由红转绿时,意味DIFF线向下突破DEA线,出现死叉。
当DIFF线在零轴上方运行时,一旦柱线与股价出现了顶背离,在下跌动能的驱动下,DIFF线和DEA线接下来往往会出现死叉,一起回到零轴,甚至形成一波下跌趋势。相反,当DIFF线在零轴下方运行时,一旦柱线和股价出现底背离,在上涨动能的驱使下,DIFF线和DEA线接下来又较大可能出现金叉,并顺利回到零轴,甚至出现一般上涨趋势。
(2)仅凭MACD柱线难以判断趋势
一般来说,MACD柱线围绕着零轴上下波动,即使是在长时间的趋势运行中,柱线也围绕着零轴上下起伏。因此投资者不能仅利用柱线来研判股价的运行趋势,必须结合其他技术分析工具进行综合分析。
(3)柱线可以用来研判具体的买卖点
由于DIFF线能够对市场动能和趋势做出较为直观的反映,而MACD柱线又能对DIFF的短期变动做出及时的反映,头i作者虽然不能用柱线来研判趋势,但是可以用柱线背离/颜色转换来研判具体的买卖点。特别是当DIFF线显示股价即将出现一波上涨趋势时,投资者结合柱线往往能够抓住上涨趋势的最低点。相反,当DIFF线显示股价即将出现一波下跌趋势时,投资者结合柱线往往能够抓住下跌趋势的最高点。
二、MACD指标的作用和使用法则
2.1、四大作用
2.1.1判断股价涨跌趋势
利用MACD指标来判断股价涨跌趋势,主要是通过DIFF线(DEA线也可以)来实现的,在实战中投资者可以通过以下两种途径来判断。
(1)DIFF线穿过零轴
DIFF状态 | 市场状态 | 操作 |
---|---|---|
由下向上穿过零轴 | 上涨趋势已经初步形成 | 分批建仓 |
穿过零轴后冲高回落在零轴得到支撑,再次向上 | 上涨趋势已经彻底形成 | 买入 |
由上向下穿过零轴 | 下跌趋势已经初步形成 | 部分卖出 |
向下穿过后反弹确认,之后再次下跌 | 下跌趋势已经彻底形成 | 卖出 |
(2)DIFF线的背离
DIFF线(或DEA线)与股价背离是判断市场趋势的另外一种常用方法。
DIFF状态 | 股价状态 | 市场状态 | 操作 |
---|---|---|---|
DIFF线与股价底背离 | 股价突破前期重要阻力位 | 表明上涨趋势已经初步形成,有时股价突破之后会有一个回抽确认过程,这是上涨趋势彻底形成的标志 | 买入 |
DIFF线与股价顶背离 | 股价跌破前期重要支撑位 | 表明下跌趋势已经初步形成,有时股价跌破之后会有一个反弹确认过程,这是下跌趋势彻底形成的标志 | 卖出 |
在实战中,投资者通过DIFF线与股价背离关系来判断市场趋势,要注意与其他技术分析工具向结合,特别是以下三种最为常用的工具:
第一,DIFF线与DEA线的交叉(MACD柱),它往往出现在背离之后,起到确认的作用。如果背离出现后,迟迟MACD柱不变色,就表明背离的动能太弱。
第二,MACD柱线的背离,如果该信号也出现,往往表明趋势将很快到来。
第三,成交量的配合,当DIFF线和股价的底背离出现时候,成交量可能不会太高,但随着股价的上涨,成交量将会大幅放大。
投资者通过以上两种方法来判断市场的涨跌趋势时,必须要考虑时间因素。一般来说,上涨趋势即将形成的时候,市场正处于下跌趋势或盘整趋势中,如果下跌或者盘整持续的时间太长,那么这两种判断上涨趋势的方法的可靠性将有所降低。最典型的是,在长期下跌趋势中,即使出现DIFF线与股价的底背离,但是由于下跌动能太过强势,底背离只能使股价短期内略有反弹,但无法使之彻底转势。相反,下跌趋势即将形成的时候也是同理。
2.1.2 寻找买卖点
买卖点是指技术指标所发出的关于买进和卖出股票的信号。利用MACD指标寻找买卖点,可以有多种方法,常见的有DIFF线和DEA线与股价的背离、DIFF线和DEA线的交叉、MACD柱的背离、DIFF线和DEA线的形态等。
2.1.3寻找转支撑/阻力位
寻找支撑/阻力位是MACD指标的另一个重要作用,它主要通过以下两个方法来实现:
指标 | 说明 |
---|---|
零轴 | 当DIFF线在零轴下方运行时,零轴对其有重要的阻力作用;而一旦DIFF线突破零轴,零轴对它就具有重要的支撑作用。这种支撑和阻力作用在实战中往往构成重要买卖点。 |
DEA线 | DEA线因为是DIFF线的9日移动平均线,所以对DIFF线具有一定的支撑、阻碍作用。MACD指标买卖点中,“拒绝金叉卖点”和“拒绝死叉买点”都是根据DEA线的支撑和阻力作用而来的。 |
投资者要注意的是,当DIFF线长时间围绕着零轴窄幅震荡时,表明在股价走势中,两条快慢均线正缠绕到一起,市场正处于盘整状态。那么DIFF线围绕零轴震荡的区间一旦被突破,也会有重要的支撑或阻碍作用。
2.2、使用技巧
2.2.1 趋势第一
MACD指标作为判断市场趋势的重要工具,在使用的过程中,首先要注意的就是利用该指标判断市场趋势。
DIFF | DEA值 | 市场状态 | 操作 |
---|---|---|---|
零轴上方 | 零轴上方 | 上涨趋势 | 持股待涨或逢低加仓 |
零轴附近波动 | 零轴附近波动 | 盘整状态 | 高抛低吸或持币观望 |
零轴下方 | 零轴下方 | 下跌趋势 | 持币观望 |
2.2.2 多周期共振
在实战中,投资者在分析股票走势时,一般要用到多个周期的走势图,常用的有月/周/日/60分钟/30分钟/15分钟/5分钟这7个周期。多周期共振是指任何一个买点或卖点都必须有两个或两个以上的周期发出买入或卖出信号(越多越可靠)时,投资者才最终买入或卖出,当只有单独的一个周期发出买卖信号时,投资者可不予考虑。
对于长线投资者,当月或周线图出现买卖信号时,日线图也发出相同方向买卖信号才考虑买入和卖出。
2.2.3参数的修改
对股价变动的反应滞后,买卖价位有时不太理想,这是MACD指标的一个缺陷,改变这种情况的方法之一就是通过改变指标参数,使得MACD指标对走势的反应变得灵敏一些。投资者可以在实际使用中自行验证,比如修改位5/34/5,5/10/30等。但修改参数虽然能让灵敏度提高,但可靠性会有所降低,需要综合考虑。
2.2.4 多指标配合
在实战中,买卖点的可靠性非常重要,除了多周期共振外,多指标配合也很重要。
多指标配合是指每一个买卖点的出现都需要至少两种或两种以上的技术分析工具发出同方向的买卖信号,才能最终确认。例如MACD指标与成交量指标配合、MACD指标与K线组合理论配合、MACD与KDJ指标配合等
2.2.5形态法则
在实战中,DIFF线(或DEA线)的形态可分为三类
(1)顶部底部的经典反转状态
在经典形态理论中,反转形态主要有双重顶(M头)和双重底、头肩顶和头肩底、三重顶和三重底、圆弧顶和圆弧底等形态。当股价走势一旦出现这种形态的时候,就表示市场可能发生反转。
(2)顶背离和底背离
MACD的背离是指MACD指标的走势与股价走势正好相反,表明与市场原来趋势相反的动能正在聚集。
(3)趋势线
趋势线是指连接连续两个或两个以上波峰(或波谷)的直线,它可以直观地表示所观察对象地运行趋势,其中连接波谷地直线被称为上升趋势线,连接波峰的直线被称为下降趋势线,趋势线的一个重要特点就是起到支撑和阻力的作用,一旦被突破,就表示市场运行趋势将发生较大的变化。
4、MACD指标实操练习
结合DIFF线/MACD柱线以及股价状态,我制定了如下策略,随机选择一些股票看看实战效果如何:
DEA状态 | 股价状态 | MACD状态 | 市场状态 | 操作 |
---|---|---|---|---|
向下移动 | 顶背离 | 由红转绿 | 下跌动能十分强劲 | 卖出 |
向上移动 | 底背离 | 由绿转红 | 上涨趋势形成 | 分批买入,底背离买入一次,MACD变色买入一次,DIFF穿过零轴买入一次,共三次 |
我们以海康威视的股票为例,先定义一个存储策略函数的py文件,代码如下:
import numpy as np
import pandas as pd
import talib
from gm.api import *
import datetime
import matplotlib.pyplot as plt
"""
MACD指标
TALIB金融库中提供的MACD函数与国内实际使用的不同,因此转换为国内常用的形式;
MACD称为异同移动平均线,是从双指数移动平均线发展而来的;
由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA)得到MACD柱。
MACD的意义和双移动平均线基本相同,即由快、慢均线的离散、聚合表征当前的多空状态和股价可能的发展变化趋势,但阅读起来更方便。
MACD的变化代表着市场趋势的变化,不同K线级别的MACD代表当前级别周期中的买卖趋势。
"""
def MACD_CN(close, fastperiod = 12, slowperiod = 26, signalperiod = 9):
macdDIFF,macdDEA,macd = talib.MACDEXT(close,fastperiod = fastperiod,fastmatype=1,slowperiod = slowperiod,slowmatype =1,signalperiod =signalperiod,signalmatype =1) #平滑异同移动平均线(可控制移动平均算法)
macd = macd * 2
return macdDIFF,macdDEA,macd
"""
MACD指标买入策略
策略1:当DEA大于0时,且MACD由绿转红的时刻触发买入操作;
"""
def MACD_strategy_buy_simple1(close, fastperiod=12, slowperiod=26, signalperiod=9,strategy_buy_num=1):
macdDIFF, macdDEA, macd = MACD_CN(close, fastperiod=12, slowperiod=26, signalperiod=9)
signal = 0 # 标志位,0代表无动作,1代表买入
#策略1:当DEA大于0时,且MACD由绿转红的时刻触发买入操作;
if strategy_buy_num == 1:
if macdDEA[-1] > 0 and macd[-1]*macd[-2] < 0:
signal = 1;
return signal
"""
MACD指标卖出策略
策略1:当DEA小于0时,且MACD由红转绿的时刻触发卖出操作;
"""
def MACD_strategy_sell_simple1(close, fastperiod=12, slowperiod=26, signalperiod=9,strategy_sell_num=1):
macdDIFF, macdDEA, macd = MACD_CN(close, fastperiod=12, slowperiod=26, signalperiod=9)
signal = 0 # 标志位,0代表无动作,1代表卖出
#策略1:当DEA小于0时,且MACD由红转绿的时刻触发卖出操作;
if strategy_sell_num == 1:
if macdDEA[-1] < 0 and macd[-1]*macd[-2] < 0:
signal = 1
return signal
之后再建立一个运行的主函数:
# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
import datetime
import numpy as np
import talib
import pandas as pd
import MACD_strategy
import pandas as pd
import matplotlib.pyplot as plt
'''
示例策略仅供参考,不建议直接实盘使用。
行业轮动策略
逻辑:以场内ETF基金代表,按照月收益率进行排序,选择收益率最高的10只ETF基金进行买入,每月进行一次调仓换股
'''
def init(context):
#股票代码
context.index = "SZSE.002415"
#买入股票的标志位
context.buy_signal = 0
#卖出股票的MFI阈值
context.sell_signal = 0
# 每日定时任务
schedule(schedule_func=algo, date_rule='1d', time_rule='09:30:00')
# schedule(schedule_func=algo_zhiyingzhisun, date_rule='1d', time_rule='09:31:00') #根据盈利亏损值止盈止损
def algo(context):
# 当天日期
now_str = context.now.strftime('%Y-%m-%d')
# 获取上一个交易日及上一周交易日
last_day = get_previous_n_trading_dates(exchange='SHSE', date=now_str, n=1)[0]
# 获取历史交易数据
data = history_n(symbol=context.index, frequency="1d", count=100, end_time=last_day,
fields="high, low, close, volume", fill_missing="last", adjust=ADJUST_PREV, df=True)
# 从dataframe中提取数据
close = data["close"].values
context.buy_signal = MACD_strategy.MACD_strategy_buy_simple1(close=close, fastperiod=12, slowperiod=26, signalperiod=9, strategy_buy_num=1)
context.sell_signal = MACD_strategy.MACD_strategy_sell_simple1(close=close, fastperiod=12, slowperiod=26, signalperiod=9,strategy_sell_num=1)
if context.buy_signal == 1:
print("买入")
order_target_percent(symbol=context.index, percent=1, order_type=OrderType_Market,position_side=PositionSide_Long)
if context.sell_signal == 1:
print("卖出")
order_target_percent(symbol=context.index, percent=0, order_type=OrderType_Market,position_side=PositionSide_Long)
def algo_zhiyingzhisun(context):
now_str = context.now.strftime('%Y-%m-%d')
print(now_str+"执行策略2")
positions = get_position()
for position in positions:
symbol = position['symbol']
price = position["price"] #当前行情价格
vwap = position["vwap"] #持仓均价
# print(position)
if (price - vwap)/vwap < -0.1: #当亏损大于10%,止损
order_target_percent(symbol=symbol, percent=0, order_type=OrderType_Market,
position_side=PositionSide_Long)
print(symbol+"止损"+now_str)
elif (price - vwap)/vwap > 0.4: #当盈利大于30%,止盈
order_target_percent(symbol=symbol, percent=0, order_type=OrderType_Market,
position_side=PositionSide_Long)
print(symbol+"止盈"+now_str)
def on_order_status(context, order):
# 标的代码
symbol = order['symbol']
# 委托价格
price = order['price']
# 委托数量
volume = order['volume']
# 目标仓位
target_percent = order['target_percent']
# 查看下单后的委托状态,等于3代表委托全部成交
status = order['status']
# 买卖方向,1为买入,2为卖出
side = order['side']
# 开平仓类型,1为开仓,2为平仓
effect = order['position_effect']
# 委托类型,1为限价委托,2为市价委托
order_type = order['order_type']
if status == 3:
if effect == 1:
if side == 1:
side_effect = '开多仓'
else:
side_effect = '开空仓'
else:
if side == 1:
side_effect = '平空仓'
else:
side_effect = '平多仓'
order_type_word = '限价' if order_type == 1 else '市价'
print('{}:标的:{},操作:以{}{},委托价格:{},委托数量:{}'.format(context.now, symbol, order_type_word, side_effect,
price, volume))
def on_backtest_finished(context, indicator):
print('*' * 50)
print('回测已完成,请通过右上角“回测历史”功能查询详情。')
if __name__ == '__main__':
'''
strategy_id策略ID,由系统生成
filename文件名,请与本文件名保持一致
mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
token绑定计算机的ID,可在系统设置-密钥管理中生成
backtest_start_time回测开始时间
backtest_end_time回测结束时间
backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
backtest_initial_cash回测初始资金
backtest_commission_ratio回测佣金比例
backtest_slippage_ratio回测滑点比例
backtest_match_mode市价撮合模式,以下一tick/bar开盘价撮合:0,以当前tick/bar收盘价撮合:1
'''
run(strategy_id='自己的策略ID',
filename='MACD_strategy_test.py',
mode=MODE_BACKTEST,
token='自己的token码',
backtest_start_time='2012-03-01 09:00:00',
backtest_end_time='2024-08-01 15:00:00',
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=1000000,
backtest_commission_ratio=0.0001,
backtest_slippage_ratio=0.0001,
backtest_match_mode=1)
运行结果如下,收益为562%,还是非常可观的,年化收益率16%以上。
加上止盈止损策略后,收益率有了进一步的提升,年化收益率达到19%以上。