
很多人以为量化策略都是靠复杂数学模型堆出来的其实有一类特别实用的方法就是去学术论文里翻答案。我最近就干了一件事从一篇行为金融方向的论文里找到了一个反转策略的完整操作框架然后把它落成了可以跑的代码和回测。这篇文章就把整个过程拆开讲清楚包括论文里哪些东西可以直接用、哪些需要做工程化改造、回测里最容易骗人的地方在哪、以及从回测到实盘之间还隔着哪些坑。1. 从论文里挖策略我为什么盯上反转效应1.1 当学术结论遇上实盘逻辑论文里讨论的反转效应简单说就是一段时间内涨得多的股票未来一段时间更容易跌跌得多的股票未来更容易反弹。这个现象在行为金融学里有一整套解释比如过度反应、处置效应、投资者注意力有限等等。学术界对它的研究从上世纪八九十年代就开始了样本覆盖美股、A股、亚太多个市场结论相对扎实。但我真正看中的不是它的学术背景而是它有一个很关键的特质逻辑简单因子清晰换手率可控。相比那些动辄几十个因子的机器学习模型反转策略的底层逻辑更接近市场直觉也更容易归因。做得好的时候你知道是为什么赚的钱做得差的时候你也大概知道是为什么亏的钱。这个特性在实盘里非常重要因为策略一旦出现回撤你如果说不清楚回撤原因就很难决定是继续持有、加仓还是停下来。反转策略的价值就在于它的行为金融解释给了一个相对可靠的“安全垫”——即便短期失效你也知道它在等什么逻辑回归。当然论文归论文实盘归实盘。论文里用的是月度数据、学术数据库实盘里你得面对分钟级行情、涨跌停限制、停牌、ST摘帽、一字板买不进这些乱七八糟的问题。所以从论文到代码中间要做大量的工程化落地工作。这篇博文我按照“选论文—拆因子—做回测—上实盘”的顺序来写尽量把每一步的关键决策和踩坑点都交代清楚。1.2 论文里的因子如何翻译成代码我选的那篇论文核心结论是过去20个交易日的累计收益率如果排在市场后10%那未来20个交易日大概率跑赢市场平均。这个表述听起来很直白但翻译成代码的时候每个词都会变成一个需要做决策的参数。先说“过去20个交易日”。为什么是20个交易日而不是5个、60个这涉及到反转效应的时间尺度问题。学术研究发现短期反转1周以内和中期反转3到12个月的驱动机制不一样前者更多是流动性挤压带来的价格修正后者更多是投资者对信息的反应不足或过度反应。20个交易日恰好落在短期和中期之间的过渡区它在A股上的表现相对稳定既不会因为太短而噪音过大也不会因为太长而跟动量效应混在一起。这个选择不是拍脑袋而是我在几篇论文里对比出来的结果后面在参数敏感性测试里我也会详细说怎么验证这个窗口期是否稳健。再说“累计收益率”。这里也有两个细节值得注意。第一用的是对数收益率还是简单收益率学术论文里常用对数收益率因为它具备时间可加性但在实盘因子计算里简单收益率更直观而且对于20天这种短窗口两者差异很小选哪个都不会对排名产生本质影响。第二要不要剔除极端值比如一只股票因为资产重组连续涨停20天涨了100%它一定排进“过去涨得多”的组但它的反转逻辑和普通股票完全不同。所以实操中我会做去极值处理把极端收益压缩到合理范围内避免个别股票主导整个组合的表现。“排在市场后10%”这一步其实就是横截面排序。每天或者每20天把所有股票按过去20日收益从低到高排序取最低的10%构建组合。这个做法在代码里实现非常直接但涉及到一个重要问题股票池怎么定是全市场还是剔除ST、剔除上市不满60天的新股、剔除停牌股我在回测里默认剔除ST和上市不满一年的次新股因为这两类股票的定价逻辑和正常股票差别太大容易给策略带来虚假收益。但要不要剔除科创板、北交所就得看你的资金体量和交易权限了不同股票池做出来的曲线完全是两个策略。2. 策略核心因子构造与数据处理的几个关键坑2.1 收益率窗口怎么选才不翻车因子构造是整个策略的地基地基没打牢后面回测再漂亮都是虚的。先看最核心的参数过去收益率的计算窗口。我上面提到论文里的基准是20个交易日但这不是唯一的正确答案。A股市场有显著的大小盘风格差异小盘股的反转效应通常比大盘股更强因为小盘股流动性差、投资者结构更分散定价效率更低。所以同一个20日反转因子在小盘股池里跑出来的超额收益可能比全市场高出2到3个百分点。但“小盘股超额高”不等于“小盘股更好”因为小盘股交易成本更高、冲击成本更大、容量更低。你在回测里看到的3个点超额一旦扣掉真实的滑点和冲击成本可能只剩1个点甚至归零。所以选窗口期要结合自己的执行能力来定。如果资金量在千万级别全市场选股完全够用如果资金量到了几个亿就得考虑往大盘股倾斜或者拉长持有周期来降低换手。窗口期除了收益计算还有一个被很多人忽略的维度持有期和调仓频率。论文里通常是每月调一次仓持有期等于形成期也就是20天算因子、持有20天。但实盘里我更倾向于5天或10天调一次仓因为A股风格切换快20天的持有期容易吃到反转的尾巴又吐回去。我做过一组对比5天调仓的版本虽然换手率高了但年化超额比20天调仓高不少尤其是扣除手续费之后仍然有优势。原因在于反转信号衰减的速度比我预想的快5天正好抓在价格修正最剧烈的阶段而20天有一半时间在“等一个可能不来的继续反弹”。当然调仓频率高意味着手续费敏感度也高。万二的佣金加千一的印花税20天调一次一个月只换两次仓5天调一次一个月要换四次费用差距是实打实的。所以调仓频率要和预期超额做匹配不能只看毛利要看净利。2.2 中性化处理不剔除风格暴露回测全是假的论文模型里通常不怎么做中性化因为学术研究的核心是证明“反转效应存在”它不需要把收益拆成风格收益和alpha收益。但实盘不行。你如果直接拿原始反转因子选股组合会在小市值、高波动的股票上天然超配——因为跌得多的股票往往就是小盘高波动。这样一来你以为是反转因子在赚钱实际上可能是小市值风格在赚钱或者高波动溢价在赚钱。一旦风格切换因子就会失效而你根本搞不清是市场变了还是因子死了。所以我在构造实盘因子的时候会做两件事市值中性化和行业中性化。市值中性化就是先把所有股票的因子值对市值做回归取残差作为新的因子值。行业中性化同理把因子值对行业虚拟变量回归取残差。做完这两个处理后选出来的组合在各市值分段和行业上的分布会接近基准这时候的超额收益才能归因于反转逻辑本身。这里有一个实操细节回归取残差时要不要把因子值本身也标准化我建议做。因为不同窗口期算出来的因子值分布不一样有的是百分位排名有的是原始收益不标准化的回归结果会受极端值影响。我的做法是因子值先做MAD去极值再做z-score标准化然后对市值和行业做回归取残差。每一步都有意义去极值是为了防止个别股票主导回归标准化是为了让因子在不同股票间的差异体现为相对位置而不是绝对数值。做完中性化之后还有一步很多人容易漏掉等权重还是市值加权。论文里通常用等权重因为学术研究不关心容量问题但实盘里等权重意味着大量资金压在小市值股票上流动性风险和时间成本都很高。我用的是“市值加权的等方法”先按因子值排序选出目标股票然后按市值加权分配仓位但每只股票设置一个最大权重上限避免单票风险过度集中。这样既保留了小盘股的弹性又不至于让小市值股票绑架整个组合的流动性。3. 回测与参数敏感性别让过拟合毁掉一个还不错的想法3.1 搭建一个能说真话的回测框架因子构造好之后进入回测阶段。说实话回测框架这块我踩过的坑比因子本身还多。最典型的骗局是未来函数。比如你用了当天的收盘价算因子然后当天就以收盘价买入这在回测系统里能成交但实盘里你根本不可能在收盘那一瞬间完成交易。我的处理方法是信号生成日T日收盘后计算因子T1日开盘买入。这样至少保证了一夜的缓冲和实盘操作节奏一致。另一个容易忽略的是停牌和涨跌停的处理。回测系统里停牌股票如果还出现在交易列表里它会以停牌前价格成交这在实盘里根本不可能。涨跌停也一样一字涨停的股票你想买买不进一字跌停的股票你想卖卖不出。所以我的回测框架里加了一层过滤开盘涨停的股票不能买入开盘跌停的股票不能卖出。这个处理在牛市里尤其重要因为很多暴涨股会出现连续一字板如果回测假装你能买进去收益会虚高得离谱。手续费和滑点这部分我给的建议是宁可高估不要低估。佣金按万2.5算印花税卖出千1滑点按成交价的0.2%计算。要注意滑点不是固定的市值越小滑点越大一字板股票滑点可能直接超过5%。我在回测里用的滑点模型是市值分档的小市值股票滑点设得更高。虽然这会拉低策略表现但至少我看到的回测结果在实盘里不会缩水太多。下面是我常用的回测参数表各位可以直接参考参数设定值备注股票池全市场剔除ST、次新股次新股定义为上市不满250个自然日因子计算日每个交易日收盘后用当日收盘数据买入执行T1开盘价开盘竞价买入涨停过滤卖出执行T1开盘价跌停过滤佣金万2.5双边含规费印花税千1卖出单边不做任何减免假设滑点0.2%按市值分档调整小市值上调至0.3%调仓频率5个交易日一期形成期、一期持有期3.2 参数敏感性测试换个窗口还能不能打一个策略能不能上线关键不是它在最优参数下有多赚钱而是它在参数偏离最优值的时候还稳不稳。如果窗口从20天改成18天或者23天策略收益就大幅下滑那说明你找到的规律可能是过拟合的产物不是市场的真实结构。反转策略相对好的一点是它的经济学逻辑比较扎实但具体参数对你的实现方式依然敏感。我做了几组敏感性测试分别把形成期和持有期从5天扫到40天标记每组参数下的年化超额、夏普和最大回撤。结果发现形成期在10到30天之间策略的超额都为正但峰值出现在20天附近持有期则相对敏感5到10天明显优于20天以上。这个结果和论文结论有差异论文说20天持有期最优但我的回测里5天更好。为什么我觉得是A股的定价效率比论文样本市场更快反转信号在更短的时间内就被消化完了。这也解释了一个现象很多海外论文的策略拿到A股直接水土不服不是逻辑错了而是市场微观结构不同导致最佳参数区段整体偏移了。还有一个值得注意的维度时间区间稳定性。我把回测区间切成三段——牛市段、熊市段、震荡段分别看策略表现。反转策略理论上应该是震荡市最强、牛市次之、熊市最弱因为熊市里“跌得多的股票”往往是基本面真的恶化了反转逻辑跟“接飞刀”没什么区别。我的回测结果基本符合这个预期震荡段年化超额最高熊市段虽然有超额但回撤明显变大。这说明反转策略不是一个全天候策略它更适合作为组合里的一种风格配置而不是唯一的收益来源。参数敏感性这块我还有一个心得想分享不要只盯着一组最优参数要关注参数平原。如果最优参数周围一大片区域的绩效都接近说明策略稳定如果只有孤零零一个点绩效特别好周围都很差这几乎可以断定是过拟合。我的反转策略在参数平原上表现不错这也是我愿意继续往下推进实盘的原因。4. 实盘落地从回测到资金的最后一段路4.1 交易执行与成本假设回测做得再漂亮最终都要面对实盘的考验。实盘和回测最大的差距在于成交价格。回测里你可以假设T1开盘价成交但实盘里你的下单本身会影响开盘价。尤其是小市值股票你手里几百万资金进场可能直接把价格推高1个百分点。所以实盘我会做两件事第一限价单代替市价单。开盘前根据集合竞价的情况挂一个略高于当前买一价的限价单尽量保证成交的同时避免用市价单吃掉太多卖单。第二分时段执行。不集中在开盘那几分钟下单而是在开盘后半小时内分批完成降低对盘口的冲击。交易成本这块回测里的假设和实盘实际扣费还有差距。比如我用的是万2.5佣金但实际如果你资金量够了可以跟券商谈到万1.2甚至更低。印花税是硬成本千1卖出逃不掉。加上滑点一笔完整的买卖买入卖出成本大概在千2到千3之间。所以实盘策略的扣费后年化超额如果低于3%基本就没有上线的意义因为这点超额很容易被一次意外滑点吃掉。仓位管理也是一个容易被低估的环节。单票最大权重我设定为5%也就是说组合至少持有20只股票。这个分散度的考量是反转策略选出来的股票天然波动大如果不做分散单票的黑天鹅事件可能直接打穿组合的风控线。另外我还会做行业分散单一行业持仓不超过总仓位的20%防止踩中行业性利空。4.2 风险控制反转策略的容量与回撤反转策略的容量问题必须提前想清楚。这个策略的换手率不低5天调一次仓双边年化换手可能在40倍以上。资金量小的时候无所谓但资金量超过一个阈值策略收益就会被冲击成本吃掉。我粗略估算全市场选股、小市值股票不做限制的反转策略容量大概在3000万到5000万之间。超过这个规模要么往上加市值约束要么接受收益递减这两条路都会改变策略的收益风险特征。回撤控制方面反转策略有一个天然的弱点它在市场极端下跌的时候会严重跑输。因为“过去跌得多的股票”在市场崩盘时往往是跌得最狠的反转因子会不断选出那些跌得最惨的股票相当于在下跌趋势里持续接飞刀。我的应对方案是加了一个市场状态过滤器当市场指数20日均线在60日均线下方、且近5日跌幅超过3%时策略仓位减半。这个过滤器在历史回测里能避开几段最大的回撤但也会让你错过一些反弹初期的收益。这是个取舍我选择先活下来。实盘过程中另一个容易踩的坑是因子值更新滞后。你每天要重新计算全市场股票的因子值但如果你的数据源更新延迟或者停牌、除权除息处理不当计算出来的因子排名会和真实值有偏差。我的做法是每天收盘后跑一次因子计算流程数据源用收盘后统一推送的日线数据并且对除权除息做前复权处理。前复权这块尤其重要如果不做除权处理一次高送转就会让因子值出现假跳变导致选出的股票完全是错的。我在早期回测里就吃过这个亏当时没有做复权处理策略收益虚高了不少后来修复之后绩效直接掉了一个档次但那才是真实水平。5. 常见问题与排查技巧实录回测和实盘过程中我整理了一些典型问题和排查思路做成速查表供参考问题现象可能原因排查方向回测收益奇高年化超过100%存在未来函数或幸存者偏差检查因子计算是否用到当日或未来数据检查股票池是否包含退市股实盘收益明显低于回测滑点估计不足或冲击成本偏高对比实际成交价与信号价的偏差重新校准滑点模型策略在某个时间段突然大幅回撤市场风格切换小市值或高波动风格走弱查看因子分组的超额收益是否同步下滑判断是因子失效还是风格拖累换手率比预期高很多因子值在相邻调仓日变化过大检查因子是否做了去极值和标准化必要时在因子层做平滑处理买入信号股票当日涨停买不进信号集中在强势股开盘即涨停增加涨停过滤或把买入时间从开盘竞价改为盘中观察分红送转导致因子值异常未做前复权处理统一使用前复权价格计算因子并在数据更新时复核复权因子排雷的时候有个技巧每出现一个异常先别急着改参数要先把数据拉出来看。比如你觉得策略在某一年表现特别差就把那一年的分组收益拆出来看反转因子在那一年是不是整体失效。如果整体失效那是市场环境问题策略逻辑没问题可以等如果只是某一组股票拖累那就要检查是不是选股标准出了问题。另外我见过很多人搞错的一个细节回测曲线和基准的比较方式。反转策略的收益曲线要跟同期的中证500或者中证1000比不是跟沪深300比。因为反转因子选出来的股票天然偏向中小市值你拿它跟沪深300比相当于拿创业板跟银行股比完全没有意义。基准选错了整个策略评价体系就错了后面做的所有优化都是白费。还有一点关于数据源的建议做量化研究数据质量比策略模型重要得多。我早期用免费数据源回测结果因子计算里经常出现缺失值、价格跳变、复权不连续这些问题整个回测结果基本不可信。后来换了一套商业数据源虽然花了点钱但数据质量带来的收益远远超过成本。如果你只是初学者用免费数据源做学习没问题但做出来的回测结果不要直接当真一定要找几个真实的交易记录去对照验证。回撤之后的应对策略我自己的体会是先判断是市场原因还是策略原因。市场原因导致的回撤通常是一段时间内所有风格的因子都在回撤不只是你的反转因子这时候耐心持有是最重要的。策略原因导致的回撤表现为你的因子分组收益出现逆转——比如本来该跑赢的低估组开始跑输说明市场对这个因子的定价逻辑变了这时候要考虑暂停策略或者调整参数。这两者之间的判断没有捷径只能靠长期盯盘积累的盘感。最后说一个我自己的习惯每一版策略迭代我都会完整记录当时的市场环境、参数调整、回测结果和实盘表现。过几个月再做一次复盘看看当初的判断哪些对了、哪些错了、为什么错了。这种记录方式比任何复盘工具都管用。量化策略的世界里赚钱的逻辑千千万但能让你持续赚钱的不是某一个神奇的因子而是你对市场的持续观察和对自己判断的持续修正。反转策略只是这个过程中的一个不错的起点它简单、透明、有学术支撑非常适合作为你建立自己量化体系的第一块地基。