研究框架 · 口径说明
轮动框架口径说明:三条轴、资金流算法、卫星条件
这一页解释站上反复出现却没地方说明的几个口径:两条风格轴(加二期的 A/H 轴)各用什么指数和什么工具、ETF 净流入是怎么算出来的、卫星仓要同时满足哪三个条件。每条规则背后的回测证据在回测证据台账,实时读数在风格罗盘与轮动方案。
先说定位。这个站做的是「证据台账 + 决策辅助」,不是信号机。风格轮动的价值在于决策少、不长期站错边,不在于每次踩准拐点。下面所有阈值都写在
pipeline/config.json → rotation里,页面上的读数由同一份代码(pipeline/rules_lib.py)算出来,改阈值不用改页面。
一、三条轴(骨架)
骨架是风格轮动,不是行业轮动。理由是结构性的,不是回测出来的:行业有 31 个决策对象、每天都在换领涨,一半以上没有流动的 ETF,而且申万行业指数是 2021 版分类的回填;风格只有两条轴、一年切换一两次,宏观变量可推理,工具是日成交几亿到几十亿的宽基。
| 轴 | 信号指数(全收益) | 交易工具 | 状态 |
|---|---|---|---|
| 开关 · 权益 vs 现金 | 中证全指全收益 CSIH00985,宽度池 = 申万 31 行业 | 总敞口 E | 只展示,不进仓位。两档版本回测年化 3.42% vs 满仓 5.64%,最大回撤还没变浅 |
| 轴 1 · 大 vs 小 | 沪深300全收益 CSIH00300 / 中证1000全收益 CSIH00852 | 510300 沪深300ETF ↔ 512100 中证1000ETF | 待定:单独开这条轴过去 15 年是负贡献,页面如实显示 |
| 轴 2 · 成长 vs 价值 | 创业板R SZ399606 / 中证红利低波全收益 CSIH20269 | 159915 创业板ETF ↔ 512890 红利低波ETF | 保留:tilt 的超额基本都来自这条轴 |
| 轴 3 · A vs H | 沪深300 / 恒生 | 510300 ↔ 159920 / 513180 | 二期:跨境 ETF 的折溢价(可达 5–10%)与限购还没处理,页面上是一张空卡 |
为什么比值一律用全收益
价格指数每年少算价值边 4–5% 的股息(中证红利价格 5568 点 vs 全收益 12070 点),用它做比值会系统性偏向成长边。所以两条轴的比值一律走全收益序列;全收益发布日之前的区间,用价格指数 × 代理分红因子的形状向前拼接(rules_lib.extend_tr),并在页面上标出真实起点——小盘 2014-10、价值 2013-12 之前都是拼接段,那几段的结论要打折。
tilt 怎么算出来
每条轴的档位 tilt ∈ {−2,−1,0,+1,+2},每档把 12.5% 从一边挪到另一边(±2 档 = 50% / 0%):
- 主项:工具比值的 120 日与 250 日相对动量同向 → ±1;若 20 日也同向(加速)→ ±2;不同向 → 0。(回测里 tilt 的全部正贡献都来自 ±2 档。)
- 否决:对比值的两个方向各跑一次状态模型,倾斜目标边的 P(破位) ≥ 0.5 → tilt 归 0。保留它的理由是结构性的(不在已经破位的一边加满档),不是回测——回测上它是噪声。
- 压回:目标边估值差(PE 之比)的 60 个月滚动分位 ≥ 90% → 压回一档。
- 资金差只展示、不压回:按 20 日资金差与动量矛盾就压回,2019 年起年化从 13.0% 掉到 11.5%、回撤从 −28% 深到 −35%。比值动量最强的时候资金往往还在流出滞后边,压回等于砍掉最好的时段。
- 换手约束:每条轴每 28 天最多变一档(从 −2 走到 +2 至少 4 个月,是有意的慢速设计)、每周最多动一条轴、核心仓单周总变动 ≤ 25%。
指令在每周最后一个交易日(按真实交易日历,不是「周五」——2026 年有 6 个周五是节假日)收盘后生成,纸面成交价 = 下一交易日的 ETF 后复权收盘,单边成本宽基 0.1%、行业 0.15%。
二、ETF 资金流是怎么算的
资金流页与首页「热点 + 资金验证」用的是同一个口径:净流入 = Δ总份额 × 前一日单位净值。份额数据来自基金份额变动表,有三道防护:
当「单位净值日变动」与「复权净值日变动」之差超过 0.5%,判为事件日,该日净流入置 0。512890 在 2021-10-22 有一次 1:2 拆分,不处理会算出相当于规模 49% 的假流入。
募集份额不是资金流。
每只 ETF 带一个「份额截至」,比全市场最新日晚 3 个交易日以上的不进桶,页面上单独标「停更」。
两件事要记住:
- 份额是 T+1 的。今晚只能拿到前一个交易日的份额,所以页面上「份额截至」比行情日早一天——这是数据本身的性质,不是 bug。涨幅按份额日期对齐,1 日流量配 1 日涨幅。
- 20 日净流入占规模比的分母用窗口起点的「份额 × 净值」,不用每周才刷新一次的规模。
ETF 按标的指数自动归类到桶:宽基(大/中/小/微)、风格(成长 / 价值 / 红利 / 低波 / 质量)、行业主题(带申万一级归属)、跨境(港 / 美 / 其他)、商品、债券、货币。权益资金流只汇总宽基 / 风格 / 行业三类;商品、债券、货币、跨境各单独一行,当避险与出海的信号看。行业桶的申万归属是人判断的事,规则只给起点,映射表里带 _review 的条目等人工审核,审过的下次刷新不会被规则覆盖。
三、卫星仓的三个条件
行业/主题是受约束的卫星仓,不是第二套框架。一个行业要进卫星,必须同时满足:
- 自身有资格:120 日动量为正,且 P(破位) 低于阈值(状态裁决不能是「破位」或「脱离破位·脆弱」;「趋势·延伸」允许进但权重减半);
- 有钱跟:对应行业/主题 ETF 近 20 日净流入为正(这就是「资金验证」);
- 所属风格边没破位:它归到的那条风格边(成长 / 价值)当前 P(破位) < 0.5。
最多 3 个,合计占权益敞口 30%,按 20 日净流入占规模比排序,至少持有 4 周除非转「破位」;不够的份额回核心仓。
卫星仓目前是关闭的。回测里加 30% 卫星后年化从 9.11% 掉到 7.49%、回撤更深。但那次测的其实是个「按动量选行业」的退化版——条件 2 和排序要的 ETF 资金流数据当时还没有。等资金流攒够历史,用同一个脚本把条件 2 与排序补齐重测,达标才打开。在那之前核心仓占 100%。
四、还有几件要说清楚的事
- 行业状态读数来自自建的 rotation_v2 状态模型(七条证据通道 → P(趋势/脆弱/破位) → 五档仓位),「拥挤比」「延伸 ext_z」是个人自定义观察指标,未经框架正式验证。31 行业全表每个交易日更新。
- 「成交额占比」用的是两只工具 ETF 的当日成交额之比,不是指数成交额占两市的比例。
- 台账不回填历史:轮动指令的纸面净值从上线后的第一个指令日起算,之前只有「若今天调仓」的试算。不造历史。
- 所有表格里的数字都不经过语言模型:指数表、行业表、资金流表、轮动台账、证据台账全部由 Python 直接从 JSON 渲染,模型只写文字。这是防数字编造的结构性保证。
本页仅为个人研究记录,不构成任何投资建议。规则的回测证据见回测证据台账(每月第一个交易日重跑一次);阈值与裁决的唯一来源是 pipeline/config.json → rotation。