# BackTrader初尝试 **Repository Path**: dl-high-strength/backtrader-initial-attempt ## Basic Information - **Project Name**: BackTrader初尝试 - **Description**: BackTrader是一个基于Python的自动化回溯测试框架, 作者是德国人。最近原本参与的一个项目搁浅,有点时间学习一下关于量化的知识,比较了一下,发现BackTrader是一个易懂、易上手的量化框架。今天我们就来试试用Backtrader进行简单的量化策略回溯。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2022-01-10 - **Last Updated**: 2022-01-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 基本介绍 一直都知道Python可以用于量化投资分析,很想学习一下这方面的知识,趁着最近参加的一个项目意外搁浅,花点时间入门下。 查了下现在市场上的基于Python的量化回测框架,开源的有zipline、vnpy、Pyalgotrade和backtrader等,量化平台有Quantopian、聚宽、万矿、优矿、米筐等。 既然是程序猿,还是弄个开源框架自己跑跑试试,比较了下觉得BackTrader(德国人写的)好像入门容易点,搭一个先试试看。 ## 安装步骤 1. BackTrader的安装很简单,支持从pypi安装pip install backtrader, 也支持从源代码安装https://github.com/mementum/backtrader, 加压后执行python3 setup.py install。 我执行了下源码安装,主要看看以后有没有时间学习别人怎么写的python工程。 2. 还需要安装一些backtrader需要的依赖需要安装 python3 -m pip install --upgrade tushare python3 -m pip install --upgrade pandas python3 -m pip install --upgrade datetime python3 -m pip install --upgrade matplotlib sudo apt install python3-tk tk-dev -y 3. 注册新版的tushare pro账户,个人主页获取token,这个是为了程序能通过tushare提供的接口获取行情数据。 ![用户注册](https://dengbao-file.oss-cn-beijing.aliyuncs.com/backtrader/1.PNG "用户注册") 也有其它些网站和交易商提供了行情数据接口,但是tushare用起来挺方便的,重点不在这里,不研究其它的了。 4. 新建一个目录,把程序firstsample.py, SimpleStrategy.py下载到目录下,直接执行python3 firstsample.py就能看到执行结果。 ![交易结果](https://dengbao-file.oss-cn-beijing.aliyuncs.com/backtrader/2.PNG "交易结果") 3. 简单解释一下程序 1) 准备连接tushare,从网上找一些股票代码(特意加上了太极,以后如果有好的策略,分析一下太极)。 TOKEN = '******************' pro = ts.pro_api(token=TOKEN) data = { 'code':['600819.SH','000612.SZ','000998.SZ','002009.SZ','300159.SZ','300048.SZ','600150.SH','002041.SZ','601669.SH','002368.SZ'], 'name':['耀皮玻璃','焦作万方','隆平高科','天奇股份','新研股份','合康新能','中国船舶','登海种业','中国电建','太极股份'] } frame = pd.DataFrame(data) stock=frame['code'] 2) 下述代码就是从tushare网站拉取数据,执行的结果就是生成了股票的每日行情文件,如图所示。 def fetch_daily_data(stock,start,end): data = pro.daily(ts_code=stock,start_date=start,end_date=end) data['trade_date'] = pd.to_datetime(data['trade_date']) data=data.sort_values(by = 'trade_date') data.index = data['trade_date'] data = data[ ['ts_code', 'open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_chg', 'vol', 'amount']] return data for i in range(len(stock)): data=fetch_daily_data(stock.iloc[i],'20200813', '20210813')#字段分别为股票代码、开始日期、结束日期 data.to_csv(stock.iloc[i]+'.csv') ![数据文件](https://dengbao-file.oss-cn-beijing.aliyuncs.com/backtrader/3.PNG "数据文件") 3) 收集输入,执行策略,回测。 //Cerebro类是backtrader的引擎,有以下几方面功能 //创建cerebro cerebro = bt.Cerebro() //循环获取10支股票历史数据 for i in range(len(stock)): //添加交易数据 data = bt.feeds.GenericCSVData( dataname=stock.iloc[i]+'.csv', fromdate=dt.datetime(2020, 8, 13), todate=dt.datetime(2021, 8, 13), dtformat='%Y-%m-%d', datetime=0,#定义trade_date在第0列 open=2, high=3, low=4, close=5, volume=9, nullvalue=0.0,#设置空值 ) cerebro.adddata(data) //回测设置 startcash=100000.0 cerebro.broker.setcash(startcash) //设置佣金为万分之二 cerebro.broker.setcommission(commission=0.0002) //添加策略 cerebro.addstrategy(SimpleStrategy,printlog=True) cerebro.run() //获取回测结束后的总资金 portvalue = cerebro.broker.getvalue() pnl = portvalue - startcash //打印结果 print(f'总资金: {round(portvalue,2)}') print(f'净收益: {round(pnl,2)}') 4. 还有一个文件SimpleStrategy.py就是动量+趋势跟踪的策略,策略思路为:计算24只股票过去30日的收益率并进行排序,选择前10只股票加入选股池(动量),逐日滚动计算和判断:如果选股池中某只个股满足股价位于20均线以上且没有持仓时买入(以20日均线为生命线跟踪趋势);如果某只个股已持仓但判断不在选股池中或股价位于20均线以下则卖出。每次交易根据十只个股平均持仓。 这个是从网上找的一个现成策略,我随便找了10只股票,并不完全满足策略要求,主要为了测试backtrader是否为我所用了,具体的策略问题等以后慢慢研究。 到这一步,一个backtrader的环境就搭建好了,backtrader还支持绘图, 以后的学习中再仔细研究一下。