屏幕上的两条曲线像一道无形的裂痕,横在林晨心头。
那个 18.7% 的回测收益率带来的短暂兴奋早已冷却。此刻,他更关注的是训练集损失曲线平滑下降,而验证集曲线却在某个节点后开始微微上扬的分化现象。过拟合。这个在机器学习领域老生常谈的问题,在量化交易的语境下,意味着模型可能只是“记住”了历史数据的噪音,而非真正学会了市场规律。把这样的模型投入实盘,无异于蒙眼走钢丝。
“不能急着上实盘”。林晨关掉回测图表,向后靠在椅背上,书房里只听得见主机风扇低沉的嗡鸣。窗外的鹏城夜空,零星灯火点缀着密集的楼宇轮廓。他揉了揉发酸的眼眶,思路逐渐清晰。
问题发现了,优化方向也有了,但在这之前,还有一个更根本的环节被他忽略了——风险控制。一个只能预测涨跌(哪怕预测精度尚可)的策略,是残缺的。它没有回答:如果预测错了怎么办?该投入多少资金?亏损到什么程度必须退出?盈利了又该何时落袋为安?
这些,才是交易系统中决定生死存亡的部分。收益决定了你能走多高,而风控决定了你能不能活下来。
接下来的几天,林晨暂时搁置了模型优化的具体编码工作,转而一头扎进了风险管理的知识海洋。他泡在 quantconnect、聚宽等平台的社区论坛,翻阅那些真正经历过市场牛熊的量化交易者分享的经验帖——尤其是那些关于爆仓、关于回撤控制的血泪教训。同时,他系统性地查阅学术论文和经典书籍,从最基础的《期货市场技术分析》中关于资金管理的章节,到更现代的《主动投资组合管理》中关于风险预算的复杂模型。
他像个海绵一样吸收着,并在笔记本上(这次是真正的纸质笔记本,他感觉有些核心思路需要手写下来加深记忆)梳理出关键点:
仓位管理: 这是风控的第一道闸门。绝对不能把所有资金押注在一次交易上。他学习了固定比例法(每次投入总资金的固定百分比)、凯利公式(在已知胜率和赔率情况下的最优下注比例),以及更具动态性的波动率调整仓位法(市场波动大时自动降低仓位)。
止损策略: 这是防止单次亏损无限扩大的“保险丝”。他研究了固定价格止损、移动止损(如跟踪止损)、技术指标止损(如跌破某条均线)以及基于波动率的百分比止损。每种方法都有其适用场景和优缺点。
止盈策略: 与止损相对,但同样重要,目的是锁定利润,避免坐过山车。除了固定目标止盈,还有移动止盈、分批止盈等更灵活的方式。
组合风险: 当他未来同时运行多个策略、交易多个品种时,还需要考虑策略之间的相关性,避免所有策略在同一时间遭遇同类型风险,导致整体回撤过大。
“最重要的原则”,林晨在笔记本上重重写下,“永远是活下去。收益可以慢慢积累,但本金一旦大幅亏损,需要更高的收益率才能回本,而且心态极易崩溃”。
理论需要落地。他重新打开 pycharm,在之前那个略显单薄的“策略”类旁边,开始创建一个全新的“Riskmanager”(风险管理器)类。这个类将作为未来交易系统的核心组件之一,独立于预测模型,专门负责计算仓位、发出止损止盈指令。
他决定先从相对稳健的方法入手。在仓位管理上,他实现了一个基于账户总净值的固定比例方法,并设置了一个最大单笔仓位上限(比如总资金的 2%)。同时,他写了一个简单的波动率监测模块,计算标的近期价格波动率(如 AtR 指标),当波动率异常升高时,仓位比例会自动下调。
止损方面,他选择了“百分比止损”结合“移动止损”的混合方式。入场后,先设置一个基于入场价的固定百分比作为初始止损(例如 -5%)。一旦价格向有利方向移动超过一定幅度,止损价就自动上移(跟踪止损),锁定部分利润,同时给予行情继续发展的空间。
止盈则相对灵活,他设置了两重止盈:第一重是固定比例止盈(如 +10%),到达后平掉一半仓位,剩下的一半采用更宽松的移动止损,博取更大趋势的可能。
代码敲击声中,一个个函数被构建起来:calculate_position_size、check_stop_loss、update_trailing_stop、check_take_profit……他力求逻辑清晰,参数可配置,方便后续调整和优化。
“光有逻辑还不够,得能直观看到效果”。林晨心想。他修改了回测框架,将新的风控模块整合进去。回测引擎在模拟交易时,每一笔买卖决策不仅要看模型的预测信号,还必须经过 Riskmanager 的审核:能买多少?有没有触发止损或止盈?
他选用了同一段历史数据重新回测。这一次,回测报告出来后,累计收益率从之前的 18.7% 下降到了 15.2%。表面看收益降低了,但林晨仔细分析交易明细和资金曲线图后,眉头反而舒展开来。
最大的单笔亏损被严格限制在了 -5% 左右,没有出现之前可能存在的深度套牢。资金曲线的回撤(从高点回落的最大幅度)明显变小,曲线看起来更平滑,少了些陡峭的“悬崖”。虽然牺牲了一些潜在利润(比如有些仓位被过早止损或止盈),但整个交易过程显得可控了许多。
“这才像个样子”。林晨长舒一口气。一个完整的、可运行的量化交易系统雏形,终于在他手中拼接起来。它现在至少包含了几个关键模块:数据获取与处理、特征工程、AI 预测模型(尽管还需优化)、风险管理系统、回测框架。骨架已经搭好,剩下的就是不断填充血肉、优化细节。
他给这个初生的系统项目命名为“phoenix trader”(凤凰交易者),寓意着从灰烬中重生。创建了一个新的 Git 仓库,将代码谨慎地提交上去,并写下了详细的 REAdmE 说明。
完成这一切,已是深夜。林晨站起来活动了一下僵硬的肩颈,走到窗边。远处,鹏城湾的方向隐约有灯光闪烁。他知道,距离用这个系统真正赚到钱,还有很长的路要走。模型需要优化,风控参数需要更精细的测试,实盘环境下的滑点、网络延迟、交易接口稳定性等问题都还是未知数。
但至少,方向越来越清晰了。他不再是那个只盯着预测准确率的“模型炼金术士”,而开始像一个真正的“系统架构师”一样思考,思考如何构建一个健壮的、能够长期在复杂金融市场中生存并获取利润的机器。
这种从混沌到有序、从单点突破到系统构建的过程,带来了一种更深沉、更扎实的成就感。它驱散了部分因失业和财务压力带来的焦虑,取而代之的是一种专注于解决问题的平静力量。
他忽然想起侄儿林浩。那孩子也在流水线上,重复着看不到太多变化的工作。自己现在摸索的这条路,虽然艰难,但至少每一步都在创造新的东西,都有学习和成长。或许,这也是一条可以分享的路?
这个念头一闪而过。眼下,最重要的是让“凤凰”先真正飞起来一小段。林晨回到电脑前,打开模拟交易账户的界面。他决定,在投入真金白银进行极小额实盘测试之前,先让系统在模拟环境中全自动运行一周,观察它在更接近真实的环境下(尽管没有实际资金流动),面对实时行情数据、处理模拟订单的表现。
他启动了系统,设置好监控告警。屏幕上,行情数据开始滚动,系统日志窗口偶尔跳出一两行状态信息。一切似乎平静地运转起来。
林晨泡了杯浓茶,没有离开。他就坐在那里,看着屏幕,像守护着一个刚刚点燃火种、尚在摇曳的炉灶。他知道,这第一周的模拟运行,不会一帆风顺。但无论出现什么问题,都是宝贵的经验,都是让“凤凰”羽毛更加丰满的必经之路。
窗外的夜色,渐渐褪去最浓的黑,透出一点深蓝。鹏城的又一个清晨,即将来临。