1. 资金迁移与轮动错位的基础识别框架搭建

为什么先搭框架,而不是先算指标

资金迁移与轮动错位分析最容易犯的错误,是拿到板块指数和成交额后立刻去算“净流入”“轮动强度”这类指标,结果口径不统一、信号互相矛盾。本节的任务是先建立一个可复用的识别框架:把原始数据、派生量、信号定义和判读规则分层固定下来,后续所有计算都挂在这个框架上。

框架的核心是把“资金迁移”和“轮动错位”拆成两个可独立观测、又能交叉验证的维度:

  • 资金迁移:看资金在板块之间的方向与相对强弱,用板块成交额占比的变化来刻画,而不是绝对金额。
  • 轮动错位:看板块价格表现与资金占比变化是否同步。同步为“确认轮动”,背离为“错位信号”。

框架的四层结构与计算口径

整个框架自下而上分四层,每层只依赖下一层的输出,保证口径可追溯:

  1. 数据层:板块指数收盘价 P_i,t、板块成交额 A_i,t,i 为板块,t 为交易日。要求同一交易日所有板块数据齐全,缺失先标记不参与当日计算。
  2. 派生层:板块日收益 R_i,t = P_i,t / P_i,t-1 - 1;成交额占比 S_i,t = A_i,t / ΣA_i,t(Σ 为当日全部样本板块成交额之和,占比之和为 1)。
  3. 信号层:占比变化 ΔS_i,t = S_i,t - S_i,t-n(n 为观察窗口,示例取 5 日);相对收益 RR_i,t = R_i,t - R_bench,t(基准取样本板块等权收益)。
  4. 判读层:用 ΔS 与 RR 的符号组合划分四种状态,识别资金迁移方向与轮动是否错位。
口径约定:所有“流入/流出”均指成交额占比的相对变化,不是真实资金净额;占比上升记为“占比流入”,下降记为“占比流出”。这一约定避免把成交额绝对增减误读为资金迁移。

四象限判读规则

把 ΔS_i,t 作横轴、RR_i,t 作纵轴,每个板块每日落入一个象限,象限即状态标签:

象限ΔS(占比变化)RR(相对收益)状态标签含义
Q1> 0> 0确认流入资金占比与价格同向走强,轮动确认
Q2< 0> 0缩量上涨(错位)价格强但资金占比退潮,警惕接力不足
Q3< 0< 0确认流出资金与价格同步走弱,轮动确认
Q4> 0< 0放量下跌(错位)资金占比升但价格弱,可能是承接或派发

“错位”专指 Q2 与 Q4:价格与资金占比方向相反。框架不直接判定错位是好是坏,而是把它作为需要进一步观察的标记,交由后续窗口确认。

识别框架四层结构 ① 数据层 板块指数收盘价 P(i,t) 板块成交额 A(i,t) 缺失→当日剔除 ② 派生层 日收益 R = P(t)/P(t-1) − 1 成交额占比 S = A(i,t) / ΣA(t) ③ 信号层 占比变化 ΔS = S(t) − S(t−n),n=5 相对收益 RR = R(i,t) − R_bench(t) ④ 判读层 按 ΔS、RR 符号落入四象限 输出状态标签 + 错位标记 四象限状态判读 ΔS RR Q1 确认流入 ΔS > 0,RR > 0 资金占比与价格同向 轮动确认 Q2 缩量上涨 ΔS < 0,RR > 0 价格强、占比退潮 错位标记 Q3 确认流出 ΔS < 0,RR < 0 资金与价格同步走弱 轮动确认 Q4 放量下跌 ΔS > 0,RR < 0 占比升、价格弱 错位标记 0

用一段示例数据走通框架

假设样本只有 3 个板块(A、B、C),观察窗口 n=5。下表是某日计算出的派生量与信号量(示例数据,用于演示口径,非真实行情):

板块S(t−5)S(t)ΔSR(t)RR象限
A0.300.36+0.06+2.1%+1.4%Q1 确认流入
B0.450.38−0.07+0.9%+0.2%Q2 缩量上涨(错位)
C0.250.26+0.01−1.5%−2.2%Q4 放量下跌(错位)

读法:A 的占比与相对收益同向上升,是明确的资金迁入方向;B 价格仍强但占比明显回落,属于“缩量上涨”错位,提示其上涨的成交支撑在减弱;C 占比微升但价格显著走弱,属于“放量下跌”错位,需结合后续窗口判断是承接还是派发。三个板块的 ΔS 之和为 0,符合占比变化的守恒约束,可作为计算自检。

框架自检两条硬约束:① 同一交易日所有参与计算的板块,ΣS_i,t = 1;② 同一窗口内 ΣΔS_i,t = 0。任一不满足,说明样本板块集合在窗口内发生过变更(如新增、剔除、停牌),必须先对齐样本再计算,否则象限判读会失真。

框架落地为可复用的计算骨架

把上述口径写成一段最小可运行的计算骨架,输入为按日期对齐的宽表,输出为带象限标签的信号表。示例用 Python 与 pandas,数据为构造的示例值:

import pandas as pd

# 示例输入:行=交易日,列=板块,值为收盘价与成交额
prices = pd.DataFrame({
    "A": [10.0, 10.2, 10.5, 10.8, 11.0, 11.2],
    "B": [20.0, 20.1, 20.3, 20.4, 20.5, 20.6],
    "C": [15.0, 14.8, 14.5, 14.2, 14.0, 13.8],
})
amounts = pd.DataFrame({
    "A": [100, 110, 130, 150, 170, 190],
    "B": [150, 148, 145, 140, 135, 130],
    "C": [80, 82, 85, 88, 90, 92],
})

n = 5  # 观察窗口

# 派生层
returns = prices.pct_change()
share = amounts.div(amounts.sum(axis=1), axis=0)

# 信号层
delta_share = share - share.shift(n)
bench = returns.mean(axis=1)          # 等权基准
rel_return = returns.sub(bench, axis=0)

# 判读层:四象限标签
def label(ds, rr):
    if pd.isna(ds) or pd.isna(rr):
        return "数据不足"
    if ds > 0 and rr > 0: return "Q1 确认流入"
    if ds < 0 and rr > 0: return "Q2 缩量上涨(错位)"
    if ds < 0 and rr < 0: return "Q3 确认流出"
    return "Q4 放量下跌(错位)"

signals = pd.DataFrame(index=prices.index, columns=prices.columns)
for i in prices.columns:
    for t in prices.index:
        signals.loc[t, i] = label(delta_share.loc[t, i], rel_return.loc[t, i])

print(signals.tail(1))

运行后最后一行即当日各板块的象限标签。验证方式:检查 share.sum(axis=1) 是否恒为 1,以及 delta_share.sum(axis=1) 在有效窗口内是否近似为 0(浮点误差可接受)。这两项通过,说明框架口径正确,后续例 2 的净流入计算与例 3 的轮动强度指标都可以直接挂接在本框架的信号层之上。

框架的价值在于“先定口径、再算指标”:数据层保证样本一致,派生层保证量纲可比,信号层保证方向可读,判读层保证结论可复核。任何后续新增指标,都应说明它挂在哪一层、依赖哪些已有量,避免口径漂移。