当前位置: 首页 > 后端技术 > Python

Python量化投资实战教程(二)-MACD策略(+26.9%)

时间:2023-03-25 23:12:28 Python

量化投资系列文章:Backtrader教程-Python量化投资实战教程(一)Python量化投资实战教程(二)-MACD策略(+26.9%))Python量化投资实战教程(三)——A股回测MACD策略Github仓库:https://github.com/Ckend/pythondict-quant上次简单用Python和backtrader使用最简单的买卖策略进行了一次量化投资分析:backtrader教程-量化投资实战教程(一)这次让我们把策略复杂一点,使用MACD策略的信号线交叉交易方式:本系列教程Github源码仓库:https://github.com/Ckend/pythondict-quant1。原理为了解释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(9)的EMA和图中那些方块,那么就是MACD线-信号线得到的差值,上面是正值,下面是负值。知道了这一点,我们就可以开始构建回测脚本了:买入:当前一天MACD线的值<前一天信号线的值和当日MACD线的值>的值当日的信号线,表示黄金交叉已经出现,此时看涨,隔日买入。卖出:如果获利10%,就卖出;如果您损失了10%,您将卖出。本策略以股票603186为例,每次成交100股,年化收益率为26.9%。2.在开始之前,您必须确保您的计算机上已经成功安装了Python和pip。如果没有,请访问这篇文章文章:超详细的Python安装指南进行安装。如果使用Python进行数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手-AnacondaWindows环境打开Cmd(开始-运行-CMD),苹果系统环境请打开Terminal(命令+空格输入Terminal),准备开始输入命令来安装依赖。当然,我更推荐你使用VSCode编辑器,将本文代码复制,在编辑器下方的终端中运行命令安装依赖模块。多么惬意的一件事:Python编程的最佳搭档——VSCode详解指南。在终端输入如下命令安装我们需要的依赖模块:pipinstallbacktrader如果看到Successfullyinstalledxxx,则安装成功。Backtrader的基本使用可以参考我们之前的文章:Backtrader教程——实战量化投资教程(一)本文所有代码请在Python实战宝典后台回复:量化投资2下载。3.构建策略如果你没有读过第一篇文章,你可能不知道如何构建这个策略。看得一头雾水很正常,建议先看backtrader教程——量化投资实战教程(一)。当然,如果你只想运行起来,修改一些参数,就可以在Python实战宝典:量化投资2后台下载全部源码。从MACD的原理我们知道MACD是从EMA线计算出来的,所以我们需要构造一个短期EMA和一个长期EMA。常规选择分别是周期为12和26的EMA线:frombacktrader.indicatorsimportEMAme1=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实战宝典defnext(self):self.log('Close,%.2f'%self.dataclose[0])ifself.order:returnifnotself.position:#如果没有仓位,如果前一天的MACD0:self.log('BUYCREATE,%.2f'%self.dataclose[0])自己。order=self.buy()else:#如果利润为10%,则卖出;如果损失为10%,则卖出。条件=(self.dataclose[0]-self.bar_executed_close)/self.dataclose[0]如果条件>0.1或条件<-0.1:self.log('SELLCREATE,%.2f'%self.dataclose[0])self.order=self.sell()买入逻辑就是我们在原理中提到的,如果前一天的MACD