做了几年量化交易,几乎每周都会遇到有人问我同一个问题:你的策略能不能写成全自动代码,直接挂机跑?问的人多了,我反而开始琢磨这个提问背后的执念——好像只要把“Alpha”写进一段不会睡觉、不会手抖的代码里,就能让账户自动钱生钱。每次被问到这,我都要停下来想一想怎么回答。不是问题本身有多难,而是这个提问里藏着一个对量化的根本误解:大家默认Alpha是一段可复制、可固化的规律,是一段可以被“全自动代码”永恒执行下去的圣杯策略。今天就把这个残酷的真相摊开,聊透为什么真正的Alpha永远无法被写进全自动代码里。
1. 先搞清楚:Alpha到底是个什么东西
1.1 Alpha不是你想的那种“稳定的超额收益”
聊量化,绕不开Alpha这个词。在量化语境里,Alpha指的是剔除市场整体涨跌影响之后,策略自身创造的那部分超额收益。比如沪深300指数今年涨了15%,你的策略赚了22%,那多出来的7%就是Alpha。反过来也一样,大盘跌了10%,你的策略只亏了2%,那8%的正向偏离同样是Alpha的体现。
但这里有一个新人特别容易误解的地方:Alpha不是一个“一旦找到就永远存在”的静态规律。它的本质其实是信息优势,而且是一种有保质期的信息优势。可能你比别人更快拿到某些数据,可能你发现了某个财务指标和股价之间的特殊关联,可能你对某个特定市场行为的理解比大众更深刻。在某一段时间内,这些优势能稳定转化为超额收益。但信息优势的天然属性就是:会被模仿、会被传播、会被对冲掉。当足够多的资金开始顺着同一套逻辑进场,Alpha就开始衰减,直到彻底消失。
所以很多人一上来就问我“你的策略Alpha是多少”,我一听就知道这是把Alpha当成一个固定属性在看。实际上每一个Alpha都有它的生命周期。你可以捕捉它、利用它,但你不能指望它永远属于你。
1.2 全自动代码解决的是“执行”,不是“认知”
那全自动量化系统到底解决了什么?它解决的是执行层面的问题。
第一,它解决了速度问题。人眼盯盘、手动下单,反应速度是秒级甚至分钟级的;全自动系统可以在毫秒甚至微秒级别完成信号触发、下单、撤单、改单。一些高频类的策略在人工操作下根本跑不起来。第二,它解决了纪律问题。人会有恐惧、贪婪、犹豫,一个信号出来你可能因为害怕回撤而不敢执行,全自动代码没有这个心理负担,信号给出就执行,绝不手软。第三,它解决了规模化问题。一套手工交易系统一天盯十只股票已经是极限,全自动系统可以同时覆盖全市场几千只标的,批量扫描、批量下单,这是人力远远达不到的。
但这里有一条关键的分界线:全自动代码把“既定策略”执行得再好,也无法自动回答“这个策略今天还灵不灵”。代码可以一丝不苟地执行规则,但规则本身是否仍然有效,不在代码的认知范围里。这就像一辆自动驾驶技术非常成熟的汽车,它可以精准完成所有的驾驶动作,但它不知道目的地应不应该改——因为目的地是导航系统里那个模糊的“判断”在决定。可叹的是,量化系统里恰恰是“判断”这个环节,决定了Alpha的生死。
2. 为什么真正的Alpha永远写不进全自动代码
2.1 数据层的坑:你的回测很可能已经在“偷看未来”
说到“Alpha为什么写不进代码”,我第一个要提的就是数据层的坑。很多看起来特别完美的策略,最后发现从根上就错了,错在回测的时候用到了未来信息。
这个坑有几种非常隐蔽的表现形式。
第一种叫前视偏差(Look-ahead Bias)。我用一个最简单的例子说明:假设你的策略逻辑是“每日开盘买入昨日涨幅排名前10的股票”,但在回测代码里,你用了当日收盘后才能拿到的数据去生成当日开盘的信号。时间错位了,但你浑然不觉。回测结果显示这个策略年年翻倍,实际上这纯粹是因为你在“偷看未来”——用未来数据做历史决策,当然百发百中。而实盘系统里,根本不存在这种穿越时空的信号。
第二种叫未来函数。很多人做因子归一化时,习惯性地对整个样本期的数据算均值和标准差,然后做标准化处理。这个动作现在看起来没什么问题,但实际上在样本期的每一个时间点,你都提前用了样本期结束时的统计量——这等于在每一根K线上都“预知”了未来的统计结果。正确的做法是只用截至当前时刻的历史数据做滚动标准化,也就是要用只包含过去数据的窗口去计算。
第三种是幸存者偏差。这个坑在选股类策略里尤其致命。比如你做股票量化回测,如果你的股票池是“今天还活着、还在交易的股票”,那你就把那些已经退市、已经破产、股价跌到灰飞烟灭的股票全部排除在历史回测之外了。你的回测结果当然好看,因为你在历史上只选到了“活到最后”的幸运儿。可实盘中,你根本不知道哪只会活到最后。
这些坑的共同特点是:它们不会自己暴露在代码运行过程中。回测代码写得再严谨、运行得再流畅,也不代表数据逻辑就是对的。判断数据是否可靠、处理方式是否引入未来信息,需要的是人对数据生成过程和存储过程的理解,需要人工去逐层审查。这部分能力很难被自动化——因为自动化程序只会忠实执行你的指令,不会质疑你的数据逻辑。
2.2 模型层的坑:过拟合是量化最大的敌人
哪怕数据层的问题全部处理干净了,模型层还有一个更大的坑等着你:过拟合。
我先把过拟合翻译成人话。所谓过拟合,就是你用一套复杂到极致的模型,把历史数据“背”了下来。历史数据里有一个上涨、一个下跌、一个震荡,你的模型把这些细节全部精准复刻,回测曲线被拉得平滑完美,高夏普、低回撤,怎么看怎么像圣杯。但问题在于:市场不是靠“背诵”就能考过的考试。你把过去十年的真题答案背得滚瓜烂熟,新考卷一到,全变样了。
量化领域里有一句老话:回测的尽头是过拟合,过拟合的尽头是实盘翻车。真实经历里,我见过太多人用一个策略反复调参,今天把持仓周期从3天改成4天,明天把止损线从5%改成7%,后天发现某个参数组合回测夏普能从1.5提高到2.8,于是如获至宝。但他们忽略了一个致命的逻辑:你在100个参数组合里总能找到一个历史表现最好的——这不是因为你找到了规律,而是你恰好选中了那一段随机波动里最顺的区间。这就像抛硬币100次,总有一次连续出现5次正面朝上,你非说这是规律,那就没法聊了。
国外的学术研究里管这叫多重检验问题。你在同一个数据集上试了100种策略、100组参数,总有一个是“有效的”,但它的有效性极大概率是随机噪声导致的。真正的Alpha需要经过样本外数据验证、需要经过不同市场环境的检验,而不是在同一个历史数据上来回打磨。
还有一个容易被忽略的问题叫参数漂移。哪怕你非常严谨地找到了一组在历史上有效的参数,比如一个动量策略的最优持仓周期是5天,市场运行一阵子之后,这个“最优周期”会慢慢漂移——可能变成6天、7天,甚至完全失效。模型参数本身就不是一个静态值,它是市场结构的影子。市场参与者换了、交易规则变了、波动率变了,参数的最优解就跟着变了。程序化策略最大的好处是严格执行参数,但最大的坏处也是严格执行参数——当参数已经漂移到危险区,代码根本不会自己停下来反思。
2.3 市场层面的坑:Alpha本身会衰减、会被拥挤
数据层的问题可以通过人工审查规避,模型层的问题可以通过严谨的验证框架降低概率,但市场层面的坑是最让人无力的:Alpha本身有生命周期。
我举一个特别典型的例子。早期有一批量化机构发现小市值股票的收益显著高于大市值,于是大量资金涌入小市值策略,把小市值因子“买”到了失效。到后来,小市值策略不仅不赚钱,反而变成了一种拥挤交易,前期进去的人赚得盆满钵满,后期跟进的人成了接盘侠。同样的故事反复发生在低波动因子、动量因子、反转因子等无数经典因子上。你写出来的全自动代码可能非常正确,非常忠实于历史逻辑,但市场不会因为你的代码忠实就停止变化。当一个策略被写进越来越多人的代码里,它的Alpha就开始被瓜分、被稀释、被磨平——这个过程叫Alpha衰减,是每个量化人都躲不过的宿命。
还有一个更深层的问题叫市场结构演化。十年前A股的交易者主体是散户,市场里充满情绪化、惯性化的交易行为;今天的市场里机构资金占比越来越高,程序化交易工具越来越普及,同样的策略逻辑表现自然大相径庭。更不要说交易制度层面的变化,比如涨跌停规则调整、交易时间变化、印花税调整、做市商机制引入等等,这些制度层面的变量会彻底改变某些策略的生存土壤。问题是:这些变量大部分是文本和政策层面的变化,代码无法自动更新对这些变量变化的认知。它只知道按照既定规则跑,而规则适用的大前提可能已经悄然改变了。
2.4 执行层的坑:代码写对了,钱也没赚到
退一万步说,你的数据没问题、模型没过拟合、市场环境也没改变,还是会有一批坑潜伏在执行层。最典型的就是滑点和冲击成本。
很多刚入门的人做回测时默认按信号价格成交,亏得最惨的就是这批人。举个例子,你的策略生成一个次日开盘买入的信号,回测系统按次日开盘价成交,看似合理。但实盘中,如果这个信号同时被很多资金捕捉到,次日开盘的直接结果就是高开跳空——你以远高于回测假设的价格买入,利润空间被瞬间压缩。尤其是策略容量超过市场流动性承载能力的时候,冲击成本会进一步吃掉Alpha。这就是为什么很多策略在回测里夏普高达3,实盘跑一个月连正收益都保不住。
我甚至见过一种更隐蔽的执行问题:信号在收盘后生成,但程序实际下单时的价格撮合逻辑没有处理限价单被拒、部分成交、撤单重发这些现实的细节。回测里一根K线一个成交量,实盘里的订单簿是动态的、流动的、充满噪声的。代码在回测里跑得丝滑流畅,在实盘里却可能频繁漏单、滑单。你说代码写错了吗?没有,逻辑完全一致,但钱就是在实盘里莫名其妙地少了。
执行层的坑虽然看起来不像数据层和模型层那样“高大上”,但它是实盘最现实的打击。而更残酷的是,即使你把执行层做得无懈可击,你依然无法改变一个事实:策略什么时候失效,代码不会告诉你。失效的最初信号往往隐藏在数据里——可能是收益率的波动结构变了,可能是策略对某类行情的敏感度变了——这些信号需要一个有经验的人盯着绩效归因报表去发现。
3. 实操视角:量化系统里“人”到底在哪里
3.1 一个完整策略从想法到上线的关键节点
说了这么多“为什么写不进代码”,总有人会反问:那量化到底是怎么做的?人到底在哪个环节起作用?我直接给一张从想法到上线的流程图,把“人”的位置标出来。
一个策略的完整生命周期通常经过这几个节点:
- 提出假设:基于你对市场的观察和理解,提出一个“可能有赚钱逻辑”的假设。比如你认为“某类财报超预期的事件会引发持续数日的超额收益”,这个假设从哪里来?代码给不了你,只能来自你对市场行为的认知。
- 数据验证:把假设变成可量化的信号,用历史数据验证它的有效性。这一步人要判断数据口径、处理方式、是否有前视偏差和幸存者偏差。机器只能按已验证的逻辑执行计算,而“验证逻辑是否可靠”这一步永远需要人。
- 样本外测试:用一段没有参与参数优化的历史数据测试策略,检验它是否过拟合。人要根据测试结果判断策略是“真Alpha”还是“过拟合幸存者”。
- 模拟盘运行:在完全真实的市场数据流中模拟运行一段时期,观察滑点、成交、信号触发频率是否与回测一致。
- 小资金实盘:用极小的资金量真金白银跑一段时间,这一步是检验所有假设的终极裁判。人需要密切关注实盘与回测的偏离度。
- 持续监控与迭代:策略上线后的每个交易日,你都要判断策略有没有偏离预期、市场环境有没有变化、是否需要暂停或调整。
看到没有?从假设生成、数据验证、样本外测试,到实盘后的环境判断,每一个节点都有“人”的活跃位置。代码做的事,是在人做出判断之后,高效、无情、精确地把判断落地成交易。
3.2 半自动化的真实形态:代码负责执行,人负责判断
我做了这几年量化,见过形形色色的系统架构。要说有什么体系是相对健康、可持续的,我发现绝大多数做得好的人最后都走向了同一个模式:半自动化,或者用学术一点的说法叫“人在回路中”。
这套模式大概是这样的:
- 信号层:全自动代码负责扫描全市场的信号,实时监控所有策略的候选标的,按既定算法计算出信号的强度、方向和预期收益。这一步机器做得比人好,它可以覆盖几千只标的,永远保持注意力。
- 风控层:代码自动完成仓位计算、风险检查、组合优化。比如控制单一行业暴露不超过X%、总仓位不超过Y%,这些都是可规则化的,可以交给自动化。
- 决策层:策略是否上线、是否关停、是否调整参数,整个过程保留一个“人工确认”的接口。系统可以自动生成候选交易列表,但最后的开关握在基金经理手上。人每天看绩效归因报表,看环境监测指标,判断这个策略还值不值得继续跑。
我身边有一些做得很好的私募团队,他们的系统架构就是这个模子。人和机器分工清晰:机器负责海量计算和严格执行,人负责判断策略的生命周期、市场环境是否有变化、Alpha是否已经衰减到不值得继续运行。这套模式看起来不那么“酷”,不像“全自动赚钱机器”那么吸引眼球,但它在实盘中活得最久。
3.3 一个真实案例:看起来完美的策略如何失效
讲一个我自己踩过的真实案例。有一段时间我做了一个商品期货的日内动量策略,逻辑很简单:开盘一定时间内出现放量突破,顺势追入,日内平仓。这个策略在回测里表现非常漂亮,夏普比率稳定在2以上,回撤也控制在合理范围。当时我一度觉得这就是可以“一键全自动”的圣杯了,于是做了一个完全自动化的执行系统,信号到代码直接下单,没有人在中间做判断。
最开始两个月确实很爽,账户曲线和回测基本重合,几乎不需要人工干预。但第三个月开始,市场波动率明显下降,日内动量的幅度越来越小,突破信号频繁被假突破触发。系统还是忠实地执行每一个信号,但本金和手续费却在加速流失。直到我的风控指标发出警告,我才把策略暂停下来,做了一轮归因分析,才发现市场结构已经发生变化——波动率坍缩导致动量策略的平均收益从正转负。
这个案例给我最深的一个教训是:如果我的系统里保留一个人工判断的节点,在波动率下降初期就及时介入,是可以减少一部分亏损的。代码没有“感觉”,它不会因为连续亏损而产生警惕;但一个有经验的交易者看到连续一周的亏损曲线和波动率指标同时恶化时,直觉上会停下来问一句“哪里不对”。这种直觉和判断能力,恰恰是Alpha中最珍贵、也是最难写进代码的部分。
4. 常见问题与避坑清单:新手老手都能用
4.1 新手最容易踩的五个坑
我给几个高频踩坑场景,每一条都是真实的血泪:
- 把回测曲线当成Alpha。回测好看不代表实盘赚钱,过分漂亮往往意味着过拟合。真正的验证要看样本外、要看模拟盘、要看小资金实盘,时间会帮你筛掉绝大多数“看起来很美”的伪Alpha。
- 反复调参直到曲线完美。每调一次参数,你就把资金向过拟合的深渊推进了一步。如果优化到某组参数附近时性能急剧提升,而相邻参数表现却很差,这是危险的信号,不是值得庆祝的信号。
- 忽略交易成本。有些策略单次收益率很高,但交易频率极高,换手率大得惊人,算上手续费和滑点之后利润直接归零甚至转负。回测里一定要把成本模型做得足够保守。
- 忽视市场环境适应性。一个策略在趋势行情里赚大钱,在震荡行情里连续止损,这本身可能很正常。怕的是你只看到趋势行情里的高收益曲线,却没意识到自己处在不适合策略的阶段。
- 迷信全自动。希望代码覆盖所有情况、自动应对所有变化,本质上是把决策责任外包给一个自己不理解的系统。这是最危险的心态。
4.2 判断策略是不是“真Alpha”的快速检查表
我把判断一个策略是否是真Alpha的核心检查项整理成一张表,供你对照自查:
| 检查项 | 正常表现 | 危险信号 |
|---|---|---|
| 样本外表现 | 与样本内差距不大,逻辑一致 | 样本外收益大幅衰减甚至转负 |
| 交易成本敏感性 | 扣除保守估计的滑点与手续费后仍有正收益 | 微调成本参数后收益由正转负 |
| 参数敏感性 | 相邻参数组的回测结果平滑接近 | 只有某一组精确参数下才“完美” |
| 市场环境适应性 | 在多种波动率环境下仍有合理表现 | 只在特定行情阶段有效,换环境就失效 |
| 数据质量审查 | 无前视偏差、无幸存者偏差、复权处理正确 | 回测中存在未来函数或数据口径错误 |
| 容量与冲击成本 | 小资金回测与大资金假设下收益差距可控 | 资金规模增加后Alpha被冲击成本吃掉 |
你用这个表去对照任何一份策略报告,至少能筛掉八成看起来像是Alpha的回测结果。
4.3 几条走了弯路才悟出来的实操建议
最后给几条我自己走弯路换来的建议,不一定多高深,但每条都花过真金白银。
第一,自动化永远只到执行层,不要轻易交给决策层。把信号计算、仓位管理、订单执行这些流程自动化,但策略生效和关停的开关留在人手里。这样即使市场变脸,你还有一个人工介入的窗口期。
第二,给策略做定期的绩效归因,别等亏损大了才回头看。我一般每周跑一次策略的收益归因,看看收益是来自哪个因子、哪个市场板块、哪个时间段。一旦发现收益结构偏离历史模式,就把它当作“Beta异动”来排查,而不是等到净值大幅回撤才慌张。
第三,永远保留一个“不知道”的选项。策略表现异常,市场结构变化,大环境收缩,这些时候最好的操作往往是不操作。代码没有“暂停交易”之外的智能应对能力,但人可以。承认现在不属于这个策略的时间窗口,主动暂停甚至下线策略,是量化系统中最高级的一种人工干预。
第四,区分“量化的量化”。常有人把模型量化(比如对AI模型做INT8、GGUF量化压缩)和金融量化交易混为一谈,我在自己的博客里也写过,两者完全是两回事。模型量化解决的是算力与体积问题,金融量化解决的是投资收益与风险问题。别搜索的时候走岔了路,也别在一篇讲Alpha的文章里去找模型压缩的方案。
结尾
说了这么多,其实就是想讲清楚一件事:Alpha的本质是信息优势和认知优势,而优势天然会流失、会被模仿、会被市场结构变化冲散。全自动代码可以把一个优势执行到极致,但代码本身不会创造优势,也不会识别优势的消失。我这些年做量化的体会是,真正可持续的量化系统从来不是“完全不需要人”的系统,而是把执行交给代码、把判断留给人的系统。纯自动化的故事确实好听,但市场的残酷在于:如果Alpha真能被写死成代码,它早就不是Alpha了——趁它还在代码之外,人还看得见它的时候,靠自己的判断去捕捉它,才是量化交易最本真的样子。