跳转至

A 股情绪周期与择时策略 (2025-2026)

最后更新: 2026年4月30日 | 状态: 研究就绪 覆盖范围: 情绪周期识别、择时信号、区间切换策略、宏观因子联动


1. A 股市场周期特征

A 股市场呈现明显的"牛短熊长、快涨慢跌"特征,受以下因素驱动: - 政策周期: 货币政策宽松/紧缩、IPO 节奏管控、印花税调整 - 资金周期: 北向资金、融资融券、新基金发行、险资配置 - 情绪周期: 散户参与度、涨停板效应、社交媒体热度

典型周期阶段

阶段 特征 持续时间 量化信号
筑底期 成交量萎缩、估值低位、情绪悲观 3-6 月 PB<1.2、换手率<1%、融资余额持续下降
启动期 政策催化、北向回流、领涨板块出现 1-2 月 北向 5 日净流入>100亿、涨停数>50
加速期 赚钱效应扩散、新开户激增、杠杆上升 2-4 月 新增开户>50万/周、融资余额增速>5%/周
狂热期 全民炒股、垃圾股暴涨、杠杆见顶 1-2 月 TRD>3.0、换手率>5%、涨停/跌停比>3
退潮期 高位股崩塌、流动性收紧、恐慌抛售 2-3 月 跌停数>50、北向持续净流出、融资余额下降

2. 情绪周期量化指标体系

2.1 领先指标(预测未来 1-4 周走势)

社融信用脉冲

信用脉冲_t = (社融_TTM_t - 社融_TTM_{t-12}) / GDP_{t-4}
信用脉冲向上拐头通常领先 A 股底部 1-3 个月。

M1-M2 剪刀差

剪刀差_t = M1_yoy_t - M2_yoy_t
剪刀差收窄(M1 增速接近 M2)预示资金活化,利好股市。

新基金发行量 4 周滚动新发偏股基金规模。极端低位(<50亿/周)通常为底部信号。

2.2 同步指标(确认当前市场状态)

涨停广度指数

涨停广度 = (涨停家数 - 跌停家数) / 总交易家数

0.3 表示强势市场,<-0.1 表示弱势市场。

行业轮动速度

轮动速度 = 周度行业收益率排名前 5 的变更数量 / 5
轮动速度加快(>0.6)表示市场缺乏主线,行情接近尾声。

2.3 滞后指标(确认趋势结束)

融资余额见顶 融资余额连续 2 周下降,通常确认市场已进入退潮期。

产业资本减持 上市公司净减持规模创阶段新高,确认顶部区域。


3. 择时策略框架

确认趋势结束)

融资余额见顶 融资余额连续 2 周下降,通常确认市场已进入退潮期。

产业资本减持 上市公司净减持规模创阶段新高,确认顶部区域。


3. 择时策略框架### 3.1 多信号综合择时模型

def timing_signal(macro_score, sentiment_score, technical_score):
    """
    综合择时信号: -1 (空仓) 到 +1 (满仓)
    """
    # 权重配置
    w_macro = 0.35
    w_sentiment = 0.35
    w_technical = 0.30

    composite = (w_macro * macro_score + 
                 w_sentiment * sentiment_score + 
                 w_technical * technical_score)

    # 信号映射到仓位
    if composite > 0.5:
        return 1.0   # 满仓
    elif composite > 0.2:
        return 0.7   # 7成仓
    elif composite > -0.2:
        return 0.4   # 4成仓
    elif composite > -0.5:
        return 0.2   # 2成仓
    else:
        return 0.0   # 空仓

3.2 各信号打分规则

信号类型 +1 条件 0 条件 -1 条件
宏观 信用脉冲向上 + M1-M2 剪刀差收窄 信号矛盾 信用脉冲向下 + 剪刀差扩大
情绪 涨停广度>0.3 + 融资余额上升 中性 涨停广度<-0.1 + 融资余额下降
技术 沪深300站上60日均线 + 放量 震荡 跌破250日均线 + 缩量

3.3 动态仓位管理

def dynamic_position(base_position, volatility_regime, drawdown):
    """
    基于波动率和回撤动态调整仓位
    """
    # 波动率调整
    if volatility_regime == 'high':
        vol_adj = 0.7
    elif volatility_regime == 'normal':
        vol_adj = 1.0
    else:
        vol_adj = 1.2

    # 回撤保护
    if drawdown > 0.15:  # 回撤超过15%
        dd_adj = 0.5
    elif drawdown > 0.08:
        dd_adj = 0.8
    else:
        dd_adj = 1.0

    return base_position * vol_adj * dd_adj

4. 行业轮动策略

else: dd_adj = 1.0

return base_position * vol_adj * dd_adj

```


4. 行业轮动策略### 4.1 基于宏观周期的行业配置

经济周期 推荐行业 回避行业
复苏初期 金融、地产、建材、可选消费 公用事业、必选消费
复苏中期 科技、医药、新能源、高端制造 银行、地产
过热期 有色金属、化工、煤炭、石油 科技、医药
滞胀期 必选消费、医药、公用事业 周期股、金融
衰退期 国债、黄金、必选消费 周期股、金融
### 4.2 行业动量-反转混合策略
```python
def industry_rotation(industries, lookback_momentum=60, lookback_reversal=5):
"""
行业轮动:中期动量 + 短期反转
"""
scores = {}
for ind in industries:
# 中期动量(60日收益,跳过近5日)
mom = calc_return(ind, window=lookback_momentum, skip=lookback_reversal)
# 短期反转(近5日收益取反)
rev = -calc_return(ind, window=lookback_reversal)
# 综合评分
scores[ind] = 0.7 * zscore(mom) + 0.3 * zscore(rev)
# 选取得分最高的 3-5 个行业
return sorted(scores.items(), key=lambda x: x[1], reverse=True)[:5]
```

5. 风险控制

5.1 止损机制

  • 个股止损: -8% 硬止损
  • 组合止损: 组合回撤 >10% 减仓 50%,>15% 清仓
  • 时间止损: 持仓 20 个交易日未达预期收益,减仓 50%

5.2 黑天鹅防护

  • VIX 类指标: 中国波指(iVIX)>30 时,仓位上限 30%
  • 流动性监控: 全 A 成交额 <5000亿 时,暂停开新仓
  • 政策风险: 重大政策会议(两会、政治局会议)前 2 天降低仓位

文档更新日期: 2026年4月30日 | 来源: 国信证券/天风证券研报、Wind 数据、社区量化实践


6. 【新增】2026 最新进阶技术

议)前 2 天降低仓位


文档更新日期: 2026年4月30日 | 来源: 国信证券/天风证券研报、Wind 数据、社区量化实践


6. 【新增】2026 最新进阶技术### 6.1 LLM 增强情绪因子

思路: 利用大语言模型从财经新闻、社交媒体、研报中提取情绪信号,构建另类 alpha。

import openai
import pandas as pd
import numpy as np

def llm_sentiment_score(texts, model="gpt-4"):
    """
    使用 LLM 批量分析财经文本情绪
    返回 -1(极度看空)到 +1(极度看多)的分数
    """
    client = openai.OpenAI()

    system_prompt = """你是量化分析师。请对以下财经新闻/评论进行情绪评分:
    - 评分范围: -1.0(极度看空)到 +1.0(极度看多)
    - 0.0 表示中性
    - 只输出数字,不要解释"""

    scores = []
    for text in texts:
        try:
            resp = client.chat.completions.create(
                model=model,
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": text[:2000]}
                ],
                temperature=0.0
            )
            score = float(resp.choices[0].message.content.strip())
            scores.append(score)
        except:
            scores.append(0.0)

    return pd.Series(scores)

# 构建情绪因子时间序列
def build_sentiment_factor(news_df, date_col, text_col):
    """
    按日期聚合新闻情绪,构建日度情绪因子
    """
    news_df['sentiment'] = llm_sentiment_score(news_df[text_col].tolist())
    daily_sentiment = news_df.groupby(date_col)['sentiment'].mean()

    # 标准化
    sentiment_factor = (daily_sentiment - daily_sentiment.mean()) / daily_sentiment.std()

    return sentiment_factor
ily_sentiment - daily_sentiment.mean()) / daily_sentiment.std()

return sentiment_factor

```### 6.2 多因子轮动策略(因子择时)

核心思想: 不同因子在不同市场环境下表现不同。根据市场环境动态调整因子权重。

def regime_detection(market_data):
    """
    市场环境识别
    返回: 'bull', 'bear', 'volatile', 'sideways'
    """
    returns = market_data['close'].pct_change()

    # 指标
    trend = market_data['close'].pct_change(60)  # 60日趋势
    vol = returns.rolling(20).std() * np.sqrt(252)  # 20日年化波动率
    momentum = returns.rolling(20).mean()  # 20日动量

    if trend > 0.1 and vol < 0.2:
        return 'bull'       # 牛市:低波动上涨
    elif trend < -0.1 and vol > 0.3:
        return 'bear'       # 熊市:高波动下跌
    elif vol > 0.35:
        return 'volatile'   # 高波动震荡
    else:
        return 'sideways'   # 横盘

    elif vol > 0.35:
        return 'volatile'   # 高波动震荡
    else:
        return 'sideways'   # 横盘def factor_rotation_weights(regime):
    """
    根据市场环境动态分配因子权重
    """
    weight_maps = {
        'bull': {
            'momentum': 0.30,
            'growth': 0.25,
            'quality': 0.15,
            'value': 0.10,
            'volatility': 0.10,
            'sentiment': 0.10,
        },
        'bear': {
            'volatility': 0.30,  # 低波动防御
            'quality': 0.25,     # 高质量防御
            'value': 0.20,       # 价值防御
            'momentum': 0.05,    # 减少动量暴露
            'growth': 0.10,
            'sentiment': 0.10,
        },
        'volatile': {
            'volatility': 0.25,
            'value': 0.20,
            'quality': 0.20,
            'sentiment': 0.20,  # 情绪因子在高波动时更有效
            'momentum': 0.05,
            'growth': 0.10,
        },
        'sideways': {
            'reversal': 0.25,   # 横盘时反转因子有效
            'value': 0.20,
            'sentiment': 0.20,
            'momentum': 0.10,
            'quality': 0.15,
            'growth': 0.10,
        }
    }
    return weight_maps.get(regime, weight_maps['sideways'])
'growth': 0.10, } } return weight_maps.get(regime, weight_maps['sideways']) ```### 6.3 因子衰减监控与预警

def monitor_factor_decay(ic_history, factor_name, window=60):
    """
    监控因子 IC 衰减,触发预警
    """
    recent_ic = ic_history.tail(window)
    rolling_mean = recent_ic.rolling(20).mean()
    rolling_std = recent_ic.rolling(20).std()

    # 衰减信号
    current_ic = recent_ic.iloc[-1]
    avg_ic = rolling_mean.iloc[-1]

    alerts = []

    # IC 转负
    if current_ic < 0:
        alerts.append(f"⚠️ {factor_name} IC 转负: {current_ic:.3f}")

    # IC 持续下降(连续5期为负斜率)
    slope = rolling_mean.diff().tail(5)
    if all(s < 0 for s in slope.dropna()):
        alerts.append(f"📉 {factor_name} IC 持续下降趋势")

    # ICIR 低于阈值
    icir = avg_ic / rolling_std.iloc[-1] if rolling_std.iloc[-1] > 0 else 0
    if icir < 0.3:
        alerts.append(f"🔴 {factor_name} ICIR 过低: {icir:.2f}")

    return alerts

6.4 实时数据接入(akshare 2.0)

import akshare as ak
import pandas as pd

def fetch_real_time_data():
    """
    使用 akshare 2.0 获取实时 A 股数据
    """
    # 实时行情
    spot_df = ak.stock_zh_a_spot_em()

    # 北向资金实时
    north_flow = ak.stock_hsgt_north_net_flow_in_em(symbol="北上")

    # 融资融券
    margin_df = ak.stock_margin_detail_szse()

    # 涨停板统计
    limit_up = ak.stock_zt_pool_em(date='20260430')

    return {
        'spot': spot_df,
        'north_flow': north_flow,
        'margin': margin_df,
        'limit_up': limit_up,
    }
,
        'north_flow': north_flow,
        'margin': margin_df,
        'limit_up': limit_up,
    }# 因子计算示例
def calculate_momentum_factor(spot_df):
    """计算动量因子(60日收益率,跳过近5日)"""
    spot_df['momentum'] = (
        spot_df['60日涨跌幅'] - spot_df['5日涨跌幅']
    )
    return spot_df[['代码', '名称', 'momentum']].dropna()

7. 风险等级标注

技术 风险等级 说明
多因子等权合成 🟢 低 简单有效,不易过拟合
IC/IR 加权合成 🟢 低 基于因子历史表现,逻辑清晰
机器学习因子合成 🟡 中 可能过拟合,需要严格交叉验证
LLM 情绪因子 🟡 中 API 成本高,延迟大,需要缓存策略
因子择时/轮动 🟠 高 regime 识别错误会放大损失
高频因子 🔴 高 需要低延迟基础设施,不适合普通投资者

文档更新日期: 2026年4月30日 | 来源: 国信证券/天风证券研报、arXiv 量化论文、akshare 文档、社区开源实践