数量技术宅团队在CSDN学院推出了量化投资系列课程
欢迎有兴趣系统学习量化投资的同学,点击下方链接报名:
量化投资速成营(入门课程)
Python股票量化投资
Python期货量化投资
Python数字货币量化投资
C++语言CTP期货交易系统开发
数字货币JavaScript语言量化交易系统开发
我们在进行量化策略回测的时候,免不了要做一些时间序列的操作,比如计算过去一段时间的某个技术指标、因子等等,即时是横截面的策略,也需要在横截面数据准备后,进行时间序列的回测,用以确定因子在回测周期内的表现。
在进行时序相关的回测操作时,我们通常有两种编写方式可供选择。第一种是循环回测,即按照时间序列由远及近,每次进入循环后计算指标或因子,并判断是否触发交易信号;第二种是利用矩阵进行数值计算,即先调用矩阵运算所有可能用到的指标或因子,再通过矩阵筛选的方式选出符合条件的交易信号并回测。
那么,这两种方式,相对来说哪种更能提高我们的回测效率?
如果数据量级比较小,这两种方式的差别不大。但是随着数据量级的增加,比如需要回测分钟k,甚至是逐笔的数据,或者需要回测过去很长一段时间跨度的数据,两者之间的运算速度(效率)差距会越来越明显。
这次的文章,我们就将以策略回测最常用的Python语言为例,来比较两种方法之间的效率差异。
普通数值计算比较
首先,我们抛开策略回测,先从数据量级增加的视角,来比较循环和矩阵运算的效率差异。这个比较的例子很简单,我们分别生成两个100万数据量级的数组,计算这两个数组每个对应元素的乘积,即A数组第一个元素与B数组第一个元素相乘,并将所有得到的乘积相加。
对于这个例子,我们既可以使用矩阵运算的方式,也可以使用循环的方式来实现。
一起来看实现的具体代码。对于矩阵运算,我们直接调用numpy库中的dot方法即可,而循环,则是通过100万次循环依次获取每个数组中对应的元素后不断加总。
我们特意在代码中记录了需要比较代码模块的运行起始和终止时间,通过这两个时间的差值,可以比较两种算法在执行时间上的差异。
可以看到,两种方法计算出了相同的结果,说明方法在功能上是完全可替代的,但是执行时间相差很大,矩阵运算的执行用了3秒钟,而循环运算则使用了493秒,在处理这个量级的数据上,两种算法的效率相差了100多倍,不可谓不大。
量化策略回测比较
我们再回到量化策略的回测,举一个简单的例子进行比较,我们使用股指期货IF的分钟k线,策略规则分钟k是连续上涨3次,或连续下跌3次开仓,持有固定分钟后平仓。这样的规则,我们同样可以使用循环运算以及矩阵运算两种方式,进行回测的编写。
先来看循环模式的实现逻辑,我们逐K线遍历、在循环内,单独计算每一个K线的指标、判断是否满足开仓条件、并且将每一笔交易在平仓的结果逐一加入到利润记录列表变量中。
再来看矩阵运算的实现逻辑,通过矩阵运行一次性计算得到使用指标,筛选出所有满足开仓条件的行,并根据筛选得到的子表统计计算回测结果。
我们同样在两种实现方式的起始和终止位置增加了时间戳的记录,以此来比较两种算法的执行耗时。
并且,我们对比两种算法得到的回测结果,回测结果也是完全一样的,说明算法可互相替代,我们没有理由不选择效率更高的算法来实现。
因此,在具体的量化策略回测中,矩阵算法的执行效率仍然是大大优于循环算法的,循环算法回测共耗时16409秒,而矩阵算法仅耗时809秒,两者差距在20倍。可以说,随着数据量级、算法复杂程度的增大,两者的差距还会进一步的扩大。
结论
通过对大数据量级的运算速度比较,以及一个具体量化策略的回测速度比较,我们可以得到以下结论:
1 量化策略回测与大规模数值计算一样,矩阵运算效率高于循环运算。
2 随着处理数据量级的增大,两者之间的速度差异将越来越大。
3 尽可能使用矩阵运算方式回测策略。如某些复杂逻辑策略无法完全做到矩阵运算,也可以用矩阵运算计算必须变量或做初步测试,如果初测结果理想,再加入循环算法逻辑做精细化测试。
4 涉及到大规模机器学习算法,通过矩阵运算模式优化代码,解决耗时问题。