以前研究如何做回测的时候,专门写了一个比较简单的回测模块,其原理就是将递增的K线数据传入一个空列表中,模拟k线真实的逐根增加的情景,然后是将回测过程中的交易存储到文件中,当需要当前的持仓和资金等信息时,就从文件中去读取,这实际上就是模拟我们实盘时从交易所的数据库获取我们当前持仓、资金信息的场景。
但是在回测比如一分钟k线时,一个币种一年的一分钟k线有1440 * 365 = 525600
条数据,进行回测就会非常慢。之前也尝试进行过改进,比如考虑到我们实盘交易时,从交易所获取的数据是有限制的,交易时只会返回最近的几百条k线数据,但是之前尝试优化的时候不知道什么地方出了问题吧,加之本来对回测也并不很在意,最后就不了了之了。
昨天闲来无事,就将之前的回测模块翻了出来。主要的优化地方有两个:
-
原先是回测过程中将交易记录保存到文件,每次获取持仓再从文件中读取,现在改为将交易数据先存放在内存中,待回测完成后将交易记录全部保存至文件。
-
原先的用于存放k线的列表会越来越大,每次计算指标锁需要计算的数据也越来越大,总之这是极不合理的,我们实盘交易只会用到最近的几百条k线数据。因此做了一个小小的修改,当k线的数量达到多少的时候,就将之前的旧的k线数据从列表中删除。
img
这样略作优化后,52万条一分钟k线数据回测,只用了10秒!
![](https://img.haomeiwen.com/i25280425/3475231150217f31.jpg)
为了验证回测结果是不是有问题,特意将为做修改前的回测模块进行了一下回测,当然,由于未修改前的回测实在是太慢了,我只比对了部分数据。
未经修改前的部分回测结果:
![](https://img.haomeiwen.com/i25280425/9fbc7891dc021e72.jpg)
优化后的同一时间段的回测结果:
![](https://img.haomeiwen.com/i25280425/6090a4f427da1849.jpg)
从两者的对比可以看出,回测结果是一致的。
完整的回测结果是一共有20780条交易记录,我们简单看一下资金曲线图:
![](https://img.haomeiwen.com/i25280425/279e92a3ace4ad53.jpg)
网友评论