前言双均线网格、阈值扫描动辄几十上百组参数单进程串行回测可能要跑一整夜。我试过用多进程并行能缩短墙钟时间但若每个子进程都抢同一 auth、或忘记api.close()反而报错或越跑越慢。天勤TqSdk回测每个组合宜独立TqApi实例进程间不要共享连接。下面说明何时值得多进程、Pool 骨架、auth 与资源限制、以及结果汇总习惯。单进程扫参流程在批量回测专题里已有展开本篇专注并行层。一、何时用多进程适合参数组合多、每组回测相互独立机器 CPU 核数 ≥ 4内存够同时开数个 Python不适合单组回测已占满内存Tick 长区间账户并发连接数受限子进程过多同时连服务器调试阶段先单进程跑通 23 组并行缩短的是「等待时间」不能替代样本外验证。二、子进程里独立 TqApi每个任务函数内创建、关闭 api不要把父进程的api传给子进程fromdatetimeimportdatefrommultiprocessingimportPoolfromtqsdkimportTqApi,TqAuth,TqBacktest,BacktestFinisheddefrun_one(params):fast,slowparams authTqAuth(账户,密码)# 或从环境变量读apiTqApi(backtestTqBacktest(start_dtdate(2023,1,1),end_dtdate(2023,6,30)),authauth,)symbolSHFE.rb2510klapi.get_kline_serial(symbol,60*5,data_length200)balanceNonetry:whileTrue:api.wait_update()# 省略双均线逻辑与单进程版相同exceptBacktestFinished:balanceapi.get_account().balancefinally:api.close()return(fast,slow,balance)if__name____main__:grid[(f,s)forfinrange(5,21,5)forsinrange(20,61,10)iffs]withPool(processes4)aspool:rowspool.map(run_one,grid)forrinsorted(rows,keylambdax:-(x[2]or0))[:10]:print(r)if __name__ __main__在 Windows 上必不可少否则 Pool 递归启动失败。三、并发度与 auth进程数建议从 24 试起观察是否出现连接失败、超时。同一快期账户多进程同时回测可能触发限流可分批跑或向官方确认并发策略。密码不要硬编码进每个子文件用环境变量。若频繁TqTimeoutError先降并发再查网络不要一味加进程。四、结果汇总与过拟合子进程返回元组列表后写入 CSVfastslowbalancenote排序取 Top 后必须在「未参与扫参」的区间再跑一轮。并行扫出的最优参数过拟合风险与单进程相同甚至更高扫得越多越容易撞噪音。五、常见失败原因现象可能原因子进程立即报错未close上次、Windows 未 guard main越跑越慢进程过多、内存交换结果全 None未捕获 BacktestFinished 或逻辑未成交认证失败并发超限或密码错误总结参数扫描墙钟时间过长时可在「每组回测相互独立」的前提下用多进程子进程内各自TqApiTqBacktest在BacktestFinished后取balance并close()父进程用Pool.map汇总为 CSV。不要把父进程的api传入子进程也不要多线程共享连接Windows 必须if __name__ __main__。并发数宜从 24 试起观察TqTimeoutError与认证失败是否随并发上升。并行只解决「跑得慢」不解决过拟合Top 参数必须在未参与扫参的样本外区间重跑并记录扫描组数。每组回测应记下 fast、slow、期末权益、回撤、成交笔数等排序后勿直接拿 Top 1 上实盘。Tick 长区间、内存已吃满时不宜再堆进程。实操上建议先单进程跑 9 组估单组耗时再开 4 进程对比总时长与失败率把稳定配置写入团队说明。auth 用环境变量注入结果文件param_search.csv与回测假设合约、手续费、区间一并归档三个月后仍能复现当时扫参条件。FAQ1能用 threading 吗回测 CPU 密集多进程通常优于多线程且不应共享 api。2多机分布式本篇不展开单机 Pool 够个人和小团队。3每组回测不同合约可以把 symbol 放进 params 元组即可。4Pool 里能用 Jupyter 吗不建议用独立 .py 脚本跑批。风险提示本文用于回测工程说明不构成投资建议。