首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >固定一个 seed 还不够:并行回测要拆分随机数流

固定一个 seed 还不够:并行回测要拆分随机数流

原创
作者头像
量化行业新引擎
发布于 2026-10-19 11:36:30
发布于 2026-10-19 11:36:30
610
举报
文章被收录于专栏:AI量化视界AI量化视界

不少回测都会用到随机数,比如打乱样本、Bootstrap 重采样、蒙特卡洛路径,或者给参数搜索生成候选组合。单进程里固定 seed 通常能复现实验;换成多进程后,如果每个 worker 都执行 default_rng(42),几个进程会从相同状态出发,抽到完全一样的序列。程序虽然跑快了,有效样本数却没有按预期增加。

更合适的做法,是先建立一个根种子,再为各个任务派生独立的子随机数流。NumPy 的 SeedSequence 会把根熵和子节点位置混合起来,spawn 得到的子序列可复现,并且以很高概率互不重叠。最小写法如下:

代码语言:python
复制
from numpy.random import SeedSequence, default_rng
root = SeedSequence(20261019)
child_seeds = root.spawn(4)
rngs = [default_rng(s) for s in child_seeds]
paths = [rng.normal(size=1000) for rng in rngs]

重点不是简单把 seed 改成 42、43、44、45,而是明确管理随机数流的层级。根种子代表整次实验,子种子对应具体任务。排查结果时,保留根种子、NumPy 版本、worker 数量以及“任务编号—子种子编号”的对应关系,就能还原当时的随机输入。

我还会避免按进程完成顺序分配子种子。并行任务谁先结束受机器负载影响,如果完成一个再取下一个随机流,同一组参数在两次运行中可能对应不同序列。更稳妥的办法是先按固定顺序给参数组合编号,再绑定 child_seedsi,调度顺序变化也不会影响对应关系。

固定随机数流只解决随机输入的可复现性。底层库版本、浮点归约顺序、线程设置和原始数据变化,仍可能让结果出现差异。对量化实验来说,seed 应和代码版本、数据版本一起进入运行记录,而不是只在脚本开头留下一行数字。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档