1.平滑异同移动平均线定义
平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标
DIF(蓝线): 计算12天平均和26天平均的差,公式:EMA(C,12)-EMA(c,26)
Signal(DEM或DEA或MACD) (红线): 计算macd9天均值,公式:Signal(DEM或DEA或MACD):EMA(MACD,9)
Histogram (柱): 计算macd与signal的差值,公式:Histogram:MACD-Signal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | '''#平滑异同移动平均线MACD DIF(蓝线): 计算12天平均和26天平均的差,公式:EMA(C,12)-EMA(c,26) Signal(DEM或DEA或MACD) (红线): 计算macd9天均值,公式:Signal(DEM或DEA或MACD):EMA(MACD,9) Histogram (柱): 计算macd与signal的差值,公式:Histogram:MACD-Signal period_me1=12 period_me2=26 period_signal=9 macd = ema(data, me1_period) - ema(data, me2_period) signal = ema(macd, signal_period) histo = macd - signal ''' def __init__(self): #sma源码位于indicators\macd.py #指标必须要定义在策略类中的初始化函数中 macd=bt.ind.MACD() self.macd=macd.macd self.signal=macd.signal self.histo=bt.ind.MACDHisto() def next(self): #self.data.close是表示收盘价 #收盘价大于histo,买入 if self.macd>0 and self.signal>0 and self.histo>0: self.buy() #收盘价小于等于histo,卖出 if self.macd<=0 and self.signal<=0 and self.histo<=0: self.sell() |
2.MACD的应用
MACD在应用上,是以12日为快速移动平均线(12日EMA),而以26日为慢速移动平均线(26日EMA),首先计算出此两条移动平均线数值,再计算出两者数值间的差离值,即差离值(DIF)=12日EMA-26日EMA。然后根据此差离值,计算9日EMA值(即为MACD值);将DIF与MACD值分别绘出线条,然后依“交错分析法”分析,当DIF线向上突破MACD平滑线即为涨势确认之点,也就是买入讯号。反之,当DIF线向下跌破MACD平滑线时,即为跌 势确认之点,也就是卖出讯号
3. MACD指标的研判标准
a.DIF和MACD的值及线的位置
- 当DIF和MACD均大于0(即在图形上表示为它们处于零线以上)并向上移动时,一般表示为股市处于多头行情中,可以买入或持股;
- 当DIF和MACD均小于0(即在图形上表示为它们处于零线以下)并向下移动时,一般表示为股市处于空头行情中,可以卖出股票或观望。
- 当DIF和MACD均大于0(即在图形上表示为它们处于零线以上)但都向下移动时,一般表示为股票行情处于退潮阶段,股票将下跌,可以卖出股票和观望;
- 当DIF和MACD均小于0时(即在图形上表示为它们处于零线以下)但向上移动时,一般表示为行情即将启动,股票将上涨,可以买进股票或持股待涨。
b.DIF和MACD的交叉情况
- 当DIF与MACD都在零线以上,而DIF向上突破MACD时,表明股市处于一种强势之中,股价将再次上涨,可以加码买进股票或持股待涨,这就是MACD指标“黄金交叉”的一种形式。
- 当DIF和MACD都在零线以下,而DIF向上突破MACD时,表明股市即将转强,股价跌势已尽将止跌朝上,可以开始买进股票或持股,这是MACD指标“黄金交叉”的另一种形式。
- 当DIF与MACD都在零线以上,而DIF却向下突破MACD时,表明股市即将由强势转为弱势,股价将大跌,这时应卖出大部分股票而不能买股票,这就是MACD指标的“死亡交叉”的一种形式。
- 当DIF和MACD都在零线以上,而DIF向下突破MACD时,表明股市将再次进入极度弱市中,股价还将下跌,可以再卖出股票或观望,这是MACD指标“死亡交叉”的另一种形式。
c.MACD指标中的柱状图分析
在股市电脑分析软件中,通常采用DIF值减DEA(即MACD、DEM)值而绘制成柱状图,用红柱状和绿柱状表示,红柱表示正值,绿柱表示负值。用红绿柱状来分析行情,既直观明了又实用可靠。
- 当红柱状持续放大时,表明股市处于牛市行情中,股价将继续上涨,这时应持股待涨或短线买入股票,直到红柱无法再放大时才考虑卖出。
- 当绿柱状持续放大时,表明股市处于熊市行情之中,股价将继续下跌,这时应持币观望或卖出股票,直到绿柱开始缩小时才可以考虑少量买入股票。
- 当红柱状开始缩小时,表明股市牛市即将结束(或要进入调整期),股价将大幅下跌,这时应卖出大部分股票而不能买入股票。
- 当绿柱状开始收缩时,表明股市的大跌行情即将结束,股价将止跌向上(或进入盘整),这时可以少量进行长期战略建仓而不要轻易卖出股票。
- 当红柱开始消失、绿柱开始放出时,这是股市转市信号之一,表明股市的上涨行情(或高位盘整行情)即将结束,股价将开始加速下跌,这时应开始卖出大部分股票而不能买入股票。
- 当绿柱开始消失、红柱开始放出时,这也是股市转市信号之一,表明股市的下跌行情(或低位盘整)已经结束,股价将开始加速上升,这时应开始加码买入股票或持股待涨。
4.MACD案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | # -*- coding: utf-8 -*- """ Created on Wed May 13 14:37:09 2020 @author: 觉醒2020 """ from __future__ import (absolute_import, division, print_function, unicode_literals) import datetime import backtrader as bt # 引入backtrader框架 #平滑异同移动平均线MACD #买入与卖出算法: # macd、signal、histo都大于0,买入 # macd、signal、histo都小于等于0,卖出 class StrategyClass(bt.Strategy): '''#平滑异同移动平均线MACD DIF(蓝线): 计算12天平均和26天平均的差,公式:EMA(C,12)-EMA(c,26) Signal(DEM或DEA或MACD) (红线): 计算macd9天均值,公式:Signal(DEM或DEA或MACD):EMA(MACD,9) Histogram (柱): 计算macd与signal的差值,公式:Histogram:MACD-Signal period_me1=12 period_me2=26 period_signal=9 macd = ema(data, me1_period) - ema(data, me2_period) signal = ema(macd, signal_period) histo = macd - signal ''' def __init__(self): #sma源码位于indicators\macd.py #指标必须要定义在策略类中的初始化函数中 macd=bt.ind.MACD() self.macd=macd.macd self.signal=macd.signal self.histo=bt.ind.MACDHisto() def next(self): #self.data.close是表示收盘价 #收盘价大于histo,买入 if self.macd>0 and self.signal>0 and self.histo>0: self.buy() #收盘价小于等于histo,卖出 if self.macd<=0 and self.signal<=0 and self.histo<=0: self.sell() cerebro=bt.Cerebro() datapath=".\\datas\\test\\000001.XSHE" data=bt.feeds.GenericCSVData(dataname=datapath, fromdate = datetime.datetime(2018, 1, 1), todate = datetime.datetime(2020, 3, 20), nullvalue=0.0, dtformat=('%Y-%m-%d'), datetime=0, high=3, low=4, open=1, close=2, volume=5, openinterest=-1) cerebro.adddata(data) cerebro.addstrategy(StrategyClass) #设置金额,默认是100000 cerebro.broker.set_cash(200000) cerebro.run(maxcpu=1) cerebro.plot() |
运行结果