一、从一行crontab开始的末日
周五晚上十一点,陈默的屏幕还亮着。
不是因为加班——作为一个在星云科技写了五年后端的中年码农,他已经学会了在六点整把电脑一扣就走人。但今晚不一样。今晚他的 crontab 里躺着一条新任务:
0 23 * * 5 /usr/local/bin/python3 /home/chenmo/scripts/wallstreet_bot.py
陈默盯着终端里跑出来的结果,陷入了长达三十秒的沉思。
那行输出很简洁,简洁到像一个assert False一样令人不安:
【选股信号】A轮融资估值 × 技术专利数 / 创始人推特活跃度 = 0.87 —— 建议:观望
他注册这个账号的起因非常荒诞。两周前,他在逛一个技术论坛的时候,看到有人讨论"量化交易",说是用机器学习预测股票走势。陈默的第一反应是:这不就是把回归模型套了个新皮肤吗?
然后他的第二反应是:我也能写啊。
于是他就写了。用了两个晚上,在一个开源的股票数据接口上搭了一个所谓的"AI选股模型",特征向量包括公司技术博客更新频率、GitHub Star数、CTO在StackOverflow上的声望值、以及(他后来承认这是一个明显的过拟合)创始人推特emoji使用比例。
他给它起了个名字,叫做 "华尔街之蟒" ,缩写是WSM——Wall Street Monster。
结果这个东西跑了两周,选了十七支股票,涨了四支,跌了十三支,准确率23.5%。
作为一个程序员,陈默对此非常平静。毕竟三个月前他写的一个用户画像系统准确率才19%,老板还夸他"方向对了"。
但真正的问题不是准确率。真正的问题是——他忘记在脚本里关掉自动发布功能。
周一早上九点半,陈默正在跟一个诡异的NullPointerException搏斗,他的手机突然像被电击了一样疯狂震动。
他低头一看:十七个财经APP推送,标题全部一模一样。
"神秘分析师'华尔街之蟒'上周推荐的四支暴涨股,收益率超200%!"
陈默盯着手机屏幕,感觉自己的大脑正在执行一次segmentation fault。
二、我是个只会写for循环的人
消息的传播速度比rsync同步一万个文件还快。
到中午的时候,他工位的Slack已经被@了四百多次。他的高中同学群、大学校友群、甚至他姥姥的广场舞微信群,全都在转那篇文章。
"华尔街之蟒"——陈默用一个Gmail小号注册的账号——已经被扒了出来。该账号一共发了三条贴文,其中两条预测的是错的,但第三条——也就是那条关于他公司隔壁一家叫深眸智能的AI芯片初创公司的分析——碰上了那家公司当天宣布B轮融资的消息,股价一天之内涨了90%。
问题是,陈默买这只股票的唯一原因,是他在逛那家公司的官网时发现他们的团队成员页面上有一张猫的照片。他觉得"这家公司的文化应该不错"。
这就好比一个程序员在代码里写了一个逻辑漏洞,然后这个漏洞不小心触发了生产环境上一个极其刁钻的边界条件,结果系统竟然跑出了比预期好得多的性能——然后全公司的人都跑来问他是不是重构了架构。
陈默很想告诉他们真相。
但真相是:他的策略本质上就是一个加了机器学习的抛硬币程序。
他试过制止。他登录那个账号,想发一条澄清声明。但他发现账号密码被Gmail的安全策略锁了——因为三百多个人在同一时间尝试关注他,触发了异常登录保护。
于是他放弃了解释。
周二下午,"华尔街之蟒"这个账号的粉丝数突破了十万。有人在GitHub上fork了他的项目(一个私仓,他不知道怎么被扒出来的),把他那七百多行漏洞百出的Python代码翻译成了中文,起了个名字叫《量化交易的深度学习实战——从入门到跑路》。
然后这本书在某电商平台的预售量,三天内突破了两万册。
陈默看着预售页面上自己的代码截图(他甚至认出了那个他在第九十三行写的有语法错误但不知道为什么从来没报错的变量名),第一次深刻地理解了什么叫"技术债务就是金融资产"。
三、风口上的二进制猪
"陈默先生,我是经纬资本的合伙人张总。我们想投资你的量化交易平台。"
这是陈默接到的第六十七个电话。前面六十六个分别来自:三十一家VC、十二家媒体、九家券商、七家加密货币交易所、四家AI创业公司、两家MCN机构、一个自称是马斯克表弟的人、以及一家做韭菜盒子的餐饮连锁品牌(他至今没想明白最后那个是怎么关联上的)。
他不知道怎么回答。他只是一个写代码的。他连自己的401k账户都懒得打理——存进去的钱全买了货币基金,因为"至少不会亏"。
但张总显然不这么认为。
"陈总,我们已经分析过你的策略模型了。你那个基于NLP的情感分析模块,结合多因子择时框架,再加上强化学习的仓位管理,这套体系在国内是领先的。"
陈默张了张嘴,想说"那个NLP其实就是调了HuggingFace上的一个预训练模型,多因子择时是随机森林跑出来的过拟合结果,强化学习更离谱——那是我从GitHub上抄的一个贪吃蛇AI改的"。
但他没说。因为张总的报价是一千万。
一千万——这是他在星云科技干到退休都攒不到的数目。当然,他在星云科技也干不到退休,因为昨天CTO找他谈话,委婉地问他"有没有考虑过办个停薪留职"。
"张总,"陈默咽了口唾沫,"我想问一下,你们的投资有对赌条款吗?"
"没有没有,我们都是长期主义。"
"那我干了。"
后来陈默意识到,"长期主义"在VC的语境里,和"很快"在PM的语境里是一个意思——都是相对于宇宙年龄而言的。
四、你管这叫"技术驱动"?
经纬资本投的钱到账的那天,陈默租了一间办公室。说是办公室,其实就是众创空间里一个工位。他买了两台显示器,一台用来写代码,一台用来发呆。
他注册了一家公司,叫做 "深算科技"——因为他觉得这名字比"华尔街之蟒"正经一点。公司的slogan是:"用技术重新定义投资",这行字被他用Arial字体打印出来贴在工位上方的墙上。
"深算科技"的CTO、CEO、COO、CFO、首席科学家、市场总监、产品经理和实习生,全部由同一个人担任——也就是陈默本人。
他的第一个正式产品叫做 "深算一号" ,是一个量化交易策略。原理非常简单:抓取所有财经新闻,用BERT做情感分析,然后根据情感得分做多或做空。
在回测中,这个策略的年化收益率达到了387%。
后来陈默发现回测代码里有一个bug:他用的是未来数据——也就是拿"明天的新闻"来分析"今天的行情"。这个bug让他回测多出了三百个百分点的收益。
而他之所以发现这个bug,是因为他在重构代码的时候不小心把时间戳字段删了,结果重新跑了一遍回测,收益率变成了-12%。
"所以真正的收益率是-12%?"陈默盯着终端里的结果。
他陷入了沉思。然后他决定把这个bug当作feature——具体操作方法是,他开发了一个"实时情感分析"模块,每五分钟扫描一次全网新闻,然后根据分析结果下单。
这个"实时"版本的回测数据非常漂亮。
因为它用的还是未来数据。
只不过这次,陈默把代码写得太复杂了,以至于他自己已经找不到bug在哪了。
这是一种非常高级的状态——工程师们称之为"祖传代码,别动"。
五、第一次危机
"深算一号"上线运行的第一周,赚了四十七万。
第二周,赚了九十二万。
第三周,赚了两百一十三万。
陈默看着账户里不断跳动的数字,感觉自己好像在一个梦里。他每天做的事情就是从床上爬起来,打开电脑,确认服务器还在跑,然后回去继续睡。
直到第四周。
那是一个普通的周四下午。陈默正在吃外卖——他最近从沙县小吃升级到了兰州拉面,算是一种消费升级。突然,他的手机开始震动。不是来电,是他的交易监控脚本在疯狂报警。
他打开电脑,看到了一条新闻:
《突发:某机构做空报告称深眸智能财务造假》
深眸智能——就是他最早推荐的那支股票——股价正在以每分钟5%的速度暴跌。
他的"深算一号"策略在刚开盘的时候自动加仓了这支股票——因为它的情感分析模块读到了一条关于深眸智能获得新专利的正面新闻,判定这是一个"利空出尽"的信号。
但问题是,那条"正面新闻"是一个营销号在三天前发的。而情感分析模型把"财务造假"这条负面新闻,错误地归类为了"中性偏正面"——因为它在训练数据里没见过"造假"这个词,于是根据BERT的注意力权重,把它关联到了"智能"和"专利"这两个词上。
通俗地说,就是AI把"造假"理解成了"造假技术很厉害"。
陈默盯着屏幕,看着自己的账户余额在十五分钟内从七百万变成了四百八十万。然后变成了三百万。然后变成了一百七十万。
黄线、红线、死亡线,一根根地击穿。
他伸出手,想按强制平仓的快捷键。但他的手在半空中停住了——因为他发现自己忘了那个快捷键是Ctrl+Alt+F还是Ctrl+Shift+F。
这就是他当时的状态。他写了半辈子代码,解决过上万个bug,但在真正的金融风险面前,他连一个快捷键都记不住。
最后电脑替他做了决定——电源线被他不小心踢掉了。
屏幕黑了。陈默瘫在椅子上,感觉整个世界都在用一种非常真实的方式告诉他:你他妈根本不懂投资。
六、三十三岁的穷光蛋和一杯奶茶
那一天的亏损最终停在了83%。
陈默的资产从巅峰时期的七位数,缩水到了五位数——不是前面的那个七位数,是后面的那个五位数。
他坐在黑掉的屏幕前,发现自己连点外卖的欲望都没有了。不是因为没钱——剩的钱还够他活一阵子。而是他突然意识到,自己被骗了。
不是被别人骗了——是被自己的傲慢骗了。
他以为把代码改对就行。他以为机器比人理性。他以为他能用技术碾压一切。
但他忘了——在这个局里,所有人都以为自己是那个用技术碾压别人的人。真正的赢家?
赢家是做铲子的人。 卖课程的、卖服务器的、卖数据的、卖算力的——他们才是这个行业里唯一稳赚不赔的人。
而陈默,只是那个举着铲子冲进金矿的矿工,然后发现矿塌了。
他想起自己刚进星云科技时,一个老前辈跟他说过的话:"在金融市场上,你是赚不到认知范围以外的钱的。如果赚到了,市场会用一种非常残酷的方式把它收回去。"
当时他觉得这句话很装。现在他觉得这句话简直是真理——而且收学费的方式太狠了。
他拿起手机,打开外卖软件,发现余额只够点一杯奶茶了。
他点了。
七、当极客学会了敬畏
接下来的一个月,陈默没有开电脑。
不,他开了——为了打游戏。他把所有量化相关的代码库全部锁进了private repo,改了密码,然后把SSH key删了。
他打了一个月的《文明6》,而且是选中国,科技胜利。
然后他发现自己在游戏里发展科技的样子和他在现实里搞投资的样子一模一样——都是"我只要再研究一个科技就能赢了,但为什么我的文化被碾压了?"
某天晚上,当他用核聚变技术赢得了一盘之后,他盯着胜利画面发呆。屏幕上的文明发展曲线,从青铜器到信息时代,横跨了六千年的历史。
他突然想通了一件事。
那些在金融市场里活了几十年的老交易员,他们不是不会用Python。他们是见过太多用Python的人爆仓了。
技术不是护城河。
对风险的敬畏,才是。
第二天,陈默重新打开了代码库。他没有删除任何东西——他只是把所有策略代码从头到尾读了一遍,然后在每一行重要的逻辑前面,都加上了注释:
# 警告:如果你看不懂这一行,就不要运行这一行。# 警告2:如果你看得懂这一行,也不建议运行。
然后他开始重构。这一次,他不是在造一个"打败市场的AI"——他是在造一个"不让自己破产的工具"。
第一个改动:所有的交易策略,必须经过至少三个独立的、不共享数据的模型的验证,才能执行。
第二个改动:仓位上限。任何单一股票不能超过总资产的5%。
第三个改动——也是最关键的一个改动——添加了一个panic button,物理的那种。 他买了一个红色的急停开关,用USB接在电脑上。只要按下去,所有持仓立刻清空,系统进入72小时冷却期。
他给它起了一个名字,叫做"救心丸"(不是,这是他自己叫的,正式名称叫"熔断保护系统")。
完成这三个改动之后,他发现自己的策略收益率依然很低——但最大回撤从83%降到了12%。
他接受这个数字。
八、正确的打开方式
改版后的"深算二号"跑了一个月,收益率:6.8%。
同期沪深300跌了2.1%。
陈默看着这个数字,心里比赚两百万的时候还高兴。不是因为收益率高——是因为他终于搞懂了自己在做什么。
这个时候,他的账号粉丝已经涨到了八十万。评论区画风清奇:
"大师,明天买什么?""博主,跪求推荐一支etf""已跟单,全仓all in,亏了找你"
陈默看着这些评论,想起了三个月前的自己。
他做了一件事。他写了一篇长文,标题是:
《关于我写了一个bug然后赚了七百万最后亏了八十三万这件事》
文章里,他把自己从写第一个量化脚本到亏掉83%的全过程,用技术博客的风格完整地记录了下来。他附上了自己的代码(这次是开源的),标注了每一个bug的位置,还贴了回测和实盘的对比图——那差距大到可以当反诈宣传材料。
文章的最后一段话是这么写的:
我是一个程序员。我只会写代码。我既不懂K线,也不懂宏观,更不懂庄家和游资。我唯一会做的事情,就是对着一条报错信息debug整整一个通宵。
但我通过这段经历明白了一个道理:技术不应该是用来收割别人的镰刀,而应该是帮自己看清楚陷阱的手电筒。
如果你问我什么投资策略最好——我的答案是:投入你理解的东西。如果你不理解,那就先学习。如果你懒得学习,那就去买指数基金。
以上是一个从零赚到七百万又亏到剩一杯奶茶钱的程序员的肺腑之言。
P.S. 那杯奶茶挺好喝的。
这篇文章在发出之后的二十四小时内,阅读量突破了五百万次。
下面的最高赞评论是这样写的:
"作为一个从业十五年的基金经理,我见过无数靠运气入场的热闹离场。但我第一次见到有人把自己的bug全部公开出来当反面教材。兄弟,你不是在教别人赚钱——你是在教别人活着。respect。"
那条评论获得了三万多个赞。
九、尾声:不是英雄,但也不是韭菜
一年后,陈默的"深算科技"有了一支七个人的团队。
不是因为他招人——是那些在看了他那篇文章之后主动找过来的同行,一个接一个地留下来了。资深的架构师、做过十年固收的老交易员、从大厂辞职的AI研究员,甚至还有一个曾经给他留言"已跟单全仓"的网友——那哥们现在负责风控。
"深算"不再追求高收益。他们的策略年化目标从没超过15%,回撤控制在8%以内,而且所有策略的逻辑都是完全透明的——每一条交易记录都在官网公开。
他们推出了一个免费的开源量化框架,叫 "OpenCalc" ,在GitHub上已经有了两万多颗星。很多个人投资者用它来跑自己的策略,偶尔有人fork了代码改几个参数就跑出了还不错的收益。
陈默不喜欢别人叫他"量化大佬"。他更喜欢别人叫他"那个写了祖传代码的人"。
有一天,一个新来的实习生问他:"默哥,你有没有想过,如果当时你的bug没有被发现,你现在可能已经是一个百亿私募的创始人了?"
陈默想了想,说:"也想过。但你知道吗?"
"什么?"
"代码有bug没关系,人生有bug也没关系。只要你能找到它、理解它、然后修好它——永远都不晚。 "
他顿了顿,补了一句:
"而且修完bug之后,记得写个单元测试。你不知道同样的坑什么时候会再踩一次。"
实习生翻了个白眼。
然后默默地把这段话记在了笔记里。
(全文完)
本故事纯属虚构,如有雷同,可能你也有一个忘记关自动发布的crontab。