上次,我们简单地用Python 和 backtrader 使用最简单的买入卖出策略进行了一次量化投资分析:

这一次,让我们把策略变得复杂一点,使用MACD策略的信号线交叉交易法

本系列教程源代码Github仓库: https://github.com/Ckend/pythondict-quant

1.原理

为了解释MACD的原理,我们需要先了解指数移动平均线(下称EMA), 指数移动平均线是移动平均线的一种,能够根据数据点的新旧程度分配不同的权重,其更重视近期价格,减轻对往期价格的权重 ,而普通的移动平均线在所有价格上权重都一致,这是二者最大的不同。

EMA线还有周期上的不同,长期投资者通常选择50、100、200周期来追踪数月、甚至是年的价格趋势。而12天和26天的时间周期短,则广受短期投资者欢迎。而大部分股票软件的MACD线也是按照12天EMA和26天EMA进行计算的。

好了,接下来开始从上图讲起,上图可以看出两个基本规律:

蓝线上穿信号线(橙色)的时候看涨。

蓝线下穿信号线(橙色)的时候看跌

蓝线是什么呢?是MACD线,它通过将一个价格短期EMA和价格长期EMA相减得到,在大部分股票软件中是EMA(12) - EMA(26).

信号线是什么呢?它其实是MACD线的EMA,周期一般为9.

总结公式如下:

  • MACD=价格EMA(12) - 价格EMA(26).
  • 信号线=MACD的EMA(9)

而图中那些一个个的方块,则是由MACD线 - 信号线得到的差值,正值在上,负值在下。

明白了这些,我们就能够开始构建回测脚本了:

买入:
 MACD线在前一天的值 < 信号线前一天的值
 当天MACD线的值 > 当天信号线的值 时
说明发生了金叉,此时看涨,第二天买入。

卖出:若已盈利10%,则卖出;若已亏损10%,则卖出。

这个策略在股票 603186 上,每次交易100股的情况下,年回报率为26.9%.

2.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

在终端输入以下命令安装我们所需要的依赖模块:

pip install backtrader

看到 Successfully installed xxx 则说明安装成功。

Backtrader基本使用请看我们前一篇文章:
backtrader教程—量化投资原来这么简单(1)

本文全部代码,请在Python实用宝典后台回复:量化投资2 进行下载。

3.构建策略

如果你没看第一篇文章,可能不知道如何构建这个策略,一脸懵逼也正常,所以推荐先阅读 backtrader教程—量化投资原来这么简单(1) ,当然,如果你只希望跑起来,修改一些参数,可以 Python实用宝典后台回复:量化投资2 下载全部源代码。

从MACD的原理中我们知道,MACD由EMA线计算而来,因此我们需要构建一个短期EMA和一个长期EMA,常规的选择是周期分别为12和26的EMA线:

from backtrader.indicators import EMA
me1 = EMA(self.data, period=12)
me2 = EMA(self.data, period=26)
self.macd = me1 - me2

根据前面的分析我们知道,信号线是MACD线周期为9的EMA:

self.signal = EMA(self.macd, period=9)

这样我们就构建完这两条重要的线了,是不是特别简单?接下来和第一篇文章一样,在策略的next函数中,编写买入卖出逻辑:

    # Python 实用宝典
    def next(self):
        self.log('Close, %.2f' % self.dataclose[0])
        if self.order:
            return
        if not self.position:
            # 如果没有持仓,若前一天MACD < Signal, 当天 Signal < MACD,则第二天买入
            condition1 = self.macd[-1] - self.signal[-1]
            condition2 = self.macd[0] - self.signal[0]
            if condition1 < 0 and condition2 > 0:
                self.log('BUY CREATE, %.2f' % self.dataclose[0])
                self.order = self.buy()
        else:
            # 若已盈利10%,则卖出;若已亏损10%,则卖出。 
            condition = (self.dataclose[0] - self.bar_executed_close) / self.dataclose[0]
            if condition > 0.1 or condition < -0.1:
                self.log('SELL CREATE, %.2f' % self.dataclose[0])
                self.order = self.sell()

买入逻辑就是我们在原理中提到的,若前一天MACD < Signal, 当天 Signal < MACD,则第二天买入。

卖出逻辑则简单许多, 若已盈利10%,则卖出;若已亏损10%,则卖出。

设置佣金为千分之五,每次交易为100股,初始资金为10000元:

    cerebro.broker.setcash(10000)
    cerebro.addsizer(bt.sizers.FixedSize, stake=100)
    cerebro.broker.setcommission(commission=0.005)

在命令行中运行脚本:

python macd.py

得到回测结果如下:

其实结果好得出乎意料,因为这是一个不算复杂的策略,在代码最后加上一句

cerebro.plot()

能看到整个策略的回测情况如图:

用红色的框标记策略交易成功上涨部分,绿色的框标记下跌部分。

可以看到,8次操作中盈利了7次。为什么能有这么好的结果呢?首先, 603186 是一个业绩不错的股票,其本身基本面不差,回测的前期也处于上涨状态,因此其回测效果极佳也就在意料之中。

【转】Python 量化投资实战教程(2) —MACD策略相关推荐

  1. Python 量化投资实战教程(2) —MACD策略(+26.9%)

    量化投资系列文章: Backtrader 教程 - Python 量化投资实战教程(1) Python 量化投资实战教程(2) -MACD策略(+26.9%) Python 量化投资实战教程(3) - ...

  2. Python 量化投资实战教程(4) —KDJ 策略

    量化投资系列文章: Backtrader 教程 - Python 量化投资实战教程(1) Python 量化投资实战教程(2) -MACD策略(+26.9%) Python 量化投资实战教程(3) - ...

  3. Python 量化投资实战教程(3) —A股回测MACD策略

    量化投资系列文章: Backtrader 教程 - Python 量化投资实战教程(1) Python 量化投资实战教程(2) -MACD策略(+26.9%) Python 量化投资实战教程(3) - ...

  4. Python 量化投资实战教程(6) — 交易平均收益率

    量化投资系列文章: Backtrader 教程 - Python 量化投资实战教程(1) Python 量化投资实战教程(2) -MACD策略 Python 量化投资实战教程(3) -A股回测MACD ...

  5. 可转债交易薅羊毛策略 — Python 量化投资实战教程(10)

    往期推荐 量化投资原来这么简单(1) 量化投资原来这么简单(2)-MACD策略(+26.9%) 量化投资原来这么简单(3) -A股回测MACD策略 Python 量化投资原来这么简单(4) -KDJ ...

  6. A股回测“孕线”策略 — Python 量化投资实战教程(8)

    上一篇系列文章<Python 量化投资实战教程(7)-孕线真的有用吗?>中我们讲到了孕线的形态和其基本的量化规则. 不过,当时只是基于一支股票对这个策略进行回测,数据量过少,其结果并不具有 ...

  7. 【转】Python 量化投资实战教程(1) — Backtrader 教程

    都说 Python 量化投资 非常好用,但是很多人都不知道该怎么做,甚至觉得是非常高深的知识,其实并非如此,任何人都可以在只有一点Python的基础上回测一个简单的策略. Backtrader是一个基 ...

  8. Backtrader 基本使用教程 — 量化投资实战教程(1)

    都说Python可以用于量化投资,但是很多人都不知道该怎么做,甚至觉得是非常高深的知识,其实并非如此,任何人都可以在只有一点Python的基础上回测一个简单的策略. Backtrader是一个基于Py ...

  9. python量化策略源码_【Python量化投资】趋向系统指标策略 ADX、DMI指标用于股票池(附源码)...

    原标题:[Python量化投资]趋向系统指标策略 ADX.DMI指标用于股票池(附源码) [什么是ADX] ADX(average directional indicator) 平均趋向指数,常用的趋 ...

最新文章

  1. linux bash shell 判断变量是否在列表中
  2. mysql拒绝访问root用户_设置mysql的root用户允许远程登录
  3. Spring Boot集成CKFinder
  4. cytoscape使用方法_7种方法 ,订制你的专属venn图!-代谢组学/蛋白组学研究
  5. Nginx的Mainline version、Stable version、Legacy version的版本区别
  6. 车辆等红灯时是用N档还是D档呢?
  7. c# mysql datetime 判断为空 dbnull_转:SqlServer中的datetime类型的空值和c#中的DateTime的空值的...
  8. 【转载】RESTful 架构风格概述
  9. 【POJ 3279】【开关问题】Fliptile【暑期 No.5】
  10. xamarin.android listview绑定数据及点击事件
  11. 【PostMan】测试Post请求
  12. 应用程序无法正常启动0xc0150002怎么解决
  13. nginx: [emerg] events directive is not allowed here in /opt/myapi/nginx.conf:XX
  14. Unity机器学习3 ML-Agents模仿学习(Imitation Learning)
  15. 那村的人儿(村长)第十期数码照片后期处理全套培训教程
  16. 算法竞赛专题解析(0)--写作计划
  17. MOOC中国接受《环球时报》英文版专访:MOOC证书对求职有用吗?
  18. 平方逼近matlab,MATLAB上机实验——最佳平方逼近
  19. android 开机直接运行app并当做手机桌面
  20. 张杰和机器人_「配天机器人|视点」来福谐波:90后张杰的“生意经”

热门文章

  1. Python+Vue计算机毕业设计星空摄影网站4853e(源码+程序+LW+部署)
  2. 2019最全Python入门学习路线
  3. Mac入门必须要知道的10个小技巧
  4. iphone13如何设置音量键连拍 苹果13开启音量键连拍功能教程
  5. 软件测试自学简单吗?如何自学?
  6. Git 居然还有这么高级用法,你一定需要
  7. 超萌小白虎、小熊猫、神仙龙,气球狗
  8. AD域控搭建(win2008 R2系统)
  9. Python时间戳运用
  10. Kerberos的原理[资料存档]