标的加到五十只以后,策略为什么越来越慢
发布时间:3小时前阅读:4
单只标的的策略跑一年回测只要几秒,加到五十只就变成几分钟,加到几百只可能直接卡死。多数时候不是电脑不行,而是代码里有几处重复劳动。
一、每根K线遍历全市场
最常见的写法是:每根K线,对每只标的都取一次历史数据、算一次指标、判断一次信号。数据请求的次数等于K线数乘以标的数,规模一上来就爆炸。
正确做法是先把数据一次性取全,转成内存里的结构,之后所有计算都在内存里做,不再触发请求。
二、指标重复计算
同一只标的的均线,在判断买入时算一次,判断卖出时又算一次。计算量翻倍不说,还可能因为取数时点不同导致两次结果不一致。
处理方式是每根K线只算一次,把结果缓存起来复用。
三、用循环代替向量化
逐行遍历做计算,在Python里很慢。把整个序列转成数组,用向量化运算一次算完,速度往往差几十倍。
指标计算、信号生成、收益统计,这三块都可以向量化。只有涉及逐笔状态变化的逻辑,才需要循环。
四、日志和打印
回测里每根K线打印一行,几十万行输出会拖慢几个数量级。回测阶段把日志级别调到只输出警告,实盘再打开详细信息。
五、数据结构的选用
频繁按标的查找,用字典而不是列表遍历。需要按时间对齐,用索引好的结构,不要每次线性搜索。
六、合理的分层
把策略拆成三层:数据层负责一次性取数和清洗;计算层负责向量化算指标;决策层负责逐笔判断。分层之后,慢的部分一眼就能看出来,优化也有明确目标。
七、先测量再优化
不要凭感觉改代码。在几个关键位置打时间戳,看看到底是哪一段慢。经验上,八成的时间花在两成代码上,而那两成往往是数据请求和重复计算。
八、一个容易忽略的循环
策略写好后如果频繁重启,每次重启都要重新加载历史数据。如果加载逻辑写得不够紧凑,启动一次要几十秒,一天重启几次就会错过开盘。
建议把启动流程分两步:先加载最少的必要数据快速进入可运行状态,再在后台补全历史数据。这样即使中途重启,也能在几十秒内恢复工作。
回测速度不是面子问题。迭代一次要等半小时,你就不会愿意做足够的测试,最后吃亏的还是策略质量。
股票开户欢迎找我!可以申请万0.854的股票佣金、etf 可转债佣金万0.5、国债逆回购一折(百万分之一)!量化软件QMT+ptrade免费使用!还有888、999资金靓号等你选!
温馨提示:投资有风险,选择需谨慎。



问一问
从业认证

+微信
分享该文章
