如何提高量化策略回测的效率
如何提高量化策略回测的效率
在量化策略回测中,我们常常需要进行时间序列操作,比如计算过去一段时间的技术指标或因子。这些操作可以通过循环回测或矩阵运算两种方式实现。本文将通过具体代码示例和实验数据,比较这两种方法的效率差异。
循环回测 vs 矩阵运算
循环回测是按照时间序列由远及近,每次进入循环后计算指标或因子,并判断是否触发交易信号。而矩阵运算则是先调用矩阵运算所有可能用到的指标或因子,再通过矩阵筛选的方式选出符合条件的交易信号并回测。
当数据量较小时,两种方法的差别不大。但随着数据量的增加,比如需要回测分钟K线或逐笔数据时,两者之间的运算速度差距会越来越明显。
普通数值计算比较
我们先从数据量级增加的视角,比较循环和矩阵运算的效率差异。这个比较的例子很简单,我们分别生成两个100万数据量级的数组,计算这两个数组每个对应元素的乘积,即A数组第一个元素与B数组第一个元素相乘,并将所有得到的乘积相加。
对于这个例子,我们既可以使用矩阵运算的方式,也可以使用循环的方式来实现。一起来看实现的具体代码。
对于矩阵运算,我们直接调用numpy库中的dot方法即可,而循环,则是通过100万次循环依次获取每个数组中对应的元素后不断加总。我们特意在代码中记录了需要比较代码模块的运行起始和终止时间,通过这两个时间的差值,可以比较两种算法在执行时间上的差异。
可以看到,两种方法计算出了相同的结果,说明方法在功能上是完全可替代的,但是执行时间相差很大,矩阵运算的执行用了3秒钟,而循环运算则使用了493秒,在处理这个量级的数据上,两种算法的效率相差了100多倍,不可谓不大。
量化策略回测比较
我们再回到量化策略的回测,举一个简单的例子进行比较,我们使用股指期货IF的分钟K线,策略规则分钟K是连续上涨3次,或连续下跌3次开仓,持有固定分钟后平仓。这样的规则,我们同样可以使用循环运算以及矩阵运算两种方式,进行回测的编写。
先来看循环模式的实现逻辑,我们逐K线遍历、在循环内,单独计算每一个K线的指标、判断是否满足开仓条件、并且将每一笔交易在平仓的结果逐一加入到利润记录列表变量中。
再来看矩阵运算的实现逻辑,通过矩阵运行一次性计算得到使用指标,筛选出所有满足开仓条件的行,并根据筛选得到的子表统计计算回测结果。
我们同样在两种实现方式的起始和终止位置增加了时间戳的记录,以此来比较两种算法的执行耗时。并且,我们对比两种算法得到的回测结果,回测结果也是完全一样的,说明算法可互相替代,我们没有理由不选择效率更高的算法来实现。
因此,在具体的量化策略回测中,矩阵算法的执行效率仍然是大大优于循环算法的,循环算法回测共耗时16409秒,而矩阵算法仅耗时809秒,两者差距在20倍。可以说,随着数据量级、算法复杂程度的增大,两者的差距还会进一步的扩大。
结论
通过对大数据量级的运算速度比较,以及一个具体量化策略的回测速度比较,我们可以得到以下结论:
- 量化策略回测与大规模数值计算一样,矩阵运算效率高于循环运算。
- 随着处理数据量级的增大,两者之间的速度差异将越来越大。
- 尽可能使用矩阵运算方式回测策略。如某些复杂逻辑策略无法完全做到矩阵运算,也可以用矩阵运算计算必须变量或做初步测试,如果初测结果理想,再加入循环算法逻辑做精细化测试。
- 涉及到大规模机器学习算法,通过矩阵运算模式优化代码,解决耗时问题。
本文原文来自CSDN