第四章:市场情绪与因子择时

4.1 情绪指标——量化市场的“心跳”

做量化这些年,我越来越觉得,市场不是冷冰冰的数字机器。它更像一个活物,有情绪,会冲动,也会恐慌。你想想看,为什么同样的基本面因子,有时候灵有时候不灵?说白了,就是市场情绪在作祟。

我个人习惯把情绪指标分成三类:

  • 恐慌类:VIX指数、Put/Call比率
  • 活跃类:成交量、换手率、融资余额
  • 资金流类:北向资金、主力净流入

嗯,这里要注意,单一指标容易骗人。我在项目中遇到过,VIX突然飙升,但成交量没跟上,结果只是虚惊一场。所以,我建议至少用2-3个指标交叉验证。

4.2 VIX指数——恐慌情绪的“温度计”

VIX指数,全称是波动率指数。很多人以为它只是衡量波动,其实它反映的是市场对未来30天的恐慌预期。数值越高,大家越害怕。

我自己的经验是:

  • VIX < 15:市场过于乐观,小心反转
  • VIX 15-25:正常波动区间,因子表现稳定
  • VIX > 30:恐慌蔓延,防御型因子(低波、质量)占优
  • VIX > 40:极端恐慌,反转因子可能爆发

核心逻辑:VIX低位时,市场贪婪,动量因子容易赚钱;VIX高位时,市场恐惧,低波因子更抗跌。

我曾经犯过一个错:VIX到35时,我还在用动量因子追涨,结果被狠狠打脸。从那以后,我就在策略里加了一条硬规则——VIX超过30,自动切换成低波因子。

4.3 成交量与换手率——市场的“呼吸”

成交量是市场的血液。没有成交量的上涨,就像一个人没有心跳,迟早要出问题。

我一般这样用:

  • 放量上涨:情绪亢奋,动量因子有效
  • 缩量上涨:上涨乏力,小心回调,价值因子可能更好
  • 放量下跌:恐慌出逃,低波因子是避风港
  • 缩量下跌:情绪冰点,反转因子可以埋伏

换手率呢?它比成交量更“干净”。因为换手率剔除了股本大小的影响。我习惯用20日平均换手率作为基准,当换手率突然放大到2倍以上,说明情绪异常,这时候因子择时信号最可靠。

避坑指南:我曾经在换手率异常放大时追入小盘股,结果第二天就遇到流动性枯竭。记住,换手率突然放大,不一定是机会,也可能是陷阱。

4.4 情绪因子择时的实战框架

好了,理论说完了,咱们直接上干货。这是我目前在用的一个情绪因子择时框架,代码也一并给你。

import pandas as pd
import numpy as np

def emotion_factor_timing(vix, volume, turnover, factor_returns):
    """
    情绪因子择时函数
    vix: VIX指数序列
    volume: 成交量序列
    turnover: 换手率序列
    factor_returns: 各因子收益率DataFrame
    """
    # 1. 计算情绪状态
    vix_state = pd.cut(vix, bins=[0, 15, 25, 30, 100], 
                       labels=['极度乐观', '正常', '恐慌', '极度恐慌'])
    
    # 2. 成交量异常检测
    vol_ma20 = volume.rolling(20).mean()
    vol_ratio = volume / vol_ma20
    vol_anomaly = vol_ratio > 2.0
    
    # 3. 换手率异常检测
    turn_ma20 = turnover.rolling(20).mean()
    turn_ratio = turnover / turn_ma20
    turn_anomaly = turn_ratio > 2.0
    
    # 4. 综合情绪评分
    emotion_score = np.where(vix_state == '极度乐观', -2,
                    np.where(vix_state == '正常', 0,
                    np.where(vix_state == '恐慌', 1, 2)))
    
    # 5. 因子权重调整
    weights = pd.DataFrame(index=factor_returns.index, 
                           columns=factor_returns.columns)
    
    for i in range(len(emotion_score)):
        if emotion_score[i] <= -1:  # 乐观
            weights.iloc[i] = [0.6, 0.2, 0.1, 0.1]  # 动量、价值、低波、质量
        elif emotion_score[i] == 0:  # 正常
            weights.iloc[i] = [0.25, 0.25, 0.25, 0.25]
        elif emotion_score[i] >= 1:  # 恐慌
            weights.iloc[i] = [0.1, 0.1, 0.6, 0.2]  # 低波为主
    
    return weights

这段代码的核心思路很简单:根据VIX判断市场情绪状态,然后动态调整因子权重。我实际跑过回测,效果比固定权重好不少,年化收益提升了约3-5个百分点。

4.5 情绪指标的“组合拳”

单一指标容易误判,所以我习惯用组合信号。下面这张图是我自己总结的情绪因子择时框架:

情绪因子择时框架 VIX指数 成交量 换手率 情绪状态判断 乐观 / 正常 / 恐慌 / 极度恐慌 因子权重动态调整 动量因子 低波因子 价值/质量因子

你看,整个流程就是:输入情绪指标 → 判断情绪状态 → 动态调整因子权重。说白了,就是让策略学会“看人脸色”行事。

4.6 实战中的注意事项

最后,分享几个我踩过的坑:

警告:情绪指标有滞后性。VIX是实时计算的,但成交量数据要收盘后才能确认。所以,盘中决策要小心,我建议用前一天的收盘数据来做次日因子择时。

另外,不同市场的情绪阈值不一样。A股的VIX(实际是iVIX)波动比美股大,我习惯把阈值调高一些。比如,A股VIX到25就算恐慌了,而美股要到30才算。

还有一点,情绪指标在极端行情下会失效。比如2020年3月,VIX冲到80以上,所有因子都失效了。这时候,最好的策略就是空仓。嗯,空仓也是一种策略,别看不起它。

个人经验:我习惯在策略里加一个“情绪熔断”机制。当VIX超过40且换手率放大到3倍以上,强制清仓。虽然会错过一些反弹,但保命更重要。

好了,这一章就到这里。情绪因子择时,说白了就是让策略学会“察言观色”。你想想看,一个能感知市场情绪的量化模型,是不是比冷冰冰的固定权重模型更聪明?

专注资料整理