据说可以用Python做量化投资,但是很多人都不知道怎么做,甚至认为是很高深的知识,其实事实并非如此,任何人都可以用一点Python来回测一个简单的策略。Backtrader是一个基于Python的自动化回测框架,由来自德国的DanielRodriguez编写,是一个简单易懂易用的量化投资框架。今天我们将尝试使用Backtrader进行简单的量化策略回溯。当然,第一篇文章会用最简单的投资策略,让你抢先一步。通过学习本文,您将能够学会以下简单的量化策略:买入:五日均线(MA5)与十日均线(MA10)形成金叉(MA5穿MA10)原理:卖出在最近的上升趋势中:五日价格移动平均线(MA5)和十天价格移动平均线(MA10)形成死叉(MA10交叉MA5)原理:这个策略在最近的下降趋势中真的有用吗?普通人可能要炒一辈子股票才能发现它的实际作用,但是用Python进行量化验证可以很快得到答案。1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。如果没有,请访问这篇文章:超详细的Python安装指南进行安装。Windows环境下,打开Cmd(开始-运行-CMD),苹果系统环境下,请打开Terminal(command+空格进入Terminal),准备开始输入命令安装依赖。当然,我推荐大家使用VSCode编辑器,复制本文代码,在编辑器下方的终端中安装依赖模块。多么惬意的一件事:Python编程的最佳搭档——VSCode详解指南。输入以下命令安装本文所需的依赖模块:pipinstallbacktrader如果看到Successfullyinstalledxxx,则安装成功。本文完整数据和源码可在公众号后台回复量化投资1下载。2.基本使用在开始之前,你必须了解backtrader的数据结构特点:self.dataclose[0]#当天的收盘价self.dataclose[-1]#昨天的收盘价self.dataclose[-2]#The前天刚开始用的时候也被作者的逻辑惊呆了,居然还能这么玩。总而言之,请记住这个功能,否则你可能根本看不懂攻略。2.1资金和佣金Backtrader模型初始化后,可以通过经纪商(broker)设置初始资金,如下:#-*-coding:utf-8-*-#Python实战宝典#量化投资就是这么简单(1)#2020/04/12importbacktraderasbtif__name__=='__main__':#初始化模型cerebro=bt.Cerebro()#设置初始资金cerebro.broker.setcash(100000.0)#策略执行前的资金print('StartingPortfolioValue:%.2f'%cerebro.broker.getvalue())cerebro.run()#策略执行后的资金print('FinalPortfolioValue:%.2f'%cerebro.broker.getvalue())reallifeInthestock在中国交易,每笔交易都需要支付一定的佣金,比如万物(交易量每10000元收取5元佣金)、万三等,在Backtrader中,只需要这样设置即可:大脑。broker.setcommission(0.005)setting需要设置每笔交易买入的股数,可以这样设置cerebro.addsizer(bt.sizers.FixedSize,stake=100)2.2LoaddataBacktrader调用数据集作为DataFeeds,default数据集是yahoo的股票数据,可以通过以下方式加载:data=bt.feeds.YahooFinanceCSVData(dataname='数据文件的位置',fromdate=datetime.datetime(2000,1,1),todate=datetime.datetime(2000,12,31))当然也可以加载自己的数据,但是需要设置每一列的含义,比如开盘价在第四列,然后open=3(从0开始),如下:data=bt.feeds.GenericCSVData(dataname='数据文件位置',datetime=2,open=3,high=4,low=5,close=6,volume=10,dtformat=('%Y%m%d'),fromdate=datetime(2010,1,1)、todate=datetime(2020,4,12))接下来我们用自己的数据进行回测,这样才有代入感。2.3构建策略使用backtrader构建策略是一件非常简单的事情。需要继承backtrader的策略类,重写一些方法来实现策略。比如重写我们自己的日志函数:函数,用于统一输出日志格式'''ifdoprint:dt=dtorself.datas[0].datetime.date(0)print('%s,%s'%(dt.isoformat(),txt))最重要的是重写我们自己的交易策略,比如我们开头提到的均线黄金交叉死叉策略:classTestStrategy(bt.Strategy):"""继承构建自己的bt策略"""defnext(self):#记录收盘价self.log('Close,%.2f'%self.dataclose[0])#是否正在下单,如果是,则不能提交第二笔订单ifself.order:return#你买了ifnotself.position:#还没买,如果MA5>MA10表示上升趋势,就买ifself.sma5[0]>self.sma10[0]:self.log('BUYCREATE,%.2f'%self.dataclose[0])self.order=self.buy()else:#已经买入,如果MA5
