1. 资金迁移与轮动错位的基础识别框架搭建
为什么先搭框架,而不是先算指标
资金迁移与轮动错位分析最容易犯的错误,是拿到板块指数和成交额后立刻去算“净流入”“轮动强度”这类指标,结果口径不统一、信号互相矛盾。本节的任务是先建立一个可复用的识别框架:把原始数据、派生量、信号定义和判读规则分层固定下来,后续所有计算都挂在这个框架上。
框架的核心是把“资金迁移”和“轮动错位”拆成两个可独立观测、又能交叉验证的维度:
- 资金迁移:看资金在板块之间的方向与相对强弱,用板块成交额占比的变化来刻画,而不是绝对金额。
- 轮动错位:看板块价格表现与资金占比变化是否同步。同步为“确认轮动”,背离为“错位信号”。
框架的四层结构与计算口径
整个框架自下而上分四层,每层只依赖下一层的输出,保证口径可追溯:
- 数据层:板块指数收盘价
P_i,t、板块成交额A_i,t,i 为板块,t 为交易日。要求同一交易日所有板块数据齐全,缺失先标记不参与当日计算。 - 派生层:板块日收益
R_i,t = P_i,t / P_i,t-1 - 1;成交额占比S_i,t = A_i,t / ΣA_i,t(Σ 为当日全部样本板块成交额之和,占比之和为 1)。 - 信号层:占比变化
ΔS_i,t = S_i,t - S_i,t-n(n 为观察窗口,示例取 5 日);相对收益RR_i,t = R_i,t - R_bench,t(基准取样本板块等权收益)。 - 判读层:用
ΔS与RR的符号组合划分四种状态,识别资金迁移方向与轮动是否错位。
四象限判读规则
把 ΔS_i,t 作横轴、RR_i,t 作纵轴,每个板块每日落入一个象限,象限即状态标签:
| 象限 | ΔS(占比变化) | RR(相对收益) | 状态标签 | 含义 |
|---|---|---|---|---|
| Q1 | > 0 | > 0 | 确认流入 | 资金占比与价格同向走强,轮动确认 |
| Q2 | < 0 | > 0 | 缩量上涨(错位) | 价格强但资金占比退潮,警惕接力不足 |
| Q3 | < 0 | < 0 | 确认流出 | 资金与价格同步走弱,轮动确认 |
| Q4 | > 0 | < 0 | 放量下跌(错位) | 资金占比升但价格弱,可能是承接或派发 |
“错位”专指 Q2 与 Q4:价格与资金占比方向相反。框架不直接判定错位是好是坏,而是把它作为需要进一步观察的标记,交由后续窗口确认。
用一段示例数据走通框架
假设样本只有 3 个板块(A、B、C),观察窗口 n=5。下表是某日计算出的派生量与信号量(示例数据,用于演示口径,非真实行情):
| 板块 | S(t−5) | S(t) | ΔS | R(t) | RR | 象限 |
|---|---|---|---|---|---|---|
| A | 0.30 | 0.36 | +0.06 | +2.1% | +1.4% | Q1 确认流入 |
| B | 0.45 | 0.38 | −0.07 | +0.9% | +0.2% | Q2 缩量上涨(错位) |
| C | 0.25 | 0.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 的轮动强度指标都可以直接挂接在本框架的信号层之上。