还在用pandas处理tick数据?看看怎样将策略效率提升1000倍.
我们在设计量化交易系统时有一个非常重要的性能指标,即“内部响应时间”。该指标为从系统收到信息(比如价格数据)到发出委托的时间间隔。该指标只和量化交易系统内部处理数据的性能相关,和交易所、经纪商、天气或其他任何外部环境都无关联(也就是纯粹是您自己编程水平的问题)。
如果一个投资者的交易系统有更短的内部响应时间,那么在其他条件相同的情况下,他就能更快地发出委托,更快地成交。如果众多投资者采用相同或比较相似的策略(多亏了我们的科普工作,现在您也知道专业机构的策略思路了),那么速度最快的那个投资者就会占据最有利的地位,不但能够第一个入场成交,还能先人一步去止盈止损。
由于目前国内主要期货交易所的行情一般是500毫秒(1毫秒为千分之一秒)一个切片,我们的交易一般也就在毫秒级别完成。
如何去衡量策略代码的执行速度呢?
神通广大的Python可以实现的方式有很多,比如timeit函数。
还记得我们曾经介绍过如何用真格量化跑tick策略么,当时用的是Numpy里的array来处理一系列tick数据。这是否是最快的方法呢?我们可以用timeit来测测速度。
比如我们拿一个2×1000的数组来模仿针对tick数据的队列操作,即用一个队列存储5行数据,每行两个整数,有新的一行数据时就对这个队列进行先入先出的更新:
我们选来进行速度竞赛的选手包括Numpy、Pandas和Deque(还有其他的选手您可以自己试试),看看谁跑得更快。
测试结果如下:
**Deque :
0.00146322382114秒
Pandas :
2.10415453728秒
Numpy Array :
0.00657957320599秒**
跑得最快的Deque居然只用1.46毫秒就完成了操作,Numpy用了6.58毫秒,而Pandas用了惊人(慢得惊人)的2.1秒!
在这个队列操作上,Deque的速度是Pandas的1438倍,Numpy的速度是Pandas的320倍。
我们可以说,如果您不加考虑就使用Pandas来频繁处理队列数据,那很可能就输在了起跑线上。您的策略程序“内部响应”时间就已经将您排除在高频交易的朋友圈之外了。
如果您还在抱怨程序跑不快,不妨用timeit检查一下到底是哪个地方掉了链子。