第七部分 · 把研究变成可运行项目 · 第 50 章
两条项目路径: 程序员怎样失败、怎样做稳
同样会写代码、同样从公开数据开始,两个项目可以走向完全不同的结局。反面路径先找模型、后找问题,小赚后加杠杆;正面路径从一个小问题出发,先做数据检查和简单基线,再进模拟盘。这一章把两条路线并排,让方法论落到真实选择。
本部分的问题:怎样让研究穿过代码、模拟盘、真实订单和人的情绪,仍然保持可信?
读完后,你会完成两类实战,并知道何时推进、何时停手、怎样复盘。
读完这一章,你会明白
- 计算机能力是量化优势,但不能替代金融口径、交易制度和风险纪律。
- 多数严重亏损来自多个小错误叠加: 未来函数、成本低估、过拟合、加仓过快和无停止规则。
- 稳妥项目从小问题开始,先保证数据和基线可信,再谈因子和模型。
- 单因子报告、样本外、模拟盘和小资金半自动,能把研究逐步推向真实世界。
1. 一个程序员为什么会在量化里亏钱
1.1. 他先找模型,后找问题
小林的第一反应很“程序员”:先上深度学习。他下载了日线数据,把过去 60 天的价格喂给模型,标签设成未来 5 天收益。模型很快训练起来了,回测曲线也画得不错——一切看起来都丝般顺滑。
但他漏掉了金融研究的第一道工序:先定义问题。股票池是什么?交易频率是多少?买卖在哪个价位成交?成本怎么算?跟谁比收益?这些边界一个都没写。结果就是:模型先跑起来了,策略却还不存在——一个只会输出数字的程序,离一个策略还隔着一整套定义。
工程里先做个粗糙原型很常见,金融领域也不是不行,但原型有一条铁律:它不能直接升级成投资判断。没有问题定义的模型,和一台会随机出数的机器,在“证明能力”这个维度上没有区别。
每一步翻车,回测曲线都很好看:60 天价格预测未来 5 天收益、1 月就用上 3 月才公布的年报、只扣拍脑袋的低佣金、试一百次留下样本内第一、两周翻红后资金放大 5 倍……直到亏完才复盘。每一步的正确顺序,都写在右边那列。
1.2. 他忽略时间线
接下来,小林把财务字段做成特征喂给模型,效果更好了。他按“报告期”把财务数据合并进去,没按公告日。于是一个隐蔽的事故发生了:模型在一月份,就“看”到了三月份才正式公布的年报。回测表现当然漂亮——这相当于考试时提前拿到了答案。
小林一开始完全没意识到这是未来函数,还暗自惊喜,觉得财务数据果然预测力惊人。直到了解了公告日这个概念,回去把时间轴对齐,再跑一遍:收益直接掉了一大半。那一半收益从来不属于他,只属于错误的时间轴。
这一步是全章最值得抄在便利贴上的:金融数据不是一张普通表格,每个字段都要追问“当时是否可见”。时间线一旦错了,模型越强,它偷看未来的能力越强,你错得就越彻底——强力模型配上错的时间线,是一台高效的印假钞机。
1.3. 他低估交易成本
时间线修好、收益缩水后,小林的补救思路是调参数:把策略换成每周换仓,毛收益果然又上去了。他记得要扣成本,但只扣了一个拍脑袋的低佣金,滑点、冲击成本一概没算。曲线重新优美了,账户还没见到一分钱真金白银。
然后他拿小资金试了一下盘,世界骤然不一样了。策略买的小盘股,买卖价差根本不小;成交价格经常偏离他的预期;把印花税和真实滑点一笔笔算进去,很多交易根本没有净收益——赚得漂亮的是回测,扣钱的是现实。
程序员特别容易在这里栽跟头,因为在代码世界里,交易不过是一次数据库 update:字段一改就完事。可真实市场里每一笔买卖,对面都坐着一个活生生、也在算计的人——你想要的价格,他未必肯给;你想要的数量,挂单簿上未必有。市场有摩擦,而摩擦正好专门对付纸上收益。
1.4. 他相信最佳参数
几次受挫,小林祭出大招:疯狂调参。窗口长度、模型层数、特征组合、调仓频率,全都试一遍,最后挑出历史上表现最好的那组参数,高高兴兴写进报告。样本内的曲线美得像艺术品——但一到样本外,表现普通得毫无记忆点。
他的问题不是不会调参,而是调得太自由了。每试一组参数,都是在向历史数据多打听一次答案;你问得越多,历史就越容易给你编一个恰好专属于过去的最佳答案。试一百次留下的那个第一,很可能只是和噪声最会跳舞的那一组。
量化研究在这里有一条与工程直觉相反的习惯:所有实验都要记录,而不只是成功的那次。要看参数轻微变动时表现稳不稳,要留出真正没被碰过的样本外。只把最佳结果摆出来展示,等于把一百次失败藏进了抽屉——抽屉不会消失,迟早会有人打开看。
1.5. 他小赚后加仓
终于来到小资金实盘。前两周运气不错,账户翻红。小林据此得出结论:策略通过了验证。大手一挥,资金放大了五倍。第三周市场风格反转,策略回撤超出预期——仓位变大以后,同样的百分比回撤,在账户上变成了完全不同量级的数字,心理压力也跟着放大了五倍。
压力之下,他开始手痒。模型还看好、风格还没到止损线的持仓,他卖掉;当天强势的票,他追进去。一套动作下来,系统已经不是原来那个策略,而人工操作既没有预案,也没有好好记录——账户成了模型和情绪的合租屋,出了问题谁也不知道是谁干的。
盈利后加仓是个经典错误,它的根源在于把运气当成了验证。加仓的正确理由只能是:流程跑稳定了、真实成本验证过了、回撤在你的承受力之内——唯独不能因为“最近很顺”。顺风是天气给你的,不是系统给你的。
1.6. 他没有停止规则
回撤持续扩大,小林陷入了每个没写过停止规则的人共同的困境:继续跑,怕亏更多;现在停,怕刚停就反弹。每个交易日的决定都该有了却都没有——留白的结果是,所有决策都变成了临场情绪的产物,而人在压力和亏损下的临场情绪,恰好是全世界最糟糕的风控系统。
如果他事先写过规则,局面会完全不同。比如:回撤超过历史 95% 分位,自动降仓;滚动 IC 连续一段时间为负,暂停信号;数据异常,直接停止。规则的意义就在于,把决定从你压力最大、手最抖的那一刻,提前到你还冷静、还理性的最初。
这一章记住一句话就够了:策略会亏损,人会焦虑。规则的作用,就是在焦虑淹没大脑时,替你挡住最冲动的那个决定。
1.7. 他复盘后真正进步
亏完这一轮,小林做了一件和很多散户相反的事:他没有急着换个更猛的模型翻盘,而是坐下来从头复盘。他打印出所有记录,一条一条列出自己的错误清单:数据时间线错、交易成本低、参数过拟合、仓位加太快、人工干预没记录、事前没有停用规则——一共六条,一条都不冤枉。
然后他把整个项目重做了一遍。顺序跟之前完全相反:先搭数据检查,再做简单因子;划出真正的样本外;加入成本敏感性;让模拟盘踏踏实实跑三个月;小实盘用极小资金半自动执行。收益再没惊艳过,但这回的每一样东西都真实、可查、能解释。
真正看到这里,才察觉:“量化入门”不是从亏钱变成稳赚,而是从“被净值曲线牵着鼻子走”,变成“能弯下腰一条一条审查自己的系统”。前者是乘客,后者才是司机。
1.8. 这个故事想提醒什么
先给程序员一个不偏不倚的评注:技术能力在量化里当然重要,而且是明显优势。但金融市场不看你代码写得漂亮——它不会因为你会写分布式、会调参,就自动给你发钱。量化需要工程,同样也需要金融直觉、统计纪律、交易规则和风险控制,少一门都可能在某个拐角翻车。
再注意亏损的结构:几乎从来不是一个大错误炸了账户,而是一串小错误叠加出来的。时间线错一点,成本少算一点,参数多试一点,仓位加快一点,干预随手一点——每一项单看都不致命,叠在一起,研究问题就默不作声地变成了账户亏损。
最后一条最重要的:这些错误在小钱和模拟阶段被揪出来,它们叫学费;如果等到大钱和杠杆上才逐条认识它们,它们就可能改名叫灾难。发现并交学费的阶段由你选,这就是小资金实盘存在的意义。
实盘钱贵得惊人,但模拟盘也认真写就够严苛。如果你模拟盘从未遇过失败、异常,你根本不知道自己的系统会被怎么跨下来。
2. 一个稳妥的个人量化项目怎样长出来
前一章讲了不该怎么做,这一章讲怎么做才对。主角还是虚构人物,叫小周,同样是计算机背景——但开局就不一样:他没有一上来追深度学习,而是先挑了一个很小的问题:在宽基指数增强这个范围里,能不能只用几个简单因子,做出一个可解释、适合当教学样本的策略。这个项目走得不快,甚至有点慢,但每一步都留下了证据。一个稳妥的量化项目,就是这样慢慢长出来的,不是一锤子砸出来的。
2.1. 问题很小
小周没有问那些听起来激动人心的大问题:能不能做到年化 50%,能不能预测明天的涨跌。他问的是一个很窄的问题:在沪深 300 的成分股里,低估值、质量、动量这三个简单因子,按月调仓,能不能提供一点超额收益。就这样,不多问一句。
这个问题小,所以可控:股票池明确,调仓频率明确,因子只有三个,基准就是指数本身。别小看“小”这个字——边界越小,每一步越容易查错,结果越容易解释。大词反而最容易藏住细节。
其实很多好项目,开头都长得挺不起眼的。问题越小,你越容易检查数据对不对、复现结果稳不稳、失败的时候说得清是哪一步出的错。等这套小系统全部跑通,你自然知道怎么把它放大;一上来就大而无当,往往哪一步错了都查不出来。
一个稳妥的个人量化项目按八步长大:问题先要小到一句话说清,数据先体检再谈策略,基线先立住、因子单独过堂、组合先等权;样本外「普通而不崩」才上模拟盘,小资金半自动跑顺之后,依然先加仪表再谈放大资金。
这是一张闭环图:问题变小→查数据→做基线→出单因子→组合→模拟盘→小实盘→再问下一个更小的问题。终点不存在,每一圈都是一次被修炼。
2.2. 先做数据检查
换作心急的人,此时已经开始写策略了。小周没有,他先写数据检查脚本:交易日是否连续?股票代码有没有重复?指数成分股是不是按日期在变化?复权收益算出来合不合理?停牌、涨跌停这些字段在不在?——全都查一遍。
一查就出了发现:在某个数据供应商的数据里,有些股票停牌那天,仍然带着前收盘价。如果直接拿来回测,引擎会假设你在停牌日也能以这个价格成交——这在真实市场里是不可能的。这个发现还没给他带来一分钱收益,但它拆掉了一颗迟早要爆的雷。
这一步想说的是:好的量化研究,不是从模型开始,而是从数据可信开始。先把地基验过再继续盖,慢一点,但每一步都站得住。
2.3. 做最简单基线
数据检查过关,小周还是没碰因子。他先做了两个最朴素的基线:一是买入并持有沪深 300,二是在成分股里等权持有。跑完之后,他知道了“什么都不做”和“最简单做点什么”各是什么水平——这个水位线,是后面所有策略的成绩单模板。
有了基线,后面每一个因子策略都必须回答一个问题:你比基线好在哪?是收益更高了,回撤更低了,还是风险暴露不一样了?要是连最简单的等权持有都跑不赢,那再复杂的模型也没有意义——就像新写的排序算法跑不过内置函数,再花哨也只能删。
基线的作用,是让研究不再飘。它是你立在那儿、专门用来和自己较真的参照物。少了它,你很容易对着一条不错的曲线自我感动;有了它,每一次“进步”都得先过它这一关。
2.4. 单因子报告
这才轮到因子登场。低估值、质量、动量,小周一个个单独测,每个因子都出一份完整报告:覆盖率多少、IC 和 RankIC 什么水平、五分组收益长得什么样、换手率高不高、有没有明显的行业暴露、哪些年份失效过。一个因子一份档案,谁也不许蒙混。
结果很朴实:低估值因子在某些年份挺管用,但行业暴露重;动量因子收益不错,但换手偏高,成本敏感;质量因子单独看收益一般,但回撤比较低。没有一条神奇结论,但每一条都真实可查。
这些报告的用处,是让他摸清每个因子的“性格”:什么时候勤奋,什么时候罢工,会惹什么麻烦。只有把性格摸熟了,后面把它们合成一个组合时,你才知道自己在合什么,而不是闭着眼睛搅一锅。
因子一个个单独测,每个都出六栏档案:覆盖率、IC 和 RankIC、五分组收益、换手率、行业暴露、哪些年失效过。低估值某些年份管用但行业暴露重,动量收益不错但换手偏高、成本敏感,质量收益一般但回撤低——摸清性格,合成时才知道自己在合什么。
2.5. 多因子组合
到了合成阶段,小周做了一个反直觉的选择:他不会去历史数据里优化出“最佳权重”,而是先把三个因子等权合成。每月选综合分数靠前的股票,加上行业偏离限制和单票上限,老老实实地扣掉费用和滑点。简单,但每一步都能解释。
结果如何?比基准好一点,但绝谈不上惊人:年化超额不高,有几年还跑输,换手在可接受范围,最大超额回撤也在他能承受的区间里。这种结果放在网上没人点赞,放在研究记录里却是宝——它普通,但它扎实。
普通的结果面前,小周两个方向都没走:既没因为不够惊艳而放弃,也没动强行调参美化它的念头。他把这个阶段的策略定位为“教学版指数增强”,然后继续去查它在不同市场环境下稳不稳。对结果的尊重,比对曲线的热爱更能走远。
2.6. 样本外和模拟盘
回测阶段,小周留了最后两年做样本外,所有的规则都只在前面的样本上确定。样本外表现普通,但没有崩——“普通而不崩”五个字,在量化里其实是很强的信号:说明规则没在拟合历史,有一点真实含量。接着他跑上了模拟盘:每天按真实时间更新数据,每月生成一次调仓清单,像实盘一样运转。
模拟盘没让他失望——它忠实地暴露了一串问题:数据偶尔会迟到;有一次,一只股票涨停,清单该买买不到;真实成本略高于回测假设。小周没有因为这些而急着实盘,也没有因为策略表现还行就掩盖问题,而是把这些逐条写进报告,回头把流程修好。
这里有个很难被新手接受的观点:模拟盘的意义,不是证明你的策略强,而是证明你的流程能跑。小周把这句话想通了——等他把流程修顺,最后一道门才真正打开。
2.7. 小资金半自动
模拟盘又稳定跑了几个月,小周才拿出极小一笔资金,开始半自动执行:系统每天生成订单清单,他自己逐笔人工核对后再下单;每天收盘后对账;每一笔成交的价格、费用、滑点、自己当时的心理状态,全都记下来。慢是慢,但一切在掌控里。
小实盘的成绩单同样不惊天动地:没赚多少,有一个月还是亏的。可是,流程稳稳当当:真实成本和模拟阶段接近,没成交的原因条条说得清,每天对账都没有差错。这份平淡,含金量其实很高。
为什么这份平淡比短期赚钱重要?因为短期赚钱可能靠行情赏脸,而流程稳定、成本可对、未成交可解释、对账无差错,是系统在趋近于“真实可运行状态”的证据。赚一次小钱只能开心几天,把系统调到可运行,才能让你继续走下去。
2.8. 他如何判断下一步
流程跑顺之后,小周依然没有急着放大资金。他先写复盘:哪些假设被现实验证了,哪些还没验证;现在最大的风险是什么;如果现在规模放大五倍,会上什么新品种的风险;需不需要更好的风险模型。把问题先问全,再看下一步迈多大。
他的下一步不是加杠杆,而是给系统加仪器:报告里补上行业归因,补上成本敏感性,写下策略停用规则,然后继续观察样本外的表现。钱可以后面放大,仪表必须先装好——车开得再快,没有仪表盘就是在盲开。
这个正面故事的重点从来不是收益,而是路径本身。你看,一个稳妥的量化项目真的是一步步长出来的:从小问题到数据检查,到基线、单因子、组合、样本外、模拟盘,再到小资金半自动。每一步都普通,但每一步都留着证据——这,就是一个合格研究项目的成长年轮。
小结
这一章的正文不是让你记住几个孤立名词,而是要把它们放回同一条因果链里。读完后,先用自己的话复述下面几条判断,再顺着“小节回看”检查是否能解释每一步。
- 计算机能力是量化优势,但不能替代金融口径、交易制度和风险纪律。
- 多数严重亏损来自多个小错误叠加: 未来函数、成本低估、过拟合、加仓过快和无停止规则。
- 稳妥项目从小问题开始,先保证数据和基线可信,再谈因子和模型。
- 单因子报告、样本外、模拟盘和小资金半自动,能把研究逐步推向真实世界。
小节回看
- 1.1. 他先找模型,后找问题
- 1.2. 他忽略时间线
- 1.3. 他低估交易成本
- 1.4. 他相信最佳参数
- 1.5. 他小赚后加仓
- 1.6. 他没有停止规则
- 1.7. 他复盘后真正进步
- 1.8. 这个故事想提醒什么
- 2.1. 问题很小
- 2.2. 先做数据检查
- 2.3. 做最简单基线
- 2.4. 单因子报告
- 2.5. 多因子组合
- 2.6. 样本外和模拟盘
- 2.7. 小资金半自动
- 2.8. 他如何判断下一步
自测
小林最早犯的根本错误是什么?
一上来先找复杂模型,而没有先定义金融问题和交易边界——模型跑得再顺,也不是一个策略。
短期赚钱后马上加仓为什么危险?
短期盈利可能只是运气或顺风,仓位放大同时放大了还没验证的风险和你的心理压力,容易在回撤时动作变形。
小周为什么先挑一个小问题做?
小问题股票池、频率、因子、基准全都明确,最容易检查数据、复现结果,失败的时候也说得清错在哪一步。
为什么任何策略之前都先做基线?
基线是参照物:如果复杂方案连买入持有、等权这种简单做法都打不过,那它再多花样也只是包袱。
进入第八部分 · 职业、复盘与长期成长
做完第一个项目以后,怎样选择岗位、建设作品集并形成长期学习循环?