风格轮动RSI指标均值回归超买超卖量化策略A股DuckDB信号系统

三大系统共振预警:科技股RSI86过热、蓝筹RSI17超卖,A股风格拐点信号全解析


一句话回答你的问题

2026年6月18日收盘,A股出现了一个教科书级别的风格背离信号:科技龙头生益科技RSI飙至86.4(极度超买),而消费蓝筹双汇发展RSI跌至17.0(极度超卖)——通信ETF近20天涨26.5%,沪深300只涨3.66%。当三个独立信号系统(CSI800日线扫描、蓝筹v2估值模型、行业估值周报)同时指向”卖科技、买蓝筹”,这大概率是一次风格轮动的拐点。

引言:三个系统说了同一件事

做量化交易最怕的是什么?不是信号太少,而是信号太多、互相矛盾。但当三个完全独立的信号系统在同一天给出方向一致的判断时,这个信号的置信度就远超单一指标。

2026年6月19日凌晨,我的三套自动化扫描系统(均通过Hermes Agent定时任务运行)同步产出了当日信号:

  • CSI800日线扫描系统:买入信号229只,几乎全部为蓝筹股的均值回归型(双汇发展RSI21、顺丰控股RSI24、新奥股份RSI19);卖出信号16只,集中在半导体和电子板块(生益科技RSI86)。
  • 蓝筹v2估值模型:白名单20只中明确买入5只,包括中国石油(胜率80%/年化+18.7%)、招商蛇口(RSI仅6.3)、中国平安、中国神华——零卖出
  • 行业估值周报:高估16个行业中点名半导体、通信;低估机会集中在消费(白酒/食品)和金融(保险/证券)。

如果你读过我们之前的文章《震荡市该追涨还是抄底?2861条信号实证动量vs均值回归胜率真相》,就知道信号胜率高度依赖市场状态。本文要回答的核心问题是:当科技板块短期涨幅透支、蓝筹板块跌入超卖区,这究竟是”动量延续的回调”还是”风格反转的起点”? 让数据说话。


一、数据全景:RSI极端分化的冰与火

1.1 蓝筹超卖组——8只RSI低于32的标的

我通过DuckDB从stock_daily表提取了最近26个交易日的收盘价,用Wilder平滑法自行计算RSI14和RSI21,数据截至2026年6月18日:

股票名称代码最新价RSI14RSI21PE(TTM)PB
新奥股份60080316.2816.018.2
双汇发展00089522.7917.018.716.54.36
海螺水泥60058517.7619.121.413.70.55
顺丰控股00235231.5523.326.5
招商蛇口0019797.2524.328.6
中国平安60131849.3824.326.17.30.95
中国石油6018579.5826.930.212.61.22
中国神华60108841.2631.639.419.72.03

关键发现:8只蓝筹的RSI14全部低于32,其中新奥股份16.0和双汇发展17.0已经进入极端超卖区域。更值得注意的是它们的估值——海螺水泥PB仅0.55(破净)、中国平安PE仅7.3、中国石油PE 12.6,这些是典型的”价格超跌+估值低位”的双底结构。

如果你熟悉《布林带均值回归策略》的逻辑,就会知道RSI低于20在统计上意味着过去14天的上涨幅度极小、下跌幅度较大,价格严重偏离均值。这正是均值回归策略最偏爱的入场条件。

1.2 科技过热组——RSI突破70的元件/电子股

股票名称代码最新价RSI14RSI21PE(TTM)PB
生益科技600183183.8786.484.387.019.05
深南电路002916453.8070.667.177.117.03
沪电股份002463147.9067.066.059.116.05
信维通信300136107.4555.653.1129.711.97

生益科技RSI14达到86.4——这意味着过去14个交易日中,价格上涨日的幅度远超下跌日,几乎所有交易者都在追涨。结合PE 87倍、PB 19倍的估值水平,这只股票已经同时具备了”技术面超买”和”基本面高估”的双重风险信号。

两组数据的对比一目了然:科技组PE动辄60-130倍,蓝筹组PE普遍7-20倍;科技组PB 12-19倍,蓝筹组海螺水泥仅0.55倍。这不是简单的行业差异,而是市场资金极端偏好的结果


二、风格背离的放大镜:ETF端的数据印证

2.1 通信ETF一骑绝尘

如果个股的RSI分化还不够直观,ETF端的涨幅差异则将这一趋势放大了数倍。以下是从etf_daily表提取的多周期涨幅对比:

ETF名称代码5日涨幅20日涨幅60日涨幅近1年涨幅
通信ETF515880+13.66%+26.53%+69.02%+317.57%
半导体ETF512480+16.48%+16.37%+65.29%+146.38%
创业板50159949+11.36%+11.85%+29.43%+129.18%
沪深300510300+4.90%+3.66%+8.92%+115.56%

通信ETF近20天涨了26.5%,而同期沪深300只涨3.66%——差距达到7倍以上。再看60日周期,通信ETF涨69%、沪深300涨8.9%,差距同样是近8倍。通信ETF近一年更是翻了3倍有余(+317.6%)。

这种级别的分化在A股历史上并不罕见,但每一次极端分化之后,都伴随着一次风格切换。这不是主观判断,而是均值回归的铁律。

2.2 结构性泡沫的量化信号

让我们把RSI极端值和ETF涨幅放在一起看:

  • 通信ETF 60日涨69% → 其成分股生益科技RSI飙至86.4
  • 沪深300 60日涨8.9% → 其成分股中国平安RSI仅24.3

当动量极端强劲时(20日+26%),RSI必然会被推至超买区;当板块长期被忽视时(20日+3.66%),RSI必然陷入超卖区。 这就是风格轮动的物理基础——资金不可能永远只流入一个方向。

《ETF轮动策略实战》一文中,我们详细介绍了如何用动量评分捕捉趋势。但今天的数据告诉我们的恰恰是动量的反面:当一个板块的动量已经持续到RSI 86+、PE 87倍的时候,风险收益比已经严重恶化。


三、三大系统共振——信号置信度分析

3.1 为什么要看”多系统共振”?

单一技术指标的超买超卖信号胜率有限——我们在动量vs均值回归的2861条信号回测中发现,均值回归型信号在震荡市的整体胜率约31.8%。但如果多个独立维度(技术面+基本面+资金面)同时确认,胜率会显著提升。

下面是2026年6月18日三大系统的共振矩阵:

验证维度科技板块(卖)蓝筹板块(买)数据来源
技术面RSI生益科技86.4(超买)双汇发展17.0(超卖)stock_daily自计算
基本面估值半导体PE 87/PB 19(高估)保险PE 7.3/PB 0.95(低估)stock_info_snapshot
行业评分通信/半导体列入高估16席白酒/保险列入低估区估值周报
资金流向中化国际成交额+888%stock_daily.amount
系统信号CSI800卖出16只CSI800买入229只+蓝筹v2买入5只Hermes cron输出

五维度中四个方向一致——这是一个高置信度的风格拐点预警。唯一需要注意的是资金流向维度:中字头(中化国际、深桑达A、中核科技)成交额暴增,但它们属于”央企改革”主题而非传统蓝筹。不过,CSI800买入信号中确实包含了部分中字头(中国石油、中国神华),资金面也有交叉验证。

3.2 中字头的异动——央企改革资金涌入

stock_dailyamount字段计算的5日成交额变化:

股票名称代码最新日成交额(亿)5日前均值(亿)增幅
中化国际60050035.623.61+887.9%
深桑达A00003236.673.75+878.8%
中核科技00077710.771.19+803.7%
中银证券60169612.992.69+383.7%
中国神华60108822.6918.74+21.0%
中国石油60185712.3720.34-39.2%

中化国际的成交额5天内暴增了近9倍,深桑达A和中核科技也暴增了8倍以上。这种级别的量能爆发通常意味着两类资金行为之一:要么是主题炒作资金集中涌入,要么是机构大资金在低位建仓。结合”中特估”(中国特色估值体系)主题在2026年的持续升温,后者的可能性更大。

需要注意的是,中国石油成交额反而下降了39.2%——这说明中字头的资金异动是结构性的,集中在央企改革概念股而非所有央企。


四、实战代码:构建风格轮动预警系统

下面是用DuckDB + Python实现的多维度风格轮动预警系统的核心代码。你可以在本地复现本文所有数据。

4.1 RSI计算(Wilder平滑法)

import duckdb

def calc_rsi(closes, period=14):
    """Wilder平滑法计算RSI"""
    if len(closes) < period + 1:
        return None
    gains, losses = [], []
    for i in range(1, len(closes)):
        delta = closes[i] - closes[i - 1]
        gains.append(max(delta, 0))
        losses.append(max(-delta, 0))
    # 初始均值(简单平均)
    avg_gain = sum(gains[:period]) / period
    avg_loss = sum(losses[:period]) / period
    # Wilder平滑
    for i in range(period, len(gains)):
        avg_gain = (avg_gain * (period - 1) + gains[i]) / period
        avg_loss = (avg_loss * (period - 1) + losses[i]) / period
    if avg_loss == 0:
        return 100.0
    rs = avg_gain / avg_loss
    return round(100 - 100 / (1 + rs), 1)

def get_stock_rsi(con, code, days=26):
    """从DuckDB获取收盘价并计算RSI14和RSI21"""
    rows = con.execute(
        f"SELECT close FROM stock_daily WHERE code='{code}' "
        f"ORDER BY date DESC LIMIT {days}"
    ).fetchall()
    closes = [r[0] for r in rows][::-1]  # 反转为时间正序
    if len(closes) < 22:
        return None, None, None
    price = closes[-1]
    rsi14 = calc_rsi(closes, 14)
    rsi21 = calc_rsi(closes, 21)
    return price, rsi14, rsi21

💡 数据库搭建:如果你还没有本地量化数据库,可以参考《DuckDB搭建A股量化数据库教程》,4589只股票+ETF+可转债的本地数据库,零成本、全离线、秒级查询。

4.2 风格背离检测器

def detect_style_divergence(con, overbought_codes, oversold_codes):
    """
    检测风格背离:计算超买组和超卖组的RSI中位数
    当两组RSI中位数之差 > 50 时,判定为极端背离
    """
    def median_rsi(codes):
        rsis = []
        for code in codes:
            _, rsi14, _ = get_stock_rsi(con, code)
            if rsi14 is not None:
                rsis.append(rsi14)
        rsis.sort()
        n = len(rsis)
        return rsis[n // 2] if n > 0 else 50

    overbought_med = median_rsi(overbought_codes)
    oversold_med = median_rsi(oversold_codes)
    gap = overbought_med - oversold_med

    result = {
        'overbought_median_rsi': overbought_med,
        'oversold_median_rsi': oversold_med,
        'divergence_gap': gap,
        'signal': 'EXTREME_DIVERGENCE' if gap > 50 else 'NORMAL'
    }
    return result

# 实际调用
con = duckdb.connect("quant_v2.duckdb", read_only=True)

tech_overbought = ['600183', '002916', '002463', '300136']  # 生益科技/深南电路/沪电股份/信维通信
bluechip_oversold = ['000895', '002352', '600803', '600585', '601318', '601857', '601088']

result = detect_style_divergence(con, tech_overbought, bluechip_oversold)
print(f"超买组RSI中位数: {result['overbought_median_rsi']}")
print(f"超卖组RSI中位数: {result['oversold_median_rsi']}")
print(f"背离缺口: {result['divergence_gap']}{result['signal']}")
# 输出示例:背离缺口: 62.7 → EXTREME_DIVERGENCE

con.close()

4.3 成交额异动监测

def detect_volume_spike(con, codes, lookback_days=5):
    """检测成交额的短期异动"""
    spikes = []
    for code in codes:
        rows = con.execute(
            f"SELECT amount FROM stock_daily WHERE code='{code}' "
            f"ORDER BY date DESC LIMIT {lookback_days + 5}"
        ).fetchall()
        if len(rows) < lookback_days + 5:
            continue
        latest = rows[0][0]
        baseline = sum(r[0] for r in rows[lookback_days:]) / 5
        if baseline > 0:
            pct = (latest / baseline - 1) * 100
            spikes.append((code, latest / 1e8, baseline / 1e8, round(pct, 1)))
    return sorted(spikes, key=lambda x: -x[3])

# 检测中字头异动
zhongzi_codes = ['600500', '000032', '601696', '000777', '601088']
for code, latest, base, pct in detect_volume_spike(con, zhongzi_codes):
    print(f"{code}: 最新{latest:.1f}亿 vs 均值{base:.1f}亿 → {pct:+.1f}%")

五、交易策略:风格轮动怎么执行?

5.1 不要试图精确抄底逃顶

看到以上数据,很多人的第一反应是”卖掉科技股、满仓蓝筹股”。但这是最危险的操作。我在均值回归策略实战中反复强调过一个教训:

均值回归策略最大的风险不是方向错误,而是时机错误。 一个超卖的股票可以在RSI=20继续跌到RSI=10,一个超买的股票可以在RSI=80继续涨到RSI=95。趋势的末端往往最疯狂。

所以更稳健的做法是分批操作+确认信号

  1. 减仓信号:科技板块RSI突破80 + PE处于历史90分位以上 → 减仓1/3
  2. 加仓信号:蓝筹板块RSI低于20 + PB低于1(破净)→ 加仓1/3
  3. 确认信号:等待超买组RSI跌破70(动量衰退确认)+ 超卖组RSI突破30(底部反转确认)→ 执行剩余仓位

5.2 用ETF做风格切换

个股的风险太大(尤其是科技股的波动率),用ETF做风格轮动是更好的选择:

操作方向标的逻辑
减仓通信ETF(515880)、半导体ETF(512480)20日涨幅>16%,RSI成分股>80
观察沪深300(510300)、创业板50(159949)温和上涨,未极端
加仓消费ETF、金融ETF、红利ETF对应RSI超卖的白酒/保险/煤炭

这与我们在白马股多因子选股策略中介绍的ROE+估值框架是一致的——低估值的优质蓝筹在均值回归行情中往往有超额收益。

5.3 一个重要的反面教材

如果你觉得”三个系统共振=稳赚不赔”,请注意以下数据:

通信ETF近1年涨了317%,60日涨了69%。在过去的一年里,任何一次”科技过热了该回调了”的判断都被市场证伪了。 均值回归不是”价格回到过去”,而是”极端状态不可能永远持续”。但极端状态持续的时间,可能远超你的预期和你的持仓耐心。

这就是为什么我在自己的交易系统中,把均值回归信号只作为仓位管理的参考,而不是唯一的交易依据——动量vs均值回归的2861条信号回测已经证明,均值回归型信号在单边上涨市中的胜率会进一步下降。


六、风格轮动的数据工程:如何自动化监测

要把以上分析变成每天自动运行的系统,关键在于数据工程。以下是我的实际架构(已通过Hermes Agent的cron定时任务实现):

6.1 三层数据验证体系

第一层:技术面信号(每日01:30运行)
├── CSI800日线扫描 → 输出买入/卖出信号
├── RSI/MA/BB多指标打分
└── 信号分类(动量型/均值回归型/混合型)

第二层:估值面信号(每周五运行)
├── 行业PE/PB历史分位
├── 宏观评分(SHIBOR/CPI/PMI)
└── 高估/低估行业清单

第三层:资金面信号(每日盘后运行)
├── 成交额异动监测(本文的+888%信号)
├── ETF资金净流入/流出
└── 北向资金动向(如有数据)

当三层信号方向一致时,触发”共振预警”通知(推送到飞书群)。这就是为什么我能在6月19日早上第一时间看到这个风格拐点信号——不是因为我盯盘,而是因为系统在凌晨1:30自动扫描完成后推送了提醒。

6.2 为什么用DuckDB而不是Pandas?

在上述系统中,DuckDB承担了所有历史数据查询的工作。原因很简单:

  • 查询速度:5年4589只股票的日线数据(约500万行),计算RSI只需秒级响应
  • SQL窗口函数ROW_NUMBER() OVER(PARTITION BY code ORDER BY date DESC) 一行搞定”取每只股票最新N天数据”的操作,而Pandas需要groupby+head两步
  • 零依赖:一个.duckdb文件就是一个完整数据库,不需要单独部署数据库服务

详细的DuckDB量化数据库搭建教程,可以参考这篇文章


FAQ

Q1:RSI低于多少算超卖?高于多少算超买?

经典标准是RSI<30为超卖、RSI>70为超买。但在实战中,A股的波动性更大,我倾向于用更极端的阈值:RSI<20为极度超卖(强买入信号)、RSI>80为极度超买(强卖出信号)。本文中双汇发展RSI=17、生益科技RSI=86都属于极端区域。具体阈值的选取应结合回测数据——可以参考布林带均值回归策略中的回测方法。

Q2:风格轮动信号出现后,一般多久会反转?

没有固定答案。根据我的经验,A股的风格切换通常在2-8周内完成。但极端情况下(如2025年的AI行情),一个风格可以持续数月。建议用RSI跌破70(超买消退)或RSI突破30(超卖反转)作为确认信号,而不是在RSI极端值时立即全仓操作。

Q3:中字头成交额暴增888%是不是操纵?

成交额的短期暴增有多种可能:机构建仓、游资炒作、利好消息驱动等。中化国际+888%和深桑达A+879%这类数据需要结合具体的市场环境判断。在”中特估”主题持续升温的背景下,央企改革概念股的资金涌入更可能是主题投资行为。成交额异动是一个”关注”信号,不是”买入”信号——必须结合估值和基本面综合判断。

Q4:这套风格轮动系统适合散户使用吗?

本文的代码和逻辑完全开源,任何人都可以用DuckDB+Python复现。但需要提醒:信号系统只是工具,交易的核心在于仓位管理和风险控制。建议先用模拟盘验证2-3个月,确认信号胜率后再投入实盘。


⚠️ 风险提示

本文所有数据和代码仅供学术研究和量化学习参考,不构成任何投资建议。RSI、PE等指标的超买超卖信号在单边趋势市场中可能持续失效。风格轮动策略的历史表现不代表未来收益。A股市场波动较大,请根据自身风险承受能力谨慎决策。作者持有文中提及的部分标的(中国平安、海螺水泥),存在利益冲突,请读者独立判断。


相关文章推荐

💬 评论