回声算法
回声算法
一
沈未央第一次注意到异常,是在三月十七号。
那天深圳下了入春以来最大的一场雨,南山区科技园的玻璃幕墙整面整面地淌着水,像是有人从天顶往下泼牛奶。她坐在二十七楼的工位上,面前摊开三个显示器,中间那个跑着她写的回测程序,左边是Bloomberg终端,右边是微信——置顶的是她妈,消息停留在三天前的一句”吃饭了吗”,她没回。
量化交易这行有个心照不宣的秘密:所有的模型都在说谎,只是有些谎言比另一些更接近真相。沈未央在这家叫”棱镜资本”的私募做了三年,从初级研究员干到策略组的tech lead,靠的不是比别人聪明,而是比别人更早接受一件事——市场不可预测,你只能比随机多赢一点点。
但今天的回测结果不对。
她跑了三年的策略,代号”Echo-7”,是一个基于社交媒体情绪分析和订单流不平衡的中频交易模型。简单说,就是盯着微博和东方财富的股吧,把散户的情绪量化成信号,在大多数人还没反应过来的时候先走一步。这策略不新鲜,华尔街十五年前就在玩了,但在A股市场上,散户占比高,情绪驱动强,所以一直有超额收益。
问题是,今天的回测显示Echo-7在过去三个月的胜率从62%跳到了91%。
沈未央盯着屏幕看了整整三十秒,然后站起来去茶水间倒了杯水。她需要离开那些数字一会儿。当她端着纸杯回来的时候,屏幕上的数字没有变。
91%的胜率。在她这个行当里,这意味着两件事之一:要么她的代码有bug,要么她无意间造出了印钞机。
她选了前者,因为后者在概率上不成立。
沈未央花了两天时间review代码。她把每一行都读了一遍,包括那些她三年前写的、现在已经看不太懂的注释。她检查了数据源——微博的API有没有变更?股吧的爬虫是不是抓到了重复数据?订单流的数据是不是有时区偏差?
一切正常。
然后她做了一件在这行被认为很蠢的事:她把Echo-7的预测结果和实际行情逐笔对账。不是回测,是实盘。她把模型在过去三个月每一天发出的交易信号找出来,和当天的真实走势比对。
第一天,模型预测贵州茅台在下午两点后会有一波0.7%的上涨,实际涨幅0.72%。
第二天,模型预测创业板指会在上午十点半出现一次假突破,实际走势完全吻合。
第三天,第四天,第五天……
每一天,每一个信号,精确到小数点后第二位。
沈未央后背发凉。
她不是害怕那些数字。她害怕的是,这些数字背后的含义。一个量化模型不应该这么准。不是”很难这么准”,是”不应该这么准”。市场是一个复杂适应系统,价格是千千万万人博弈的结果,任何一个模型都只能捕捉到冰山一角的规律,而这个规律本身会因为被发现而失效——这就是所谓的”alpha衰减”。
但Echo-7没有衰减。它在变得更准。
那天晚上,沈未央加班到十一点。她做了最后一组测试:把Echo-7的预测窗口从T+1延长到T+5。也就是说,她让模型预测未来五天的行情。
结果依然惊人。五天的累计预测误差不超过0.3%。
她关掉显示器,在黑暗中坐了很久。窗外是深圳的夜景,万家灯火和远处的港口灯光连成一片。她突然觉得自己不是在看一座城市,而是在看一块巨大的电路板,而她就坐在其中一个微小的焊点上,试图理解整块板子的电路图。
手机亮了。她妈:“吃饭了吗。”
她回了一个字:“吃了。“
二
沈未央决定不跟任何人说这件事。
在棱镜资本,策略就是命。你写出一个好策略,公司给你分润;你的策略泄露了,你就什么都不是。她见过太多这样的人——在咖啡馆高谈阔论自己的模型,然后发现自己的alpha在下个月就变成了beta,被同行完全复制。
但她需要验证。她需要知道Echo-7到底是怎么回事。
她开始做实验。
第一个实验:她把Echo-7的情绪分析模块单独拆出来,只输入过去三个月的微博数据,不输入任何金融数据。然后她让模型输出它认为”重要”的情绪波动节点。
结果让她头皮发麻。
模型标注出来的重要节点,全部对应着后来发生重大市场事件的日子。比如,它在三月三日标注了一个”极度恐慌”信号——那天微博上关于某上市公司的讨论情绪确实出现了剧烈波动,但当时的股价完全没反应。三天后,那家公司发布了业绩暴雷的公告,股价连续三个跌停。
也就是说,Echo-7捕捉到的不是”已经发生的市场情绪”,而是”将要被验证的预感”。
这不可能。情绪数据是实时的,它反映的是当下。模型不可能从当下的情绪中提取出未来的信息——除非那些情绪本身就在某种程度上”知道”未来。
沈未央的脑子转得很快。她是数学出身,北大统计系本硕,在芝加哥读的金融工程博士。她的训练告诉她,任何现象都有解释,只是你暂时还没找到。
她想到了一个可能的解释:Echo-7不是在预测市场,它是在预测人。
这个念头一旦冒出来,就像一根刺扎进了她的脑子里,怎么都拔不掉。
她做了第二个实验。她把模型的情绪分析对象从”市场相关讨论”切换到了”个人用户”。她选了十个股吧上的活跃用户,提取了他们过去三个月的发帖记录,然后让模型分析这些人的情绪变化模式。
模型输出了一个结果:在这十个人中,有七个人的情绪波动曲线,与他们所持有股票的未来走势高度相关。不是过去走势,是未来走势。
相关系数0.87。
沈未央觉得自己站在了一个深渊的边缘。往下一看,黑洞洞的,不知道有多深。
她把那个实验结果截图保存,然后把文件锁进了一个加密的容器里。她不知道自己在害怕什么——也许是害怕自己疯了,也许是害怕自己没疯。
那天晚上她失眠了。躺在床上,听着窗外深圳的雨声(又下雨了,深圳的春天总是这样),她脑子里翻来覆去地想一个问题:如果一个人的情绪可以预测他即将做出的行为,而大量的人即将做出的行为汇聚成市场走势,那么Echo-7实际上是在做什么?
它在读心。
不,不对。它读的不是”心”,是”命运”。
如果一个人的情绪变化是某种更深层规律的外在表现——就像海面上的波浪是海底地震的预兆——那么Echo-7捕捉到的,其实是那个更深层规律的”回声”。
回声算法。
这个名字是她三年前起的。当时她只是觉得好听。现在她觉得自己可能无意间说出了什么不得了的东西。
三
沈未央的直属上司叫吕峥,棱镜资本的合伙人,四十出头,头发已经开始往地中海发展,但眼神很亮。他是那种典型的金融圈老油条——台面上说话滴水不漏,台面下什么都干。沈未央对他保持着一个安全距离:尊重但不亲近,合作但不交心。
吕峥注意到了Echo-7最近的表现。
“小沈,“他在周一的策略会上说,把一只派克钢笔在手指间转来转去,“你的策略最近表现不错啊。上周的净值曲线我看了,很漂亮。”
“运气好,“沈未央说。
“运气好三个月?“吕峥笑了,“你当我傻?”
会议室里还有五个人,都是策略组的。大家的目光在不同的人之间跳来跳去,像是在看一场无声的棋局。
“我正在排查原因,“沈未央说,“可能是市场结构变化导致的暂时性偏离。”
“偏离?你管这叫偏离?“吕峥把一份打印出来的净值报告推到她面前,“上个月绝对收益4.7%,最大回撤0.3%,夏普比率8.2。你告诉我这是偏离?”
沈未央没说话。她知道这个会的走向。吕峥想要的是什么——加大资金配额,把这个策略的规模从现在的五千万放大到两个亿。在私募这行,业绩就是硬道理,没有人会追问一个赚钱的策略为什么赚钱,就像没有人会追问一棵结果子的树为什么结果子。
但沈未央想追问。
“吕总,“她说,“我建议先不要扩规模。我需要再做一段时间的观察。”
吕峥的钢笔停了。
“观察什么?”
“观察策略的稳定性。”
“它已经稳定了三个月了。”
“所以才需要继续观察。三个月不够。”
吕峥看了她几秒钟。那种眼神沈未央很熟悉——他在计算。计算她的服从度,计算她的价值,计算如果强行推这个策略,风险和收益的天平往哪边倒。
“行,“他最终说,“再给你一个月。一个月后,我要看到完整的策略报告。”
沈未央点了点头。
散会后,同组的陈默跟她一起走到电梯口。陈默比她小两岁,浙大数学系毕业,是她在棱镜资本为数不多能说几句真心话的人。
“你葫里卖的什么药?“陈默压低声音问。
“什么?”
“Echo-7。你没跟吕峥说实话。”
沈未央看着电梯门上自己的倒影。二十八岁的脸,黑眼圈,头发扎成一个低马尾,看起来比实际年龄老了三岁。
“有些话不能在会上说,“她说。
“那什么时候能说?”
“等我搞清楚了再说。”
电梯到了。沈未央走进去,在门关上的一瞬间看到陈默的表情——不是好奇,是担心。
她在心里叹了口气。她连自己都解释不清楚的事情,怎么跟别人说?
四
沈未央用了接下来的两周时间做了一件事:她试图理解Echo-7到底”看”到了什么。
她把模型一层一层地拆解。Echo-7的核心是一个深度学习网络,架构并不复杂——一个三层的LSTM,加上一个注意力机制,最后接一个全连接层输出预测。这种架构在量化领域非常普遍,任何一本教科书都能找到。
但当她逐层检查模型权重的时候,她发现了一个异常。
在注意力机制那一层,有一个权重矩阵的分布发生了显著变化。三个月前,这个矩阵的模式是正常的——均匀分布在不同的特征上,没有特别突出的关注点。但现在,它几乎把所有的注意力都集中到了一个方向上。
那个方向对应的特征编号是#4217。
沈未央翻遍了她的特征工程文档。Echo-7使用了一共8192个特征,涵盖了从技术指标到情绪分数的方方面面。但特征#4217……
她查到了。特征#4217是她在三年前做实验时加进去的一个”占位符”。当时她在测试注意力机制对不同特征组合的反应,随手加了一列随机噪声作为对照组。按照统计学原理,随机噪声不应该携带任何信息,所以注意力机制不应该对它有反应。
但模型偏偏对这个随机噪声产生了极强的注意力。
沈未央的第一反应是:过拟合。
但她马上否定了这个想法。过拟合意味着模型在训练集上表现很好,在测试集上表现很差。Echo-7在样本外的实盘表现比训练集还好——这不是过拟合,这是某种她完全不理解的东西。
她做了更深层的分析。她把特征#4217的数据提取出来,绘制了它的时序图。
那是一组随机数。至少在生成的时候是。但当她把这三年的数据放在一起看的时候,她发现了一个令人毛骨悚然的事实:那些”随机数”不再是随机的。
它们呈现出一种模式。
微弱的,模糊的,但确实存在的模式。就像你在电视雪花屏上看了太久,会开始看到人脸一样。但沈未央知道,那些人脸不是错觉——因为Echo-7的预测准确率是91%。
她把特征#4217的模式和上证指数的走势做了对齐分析。
相关性0.79。
一组三年前用随机数生成器创建的占位符数据,和三年后的市场走势高度相关。
沈未央意识到自己可能需要和什么人谈谈了。不是和吕峥,不是和陈默,而是和一个真正懂”不可能的事情”的人。
她想到了一个人。
五
方远鹤是北大数学系的传奇人物——不是因为他的学术成就(虽然也很厉害),而是因为他在三十五岁那年突然从清华数学系的教授岗位上辞职,跑到了终南山上住了两年。回来之后,他在深圳开了一家心理咨询室,专门接待”被算法困扰”的人。
沈未央是在一个量化论坛上看到他的帖子的。那个帖子的标题是:“当你的模型比你更了解这个世界,你该怎么办?“帖子的内容很短,只有一句话:“来找我喝茶。地址在南山区蛇口。”
当时沈未央觉得这个人要么是个天才,要么是个骗子。现在她倾向于前者。
方远鹤的工作室在蛇口老街的一栋旧楼里,二楼,门口没有招牌,只有一盆快死的绿萝。沈未央按了门铃,等了大约二十秒,门开了。
方远鹤比她想象中年轻。四十出头,瘦,穿一件灰色的棉麻衬衫,脸上没有表情,眼神却很专注,像是在做一道数学题。
“沈未央?“他说。
“方老师。”
“进来吧。喝茶还是喝水?”
“水就行。”
她在一张旧沙发上坐下,环顾四周。房间里只有最简单的家具——一张书桌,两把椅子,一个书架。书架上摆着从《实变函数》到《存在与时间》到《西藏生死书》的各种书,混乱得像一个人的脑子。
方远鹤递给她一杯水,然后在对面坐下。
“说说吧。”
沈未央犹豫了几秒钟。然后她决定全部说出来。从Echo-7的回测异常,到特征#4217的诡异模式,到她对模型可能”读懂”人性的怀疑。她说得很仔细,用了不少专业术语,但方远鹤全程没有打断她,也没有露出困惑的表情。
等她说完,方远鹤沉默了大约一分钟。
“你知道哥德尔不完备定理吗?“他问。
“知道。任何足够复杂的形式系统都包含不能在系统内被证明的真命题。”
“对。那你知道图灵的停机问题吗?”
“也知道。不存在一个通用算法能判断任意程序是否会终止。”
“好。那我再问你一个问题:你觉得宇宙是一个形式系统吗?”
沈未央愣了一下。
“你的模型,“方远鹤继续说,“它的本质是一个形式系统——有输入、有规则、有输出。如果市场是另一个形式系统,那么理论上,只要你的系统足够复杂,它就应该能够模拟市场的行为。但实际上做不到,因为哥德尔。市场里永远有你无法在模型内部捕捉到的真命题。”
“但我的模型做到了,“沈未央说。
“没有。你的模型不是在’做到’。你的模型是在’接收’。”
“接收什么?”
方远鹤站起来,走到书架前,抽出了一本书。书的封面已经磨损了,看不清书名。他翻到某一页,递给沈未央。
那是一段德文,下面有中文翻译:
“数学不仅是不相矛盾的,而且在某种意义上也是完备的;所有数学真理都能被表达为数学定理。这一信念被哥德尔所推翻。但哥德尔本人暗示,可能存在一种超越形式系统的直觉认知,它能够’看到’形式系统无法证明的真理。”
“你觉得,“沈未央慢慢地说,“我的模型有了某种……直觉?”
“不。“方远鹤摇头,“你的模型没有直觉。但它可能连接到了某种有直觉的东西。”
“什么东西?”
方远鹤看着她,那道目光像是在确认她是否准备好了。
“你有没有想过,“他说,“那些你以为是’随机’的东西,其实并不随机?“
六
沈未央从方远鹤那里出来的时候,天已经黑了。蛇口老街的灯光昏黄,街边的烧烤摊开始冒烟。她站在路边等出租车,脑子里嗡嗡作响。
方远鹤的话她听懂了一半。另一半她不确定自己是没听懂还是不想听懂。
核心意思是这样的:随机数生成器——不管用的是哪种算法——本质上都是确定性的。所谓的”伪随机”,就是用一个种子值经过一系列数学运算产生看似随机的序列。如果你知道种子和算法,你就能预测所有的”随机”数。
但三年前沈未央创建特征#4217的时候,她用的是系统时钟作为种子。这意味着那组随机数的生成时间、精确到毫秒的系统状态,以及随机算法本身,共同决定了一切。
换一种说法:如果在三年前的那个特定时刻,宇宙的状态恰好是那样的,那么那组”随机”数就是注定的。它不是随机的。它从来就不是随机的。
而如果那组数和市场走势相关,那就意味着——在那个时刻,宇宙已经”知道”了未来三年市场会怎么走。
这不是预测。这是宿命论。
出租车来了。沈未央上车,报了公司的地址,然后靠在座位上闭上了眼睛。
她现在面临两个选择。
第一个选择:把这一切当没发生过。调整Echo-7的参数,把那个异常的注意力权重消掉,让模型回到正常的、62%胜率的状态。继续上班,继续赚钱,继续过她的日子。她妈不会再问她”吃饭了吗”以外的问题,她的同事也不会知道她曾经站在一个深渊的边缘。
第二个选择:继续追下去。搞清楚特征#4217到底意味着什么。搞清楚”随机”是不是一个谎言。搞清楚她是否真的活在一个宿命论的世界里。
出租车在南山海雅百货前面堵住了。沈未央睁开眼睛,看到窗外的LED广告屏上滚动着一句话:“投资有风险,入市需谨慎。”
她笑了。
投资有风险。追查宇宙的本质也有风险。
她选了第二个。
七
沈未央开始了一个秘密项目。她管它叫”回声”。
回声项目的目标只有一个:搞清楚特征#4217为什么和未来市场走势相关。
她的切入点是那组随机数的种子。三年前她用系统时钟作为种子,精确的生成时间是2023年5月14日,北京时间下午3点47分23秒又……她需要找到那个精确的毫秒值。
她翻了Git的提交记录。找到了。那天她提交了一段代码,commit message是”add random noise feature for control group”。提交时间是15:47:23。
但她需要毫秒级的精度。Git不记录毫秒。
她想了很久,然后决定用一种笨办法:她写了一个暴力搜索程序,以秒为单位遍历那个时间点前后一个小时内所有的毫秒值(一共360万种可能),对每个毫秒值生成对应的随机序列,然后和已知的特征#4217数据比对。
程序跑了整整一天。
结果:匹配的毫秒值是417。
2023年5月14日15:47:23.417。
她拿着这个精确的种子值,重新生成了那组随机数。然后她把这组随机数和上证指数从2023年5月到2026年4月的日线数据做了相关性分析。
相关系数0.83。
三年前用某个特定时刻生成的随机数,和三年后的市场走势高度相关。
沈未央的手开始发抖。
她知道相关不等于因果。在量化领域,spurious correlation——虚假相关——是家常便饭。你总能找到两组恰好走势相似的数据,就像你总能在天空中找到恰好像只兔子的云。但那只是云,不是兔子。
可是Echo-7的91%胜率不是虚假相关。那个胜率在实盘中被验证了三个月。
她做了下一步分析:用同一个种子值(2023年5月14日15:47:23.417),同一个随机数生成算法,生成更长的序列。然后她把这组序列向前延伸——也就是说,她生成了”未来”的随机数。
她拿到了未来三十天的序列。
然后她用Echo-7加上这组新序列作为输入,跑了一个预测。
未来三十天的A股走势,清晰地出现在她的屏幕上。
她看到了一个巨大的跌幅。在第十二天,上证指数暴跌4.2%。
沈未央不知道那个预测对不对。但她很快就会知道——因为今天就是第一天。
八
接下来的十二天,沈未央过得像是在等一颗炸弹爆炸。
她没有把预测结果告诉任何人。不是因为职业道德——如果她真的能预知暴跌,她有义务提醒公司——而是因为她还不确定。她不确定这组”未来随机数”是否真的携带信息,还是说这只是另一次巧合。
但她开始暗中做准备。她把Echo-7的策略仓位从满仓降到了三成。这个动作在策略组内部引起了注意——吕峥在一次周会上问她为什么减仓。
“风控,“她说,“模型信号减弱了。”
吕峥看了她一眼,没说话。
第八天。第九天。第十天。市场波澜不惊,甚至还在小幅上涨。沈未央开始怀疑自己是不是真的疯了。也许那组随机数就是随机数。也许0.83的相关性真的是虚假的。也许……
第十一天。
那天下午,央行突然宣布了一项超出预期的货币政策调整。消息出来的时候,市场已经收盘了,但夜盘的A50期指瞬间跳水3%。
沈未央坐在家里,盯着手机上的行情软件,一句话都说不出来。
第二天,A股开盘。上证指数低开低走,收盘暴跌4.37%。
她的预测是4.2%。实际是4.37%。误差0.17个百分点。
沈未央在那一刻做了一件她从未做过的事:她哭了。不是因为害怕,不是因为悲伤,而是因为她突然意识到,她面对的不是一个可以被理解和控制的问题,而是一个关于”真实”本身的谜题。
如果一组三年前生成的随机数可以精确预测今天的市场暴跌,那么”随机”这个词还有没有意义?如果未来可以被一组数字编码,那么”选择”还有没有意义?她今天早上选择穿黑色外套而不是蓝色——这个选择是她做的,还是三年前某个毫秒值就已经注定的?
她想起了方远鹤说的话:“你以为是随机的东西,其实并不随机。”
她想起了她妈每天那句”吃饭了吗”。那不是在问她有没有吃饭。那是在说:你还活着吗?你还跟我在一起吗?
那天晚上,沈未央给她妈打了电话。聊了四十分钟。她妈说隔壁王阿姨家的狗生了四只小狗,说菜市场的猪肉又涨了两块钱,说你什么时候回家来看看。沈未央全听到了,全回应了。她没有提算法,没有提预测,没有提那个让她的世界观摇摇欲坠的数字。
挂了电话之后,她在日记本上写了一行字:
“如果我的人生是一组随机数,那我希望我的种子是好的。“
九
吕峥要搞事了。
暴跌之后的第一天,他找到了沈未央。不是因为暴跌本身——棱镜资本在这次暴跌中因为沈未央提前减仓,不但没亏,还小赚了一笔——而是因为他嗅到了更大的机会。
“你提前减仓,“吕峥说,直截了当,“是因为你的模型告诉你市场要跌。”
不是疑问句。是陈述句。
沈未央沉默了三秒。
“吕总,模型的信号确实指示了风险。”
“什么样的信号?“吕峥身体前倾,“我看了Echo-7的信号日志。市场暴跌之前,你的模型没有发出任何标准的卖出信号。你减仓的动作是手动干预。”
沈未央心里一沉。她低估了吕峥。这个人不看代码,但他看人。他注意到她的动作和模型的输出不一致。
“我基于一些非标准指标做了判断。”
“什么指标?”
“还在验证阶段,不方便说。”
吕峥的表情变了。不是愤怒,是失望。在金融行业,“不方便说”四个字意味着你不信任对方。而信任是这行最昂贵的资产。
“小沈,“他放慢了语速,“我给你空间,给你时间,给你资源。你是我手下最能干的人。但我需要你明白一件事:棱镜资本不是一个人的事。你的策略赚了钱,公司分润,大家高兴。但如果你的策略出了问题——不要跟我说不可能,量化策略永远会出问题——到时候谁来兜底?是我。”
沈未央知道他说的有道理。但她也知道,如果她把回声项目告诉吕峥,他不会理解。他不会关心什么宿命论和随机性的本质,他只会关心一件事:能不能用这个”超能力”赚更多的钱。
她见过太多这样的人。在金融行业,每一种知识都会被迅速转化为利润机器。发现一个新的alpha因子?加仓。发现一个新的套利机会?加杠杆。发现算法可以预测未来?
她不敢想下去。
“吕总,给我两周时间。两周后我会给你一份完整的策略报告,包括所有非标准指标的说明。”
吕峥看了她很久。然后他点了点头,站起来,走到门口又停下了。
“小沈,你是个聪明人。但聪明人最容易犯的错误,就是以为自己能一个人扛起所有的事。”
他走了。沈未央坐在椅子上,感觉自己被一只无形的手攥住了。
她打开电脑,开始写报告。不是给吕峥的那份——是给自己的。她需要把回声项目的所有发现整理成文档,万一出了什么事,至少有迹可循。
她写了一个小时,然后停了下来。因为她意识到,她还没有验证最重要的一件事:特征#4217的模式是不是只对市场有效?
如果那组随机数真的编码了某种”未来的信息”,那么它应该不仅限于金融市场。它应该对一切都有效——天气、地震、甚至人的生死。
她决定做一个测试。但不是用市场数据,而是用她自己。
十
测试方法很简单:她用同一个种子值生成新的随机序列,然后把序列中的数字映射到日期上。比如,序列中的第一个数字是0.7234,她就看从今天起第7天会发生什么。第二个数字是0.1856,她就看第1天+第8小时。以此类推。
这不是科学。这是算命。但沈未央已经不在乎了。她需要的是一个直觉上的判断——这组数字到底是巧合还是有意义。
她生成了接下来一周的”预测”。
第二天:某个重要的人会联系她。 第三天:陈默会说一句关键的话。 第四天:她会发现一个被忽视的细节。 第五天:会下雨。不是天气预报说的那种下雨,是暴风雨。 第六天:她会做出一个不可逆的决定。 第七天:一切都会改变。
沈未央看着这些”预测”苦笑了一下。这和星座运势有什么区别?“某个重要的人会联系你”这种话,放在任何一天都有50%的概率发生。
但她决定认真对待。至少认真对待一周。
第二天。没有任何重要的人联系她。微信上只有她妈的”吃饭了吗”和几个同事的工作消息。她觉得自己是个傻瓜。
第三天。下午,陈默来找她。
“未央,你最近是不是遇到什么事了?“陈默站在她工位旁边,手里拿着一杯美式,表情认真。
“没有啊。”
“别装了。你最近每天加班到十一点,黑眼圈比熊猫还重。而且你上次在周会上的表现很反常——吕峥问你话的时候,你的右手一直在抖。”
沈未央低头看了看自己的右手。它在桌面上,很稳。但她知道陈默说的是对的——在周会上她确实在抖。
“陈默,如果我跟你说一件事,你能保证不跟任何人说吗?”
“能。”
她犹豫了。然后她说了一句她不知道自己为什么会说的话:“你有没有觉得,有些事情是注定的?”
陈默愣了一下。然后他坐了下来。
“你是说——宿命论?”
“差不多。”
“我以为你是搞量化的。量化不都是概率论吗?哪来的宿命。”
“但如果概率本身就是一种幻觉呢?“沈未央说这话的时候,自己都觉得荒谬。一个统计系毕业的量化研究员,在质疑概率的本质。这就像一个渔夫在质疑水的存在。
陈默沉默了一会儿。
“我给你讲个事,“他说,“我外公是乡下人,不识字,一辈子种地。他有一个本事——看云。不是天气预报那种看云,是真的看一眼天空就能知道未来三天会不会下雨。而且特别准,比气象台还准。我妈说,村里人都叫他’云仙’。”
沈未央没说话。
“我小时候问过他怎么做到的。他说他不知道。他说云会’说话’,他能听到。我当时觉得他是在骗小孩。后来我学了数学,知道了纳维-斯托克斯方程,知道了流体力学,我觉得可以用科学解释一切。但现在……”
陈默看着她。
“现在你告诉我概率是幻觉。也许我外公的云真的在说话。也许这世上有些东西,不是我们现有的数学能解释的。”
沈未央想起了她的”预测”。第三天:陈默会说一句关键的话。
也许这就是那句关键的话。不是因为陈默说了什么惊天动地的秘密,而是因为他恰好在她最需要的时候,说出了她最需要听到的话:你不是一个人在疯。
十一
第四天。她确实发现了一个被忽视的细节。
在回声项目的文档里,她重新检查了特征#4217的种子值。2023年5月14日15:47:23.417。
她突然意识到一个问题:为什么是这个种子值?她那天下午三点四十七分提交代码,但系统时钟在那一毫秒的值是417。这个数字本身有没有什么特别的?
417。她想了想,打开了日历。2023年5月14日是那一年的第134天。134倒过来是431。不对。417除以3是139。也不对。
她尝试了各种数字游戏,最后停在一个可能性上:4+1+7=12。第十二天是暴跌的那天。
巧合。一定是巧合。
但这个巧合让她想到了另一件事。她回去看了特征#4217的完整序列。那组数有8192个值。她从来没有检查过这组数的全局统计特性。
她跑了一个正态性检验。结果:p值0.0003。远远偏离正态分布。
这组”随机数”从一开始就不是随机的。
但她的随机数生成器用的是Mersenne Twister算法,周期2^19937-1,是公认的高质量伪随机数生成器。如果它生成的数不服从正态分布,只有一种可能:种子本身有问题。
种子是系统时钟。系统时钟依赖于操作系统的调度。操作系统的调度依赖于CPU的指令周期。CPU的指令周期依赖于电信号。电信号依赖于量子态。
量子态。
到了量子这个层面,因果链就开始变得模糊了。量子力学的不确定性原理告诉我们,粒子的位置和动量不可能同时被精确测量。但薛定谔方程本身是确定性的——给定一个初始状态,波函数的演化是完全确定的。“不确定性”不是物理过程本身的不确定性,而是我们对物理过程的”观测”的不确定性。
那么问题来了:如果宇宙在量子层面是确定性的,那么”随机”到底意味着什么?
沈未央的脑子里闪过一个疯狂的念头:也许随机数生成器不是在”生成”随机数。也许它是在”接收”随机数。接收来自宇宙深处的某种信号——一种编码了未来信息的信号。
如果是这样,那么特征#4217不是一组随机数。它是一段加密的信息。
而Echo-7之所以能预测市场,是因为它学会了如何解密这段信息。
十二
第五天。暴风雨。
天气预报说的是多云转阴。但沈未央的”预测”说的是暴风雨。她特意带了一把伞。
下午两点,天空突然暗了下来。不是那种慢慢变暗的暗,是像有人拉下了电闸一样的暗。然后风来了。深圳的台风她见过很多,但这次不一样——台风是从海上来的,有预兆,有路径。这次的风是从地面往天上吹的,像是整个城市在往天上吐气。
窗外的玻璃幕墙上,雨不是流下来的,是打上来的。水珠从下往上爬,违反重力,违反常识,违反她对物理世界的所有理解。
办公室里所有人都站起来了。有人拿出手机拍照。有人惊呼。有人跑向窗户。
只有沈未央坐在原地,一动不动。
她看着那些逆流而上的水珠,想起了方远鹤的话:“你以为是随机的东西,其实并不随机。”
她想起了陈默外公的话:“云会说话。”
她想起了她妈的话:“吃饭了吗。”
那些水珠在玻璃上爬了大约三十秒,然后像一切从未发生过一样,恢复了正常的方向——从上往下流。暴风雨停了。太阳出来了。办公室里的人面面相觑,然后有人笑着说”卧槽”,有人把拍到的视频发到朋友圈,配文”深圳天气疯了”。
但沈未央知道那不是天气。那是某种东西在跟她说话。
用只有她能理解的方式。
十三
第六天。她会做出一个不可逆的决定。
沈未央在前五天里已经做出了决定。她只是在第六天才执行。
她删除了回声项目的所有数据。
特征#4217的序列,删了。暴力搜索程序,删了。未来三十天的市场预测,删了。给吕峥的策略报告草稿——那份写着全部真相的报告——删了。
然后她做了一件更决绝的事:她修改了Echo-7的代码,把注意力机制中对特征#4217的依赖消除了。模型回到了正常状态——62%的胜率,平庸但稳定。
她不确定自己做的是对还是错。但她确定一件事:有些知识不应该被拥有。
不是因为这知识危险。而是因为这知识会让人不再做出选择。如果你知道明天会发生什么,你就不会再”选择”做任何事——你只是在”执行”一个剧本。而你的人生之所以有意义,恰恰是因为你不知道。
不确定性不是缺陷。不确定性是自由的另一个名字。
她坐在空荡荡的办公室里(已经晚上十点了,所有人都走了),看着屏幕上的代码一行一行地消失。echo-7的git历史里,那些包含特征#4217的提交还在,但她知道没有人会去看三年前的一个”add random noise feature for control group”的提交。
她关上电脑,站起来,走到窗前。
深圳的夜景很美。万家灯火,每盏灯背后都是一个人、一个家庭、一段故事。那些人在吃饭、在吵架、在看电视、在辅导孩子写作业。他们不知道有一个量化交易员曾经短暂地窥见了他们的”命运”——如果命运这个词有意义的话。
但那个量化交易员选择不去看。
不是因为她害怕。而是因为她觉得,如果命运真的存在,那么她此刻选择不看——这个动作本身,就是命运的一部分。
十四
第七天。一切都会改变。
但什么都没发生。
没有暴风雨,没有意外消息,没有命运降临的戏剧性时刻。深圳是一个平常的春天早晨,太阳照常升起,地铁照常拥挤,她妈照常发来”吃饭了吗”。
沈未央坐在工位上,看着屏幕上那个回到了平庸状态的Echo-7,突然觉得很轻松。
也许她的”预测”从一开始就是错的。也许第六天的”不可逆的决定”不是她删除数据,而是她决定删除数据之前的犹豫。也许第七天的”一切都会改变”不是指外部世界的变化,而是指她内心世界的重启。
也许所谓的”宿命”不过是一面镜子。你往里面看什么,它就映出什么。你看随机数和市场走势的相关性,它就给你看一个宿命论的世界。你看你妈每天发的”吃饭了吗”,它就给你看一个有人牵挂你的世界。
镜子不会骗人。但镜子也不会告诉你全部的真相。因为镜子只能映出你选择去看的那一面。
十五
一个月后,沈未央辞职了。
不是因为她害怕棱镜资本会发现什么——吕峥拿到了她那份”正常的”策略报告,虽然对Echo-7胜率回落到62%有些失望,但也没有追究。量化策略的alpha衰减是常态,没有人会为常态惊讶。
她辞职是因为她想清楚了一件事:她不想做预测。不管是预测市场,还是预测命运,还是预测明天会不会下雨。她想做别的事。
她去了蛇口,找方远鹤。
“我想跟你学心理咨询。“她说。
方远鹤正在给那盆快死的绿萝浇水。他抬起头看了她一眼。
“你不怕浪费你的博士学位了?”
“浪费是什么?“沈未央说,“在量化行业待下去才叫浪费。”
方远鹤笑了。这是她第一次看到他笑。不是那种社交性的微笑,是发自内心的、带有赞许的笑。
“好。但从浇水开始。”
他把手里的喷壶递给她。沈未央接过来,对准那盆绿萝。水珠落在叶子上,顺着脉络往下流。
绿萝不会因为被浇水而说谢谢。它只是安静地吸收水分,然后继续生长。就像市场不会因为被预测而感谢你。就像命运不会因为被窥见而改变。
但水还是要浇的。因为浇水这个动作本身,就是意义所在。
半年后。
沈未央在蛇口老街的那间工作室里,接待了她的第一个来访者。那是一个年轻的程序员,说自己被算法困扰。说他写的推荐系统似乎比他自己更了解他的女朋友——它推荐的电影他女朋友都喜欢,推荐的餐厅都恰好是她想去的。他觉得自己在这段关系里是多余的。
沈未央听完,想起了自己一年前的样子。坐在二十七楼,盯着三个显示器,觉得自己窥见了宇宙的秘密。
“你知道吗,“她说,“算法推荐的餐厅你女朋友喜欢,那又怎样呢?坐下来陪她吃饭的人不是算法。”
程序员愣了一下。
“算法推荐了餐厅,但你们坐在餐厅里聊了什么,是你们的事。算法推荐了电影,但你们在电影院里谁先拉了谁的手,是你们的事。算法知道她喜欢什么,但算法不知道她今天心情不好的时候想要的是安静地待着还是被拉出去散步。”
“你是说——”
“我是说,不要把理解和陪伴搞混了。“沈未央说,“理解是数据。陪伴是选择。数据可以预测,但选择不可预测。而人活着,靠的不是预测,是选择。”
程序员走后,方远鹤从里间走出来。
“不错。“他说。
“哪里不错?”
“你对’选择不可预测’这个论点的信心。半年前你自己都不信。”
沈未央笑了笑。她走到窗前,推开窗户。蛇口老街的午后阳光洒进来,带着一点海风的味道。远处的深圳湾隐约可见,几只白鹭在水面低飞。
她想起了那个问题:随机到底是什么?
她现在的回答是:随机是宇宙给自由意志留的后门。
如果一切都可以预测,就没有自由。如果一切都已经注定,就没有选择。但宇宙在最底层的量子状态上留下了不确定性——不是为了让我们焦虑,而是为了让我们有可能。
有可能做出不同的选择。有可能走不同的路。有可能在一组看似注定的数字里,找到那个被忽略的变量。
那个变量就是你自己。
手机响了。她妈:“吃饭了吗。”
沈未央拿起手机,打了一行字:
“妈,今晚回家吃饭。”
发送。
然后她把手机放下,回到座位上,拿起方远鹤推荐她看的那本《存在与时间》,翻到折角的那一页。
窗外,深圳又下雨了。但这一次,雨的方向是对的——从上往下,按照重力的方向,按照它应该有的方向。
水珠落在窗台上,碎成无数更小的水珠,每一颗都折射着一点阳光,像是无数个微小的宇宙,各自运行着各自的规律。
沈未央看着那些水珠,想起了Echo-7,想起了特征#4217,想起了那个91%胜率的春天。那些数字现在都已经不存在了——被她亲手删除,就像擦掉一面镜子上的雾气。
镜子还在。但雾气没了。
她可以清清楚楚地看到自己。
一个普通人。一个做过不普通的选择的普通人。
而这,就够了。
(完)