门限自回归 TAR 非线性建模:用状态依赖的回归捕捉市场不对称反应
线性 AR 假设涨跌反应对称——但市场明显不是:下跌后反转快、上涨后延续慢。TAR/SETAR 用一个门限把状态空间切成两段,每段各配一套 AR 系数,让『昨天涨还是跌』决定今天用哪个模型。纯 numpy 实现网格搜索门限估计:合成 SETAR 数据上,下状态斜率 −0.20(均值回归)、上状态 +0.36(动量延续),线性 AR 只能给出一条『平均直线』全部拟丢,SETAR 把 RSS 压低 3.4%。样本外择时回测:TAR 择时 Sharpe 4.69 vs 线性 AR 4.19 vs 买入持有 4.46,最大回撤从 −7.6% 收窄到 −6.1%,仓位暴露仅 87.8%。诚实翻车:门限估计的抽样误差不小(真值 0 估出 −0.0034);Hansen 检验下门限参数不可识别导致标准推断失效;两段样本量不平衡时小状态系数噪声大。拆穿门限=拐点万能/RSS 降幅小=无用/TAR 一定赢线性等陷阱(中阶)。
先说结论:线性 AR 模型假设市场对涨跌的反应是对称的——同一个自回归系数既管上涨也管下跌。但实证事实是:大跌之后反转倾向强,上涨之后延续倾向弱,两边根本不是一套动力学。门限自回归(TAR,Threshold Autoregression)用一个门限值把状态空间切成两段,每段各配一套 AR 系数,让「昨天处于什么状态」决定「今天用哪个模型」。 在合成 SETAR 数据上实测:下状态斜率估出 −0.20(均值回归)、上状态 +0.36(动量延续),线性 AR 只能给一条”平均直线”把两种动力学全部拟丢;样本外择时回测中 TAR 择时 Sharpe 4.69,高于线性 AR 择时的 4.19 和买入持有的 4.46,最大回撤从 −7.6% 收窄到 −6.1%。但门限估计本身的抽样误差不小——真实门限 0,全样本估出 −0.0034,这个误差在实盘里就是信号错位。

一、线性 AR 的原罪:一条直线管两个世界#
标准 AR(1) 写作 。这个模型有一个几乎从不被明说的假设: 对所有 都一样。昨天涨 3% 和昨天跌 3%,模型给出的”延续强度”是同一个数。
但市场的经验事实恰恰相反:
- 恐慌下跌后:超卖反弹、抄底盘进场,短期均值回归强(负自相关);
- 温和上涨中:趋势资金追涨,动量延续(正自相关);
- 政策底/流动性冲击:反应速度完全不对称。
把这两种动力学塞进一个系数,得到的是两边都不像的”平均”。这不是参数估计误差,是模型设定错误。
二、TAR:让状态决定模型#
TAR 的想法极其直接。以最常用的两状态 SETAR(Self-Exciting TAR,转移变量是序列自身滞后)为例:
三个要素:门限 (切在哪)、延迟 (用几期前的值判断状态)、两套 AR 系数。给定 ,两段各自就是普通 OLS;难的只有 本身——它不可导,只能网格搜索:
import numpy as np
def fit_setar(X, Y, trim=0.15, n_grid=141):
"""两状态 SETAR(2;1,1):网格搜索门限,内层 OLS"""
cand = np.quantile(X, np.linspace(trim, 1 - trim, n_grid))
best = (np.inf, None, None)
for c in cand:
lo = X < c
if lo.sum() < 30 or (~lo).sum() < 30:
continue # 每段至少 30 个样本
b_lo = np.polyfit(X[lo], Y[lo], 1)
b_hi = np.polyfit(X[~lo], Y[~lo], 1)
rss = (np.sum((Y[lo] - np.polyval(b_lo, X[lo]))**2)
+ np.sum((Y[~lo] - np.polyval(b_hi, X[~lo]))**2))
if rss < best[0]:
best = (rss, c, (b_lo, b_hi))
return best # (最小RSS, 门限, 两段系数)python两个工程细节值得强调:
- trim(截尾):候选门限只在 15%~85% 分位之间取,保证两段都有足够样本,否则极端门限下小状态只剩几个点,系数纯属噪声;
- 每段最少样本数硬约束:这不是可选项,是防止过拟合的底线。
三、实验:线性 AR 拟丢了什么#
生成 2000 期 SETAR 数据:下状态()斜率 −0.45(强均值回归),上状态斜率 +0.35(动量延续),噪声 σ=1%。
估计结果:网格搜索找到门限 −0.0034(真值 0),下状态斜率 −0.20、上状态 +0.36。上状态几乎精确恢复;下状态斜率偏浅,因为门限估偏导致部分上状态样本混入下状态,把负斜率”稀释”了——这正是门限抽样误差的直接代价。

RSS 曲线在真实门限附近有一个清晰的洼地,SETAR 把残差平方和比线性 AR 压低 3.4%。这个数字看起来不大,但要点在于:收益预测的 R² 本来就以 1% 计,3.4% 的 RSS 改善在信号层面是显著的结构增益,而且它来自模型形状的修正,不是参数微调。
四、样本外择时:不对称结构能变成钱吗#
前 1000 期训练(重新估门限与系数),后 999 期样本外。策略规则:TAR 一步预测 > 0 持有,否则空仓;对照组是线性 AR 择时和买入持有。

| 指标 | TAR 择时 | 线性 AR 择时 | 买入持有 |
|---|---|---|---|
| 终值 | 16.76 | 13.55 | 17.06 |
| Sharpe | 4.69 | 4.19 | 4.46 |
| 最大回撤 | −6.1% | — | −7.6% |
| 仓位暴露 | 87.8% | 95.5% | 100% |
三个读法:
- 终值上 TAR 略输买入持有(16.76 vs 17.06)——这份合成数据整体漂移为正,任何择时都要付”踏空成本”。TAR 赢的是风险调整后收益:用 87.8% 的暴露拿到更高 Sharpe、更浅回撤;
- TAR 相对线性 AR 的增益是纯结构增益:两者用同样的数据、同样的规则,唯一区别是 TAR 知道”下跌后该用反转逻辑”。线性 AR 的单一系数在下状态给出系统性错误的方向预测;
- Sharpe 绝对值(4+)是合成数据信噪比高的产物,实盘日频择时能到 1 已经很好,看相对排序,别看绝对值。
五、已知的坑:TAR 不是免费午餐#
门限的抽样误差比你想的大。 门限估计量收敛速度虽快(超一致,n 阶而非 √n 阶),但小样本下波动仍然可观——本实验 2000 个点,真值 0 估出 −0.0034,相当于 0.34 个日波动。门限错位意味着状态判断在边界附近系统性出错。
门限检验不是普通 t 检验。 检验”是否存在门限效应”时,零假设(线性)下门限参数 不可识别,标准渐近分布失效,必须用 Hansen (1996) 的 bootstrap 上确界检验。直接看两段系数的 t 值差异会严重高估显著性——这是 TAR 文献里最常被忽略的一步。
两段样本不平衡是常态。 实盘数据里”极端状态”天然稀少,小状态可能只有全样本的 10%,那一段的系数标准误会大到没有实用价值。对策:要么把门限往中位数方向 trim,要么接受”小状态只做方向判断、不做精细预测”。
状态数与延迟 d 都是超参数。 本文固定两状态、d=1,实际应用中三状态(跌/盘/涨)和 d>1 都可能更优,但每加一个自由度,过拟合风险翻一倍,需要用 AIC/BIC 加样本外验证共同约束。
六、拆穿几个流行误读#
“门限 = 拐点,找到门限就找到了买卖点”。 错。门限是条件动力学切换的位置,不是价格拐点。 穿过门限只说明”预测模型换了一套系数”,方向信号仍取决于该状态下的完整预测值。
“RSS 只降 3.4%,模型没用”。 拟合优度的边际改善和交易价值不是线性关系。择时策略只需要在符号判断上做对更多——本实验中 3.4% 的 RSS 改善换来了 Sharpe 从 4.19 到 4.69、回撤收窄 1.5 个百分点。
“TAR 一定赢线性”。 只在数据真有门限结构时成立。若真实过程是线性的,TAR 多出来的参数就是纯过拟合,样本外必然反噬。先做 Hansen 检验确认非线性显著,再上 TAR——顺序不能反。
“合成实验赢了,实盘照搬”。 本文数据生成过程和估计模型同族(都是 SETAR),这是模型正确设定下的上限演示。实盘序列的非线性未必长成门限型(可能是平滑过渡、可能是时变系数),TAR 只是非线性工具箱里最简单的一把刀。
七、总结#
TAR 的核心贡献是把”市场反应不对称”这个人尽皆知的定性观察,变成了一个可估计、可检验、可回测的定量结构:一个门限、两套系数、网格搜索即可估计。它的代价同样清楚:门限抽样误差、非标准推断、小状态样本稀缺。把它当成线性 AR 之后的第一步非线性升级——而不是终点——是最合理的定位。