中午吃完饭,就凑时间回答一个问题。
前几天有一个读者咨询我backtrader计算的指数移动平均线指标和通达信计算的指数移动平均线指标不一样的问题。
首先必须明确的是,如果不同平台上,指标使用的算法是一致的话,除了一些因为浮点数的误差导致的不一致之外(小概率而且大家需要的精度也不会那么高),其他的应该都是一样的。
我在使用中也发现了一些问题,backtrader指标计算的结果和其他平台不一致,比如backtrader自带的atr指标和talib的atr指标计算的结果不一致,可能是有很多原因:
确保两者使用的数据是一样的。使用数据不同,很容易导致计算的指标不一样。
确保不同平台上的同一个指标计算的算法是一致的。如果算法不一致,计算的结果很可能不一样。
对于需要依赖过去历史数据的指数类的指标,需要确保开始计算指标的时间是一致的。
在不同的交易平台之间,有一个很大的问题就是,有些平台计算的指标,如果数据没有满足的情况下,是不会开始计算指标的;而有的平台会计算。这种处理方式,也会导致某些指标的计算不一致,至于说哪种情况更好,也说不上来,从我的个人经验来看,对我做策略其实影响不大。
好了,讨论下如何应对?backtrader毕竟是一个开源的量化平台,和其他指标不一致的时候,如果追求完美,希望能够实现和其他指标一致,这个是可以实现的。
就像前面几篇的答读者问中,提到了计算指标的一些问题,可以把一些指标先在pandas中计算,也可以在backtrader中计算具体的指标,如果能够实现向量化的计算,那就速度会快很多,和pandas中计算的效率差不多;
如果在backtrader中不能实现向量化的计算,需要在next中计算的话,和能在pandas中直接计算出来的指标相比的话,效率会差上很多,这就涉及到底层上的程序语言的运行效率了。pandas主要是基于numpy,而numpy是基于C、C++这些运算效率更高的语言实现的,所以,本质上,pandas也是基于C的实现,并且一些算法都经过很多人的优化,所以效率更高一些。backtrader是基于纯python的计算,运行效率会差很多。
【答读者问25】如何把一个pandas计算的指标改造成一个backtrader的指标?
backtrader中有一个废弃的版本,是希望用numpy去实现line的数据结构,这个挺有意思的。后续如果我有精力和时间,会考虑下这个版本,看能否给backtrader带来一个质的提升;或者考虑使用cython\c++重写一下。在公司大规模使用,效率还是稍微有些低。
目前,在没有好用的开源的c\C++、Java、Rust之类高运行效率的编程语言的量化框架出来之前,backtrader还算是比较优秀的,不仅仅是在python的量化框架中。
对了,还要聊一聊如何把指标在backtrader中进行向量化实现的问题。
有些简单的指标是可以向量化实现的,但是有些复杂的指标,是很难向量化实现的,这就跟为啥向量化的回测平台,很难做出来一些复杂的策略一样。