一、一切的开始,是愤怒
方骏对财经内容的厌恶,源自一个非常具体的场景。
某天他在"冰球网"上刷到一篇爆款帖子,标题叫《下一个十倍股:星桓半导体的三大拐点》。点进去看了三千字,核心论点翻译成人话就是:"这家公司做的芯片我虽然看不懂,但它的大股东最近增持了,所以我觉得它会涨。"
方骏把帖子截图发到公司群里,配了一行字:
"这种文章也能拿十万阅读——这个世界的信噪比已经低到令人发指了。"
同事回复:"那你也写一个啊。"
方骏说:"我不写文章。我写代码。"
然后他关掉聊天窗口,打开终端,mkdir earnings-cat。
"财报猫"项目就这么立项了。
二、开源项目总是开始于一个冲动的深夜
方骏在一家叫"云轨智行"的科技公司做数据工程师。他的日常工作是搭数据管道,处理TB级的交通流量数据。所以当他决定要做一款财报分析工具的时候,他的思路非常直接:
1. 爬取全部A股上市公司的财报PDF 2. OCR识别 + LLM解析关键财务指标 3. 自动计算衍生比率并生成可视化报告 4. 跑一个基于temporal-window的异常检测模型,标记财报中的"可疑数据" 5. 全部开源,MIT协议,任何人都可以Fork
他花了三个周末和一个请假调休的周五,把MVP写了出来。
他在README里写得非常克制:
"财报猫 v0.1 — 一个自动抓取A股财报并进行基础财务分析的CLI工具。仅供学习参考,不构成投资建议。如果你靠这个工具赚了钱,请捐赠给你本地的开源组织。"
然后他发了一条动态,配了一张终端截图,上面跑着财报猫对"碧泉酒业"的年报分析结果:营收增长率3.2%,净利润率12.7%,资产负债率18.3%。
发出后十二个小时,被fork了两千多次。
方骏很满意。不是因为工具多好用——事实上大部分fork的人可能根本没装Python环境——而是因为项目的star数超过了他公司主仓库。
他在群里说:"我的个人项目star数超过云轨智行的官仓了。"
同事回复:"建议你把这句话写进年终述职的'突出贡献'一栏。"
三、Pull Request来自一个意想不到的地方
财报猫火了之后,方骏每天都会收到几个issue。大部分是"能不能加一个XX功能",少部分是"你的Docker镜像拉不下来",偶尔会有一个真正的Bug报告。
然后有一天,他收到了一封邮件。
发件人显示的不是GitCode的自动通知——是一封手打的、用QQ邮箱发的、正文只有三行字的邮件:
"方骏先生你好,
我是碧泉酒业的。你的工具把我们今年的年报数据算错了。我们今年的净利润率不是12.7%,是14.2%。少算了一截,我们的新生产线投产后效率提升不小。要不要来厂里坐坐?我们请你喝酒。
—— 郑秉义"
方骏盯着这封邮件看了很久。不是因为数据被质疑——他写的那个OCR模型对印刷体PDF的识别准确率确实只有94%左右,算错了很正常。
他盯着看的原因,是一个年营收可能过亿的老字号酒厂——它的财报数据是被一个程序员在出租屋里花三个晚上写出来的CLI工具算出来的——而且酒厂的老板亲自发邮件来纠正。
他回了一行字:
"郑总,数据确实算错了。我周末过来,不用请酒,请我喝杯茶就行。"
四、酒厂不需要DevOps,但需要一个人来看一眼
碧泉酒业在福建龙岩下面一个镇上。方骏坐高铁到龙岩,换了一趟中巴,又打了一辆摩托车,在一个村口的水泥路边看到了那扇门。
不是他想象中的那种"古法酒坊"——没有红灯笼,没有青石板,没有穿汉服的小姐姐在门口酿酒。是一排灰白色的厂房,门口停着三辆五菱宏光,门卫室的大爷在看《海峡两岸》。
郑秉义今年六十九岁。穿着灰色夹克,脚上一双老北京布鞋,说话声音不大但很清楚。他带着方骏在厂里走了一圈,从原料仓库到发酵车间到灌装线,走了一个半小时。
方骏全程没说太多话。因为他发现一件事:
这个酒厂的酿造车间里,每一道工序都有一个写在硬纸板上的操作规范。字迹工整,用透明胶带贴在墙上,纸板已经泛黄,角上卷起来了。
糖化温度控制标准:28°C ± 1°C。发酵周期:不低于65天。基酒储存:陶缸,不少于3年。
这些数据的精度,超过了他见过的很多互联网公司的告警阈值配置。
"你这套工艺标准——"方骏在贴满硬纸板的走廊里停下脚步,"是谁写的?"
"我爸。"郑秉义说,"他也是接他爸的。这厂六十年了,他退休前把所有的工艺流程写了下来。我没有他懂酿酒,但我懂看数字。"
他顿了顿,又说:"你那个工具挺好的。就是不太准。不准不是因为代码不好,是因为你只看得到数字,看不到数字后面的东西。"
方骏没有反驳。他觉得这个人说得对。
五、那个周末他干了一件完全没有技术含量的事
方骏在碧泉酒业待了两天。
他没有写财报猫的迭代。他没有部署任何微服务。他做的事情包括:
1. 帮郑秉义的财务大姐修了一台打印机的驱动(原因是Windows更新后驱动掉了) 2. 给门卫大爷的手机装了一个反诈APP 3. 把发酵车间贴在墙上的硬纸板——十二张——全部拍照、整理、录入了一份Markdown文档
第三件事是他自己主动做的。
他蹲在发酵车间的水泥地上,逐字逐句地读那十二张硬纸板上的内容。读到第六张的时候,他发现了一个有意思的地方:
硬纸板上说:"夏季发酵周期可缩短至55天,但需每日检测糟醅温度,连续三日超过32°C则恢复至60天。"
这是经验。纯粹的、没有经过任何数据建模验证的经验。是一个在酒厂干了大半辈子的老师傅用手背贴在发酵桶外皮上感受温度,然后用一种无法被量化的直觉写下来的经验。
方骏在文档底部加了一行备注:
"这条规则包含了一个隐式的PID控制逻辑——以温度阈值为反馈信号,自动调整发酵周期参数。值得建模。"
他不确定郑秉义能不能看懂这句话。但他还是写了。
六、一个很朴素的事情
回深圳之后,方骏做了一件事:他没有更新财报猫的财报解析模型。他开了一个新的仓库,叫"open-brew-data"。
他把自己在碧泉酒业整理的那份工艺文档写了进去,加上了温度传感器的采集方案——用ESP32加一个DS18B20探头,成本大约三十块钱,可以实时监测发酵车间的环境温度和糟醅内部温度,数据通过LoRa网关传到一台树莓派上,再汇总到一个简单的Grafana面板。
他还写了一篇博客,标题是:《我帮一家六十年历史的老酒厂搭了一套开源酿酒监控系统》。
博客里写了碧泉酒业的硬纸板,写了ESP32的温度探头,写了那个隐式PID控制逻辑。他在结尾写了一句话:
"这大概是我写过的代码里,最接近'价值创造'的一次。"
文章被推上了"知识半岛"的首页热榜,转发超过了一万次。
有人在评论区问:"所以你后来买碧泉酒业的股票了吗?"
方骏回复了这条评论:
"没有。但他们送了我两坛五年陈酿。我打算在它们变成八年陈酿的时候再打开。"
尾声
后来方骏没有成为一个财经博主。财报猫的仓库还在,偶尔有人提交PR,他也会合并。但他的主要业余精力放在了另一件事上——他把那个酿酒监控系统写成了一个通用的开源方案,命名为"BrewPie",中文叫"酿仪"。
目前有十几个小型酿酒作坊在试用他的方案。全开源。MIT协议。
方骏没有从里面赚到一分钱。但有一次他在出差路上,收到了一条郑秉义发来的微信。是一张照片——碧泉酒业发酵车间的墙上,那十二张泛黄的硬纸板旁边,贴了一台小屏幕,上面跑着Grafana,实时显示着三条温度曲线。
照片下面附了一句话:
"发酵稳定。ES32挺好的。"
方骏笑了。不是因为他发的那个芯片型号拼错了——是因为他终于理解了,一个开源项目真正的"MAU"(月活跃用户)不一定是一万个人 fork 你的代码,也可以是一个人在福建山里的一个车间里,用你的代码,不重启地跑了三百天。