刚刚优化完自己的策略和回测程序,正好来回答一下
1,升级硬件,双路服务器架构,从i7-9700K 升级到双路金牌8180M性能大概能提高7-8倍性能。能用钱解决的问题真比优化代码简单暴力多了。
2,使用 Parallel库和Ray库进行并行计算和分布式并行计算。
Parallel(n_jobs=max_usage_of_cores)(delayed(回测函数)(codelist,
frequency,
model_account,
portfolio_batch,
verbose) for frequency,
verbose,
model_account,
portfolio_batch,
codelist in codelist_grouped)
可以简单实现并发回测,同时回测CPU核心数量的标的。
3,尽量少用Pandas.DataFrame,多用numpy,非用不可的情况下少用loc,iloc赋值,多用at.,iat。尽量不要用Dataframe.Apply处理复杂函数,这里可以发掘出大概10倍性能。
4,Numba,cython重写部分模块,注意需要在函数调用时将Dataframe转为numpy和做变量声明减少LLVM推导参数类型,这里大概可以提高6-7倍性能。
5,计算指标使用向量计算,& | ~ 是向量的and or not计算,可以同时用于ndarray和dataframe,这里比for循环可以提高大概60~70倍速度。
6,尝试不同的回测引擎,Zipline和Backtrader,检查测试选择最快的,这里可以提高大约2-3倍性能,这部分我不太推荐自己写cyhton,因为金融计算夏普率年化统计滑点手续费都是比较严谨的,拥有大量的公式和处理,自己写计算结果容易和这种成熟框架的不一致。这里要调整会花费大量的时间。