01引言

backtrader是功能非常强大的量化回测框架之一,得到欧洲很多银行、基金等金融机构的青睐,并应用于实盘交易中。公众号Python金融量化针对backtrader的入门和应用已连续发布了四篇推文:《【手把手教你】入门量化回测最强神器backtrader(一)》、《【手把手教你】入门量化回测最强神器backtrader(二)》、《【手把手教你】入门量化回测最强神器backtrader(三)》和《backtrader如何加载股票因子数据?以换手率、市盈率为例进行回测【附Python代码】》分别介绍了backtrader整个框架的组成部分、回测系统的运行,策略模块交易日志的编写、策略参数的寻优,Analyzers模块的分析、策略业绩评价指标可视化分析以及扩张数据加载模块对市盈率因子进行回测等。上述文章有一个共同点是回测实例均以个股为交易标的,那么如何对股票组合进行回测呢?本文将重点介绍如何加载多只股票数据,并构建交易组合进行量化回测


02 股票组合回测实例

数据获取

第一步是数据获取和加载,A股数据个人一般使用tushare来获取,由于对多只股频繁获取容易出现接口报错,因此个人在本地搭建了一个股票数据库(关于数据库搭建请参照:《【手把手教你】Python面向对象编程入门及股票数据管理应用实例》)。注意,下面导入的update_sql和base是自己写的本地脚本,使用自己数据运行时请将其注释掉。


策略编写

下面以一个简单的“动量+趋势跟踪”策略作为示例。策略思路为:计算24只股票过去30日的收益率并进行排序,选择前10只股票加入选股池(动量),逐日滚动计算和判断:如果选股池中某只个股满足股价位于20均线以上且没有持仓时买入(以20日均线为生命线跟踪趋势);如果某只个股已持仓但判断不在选股池中或股价位于20均线以下则卖出。每次交易根据十只个股平均持仓(注意:最多交易10只个股)。


数据加载和回测系统设置

写一个循环遍历24只个股数据并加载到回测系统中,将初始本金设置为10万元,手续费为千分之一,回测结束打印出交易日记。

#加载数据

cerebro = bt.Cerebro()
for s in get_code_list():
feed = bt.feeds.PandasData(dataname = get_data(s))
cerebro.adddata(feed, name = s)

#回测设置
startcash=100000.0
cerebro.broker.setcash(startcash)
# 设置佣金为千分之一
cerebro.broker.setcommission(commission=0.001)
# 添加策略
cerebro.addstrategy(MyStrategy,printlog=True)
cerebro.run()
#获取回测结束后的总资金
portvalue = cerebro.broker.getvalue()
pnl = portvalue - startcash
#打印结果
print(f'总资金: {round(portvalue,2)}')
print(f'净收益: {round(pnl,2)}')

输出结果:

策略回测结果可视化

cerebro = bt.Cerebro()

for s in get_code_list():
feed = bt.feeds.PandasData(dataname = get_data(s))
cerebro.adddata(feed, name = s)
#回测设置
startcash=100000.0
cerebro.broker.setcash(startcash)
# 设置佣金为千分之一
cerebro.broker.setcommission(commission=0.001)
# 添加策略
cerebro.addstrategy(MyStrategy)

注意,plot_result是自己写的对回测结果进行可视化的脚本文件,代码比较长,此处省略,完整代码分享在“金融量化知识星球中(文末)。

bt.plot_result(cerebro)




03结语

本文着重介绍了如何使用backtrader进行股票组合量化回测,回测实例仅供参考,不构成任何交易建议。文中构建的“动量+趋势跟踪”策略,并没有对相关参数进行优化,而且股票组合的选股范围较小(待选股票只有24只,而每次交易组合不超过10只),不同交易周期、不同标的参数阈值设置可能存在较大差异。从回测结果的评价指标来看,该策略并不是很理想,年化收益只有11%,最大回撤21%,夏普比率只有0.95。当然,本文的目的不在于结果而是过程。总之,兄弟我先抛块砖,有玉的尽管砸过来


参考资料:

1. backtrader官方文档和安装包原生代码


关于Python金融量化


专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。