halo 的技术博客

返回

市场里有一条很反直觉、但被验证过无数次的规律:当所有人都在恐慌的时候,往往就是该买的时候;当所有人都乐观自满的时候,反而该警惕了。

问题是——「所有人的恐慌」怎么量化?你不能靠感觉。但期权市场恰好提供了一个几乎实时的情绪温度计:Put-Call 比率(Put-Call Ratio, PCR)

当投资者害怕下跌,他们会疯狂买入看跌期权(put)做保护,PCR 冲高;当大家一片乐观、觉得只会涨,看涨期权(call)成交占主导,PCR 走低。PCR 本质上是把「市场情绪」直接写成了一个可交易的数字。 而且它是个典型的反向指标:高到极致意味着恐慌见顶(反向看多),低到极致意味着贪婪见顶(反向看空)。

一、PCR 是什么,为什么它反向#

定义非常简单:

PCRt=看跌期权成交量t看涨期权成交量t\text{PCR}_t = \frac{\text{看跌期权成交量}_t}{\text{看涨期权成交量}_t}

(有人用成交量,有人用持仓量 open interest,后面陷阱部分会讲两者差别。)

  • PCR 高(比如 > 1.2):买 put 的人远多于买 call 的——市场在集体买保险,恐慌情绪浓。按反向逻辑,恐慌到顶 → 卖压释放得差不多了 → 短期看多
  • PCR 低(比如 < 0.7):买 call 的人占主导——市场一片乐观、没人想着对冲。按反向逻辑,贪婪自满 → 脆弱 → 短期转谨慎

反向指标的底层假设是过度反应会被修正:极端恐慌通常伴随非理性抛售,价格被砸过头,随后有均值回复的反弹。这就是 PCR 反向策略赚钱的来源——它赚的是别人恐慌时的过度反应修正

二、别用固定阈值:PCR 有慢性漂移#

新手最常犯的错:直接拿「PCR > 1」当恐慌信号。这几乎必然失败,因为 PCR 的中枢会随时间漂移(市场结构变化、做市商行为变化、散户参与度变化都会推动它)。今年的 1.0 可能是恐慌,明年的 1.0 可能只是常态。

正确做法是用滚动 z-score——把 PCR 标准化成「相对它近期自己的偏离」:

zt=PCRtμt(w)σt(w)z_t = \frac{\text{PCR}_t - \mu_{t}^{(w)}}{\sigma_{t}^{(w)}}

其中 μt(w),σt(w)\mu_t^{(w)}, \sigma_t^{(w)} 是过去 ww 天(本文取 120 天)的滚动均值和标准差。只用历史窗口、不含当天,避免前视。

import numpy as np

zwin = 120
pcr_z = np.full(T, np.nan)
for t in range(zwin, T):
    w = pcr[t-zwin:t]                         # 只用过去 120 天
    pcr_z[t] = (pcr[t] - w.mean()) / (w.std(ddof=1) + 1e-12)
python

这样一来,信号是「PCR 相对自己最近的水平有多极端」,而不是一个写死的绝对值——漂移问题自动被吸收。

三、先验证:PCR 真的能反向预测吗?#

在写策略之前,先做一个诚实的检验:按 PCR 的 z-score 高低把所有日子分成五组,看每组之后 5 天的平均收益。如果反向逻辑成立,恐慌组(高 PCR)之后的收益应该显著高于贪婪组(低 PCR)。

我用 10 年(2520 个交易日)的合成期权情绪面板来做——面板里,市场收益带波动聚集,并在若干恐慌事件后设置了真实的过度反应反弹(这正是反向策略的收益来源);PCR 则由近端跌幅和恐慌应激共同驱动。

按 PCR 分组的次 5 日平均远期收益:从 Q1 最贪婪到 Q5 最恐慌,收益单调抬升,Q5 显著为正

结果非常干净:

分组平均 PCR z-score次 5 日平均收益
Q1(最贪婪)−0.95−0.16%
Q2−0.44−0.15%
Q3−0.27+0.04%
Q4+0.09+0.27%
Q5(最恐慌)+2.30+0.67%

反向单调关系成立:从最贪婪到最恐慌,后续 5 日收益从 −0.16% 单调抬升到 +0.67%。恐慌组(Q5)跑赢贪婪组(Q1)约 0.83 个百分点——考虑到只是 5 天的窗口,这个价差相当可观。这就是策略敢下注的实证基础:不是拍脑袋说反向,而是先看数据里反向关系确实存在。

四、构造反向择时策略#

验证通过,接下来把它做成一个可执行的择时规则。我用一个保守的反向版本:

  • PCR 的 z-score ≥ +1(极度恐慌)→ 次日做多(满仓);
  • z-score ≤ −1(极度贪婪)→ 次日空仓(离场规避,而非做空);
  • 中间区维持上一状态。

之所以贪婪时只空仓不做空,是因为反向做空一个长期上行的市场,期望值往往是负的——趋势的力量比情绪均值回复更持久,硬顶趋势很容易被抬走。空仓已经能规避掉贪婪见顶后的部分下跌,风险收益更划算。

z_hi, z_lo = 1.0, -1.0
pos = np.zeros(T)
for t in range(zwin+1, T):
    z = pcr_z[t-1]                # 信号滞后一期, 避免前视
    if z >= z_hi:
        pos[t] = 1.0             # 极度恐慌 -> 反向做多
    elif z <= z_lo:
        pos[t] = 0.0             # 极度贪婪 -> 空仓规避
    else:
        pos[t] = pos[t-1]        # 中间区维持
r_strat = pos * ret              # 策略日收益
python

五、结果:恐慌抄底 + 贪婪离场,把回撤压下来#

PCR 序列与市场净值:PCR 在市场下跌段冲高并进入极度恐慌区,市场随后企稳反弹

先看 PCR 和市场的关系:紫线是 PCR,每次冲进红色「极度恐慌区」,基本都对应市场净值(灰线)的一段深跌之后——而这些点往往紧跟着企稳反弹。绿色的「极度贪婪区」则常出现在阶段性高位。PCR 确实在给市场情绪实时测温。

再看策略净值和回撤:

PCR 反向择时 vs 买入持有累计净值:反向择时净值更平滑,尾段略微领先

回撤对比:反向择时因贪婪区空仓,最大回撤明显小于买入持有

指标PCR 反向择时买入持有
年化收益6.75%6.45%
Sharpe0.430.36
最大回撤−28.1%−34.6%
平均仓位76.7%100%

策略的年化收益只比 buy&hold 高一点(6.75% vs 6.45%),但它是用平均只有 76.7% 的仓位赚到的——也就是说,有近四分之一的时间它在场外(贪婪区空仓),却拿到了和满仓相当的收益,还把最大回撤从 −34.6% 压到 −28.1%。这正是情绪择时的典型收益形态:不是暴力拉高收益,而是用更少的暴露、更小的回撤,拿到相近甚至略好的结果。 Sharpe 从 0.36 提升到 0.43,风险调整后是实打实的改善。

六、四类真实陷阱(实战必看)#

1. 固定阈值必死,必须滚动标准化。 这一点前面强调过,这里再钉一遍:PCR 的中枢随市场结构漂移,「PCR > 1 就是恐慌」这种绝对阈值用不了多久就会失效。本文全程用 120 天滚动 z-score,信号永远是「相对自己最近有多极端」。任何用死阈值的 PCR 策略,回测和实盘会严重脱节。

2. PCR 口径混乱,数字之间不可比。 市面上的 PCR 有好几种:全市场股票期权 PCR、指数期权 PCR(如 CBOE 的 SPX PCR)、成交量 PCR vs 持仓量 PCR。它们的水平和含义都不一样——指数期权 PCR 天然偏高(机构常年用指数 put 做组合对冲,不代表恐慌),股票期权 PCR 更贴近散户情绪。用错口径,信号方向可能都是反的。选定一个口径,别混用。

3. 反向指标在单边趋势市会持续挨打。 均值回复类策略的通病:它假设「过度了会修正」。但在强单边行情里(比如持续大跌的熊市),恐慌可以一直恐慌、跌了还能再跌——你按「恐慌抄底」进场,可能一路抄在半山腰。本文的合成数据里恐慌事件后都有反弹,现实里不是每次恐慌都有反弹。反向策略必须配止损或仓位管理,不能无脑满仓抄。

4. 危机样本太少,统计上不够硬。 PCR 反向策略的收益高度依赖少数几次「恐慌见顶→反弹」的大事件。本文 10 年样本里也就 10 次左右的恐慌事件——样本量小意味着回测的 Sharpe 有很大的估计误差,换个随机种子、换段历史,数字可能明显不同。真要上实盘,得用尽可能长的历史、跨多个市场周期验证,别被单一样本的漂亮数字骗了。

七、小结:PCR 是情绪的温度计,不是水晶球#

Put-Call 比率反向策略的逻辑闭环:

  • PCR = 看跌/看涨成交量,直接量化市场恐慌 vs 贪婪;
  • 它是反向指标:恐慌见顶(高 PCR)→ 反向看多,贪婪见顶(低 PCR)→ 转谨慎;
  • 滚动 z-score 消除 PCR 的慢性漂移,不能用固定阈值;
  • 五分位验证反向关系成立(Q5 恐慌组 +0.67% vs Q1 贪婪组 −0.16%,单调);
  • 据此的反向择时用 76.7% 的平均仓位拿到和 buy&hold 相当的收益,Sharpe 0.36→0.43、回撤 −35%→−28%。

对做实盘的意义:PCR 是个优秀的辅助情绪信号,但别把它当独立的圣杯。 它最大的价值是「测温」——告诉你当下市场是恐慌还是自满,帮你在极端点位做仓位增减。想更进一步:把它和 VIX、融资余额、涨跌家数等其他情绪指标合成一个综合情绪指数(单一情绪指标噪声大,多指标合成更稳),再叠加趋势过滤器(避免在下跌趋势里过早抄底)。先把「反向指标会在趋势市挨打」和「危机样本稀缺」这两件事想透,你就不会拿 PCR 去做它做不到的事了。


代码与图表均由自包含 Python(numpy/matplotlib)真实计算,随机种子固定为 20260717,可完整复现。所有统计数字(五分位 Q5 +0.67% / Q1 −0.16%,反向择时 Sharpe 0.43 / 年化 6.75% / 回撤 −28.1%,buy&hold Sharpe 0.36 / 回撤 −34.6%,平均仓位 76.7%)来自文中脚本输出。模拟的期权情绪面板与恐慌-反弹结构为演示设定;真实 PCR 需注意口径(指数 vs 个股、成交量 vs 持仓量),实盘表现依赖真实历史与危机样本数量。

Put-Call 比率情绪:用期权持仓失衡给市场恐慌测温
https://blog.halo26812.eu.org/blog/put-call-ratio-sentiment
Author halo
Published at 2026年7月17日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨