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
'''#平滑异同移动平均线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案例
# -*- 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()
运行结果