市场环境与自适应门禁
第 13 章用分散化对付了个股风险,但留了一类它管不了的东西:全市场一起跌。第 13 章的坑清单里叫「相关性归一」——系统性危机来临时,所有风险资产的相关系数瞬间飙到 0.9,你分散得再好也是一起下水。有没有办法在坏时光到来之前把仓位降下来?
注意,这不是要你预测顶底——那是玄学。这一章的思路朴素得多:不预测,只识别。市场当前处于什么环境,是可以观测、可以写成规则、可以检验的;识别出弱势环境就少做或不做,识别回强势再做。这个外层的主开关,叫门禁(Gating)。
为什么「全天候策略」必死
Section titled “为什么「全天候策略」必死”先把这个行业里流传最广的幻想拆掉。有没有一组参数,在单边牛市、阴跌熊市、高波震荡里都能赚钱?
回看第二编就知道答案:趋势策略(第 8 章)靠「突破后跟进」赚钱,震荡市里突破全是假的,它被反复打脸;均值回复(第 9 章)正好反过来,震荡市是它的主场,单边趋势里它一路逆势抄底、一路被套。同一类行情,一个策略的粮食是另一个策略的毒药。把双均线跑在「趋势+震荡」混合的行情上,样本内勉强为正的净值,其实是趋势段赚的钱在给震荡段的亏损填坑——你得到的是一个「平均而言不亏」的策略,而不是一个「随时都懂行情」的策略。
面对这个事实只有两条路:一是造一个能自动适应所有环境的更聪明的策略(这条路极难,而且极易过拟合);二是承认环境的存在,给策略加一个外层开关:环境对路才营业,环境不对路就歇业。本章讲第二条路,因为它简单、可检验、而且效果惊人。
环境变量:市场宽度
Section titled “环境变量:市场宽度”环境必须用可观测的变量来刻画——任何依赖「我感觉要变盘」的判定都不可回测。最常用的一个叫市场宽度(breadth):
人话解释:全市场有几成股票还站在多头结构里。 接近 1,普涨格局;接近 0,泥沙俱下;在 0.5 附近拉锯,分化震荡。它是比大盘指数更诚实的体温计——指数被权重股绑架,宽度不会。
有了变量,环境判定就是一条写死的规则:
- :RiskOn(进攻环境),策略正常营业;
- 连续 2 日 :RiskOff(防守环境),策略歇业,不开新仓。
为什么要「连续 2 日」而不是当日跌破当日就切?因为宽度在 0.5 附近会来回穿越——单日阈值的门禁会像接触不良的灯管一样疯狂开关,每次开关都是一次交易成本和一次被反复打脸的机会。滞回(hysteresis,多确认一天再动作)用一点反应速度换稳定,这笔交易永远划算。这与上一章的马尔可夫视角一脉相承:环境的自转移概率很高(不会天天翻转),所以「晚一拍」损失很小,「抖动」损失很大。
最后一条纪律先立好:阈值 0.5 和宽度的定义必须在回测之前写死。门禁也是规则,也会过拟合——把 0.4、0.45、0.5、0.55 都试一遍挑最好的,就是第 6 章的参数网格换了件衣服。
手算:门禁前后
Section titled “手算:门禁前后”用一个 12 天的迷你样本把整套机制算一遍。下表每行依次是:宽度、按滞回规则判定的环境、某多头倾向策略的当日收益、门禁后的当日收益(RiskOff 日空仓记 0):
| 日 | 宽度 | 环境 | 策略收益 | 门禁后 |
|---|---|---|---|---|
| 1 | 0.62 | RiskOn | +1.2% | +1.2% |
| 2 | 0.65 | RiskOn | +0.8% | +0.8% |
| 3 | 0.70 | RiskOn | −0.5% | −0.5% |
| 4 | 0.55 | RiskOn | +2.0% | +2.0% |
| 5 | 0.48 | RiskOn(跌破第 1 日,不切换) | −1.8% | −1.8% |
| 6 | 0.42 | RiskOff | −2.2% | 0 |
| 7 | 0.38 | RiskOff | −1.5% | 0 |
| 8 | 0.35 | RiskOff | −0.9% | 0 |
| 9 | 0.44 | RiskOff | +1.1% | 0 |
| 10 | 0.52 | RiskOn | +0.6% | +0.6% |
| 11 | 0.58 | RiskOn | +1.4% | +1.4% |
| 12 | 0.61 | RiskOn | +0.9% | +0.9% |
无门禁:累计收益 +1.2+0.8−0.5+2.0−1.8−2.2−1.5−0.9+1.1+0.6+1.4+0.9 = +1.1%。途中从第 4 天的高点 +3.5% 一路跌到第 8 天的 −2.9%,回撤 6.4 个百分点。
有门禁:只吃 RiskOn 日的收益,累计 = +1.2+0.8−0.5+2.0−1.8+0.6+1.4+0.9 = +4.6%,最大回撤只剩 +3.5% → +1.7% 的 1.8 个百分点。
注意这 12 天里策略一个字没改——同一组参数、同一套信号,唯一的变化是弱势时段空仓。收益翻了四倍、回撤砍掉七成,全部来自一个二值的开关。也要诚实地看到代价:第 9 天策略赚 +1.1%,门禁把它放弃了(歇业期间的反弹一天都不参与);第 5 天跌 −1.8% 门禁没能躲掉(滞回还在确认中)。门禁是保险,不是预言。
(当然,这 12 天是精心构造的教学数字。真实数据上门禁不会每回都这么灵,下面的坑清单里有它失手的样子。)
图:250 日的对照
Section titled “图:250 日的对照”把同样的机制跑在本章的合成演示上(门禁演示:250 日合成数据。隐藏环境(强/弱两状态,日切换概率 5%)驱动市场宽度(AR(1),强锚 0.62 / 弱锚 0.34)。门禁规则只用可观测宽度:≥ 0.5 为 RiskOn,连续 2 日 < 0.5 切 RiskOff(2 日滞回防抖)。策略日收益:强环境 N(0.17%, 1.2%)、弱环境 N(−0.22%, 1.4%)(多头倾向策略在弱市阴跌)。gateRule 与 regime 判定只用当日及之前宽度,无前视;门禁后 RiskOff 日空仓(收益 0))。上图是同一策略的两条净值曲线,下图是市场宽度与门禁阈值,浅红色背景是门禁判定为 RiskOff 的区间(由宽度序列按滞回规则逐日算出,只用当日及之前的数据,无前视):
先看数据成色:这段行情由一个隐藏的强/弱两态过程驱动(日切换概率 5%),其中弱势日共 117 天,策略在强势日的日均收益 0.144%、弱势日 -0.185%——一个典型的「多头倾向、弱市阴跌」的策略。门禁从可观测的宽度里恢复出隐藏环境,判定准确率 0.836,实际歇业 108 天;其中 25 个弱日因为宽度确认得慢仍被持有(滞回的代价),另有 16 个强日被误关在门外——晚一拍的账单,两头都有。
对照读图:
| 指标 | 无门禁 | 有门禁 |
|---|---|---|
| 累计收益 | -4.9% | 2.7% |
| 年化收益 | -4.9% | 2.7% |
| 最大回撤 | −20.7% | −12.4% |
| 夏普比率 | -0.22 | 0.15 |
灰色净值在每段浅红背景里阴跌下台阶,红色净值同期基本走平(空仓)——同一个亏损的策略,只是不在弱市营业,就翻转了盈亏符号:累计收益从 -4.9% 变成 2.7%,最大回撤从 −20.7% 压到 −12.4%,夏普从 -0.22 翻到 0.15。策略本身一行代码没动。这就是门禁最可靠的收益不是「多赚」,而是「不亏在错误的时间」:它把策略的亏损集中区(弱市)整段剪掉,剩下的净值曲线自然平滑。
也要看到另一面:被关在门外的 16 个强日、和没躲掉的 25 个弱日,就是「晚一拍」的全部代价。如果策略在弱市的期望只是「差一点」而不是明显为负,这些代价会吃掉更多改善,门禁就变成「降低收益、只换回撤」的保险——值不值取决于你更恨回撤还是更恨踏空。先想清楚你要什么,再决定装不装门禁。
门禁在方法学上的位置
Section titled “门禁在方法学上的位置”三个容易混淆的东西划清界限:
- 门禁 ≠ 调参:门禁不碰策略的任何参数。均线还是那对均线,因子还是那个因子。它是套在策略外面的主开关,作用于「要不要暴露」而不是「怎么交易」。
- 门禁 ≠ 预测:门禁只观测和跟随当前环境,不猜顶底。它永远晚一拍(滞回的设计主动承认了这一点),因此躲不过 V 型反转的第一段——空仓踏空是它的固定成本。
- 门禁 ≠ 免检:门禁规则(宽度定义、阈值、滞回天数)同样是在历史数据上看出来的,同样要过第 6 章的样本外封条。「策略过了检验,再顺手加个门禁」而门禁本身没检验过,等于给保险柜配了把没验过的锁。
伪代码:带滞回的门禁
Section titled “伪代码:带滞回的门禁”输入:市场宽度序列 B[1..n]、阈值 T = 0.5、滞回天数 H = 2 策略信号与回测引擎(第 4 章)输出:门禁前后的两套净值与指标(同表对照报告)
第一步:环境判定(每个交易日收盘后,只用当日及之前的宽度) state = RiskOn(初始),below = 0 对 t 从 1 到 n: 若 state = RiskOn: 若 B[t] < T:below += 1;若 below ≥ H:state = RiskOff 否则:below = 0 // 重置连续跌破计数 否则(RiskOff): 若 B[t] ≥ T:state = RiskOn regime[t] = state
第二步:门控执行 对 t 从 1 到 n: 若 regime[t] = RiskOn:按策略信号正常交易 否则:不开新仓;已有持仓按策略自身退出规则处理
第三步:对照报告 同一时段输出两组净值:无门禁 vs 门禁后 收益、回撤、夏普同表报告,包括门禁变差的方向 (门禁让收益变低也要写——那是保险费,不是失败)- 阈值是试出来的。0.5 不好使就试 0.45、0.4,挑出回撤最漂亮的那档——门禁的参数网格和第 6 章的均线网格是同一种病。宽度定义(20 日均线还是 60 日)、阈值、滞回天数,全部预先写死。
- 门禁信号用了未来数据。宽度用当日收盘价算,当日收盘就切换状态、当日收盘价成交——未来函数的马甲。环境判定必须收盘后做、次日生效。
- 把门禁当圣杯。门禁降低弱市暴露,代价是踏空 V 型反转的第一波(空仓时市场已经开始涨了,宽度回升到阈值之上才会重新营业)。滞回越深、越稳,错过的第一段就越长。没有免费午餐,只有明码标价的保险。
- 门禁与策略分开检验。最隐蔽的坑:策略单独过了样本外,门禁是后来「顺手加上」的,没进封条流程。正确的做法是把「策略 + 门禁」当成一个整体策略,一起过样本外——门禁改变了交易的时点分布,两者的组合是新产品,不是旧产品的附件。
门禁解决了「什么时候不做」。还剩一个同样值钱的问题:做的时候,买谁? 当特征从一条动量变成几十条,怎么把它们合成一个排序——以及为什么排序排得再准,也可能赚不到钱。下一章讲当代选股研究的核心工具和它最著名的陷阱。