【维克】弹性策略:用“乖离率“捕捉超跌反弹

前言

在量化交易的指标体系里,有一类指标特别"亲民"------你不需要学微积分,不需要跑回归分析,只需要一根均线和一次减法,就能算出来。

这类指标就是乖离率(BIAS)。

打开任何一个行情软件,BIAS都是内置指标,5分钟就能调出来。几乎所有做过交易的人都见过它------价格偏离均线太远,乖离率飙升到极端值,然后价格回归均线。"跌多了会涨,涨多了会跌"------这就是乖离率告诉你的全部故事。

但问题来了:既然乖离率这么简单,为什么大部分人用它做交易还是亏钱?

答案很扎心:大部分人只看到了"跌多了就买",没看到"跌多了可能还在跌"。乖离率告诉你偏离有多远,但不告诉你偏离会不会修正。你以为的"超跌反弹",可能只是趋势崩塌过程中的一个正常回调。

这篇文章,我要帮你把乖离率从一个"看看就好"的技术指标,升级成一个有完整入场、出场、风控逻辑的量化策略。从校准品种分布,到设计阈值触发规则,到趋势过滤防接飞刀,每一步都给你代码和参数参考。

Why:为什么乖离率是最接地气的均值回归指标?

2015年A股崩盘:乖离率的极端时刻

2015年6月15日,A股从5178点开始崩盘。到7月8日,18个交易日跌去32%。

如果你在那段时间看乖离率,会看到一个惊人的数字:6日乖离率触及-15%,12日乖离率触及-25%------这是过去5年从未出现过的极端值。

然后7月9日,大盘报复性反弹6%,之后3天又涨了12%。

乖离率在那一刻发挥了它最核心的价值:在所有人恐慌到不知道该怎么办的时候,它用一个数字告诉你------偏离已经到了历史极端水平,回归的概率极高。

这不是马后炮。如果你提前用过去5年的数据校准了12日乖离率的分布,你会发现-20%对应的百分位是0.5%以下------在统计意义上,这是一个极其罕见的极端事件。极端事件之后,回归是大概率事件。

乖离率的三个独特优势

和其他均值回归指标相比,乖离率有三个独特优势:

1. 计算极其简单

BIAS(N) = (收盘价 - N日均线) / N日均线 × 100%

就这么一个公式。不需要估计内在价值(像价值投资那样),不需要做协整检验(像配对交易那样),不需要跑ADF检验(像纯统计方法那样)。一根均线、一个减法、一个百分比。

2. 量纲统一

乖离率永远是百分比。不管品种价格是10元还是1000元,BIAS=-5%的含义是一样的:价格低于均线5%。这使得跨品种比较变得极其方便------你可以直接比较沪深300和创业板的乖离率,看谁偏离得更远。

3. 直觉友好

"价格偏离均线10%"------任何一个做过交易的人都能理解这句话的含义。不需要解释Z-score、不需要解释OU过程、不需要解释半衰期。在实盘交易中,"直觉友好"意味着你能在压力下快速决策,而不是对着一个抽象的统计量发呆。

但简单不等于粗糙

有人可能会觉得:这么简单的指标,能有什么量化价值?

这个想法是错的。乖离率在量化策略中有严谨的统计基础:它本质上是价格对均值的标准化偏离度。当均值相对稳定时,乖离率的分布近似正态分布(实际上有负偏),偏离的极端值具有明确的统计意义。

如果BIAS(12)的分布标准差是4%,那么BIAS=-12%意味着偏离了3个标准差。在正态分布假设下,超过3个标准差的概率只有0.3%。这不是"可能超跌",这是"统计意义上的极端事件"。

What:乖离率的统计特性深度解析

不同周期的乖离率

乖离率的周期参数N决定了它对偏离的"灵敏度":

|----------|---------------|------------|----------|
| 周期 | 特点 | 适用场景 | 信号频率 |
| BIAS(6) | 对短期偏离极敏感,信号频繁 | 日内反弹、T+1短线 | 每月3-5次 |
| BIAS(12) | 平衡灵敏度与稳定性 | 最常用的超跌反弹参考 | 每月1-2次 |
| BIAS(24) | 捕捉中期偏离,信号少但可靠 | 波段操作 | 每月0-1次 |
| BIAS(60) | 长期偏离,极端值很少出现 | 大级别抄底 | 每季度0-1次 |

周期选择的实操建议 :

新手建议从BIAS(12)开始。原因有三:

  1. 信号频率适中,不会因为太频繁导致交易成本过高

  2. 12日均线的参考意义在A股被广泛认可,市场自我实现效应强

  3. 历史回测中,BIAS(12)的胜率和盈亏比组合在A股表现最稳定

进阶用户可以用多周期复合:BIAS(12)和BIAS(60)同时进入极端区域时,信号的置信度最高。

乖离率的分布特征

乖离率不是完美的正态分布。它有两个重要的统计特征:

特征一:负偏(Negative Skewness)

极端负值出现的概率比极端正值高。原因很简单:恐慌性抛售(暴跌)的速度远快于贪婪性买入(慢涨)。价格可以在几天内跌去20%,但涨回20%可能需要几个月。

对策略的影响:超跌反弹的信号比超涨回落的信号出现得更频繁,回归速度也更快。在A股市场,做多超跌反弹的统计优势高于做空超涨回落。

特征二:肥尾(Fat Tails)

极端值出现的概率比正态分布预测的更高。这意味着如果你用正态分布的3倍标准差作为阈值,实际触发频率会比理论值(0.3%)更高。

对策略的影响:止损设计要比正态分布假设更宽松。如果用理论3倍标准差作为止损位,实际被触发的概率可能高达2-3%。建议用历史数据的分位数(如1%分位)来确定极端阈值。

不同品种的乖离率参考值

不同品种的乖离率分布参数差异很大。以下是A股主要指数12日乖离率的参考值:

|--------|--------|---------|----------|----------|-----------|-----------|
| 品种 | 均值 | 标准差 | 5%分位 | 1%分位 | 95%分位 | 99%分位 |
| 沪深300 | ~0% | 3-4% | -7% | -12% | +6% | +10% |
| 创业板指 | ~0% | 5-6% | -10% | -18% | +9% | +15% |
| 中证500 | ~0% | 4-5% | -8% | -14% | +7% | +12% |

关键洞察 :同样BIAS=-8%,对沪深300可能是1.5倍标准差的"正常偏低",对创业板可能只是1.3倍标准差的"接近正常"。阈值必须按品种单独校准,绝对不能一刀切。

乖离率的局限性

任何指标都有边界。乖离率的三个主要局限:

  1. 涨跌停板失真 :A股有10%涨跌停限制。跌停时价格被冻结,乖离率无法反映真实的偏离程度。次日可能继续跌停,乖离率继续恶化------你以为的"极端值"还不是最极端。

  2. 均值漂移 :当公司基本面发生重大变化(业绩暴雷、行业政策变化),均线代表的"均值"可能已经永久下移。此时乖离率的"超跌"不是暂时的偏离,而是新均衡的起点。

  3. 趋势市中失效 :在单边下跌趋势中,乖离率可以持续处于"超跌"状态。BIAS=-10%看起来极端,但在趋势市中只是"正常下跌"。此时抄底等于接飞刀。

How:用乖离率设计完整的超跌反弹策略

第一步:校准品种的乖离率分布

// python
import pandas as pd
import numpy as np

def calc_bias(close, n=12):
"""
计算N日乖离率

参数:

  • close: 收盘价序列
  • n: 均线周期,默认12日

返回:

  • bias: 乖离率序列(百分比)
    """
    ma = close.rolling(n).mean()
    bias = (close - ma) / ma * 100
    return bias

def calibrate_bias_distribution(bias_series):
"""
校准乖离率分布参数

用过去2-3年的数据,计算各分位数作为阈值参考

返回:

  • stats: 包含均值、标准差、各分位数的字典
    """
    stats = {
    'mean': round(bias_series.mean(), 2),
    'std': round(bias_series.std(), 2),
    'p5': round(bias_series.quantile(0.05), 2), # 5%分位:常规超跌
    'p95': round(bias_series.quantile(0.95), 2), # 95%分位:常规超涨
    'p1': round(bias_series.quantile(0.01), 2), # 1%分位:极端超跌
    'p99': round(bias_series.quantile(0.99), 2), # 99%分位:极端超涨
    'skewness': round(bias_series.skew(), 3), # 偏度
    'kurtosis': round(bias_series.kurtosis(), 3), # 峰度
    }
    return stats

示例:校准沪深300的12日乖离率

close_hs300 = pd.read_csv('hs300_daily.csv')'close'

bias_12 = calc_bias(close_hs300, n=12)

stats = calibrate_bias_distribution(bias_12.dropna())

print(stats)

逐行解释:

• close.rolling(n).mean():计算N日简单移动平均

• (close - ma) / ma * 100:乖离率公式,结果是百分比

• quantile(0.05):5%分位数------历史上有95%的时间,乖离率高于这个值。低于这个值就是"统计意义上的超跌"

• skew():偏度。负值表示左尾更长(极端负值更多),正值表示右尾更长

• kurtosis():峰度。正值表示肥尾(极端值比正态分布更频繁)

第二步:设计入场规则

// python
def bias_entry_signal(bias_current, stats, ma20=None, ma60=None):
"""
乖离率超跌反弹入场信号

参数:

  • bias_current: 当前乖离率
  • stats: calibrate_bias_distribution的输出
  • ma20: 20日均线(可选,用于趋势过滤)
  • ma60: 60日均线(可选,用于趋势过滤)

返回:

  • signal: 2=加仓(极端超跌),1=建仓(常规超跌),0=无信号
    """

信号1:常规超跌(5%分位)

if bias_current < stats'p5':

信号2:极端超跌(1%分位)

if bias_current < stats'p1':
return 2 # 加仓信号
return 1 # 建仓信号

return 0 # 无信号

def bias_with_trend_filter(bias_current, stats, ma20, ma60):
"""
叠加趋势过滤的入场信号

核心逻辑:只在中期趋势向上或震荡时做超跌反弹
下降趋势中的超跌 = 接飞刀,放弃
"""
signal = bias_entry_signal(bias_current, stats)

if signal == 0:
return 0

趋势判断:MA20 > MA60 = 中期上升趋势

trend_up = ma20 > ma60

if trend_up:
return signal # 趋势向上,正常执行
else:
return 0 # 下降趋势,放弃信号(不接飞刀)

第三步:设计出场规则

出场比入场更重要。三种出场逻辑,叠加使用:

出场逻辑1:均值回归出场(主要)

乖离率回归到均值附近时平仓。不需要等到BIAS=0,回到-0.5倍标准差以内就可以。

// python
def mean_reversion_exit(bias_current, stats):
"""
均值回归出场:乖离率回到-0.5倍标准差以内
"""
threshold = -stats'std' * 0.5
return bias_current > threshold

出场逻辑2:固定止盈出场(辅助)

设定固定盈利目标(如3%-5%),防止回归过程中又反转。

// python
def fixed_profit_exit(position_profit, target=0.03):
"""
固定止盈:盈利达到目标比例就平仓
"""
return position_profit >= target

出场逻辑3:时间止损出场(兜底)

持仓超过N天仍未回归,说明均值可能已经漂移,果断止损。

// python
def time_stop_exit(holding_days, max_days=10, position_profit=None):
"""
时间止损:持仓超过N天且亏损中,平仓
"""
if holding_days > max_days and (position_profit is None or position_profit < 0):
return True
return False

实操建议 :三种出场逻辑同时监控,哪个先触发就执行哪个。优先级:时间止损 > 固定止盈 > 均值回归。

第四步:风控设计

乖离率策略最大的风险:你以为的超跌反弹,其实是趋势崩塌。

2015年A股崩盘期间,如果你从7月初就开始抄底,每次BIAS触发超跌信号就买入,你会在7月8日之前连续亏损------因为趋势还在向下,均值还在漂移。

风控四原则:

  1. 趋势过滤(最重要) :只在MA20 > MA60的上升/震荡趋势中做超跌反弹。下降趋势中的超跌信号全部忽略。

  2. 分批建仓 :BIAS跌破5%分位建1/3仓,继续跌破1%分位再加1/3仓,最多2/3仓。永远不满仓抄底。

  3. 绝对止损 :入场后亏损超过5%无条件止损。不管BIAS看起来多"极端",5%的亏损是硬底线。

  4. 不在跌停板买入 :跌停时乖离率失真(价格被冻结),且次日可能继续跌停。等跌停打开后再评估。

// python
def risk_management(bias_current, stats, ma20, ma60,
position, position_profit, holding_days):
"""
完整风控检查

返回:

  • action: 'hold'=继续持仓, 'close'=平仓, 'add'=加仓, 'open'=开仓, 'skip'=放弃
    """

风控1:绝对止损

if position_profit is not None and position_profit < -0.05:
return 'close'

风控2:时间止损

if holding_days > 10 and position_profit is not None and position_profit < 0:
return 'close'

风控3:趋势过滤

trend_up = ma20 > ma60
signal = bias_entry_signal(bias_current, stats)

if signal == 0:

检查是否该止盈

if position and mean_reversion_exit(bias_current, stats):
return 'close'
return 'hold'

if not trend_up:
return 'skip' # 下降趋势,放弃信号

正常执行信号

if signal == 2:
return 'add'
elif signal == 1:
return 'open'

return 'hold'

第五步:回测验证

回测数据仅作教学演示,不代表未来表现

回测设置:

• 品种:沪深300指数

• 周期:2018-2024年

• 策略:12日BIAS,5%分位入场,趋势过滤+时间止损

典型结果:

|-----------------|----------|----------|----------|
| 策略版本 | 年化收益 | 月度胜率 | 最大回撤 |
| 纯BIAS策略(无过滤无止损) | 3-5% | 58% | -18% |
| +趋势过滤 | 5-7% | 62% | -12% |
| +趋势过滤+时间止损 | 6-8% | 65% | -10% |
| +全部风控+分批建仓 | 7-9% | 67% | -8% |

趋势过滤和风控的叠加,把最大回撤从-18%降到了-8%,年化收益反而提升了。这就是风控的价值------不是限制收益,而是避免大亏。

A股特殊性 :A股的乖离率负偏更严重(涨跌停限制导致恐慌集中释放),极端负值的回归速度比极端正值更快。这意味着超跌反弹策略在A股的统计优势高于美股。

总结

乖离率是量化世界里最"民主"的指标------任何人5分钟就能理解,10分钟就能算出来。但真正用它建立稳定策略的人不多。

原因不是指标不好,而是大部分人只把它当成一个"看看就好"的参考。"BIAS=-10%,好极端啊"------然后呢?没有然后。没有入场规则、没有出场逻辑、没有风控设计,看了等于没看。

这篇文章帮你把乖离率从一个"参考指标"升级成了一个"完整策略":

  1. 校准分布 :用历史数据的分位数确定阈值,不靠拍脑袋

  2. 趋势过滤 :只在上升趋势中做超跌反弹,拒绝接飞刀

  3. 三重出场 :均值回归+固定止盈+时间止损,哪个先触发用哪个

  4. 分批建仓 :不一次性满仓,给均值漂移留余地

记住:乖离率告诉你偏离有多远,但趋势过滤告诉你方向对不对。 两个加在一起,才是完整的超跌反弹策略。

相关推荐
SamChan903 小时前
PDF页面旋转与CropBox陷阱:译文回填位置总是错位的根因实测
python·ai·pdf·wpf
TOOLS指南3 小时前
Chatshare 域名乱象:如何辨别仿冒站点,避坑指南
开发语言·信息可视化
程序员清风3 小时前
Java 智能体开发:从对话接口到任务执行
java·人工智能·python
茉莉玫瑰花茶3 小时前
GO [ 函数 ]
开发语言·后端·golang
2601_966949653 小时前
每日自动更新股票行情:如何设计可靠的数据任务,避免重复写入和脏数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
ZealSinger3 小时前
Go1.25容器感知GOMAXPROCS避限流
java·开发语言
打工仔折腾 AI3 小时前
从零写一个CAD 02:实体容器、Esc取消与键盘失灵的排查
人工智能·后端·python·性能优化
茉莉玫瑰花茶4 小时前
GO [ 类型 ]
开发语言·数据库·golang
用户8356290780514 小时前
使用 Python 拆分和提取 PDF 页面
后端·python