QMT量化交易中的vba支持内置/原生python,并行计算速度提升10-100倍.
发布时间:6小时前阅读:10
有个做多品种轮动的用户跟我抱怨,他的策略要同时盯四十多个标的,每个标的算一遍指标,一轮下来要好几秒,行情早就跑过去了。他原来是在客户端里写脚本的思路,习惯了一个进程从头算到尾。其实客户端现在给了两种跑法:内置 Python 和原生 Python,用对了,这类批量计算能快出一个量级。
先把两者分清楚。内置 Python 是客户端自己带的解释器,脚本跟着客户端进程走,好处是不用装环境、打开就能写,坏处是受客户端调度影响,重计算会把界面拖慢。原生 Python 是你自己装的解释器,独立进程运行,库随便装、可以用多进程,适合做重活和数据预处理。两者不是替代关系,是分工关系。
并行计算快在哪,道理很朴素:四十个标的的指标计算彼此独立,本来就是可以拆开同时做的。串行是一根线穿四十个珠子,并行是四十根线一起穿。所谓十到一百倍的提升,是在“任务彼此独立、单任务耗时够长、机器核数够多”这三个条件同时成立时才有可能出现,条件不满足,加速比会很有限,甚至因为进程调度开销反而更慢。
落地按这四步走。第一步,把策略拆成“计算”和“决策”两段,计算段只负责算指标、算因子,输出一张表;决策段只读这张表,决定买还是卖。第二步,计算段放到原生 Python 里,用进程池按标的分组,每个进程处理一批,别一个标的开一个进程,进程本身的开销不小。第三步,结果通过文件或者本地数据库交接,格式统一,字段固定,两边都按同一份约定读。第四步,内置 Python 那侧只做轻量的读表和下单,保持回调里的代码短小,别在里面做重计算。
有三个坑要提前知道。一是别在回调里等计算结果,会把行情线程堵住,宁可上一轮的结果给这一轮用。二是进程池的创建要放在初始化阶段,反复创建销毁比计算本身还费时间。三是数据要一次给足,别让子进程自己去请求接口,容易触发限流。
判断标准:把你的计算段单独计时,串行跑一遍记下耗时,再并行跑一遍。加速比稳定在你机器核数的一半以上,说明拆得合理;只有一两倍,说明任务粒度太碎或者数据传递成了瓶颈,回去重新分组。
股票/量化开户欢迎找我!满足条件股票佣金万0.854、etf 可转债佣金万0.5、国债逆回购一折(百万分之一)!期权1.8元一张全包价!量化软件QMT+ptrade免费使用!还有888、999资金靓号等你选!
温馨提示:投资有风险,选择需谨慎。



问一问
从业认证

+微信
分享该文章
