凌晨两点,宝安某老旧小区狭窄的书房里,屏幕的冷光映照着林晨专注的脸。
他盯着刚刚运行完毕的程序输出,眉头微皱。系统自动下载美股数据时果然遇到了问题——雅虎财经 ApI 返回的某些历史数据格式不一致,导致 pandas 在解析时抛出了类型错误。
“边界条件……”林晨低声自语,手指在键盘上敲击。
他花了半小时修改数据预处理模块,增加了更鲁棒的类型转换和异常值处理。修复完成后,系统顺利载入了过去五年标普 500 指数成分股的日线数据,总计超过六十万条记录。
但真正让他陷入思考的,是另一个问题。
过去一周的实盘运行加上新整合的传统技术指标,现在他的决策系统里已经有三十七个特征维度。从移动平均线到波动率指标,从成交量变化到市场情绪代理变量,系统在每次预测前都要处理这些海量数据。
“太多了”。林晨靠在椅背上,揉了揉发酸的眼睛。
他想起以前做跨境电商系统时的一个教训:当时为了追求功能全面,他们在订单处理模块里加入了十几个校验规则和异常处理流程。结果系统变得臃肿不堪,每次新需求都要考虑与旧逻辑的兼容性,最终不得不重构。
代码可以骗人,但逻辑不会。
林晨点开 Jupyter Notebook,新建了一个文件。他决定用 xGboost 来做一次彻底的特征重要性分析——这是他在学习机器学习课程时掌握的工具,一种基于梯度提升树的算法,能直观地展示每个特征对模型预测的贡献程度。
“先看看哪些特征在真正起作用”。
他导入数据,开始编写代码。首先将三十七个特征标准化处理,然后划分训练集和测试集。xGboost 模型的参数需要仔细调优:学习率不能太高,否则容易过拟合,树的最大深度要控制,子采样比例要设置……
窗外远处的城中村渐渐安静下来,只有远处偶尔传来货车的轰鸣声。林晨完全沉浸在代码的世界里,一行行指令在屏幕上流淌。
三小时后,模型训练完成。
林晨运行特征重要性分析函数,屏幕上生成了一张横向条形图。三十七个特征按照重要性得分从高到低排列,结果让他有些意外。
排名前五的特征分别是:20 日波动率、相对强弱指标(RSI)的 14 日均值、布林带宽度、成交量的 5 日变化率、以及 mAcd 柱状图的趋势。
这些都在预料之中。
但往下看,从第十名开始,特征的重要性得分断崖式下跌。第二十名之后的那些特征——比如某些特定周期的移动平均线交叉信号、成交量加权价格的一些衍生指标——重要性得分几乎为零。
“也就是说,系统里超过一半的特征,对预测的贡献微乎其微”?林晨喃喃道。
他重新运行了几次分析,每次随机划分不同的训练测试集,结果都高度一致。那些他花了不少时间从金融文献里找来的“经典指标”,在机器学习模型眼里,大部分都是噪声。
林晨没有马上删除这些低重要性特征,而是做了另一个实验:他用重要性排名前十五的特征重新训练了一个模型,然后用完整的测试集进行评估。
结果让他愣住了。
精简后的模型,在测试集上的准确率不仅没有下降,反而从原来的 61.3% 提升到了 63.8%。更重要的是,模型的泛化误差显着降低——在模拟 2022 年熊市数据的压力测试中,新模型的回撤控制得更好。
“少即是多……”林晨盯着屏幕上的数字,忽然笑了。
这是一种奇妙的顿悟时刻。在过去十年的程序员生涯里,他习惯了“功能越多越好”的思维模式。做电商系统时要支持几十种促销规则,做后台管理时要覆盖所有可能的查询条件。复杂度在不知不觉中累积,直到系统变得难以维护。
而现在,机器学习模型用冰冷的数据告诉他:很多时候,精简才是高效。
林晨站起身,走到窗边做了几个伸展动作。凌晨四点的鹏城,天空是深蓝色,几颗星星在云隙间隐约可见。楼下早餐铺的灯光已经亮起,蒸笼冒着白气——这座城市永远有人比你以为的更早开始新的一天。
他回到电脑前,开始重构特征工程模块。
删除那些低重要性特征不是简单地注释掉几行代码,而是需要重新考虑整个数据流水线的设计。林晨决定采用模块化架构:核心特征计算模块保留十五个高重要性指标,但同时设计一个可插拔的“特征扩展接口”,未来如果发现新的有效特征,可以无缝接入。
这花了将近两个小时。
当晨曦透过窗帘缝隙照进书房时,林晨完成了所有修改。他运行了完整的回测流程——从数据获取、特征计算、模型预测到模拟交易,覆盖过去三年 A 股、美股和黄金期货的数据。
结果令人振奋。
精简后的系统,年化收益从 17% 提升到 19.5%,最大回撤从 8.2% 降低到 7.1%,夏普比率——衡量风险调整后收益的指标——从 1.8 提升到 2.3。这意味着系统在承担相同风险的情况下,能获得更高的回报。
“这才是真正的优化”。林晨长舒一口气。
他看了眼时间,早上六点半。苏婉和乐乐还在睡觉,家里安静得能听见冰箱的嗡鸣声。
林晨没有去补觉,而是泡了杯浓咖啡,然后打开了实盘交易账户的后台。过去一周,原始策略在 A 股和黄金上的小规模实盘,已经带来了八百多元的收益。虽然不多,但证明了系统能真正赚钱。
现在,他决定做两件事。
第一,启用优化后的新策略,从今天开始实盘运行。
第二,增加投入资金。
林晨登录银行 App,查看自己的储蓄账户。裁员补偿金还剩二十万多,房贷账户里有三个月的预留款。他沉思片刻,决定从储蓄中再转出两万元,注入实盘交易账户。
这样总投资本金就达到了七万元。
“压力测试”。他对自己说。
如果优化后的系统能在更大资金量下稳定运行,那就证明这条路真的可行。如果出现问题……那就在模拟盘继续调整,反正实盘资金只占储蓄的一小部分。
转账操作很快完成。林晨重新配置了实盘系统的参数,设定了更严格的风控规则:单日亏损超过 2% 就暂停交易,单只股票仓位不超过总资金的 15%,黄金期货的杠杆控制在三倍以内。
做完这一切,他终于感到困意袭来。
躺到床上时,林晨脑子里还在回想那个特征重要性条形图。那些几乎为零的贡献度,像是一种无声的嘲讽——人类总喜欢把事情复杂化,而数据只相信最简单有效的逻辑。
这让他联想到自己这几个月的人生。
失业后,他一度认为需要学完 AI 的所有分支、掌握所有热门技术、面试所有类型的公司,才能找到出路。但现在看来,也许只需要聚焦在最核心的那几项能力上:扎实的机器学习基础、清晰的系统架构思维、以及将技术转化为实际价值的能力。
就像精简后的投资系统,不需要三十七个花哨的特征,只需要十五个真正有效的指标。
“专注核心……”林晨在入睡前模糊地想道。
窗外,鹏城的早晨正式开始。地铁开始运行,公交车驶出站场,科技园的班车在路上汇聚成流。这座城市永远在寻找最高效的路径,就像他刚刚优化的那个机器学习模型。
而在林晨的书房里,电脑屏幕暗了下去。但系统后台的程序仍在运行,按照新的精简逻辑,分析着全球市场的海量数据,寻找那些隐藏在噪声中的有效信号。
七万元的本金已经就位。
下一次交易信号出现时,系统会自动执行。