打造属于自己的量化投资系统5——利用backtrader创建平滑异同移动平均线MACD策略

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()

运行结果

在这里插入图片描述

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值