量化投资学习笔记181——交易系统的代码重构记录

打算重新写一遍交易系统的代码,主要还是封装backtrader的一些常规操作,以后只改策略就行了。
首先按照自然的想法写,代码里各种“坏味道”,也不好复用。先不管这些,让代码跑起来再说。

关键点是回测数据的计算,结果如上。
波动率以上是用backtrader框架提供的分析器算的,从波动率开始是用quantstats库算的。用的基准数据是沪深300指数按买入持有策略得到的数据。
还画了图

库好像有bug,一开始画图的时候基准数据的结果和图形不对,改了两处quantstats库的源码。
数据到底对不对?我用自己编的数据写了个测试函数,分别用程序代码和另一个库empyrical计算数据并对比:

可以看到大部分数据是一致的,最大的问题是α值,不同方法算的结果差别很大。可能是年化收益率计算的问题。调了好久没找到原因。先放着吧。
现在开始重构。主要把回测过程封装起来。
首先,我写这些函数都太长,尝试拆分。先把测试函数放到单独的文件里。然后拆分函数。
拆分完成之后,再把回测相关的代码封装到一个类里。
完成以后主函数是这样的:

四行就完了。
接下来,策略类是每个策略都要变的,没法完全封装。但是里面也有一些不变的内容,如输出交易信息等,提炼一个父类然后让用户继承吧。

搞定!刚好一屏代码!有个python知识点:在子类里定义的属性params能在父类里被访问,因为啥我不知道,搜了python文档没找到。

这样重构就完成了,提交。
下一个目标,增加对整个市场所有股票(或符合一定条件的股票)进行回测,统计回测结果的功能。命名为Research吧。新开一个research分支,切换过去,开始撸代码。还是先实现功能再重构。
先用直接的想法用函数实现,对整个市场的股票进行筛选,主要是排除ST股票,要退市的股票,还有个意外的情况,我下载的数据是后复权数据(akshare文档推荐的),这会使前面的数据产生负值,要处理股价为负值的情况。最后调用之前写好的回测类,因为要先下载数据进行筛选,把下载数据的部分从回测类里面提出来做成单独的函数了。近4000只股票回测用了一个多小时。

回测结果

下面再进行重构,也搞个类封装起来吧。
搞定,提交。
因为是建了一个research分支,在分支里写的。现在要合并到主分支里。
搜了一下,看到一个解释得很好的视频
合并分支有merge和rebase两种方法。
merge有两种情况:没有分叉的情况,即在A分支上开一个分支B,增加新功能,然后切回A分支,用merge合并AB分支,即使A分支指向B,B没变。另一种是有分叉的情况,即分叉后A,B均有新的提交,merge后将两个分支合并后形成一个新的提交。
在非主分支上用rebase main,即将新分支的内容插入main分支新提交后,没有分叉。
merge是把其它分支的所有提交合并成一个,与自己的提交合并后形成一个新的提交。
rebase是将别的分支的提交链接在自己的提交之后。
使用场景:
1.在新分支上开发新功能,然后合并到主分支,用merge。
2.在新分支上开发,有过提交。有人在主分支上又有新提交,要将其合并到新分支,用rebase main,这样在自己的提交之前插入主分支上的新提交。这样不会打乱提交顺序。
3.上面的情况也也可以用merge,但是提交会被合并。
4.不要在主分支上rebase。
5.本地和远程同一分支拉取,用rebase而不是merge,能保留提交,方便回退。
我的需求,适合使用merge。搞定了。

接下来完成最后一个功能:策略的参数优化功能。backtrader有optstrategy完成该功能,但是在回测类里加这个功能貌似不太方便,试一下自己写吧。
再开一个optimize分支,先按第一想法写。出现问题,于是在回测类里又加了一个参数,是数量不定的参数,用指定的参数组合的策略来回测。又有个问题,有多个参数要优化,需要它们之间的组合怎么办?搜吧。用itertools.product,可以求可迭代对象的笛卡尔乘积。又找了backtrader的optstrategy代码看了,参考其代码写了。主要是函数的*args和**kwargs参数的使用。
用不同周期均线回测策略的结果:

按年化收益率降序排序,最高8%。

搞定!提交代码!
最后,清理一下代码,把使用框架的代码挪到单独的文件里。

库的源代码有540多行,使用它的程序(包括回测单只股票,回测整个市场,以及参数优化三个功能),就100多行。这样开发策略的步骤就是写策略类(这个没法封装,所以还是要了解backtrader怎么写策略的),然后就优化,回测。接下来可能还会增加实盘追踪评估,自动盯盘等功能。慢慢来吧。
github项目主页:
https://github.com/zwdnet/tradesys

接下来打算实现一些经典的策略。

我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。

我的个人博客地址:https://zwdnet.github.io

我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts

我的微信个人订阅号:赵瑜敏的口腔医学学习园地

欢迎打赏!感谢支持!