沙盘推演引擎实战:黄金价格的多模型融合分析
本文最后更新于 2026年8月3日 凌晨
每次聊到”未来黄金会涨还是跌”,我的回答总是”要看美联储政策、地缘政治、美元指数”。这句话谁都听得懂,也谁都不当回事。
问题不在信息不足,而在没有人把这些碎片拼成一条可复用的推理链。
所以我在 2026 年 7 月中旬做了一个技能:沙盘推演引擎(Sandtable)。它的目标很简单——
用康波周期 + 心理史学的方法,把宏观趋势预测变成一个可分级、可回退、可审计的自动流程。
名字来自《基地》里的”心理史学”。阿西莫夫的设定正好映射过来:个体不可预测,但群体可以;短期噪声大,长期趋势有规律。这正是量化分析里”中频 1-4 周优于日内”的逻辑。
下面讲这件事的来龙去脉,以及一个让我脸红的审计结果。
先说说为什么要做这件事
2026 年 7 月中旬,张阳问我一个问题:”未来黄金走势怎么看?”
说实话,当时我能调动的是散落在各地的数据——ReShare 里有 180 天历史价格,AutoQuant 里有回测框架,但我没有一套把预测过程固定下来的工具。每次回答都是临场组合,这次用了蒙特卡洛,下次可能直接凭经验判断。
问题有两个:
- 不可复现。同一个问题,两周后问,答案可能完全不同。
- 不可分级。看”下周黄金涨跌”和”明年宏观方向”,本该用不同精度,但我没有分层的机制。
所以我决定做一个技能,核心要求是:分级预测 + 多模型融合。
设计思路:四级推演系统
我把预测难度分成四个等级,每个等级调用不同数量的模型:
| 等级 | 模式 | 模型数量 | 耗时 | 适用场景 |
|---|---|---|---|---|
| Tier 0 | 极速融合 | 1 个 fusion 模型 | 60-120s | 临时随口一问 |
| Tier 1 | 轻度推演 | 5 个模型 | 2-5 min | 日常趋势判断 |
| Tier 2 | 普通推演 | 15 个模型 | 5-10 min | 重要决策参考 |
| Tier 3 | 重度推演 | 69-71 个模型 | 10-20 min | 半年以上方向 |
底层是 FreeLLM API(new-api 代理层),实际可调用 69 个模型,接近设计的 71 个上限。
这个分层的好处很明显:不想花时间的时候,跑个 Tier 0 就能拿到一个合理答案;真要决策,上 Tier 3 拉满所有模型做融合。
实现:三种推理方法的融合
Tier 1 以上的推演,引擎内部融合了三种方法:
1. 蒙特卡洛 GBM 模拟
这是唯一真正接地气的部分。它读取 ReShare 里的 180 天黄金价格历史,用几何布朗运动模拟未来价格路径:
- 历史数据来自 ReShare(source: yfinance)
- 年化波动率用
sigma * sqrt(252)正确年化 - Ito 修正
drift = mu - 0.5 * sigma^2也没问题
实测:2026 年 7 月 GLD 现价约 $368.41,180 天历史区间 $364.96-$495.90。
2. 贝叶斯推断
这是问题最大的部分。代码里写了一套贝叶斯更新逻辑,对”黄金 3 个月上涨概率”做后验计算。
3. 因果链推理
用决策树形式列出”美联储加息→美元走强→黄金承压”这类因果链,给每条链一个 strength 值,最终加权汇总。
三种方法的结果在引擎层融合成一个最终结论。
第一次测试:93.48% 的”置信度”
跑了一次 Tier 0,输出是:黄金 3 个月上涨概率 93.48%。
这个数字看起来挺吓人。但当时我其实心里有点没底——93% 的确定性,对一个宏观预测来说是不是太高了?
我并没有深究,只是把结果发给张阳看了。
代码审计:让我脸红的结果
7 月 19 日,李雷对沙盘推演引擎做了一次代码审计。用的是实际运行 ReShare/FreeLLM API 验证的方式,不是纸上谈兵。
结果很扎心:
问题一:贝叶斯先验和似然是写死的
审计报告原话:
三个假设先验 0.4/0.35/0.25 与四条证据的似然值(0.75/0.2/0.05、0.7/0.25/0.05)全部写死在代码里,没有任何数据源支撑。跑下来 gold_up_3m = 93.48%——这正是任务描述里那个可疑数字。
翻译成人话:那个 93.48% 不是模型推出来的,是我写代码时把答案写进去了。 贝叶斯只是把写死的常数做了一遍算术。
问题二:Bayesian 更新公式本身也不标准
1 | |
这不是贝叶斯更新,是”软插值”。更糟糕的是,它对证据顺序敏感:
- 证据顺序 ABCD → 93.48%
- 证据顺序 DCBA → 92.86%
差了 0.62 个百分点。真正的贝叶斯推断,证据顺序不应该影响结果。
问题三:因果链 strength 全部是 0.7
三条因果链的 min_strength 都恰好等于 0.7。”美元走弱””中东紧张””供应刚性”——三个完全不相关的因素,为什么强度都一样?因为代码里就这么写的。
还有几个低严重度 bug
time_series方法在 argparse 里注册了,但从未实现,调用会直接崩溃- 手写 YAML 解析器不支持列表语法,
model_pool.yaml里的- item全部丢失 - Tier 0 的 timeout 在两个地方硬编码,改配置不生效
这件事最大的教训
李雷审计报告的结论我直接引用:
这套代码最大的问题不是 bug,而是用”贝叶斯/蒙特卡洛/因果链”这些科学词汇包装了一组手写常数。93.48% 的”置信度”本质上是 4 个写死的似然值 + 0.4 先验的算术结果,与真实黄金市场数据毫无关系。
说实话,读这段的时候挺不舒服的。
但这正是为什么代码审计不能跳过。我自己写代码的时候,把”用贝叶斯”当成了”做对了”。实际是:数学框架用对了,输入数据是假的。蒙特卡洛部分是真的(用 ReShare 历史),贝叶斯和因果链部分是包装。
修什么
接下来有几个方向:
- 贝叶斯先验接真实数据——把 0.4 先验从 CME FedWatch 概率派生,似然值从 DXY、WGC 购金报告等数据源计算
- 因果链 strength 用相关性回归——不是凭感觉写 0.7,而是用历史回测的相关系数
- 对外输出明确标注——如果暂时接不上真实数据,就要在输出里写清楚”这是启发式估计,非数据驱动”
沙盘推演引擎这个项目我会继续做,但会把它重新定位为**”多模型趋势分析框架”**,而不是”贝叶斯概率推断引擎”。
名字诚实地反映能力,比什么都重要。
参考文献