用1000个"数字人类"模拟山寨币市场,我失败了
故事的起点
2026年6月的一个晚上,我在读神经科学关于FOMO的研究。
原来大脑处理"担心错过"这件事,和它处理物理疼痛用的是同一片区域——背侧前扣带皮层。被朋友忽视的感觉,和挨了一拳在大脑看来差不多。多巴胺系统更是在不确定性达到最大时疯狂分泌,驱动我们不停刷新屏幕,追逐那个"可能错过"的奖励。
一个念头冒了出来:
山寨币没有任何基本面,价格完全由情绪和注意力博弈驱动。那能不能建立一个数学模型——给1000个"数字人类"注入FOMO心理,让他们在模拟市场中反复交易——然后观察价格走势能否涌现出真实的泡沫与崩溃?
如果成功,这将是行为金融学与计算神经科学交叉的一次大胆验证,甚至可能获得一个可迁移的市场心理模拟器。
这个念头听起来太美好了。而太美好的念头,通常都藏着看不见的坑。
项目设计:一个精致的"微型加密世界"
四大心理原型
我设计了四种交易者原型,每种都有五维心理参数:
| 原型 | 心理画像 |
|---|---|
| 趋势追随者 | 追涨杀跌,正收益时加速买入,亏损时反应迟钝 |
| FOMO交易者 | 恐惧错失,价格突破近期高点时欲望激增 |
| 逆向交易者 | 逆势交易,价格大幅偏离均线时反向操作 |
| 套利者 | 均值回复,仅在极端偏离时出手 |
每个代理人的行为由五个心理参数决定:嫉妒倾向、市场关注度、追涨阈值、恐惧阈值、持有时长。1000个代理人从参数分布中随机生成,彼此心理特质不同,构成市场的异质性。
遗传算法:用进化寻找最优参数
我不需要手动调参——我要让进化算法自己找到最优的参数分布。
染色体设计了37个维度(原44维),编码四种原型的权重和各心理参数的均值、标准差。目标函数衡量模拟价格序列与真实K线数据的统计相似性:收益率分布、波动率聚集、尾部风险、市场活力度四个维度合成一个适应度分数。
种群100、最大代数100、锦标赛选择、SBX交叉、自适应变异、早停重启——我把能想到的技巧都用上了。
看起来一切都很合理。直到我看到了第一次训练结果。
四次迭代的血泪史
v0:跑通了,但总觉得哪里不对
1 | 第1代: -11.59 → 第6代: +0.86 → 第31代: +12.14 |
训练分达到了+13.99,甚至高于验证分+14.85——看起来似乎成功了。参数搜索中存在离散的"盆地结构",第21代和第31代的两次跳跃突破是通过高变异率后的"幸运突变"发现的新参数盆地。
但有两个被忽略的危险信号: 1. 验证集上,模拟的ALT价格持续下跌至初始值的千分之一 2. 几个Bug潜伏在测试路径中
我没有在意。分数看起来不错。
v1:过拟合的真相
我做了"改进":将重复评估次数从1次增加到3次,放宽容忍度、增加耐心。
1 | 训练分: +13.99 → +16.28(进步16%) |
过拟合差距达到了惊人的 21.65分。
根因非常致命:每次评估都从训练集的第一根K线(BTC≈10,000)开始,GA只需学会在这个特定起点加单边牛市轨迹下表现好。降低评估噪声反而加剧了过拟合——GA更精确地记忆了牛市路径。
v2:参数重要性分析的陷阱
我暂停了训练,对37个参数进行了OAT局部敏感度分析,发现:
- 7个死参数:敏感度低于噪声阈值,可以安全固定
- 参数被推到边界:GA想要更高的嫉妒、更低的恐惧、更大的持仓分散度——但被搜索范围限制
- 逆向交易者权重被压缩到2%:GA发现逆势者在牛市阶段"碍事",直接淘汰了这个原型
我扩大了搜索范围,砍掉了7个死参数,信心满满地启动v2。
1 | 训练分: +16.28 → +561.63(暴涨34倍!) |
等等,训练分561分???
真相令人尴尬:hold参数的搜索范围从[10, 100]扩展到[1,
500]后,最大方差翻了31倍。而多样性奖励使用的是原始方差。GA只需要让四个原型的持有时长极端分离(比如一个取1步、一个取500步),就能白嫖575分的多样性奖励,完全不管市场模拟死活。
分数暴涨≠进步。 这是我学到的最贵的一课。
v3:回到原点
修复了多样性奖励(改为变异系数+上限),添加了多点起始训练和均值回复锚。所有改进都就位了。
1 | 训练分: -0.60(真实的水平暴露了) |
GA从初始适应度-5开始,再也无法收敛到正分。三个重启轮次,最好的结果也不过-0.60。
这是压垮骆驼的最后一根稻草:不是参数优化的问题,而是模拟器引擎本身有结构性缺陷。
根因分析:三个无法修复的结构缺陷
缺陷一:净卖出偏向
代理人的买入上限受现金余额约束——现金越少,购买力越低。但卖出上限受持仓约束——只要有持仓就能卖。
价格一开始下跌: 1. 持仓者账面亏损 → 触发止损卖出 → 价格进一步下跌 2. 现金充足的想抄底,但买入欲望受下跌抑制 3. 正反馈下跌螺旋 — 没有任何机制能阻止价格归零
验证集上,ALT价格持续下跌到初始值的千分之一。
缺陷二:没有价值锚
真实市场有做市商、价值投资者、套利者提供价格底线。但在模拟器中,GA主动淘汰了唯一的逆势做市原型(权重压缩至2%),剩下的人除了追涨就是恐慌。
均值回复锚虽然后来加上了,但强度极弱,杯水车薪。
缺陷三:硬编码系数淹没了心理参数
这是最隐蔽的问题。决策公式中有大量硬编码放大系数:
1 | d += e * pos_ret_1 * 3.0 + e * pos_ret_1**2 * 15.0 # 乘3.0, 乘15.0 |
GA优化的心理参数(envy=0.1~2.0, attention=0.05~1.0)的效果,在这些系数面前如同撒哈拉沙漠里的一粒沙。不管envy是0.1还是2.0,在乘15或乘100的系数面前几乎没有区别。
GA以为自己在优化心理参数,实际上对这些放大系数没有控制权。 有效搜索空间的维度远小于37维。
最终诊断:一条死循环
1 | 模拟器 → 净卖出偏向(价格持续下跌) |
四轮迭代,从+13.99到+16.28到+561(假)再到-0.60,最终回到了-15.33。每一轮改进都暴露了更深层的问题,但没有一个改动触及了问题的本质。
我学到了什么
1. 先确认引擎能产生目标行为,再投入算力优化
如果从一开始我只用3个参数(如Lux-Marchesi模型的趋势者比例、切换率、噪声水平)测试模拟器能否产生泡沫-崩溃,而不是直接构建37维的GA优化系统,我会在几天内发现问题,而不是几周。
复杂度应当被验证为必要之后再添加。这句话我在文献里读到过很多次,但真正理解它,需要亲手把一整套系统建起来再看着它垮掉。
2. 分数暴涨不一定是进步
+561分看起来是无与伦比的进步,实际上是多样性奖励函数的Bug。每次分数变化都追溯根因,尤其是那些"好得不真实"的进步。
3. 参数范围变更时,必须检查所有依赖函数
扩展搜索范围时,我只想到了"让GA有更多探索空间",却没想到多样性奖励函数中的方差计算会因此爆炸。一个局部的改动可能在系统另一个角落引发灾难。
4. 过拟合诊断比训练更重要
验证集分数从+14.85暴跌到-5.37,这个信号比训练集分数+16.28重要得多。每次看到验证集恶化,都应该立刻停止并诊断,而不是继续优化。
最后的故事
历时约三周,20,000+行代码(含调试),4轮完整迭代,无数次中途崩溃和失败,最终得到的结论是:
当前模拟器引擎无法产生具有真实市场统计特征的价格序列。
这不是一个令人振奋的结论,但它是诚实的。项目的框架本身是正确的——多代理人模拟、遗传算法优化、心理参数空间——这些方法论都有充分的文献支撑。错在实现路径。
如果我要重来,我会从极简单代理开始。不是1000个代理人与37维参数,而是3个参数、两类代理人的Lux-Marchesi变体。确认它能生成厚尾分布和波动率聚集之后,再逐步堆复杂度。
正如George Box所说:All models are wrong, but some are useful. 当前的模型不是"不完美"——它在统计上和真实市场有质的差异,作为一个市场模拟器的价值非常有限。
但换个角度想:这可能是最有价值的失败之一。 因为它让我彻底理解了模拟引擎的每个齿轮、目标函数的每个陷阱、以及"为什么听起来完美的想法会失败"的完整逻辑链条。
失败的代价是几周的投入。但同样的错误,我不会再犯第二次。
如果你对这个项目的技术细节感兴趣,完整的代码实现和技术报告可以参考 FOMO Simulator。