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 周走势)
社融信用脉冲
信用脉冲向上拐头通常领先 A 股底部 1-3 个月。M1-M2 剪刀差
剪刀差收窄(M1 增速接近 M2)预示资金活化,利好股市。新基金发行量 4 周滚动新发偏股基金规模。极端低位(<50亿/周)通常为底部信号。
2.2 同步指标(确认当前市场状态)
涨停广度指数
0.3 表示强势市场,<-0.1 表示弱势市场。
行业轮动速度
轮动速度加快(>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
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'])
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 文档、社区开源实践