Files
zhixing-system/docs/research/onechartlab-radar-three-metrics.md
T

165 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OneChartLab「板块资金雷达」三个指标逻辑补充研究
> 调研日期:2026-09-01。对象:截图所示“涨跌幅、加权评分、波段流入率”。本文是对既有板块资金雷达报告的补充,不把后端未公开算法包装成可复现事实。
## 结论先行
这三个指标处在不同计算层,不能用一个简单公式互相替代:
| 指标 | 页面直接展示的字段 | 已确认逻辑 | 当前不可确认的部分 |
| --- | --- | --- | --- |
| 涨跌幅 | `pct_change` | 直接格式化为带符号的两位小数百分比;可在榜内单独排序 | 板块层如何由成员股 `daily.pct_chg` 聚合、是否等权/成交额加权、停牌和缺失样本处理 |
| 加权评分 | `Swing_Score` 或 `Ratio_Score` | 后端预计算的综合加权值;Swing/Ratio 榜按 score 排名 | 特征列表、权重、标准化、截尾、缺失值规则;是否使用涨跌幅无法证明 |
| 波段流入率 | `Swing_Ratio_Val` | 多日资金流入率特征,页面显示时乘 100;作者称为 3—10 日加权单日流入率 | 具体日窗口权重、流入率分母、先聚合后求比还是逐股求比、低流动性过滤和缺失规则 |
因此第一阶段用 Tushare 直接复刻失败并不意外:Tushare 能提供底层行情和资金流事实,但页面只公开结果字段和少量来源契约,没有公开 score 与波段指标的构建端参数。
## 截图对应的页面结构
截图顶部选择的是“波段流入率”视角,页面把板块按类型排名池切成左右两榜:左侧“资金进攻榜 TOP 10%”,右侧“资金撤离榜 BOTTOM 10%”。每一行的主要列为:板块/排名、涨跌幅、加权评分、净额、在榜;中间镜像条显示波段流入与流出;右侧对应显示在榜、净额、加权评分、涨跌幅和板块名称。
这意味着同一行里的数值不是一组可互相换算的字段。以截图中“知识产权”为例,`+4.03%` 是 `pct_change`,`985.0` 是 `Swing_Score` 的一位小数展示,`+3.21%` 是 `Swing_Ratio_Val × 100`,`25.0 亿` 是金额字段。右侧“资金撤离榜”的 `-5.60%` 同样是波段流入率的负向展示,而不是涨跌幅列。
页面源码证据:<https://onechartlab.com/> 首页内联 Vue 模板中,`pct_change` 的格式化与排序位于当前 HTML 的 `731—744`、`836`、`963` 附近;score tooltip 和字段读取位于 `801—806`、`930—932`;波段流入率格式化位于 `809—810`、`936—937`。行号随页面发布版本变化,应以字段和原文为准。
## 一、涨跌幅 `pct_change`
### 页面行为
无论当前视角是 `Swing`、`Ratio` 还是 `Amount`,表格都会读取同一条板块记录的 `pct_change`,以 `+4.03%`、`-0.15%` 形式显示,保留两位小数;非有限值显示 `-`。点击“涨跌幅”表头只改变当前榜一侧的排序,不改变该榜已经按 `RankPct` 筛出的候选集合。
### 上游来源与合理候选
OneChartLab 成分排行 manifest 声明个股涨跌幅来源为 `tushare.daily.pct_chg`,多日窗口的成分结果使用 `compound_return`。因此可确认的最小事实是:板块涨跌幅最终与成员股日行情有关,而不是从 score 反推出来。
对板块层聚合,至少存在以下候选:
```text
# 候选 A:成员等权的当日平均收益
board_return_t = mean_i(r_i,t)
# 候选 B:按成交额/规模加权
board_return_t = sum_i(w_i,t * r_i,t), sum_i(w_i,t)=1
# 候选 C:先形成板块净值,再计算净值收益
board_return_t = NAV_t / NAV_{t-1} - 1
```
其中 `r_i,t = daily.pct_chg / 100`。公开 payload 没有成员逐股权重、板块净值、自由流通市值或完整 point-in-time 成员快照,因此无法在 A/B/C 中做确定选择。manifest 的 `compound_return` 能确认多日收益的复合语义,但不能单独证明板块单日横截面采用哪一种权重。
### 为什么第一阶段容易“没有条件”
如果只有当前板块名称和一个最终涨跌幅,无法处理成员变更、停牌、上市生命周期、缺失行情和板块规模权重;如果用当前成员回填历史,会产生幸存者偏差。正确的复现输入至少要保存交易日级 `dc_member`、`stock_basic`、`suspend_d` 和 `daily`,并把无法确定的聚合公式作为独立实验版本。
## 二、加权评分 `Swing_Score` / `Ratio_Score`
### 页面行为
在截图视角中,“加权评分”显示约 985.0、976.4 等数值。源码 tooltip 原文为“后端特征算法算出的综合加权值”,前端只做读取、保留一位小数、排序和展示,没有 score 计算函数。
普通榜先按类型分池,再以 `RankPct >= 90` 和 `RankPct <= 10` 选取前后 10%。`Swing` 榜默认键是 `Swing_Score`,`Ratio` 榜默认键是 `Ratio_Score`;`Amount` 榜默认按 `Amount_Raw_BN`,即使记录带有 `Amount_Score` 也不使用它。由此可知 score 是排序特征,不是排名百分位本身。
### 数据证据:不是涨跌幅的简单变换
当前最新公开分片(`2026-08-31`,791 条记录,概念 414、行业 377)可重复观察到:
| 板块 | `pct_change` | `Swing_Ratio_Val` | `Swing_Score` | `Ratio_Raw_Pct` | `Ratio_Score` | `Amount_Raw_BN` |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| 知识产权 (概念) | 4.03 | 0.0320857 | 985.0391 | 0.1494700 | 988.6650 | 25.0232 |
| 盲盒经济 (概念) | 4.04 | 0.0465369 | 899.3116 | 0.2279457 | 952.2123 | 16.0316 |
| 元宇宙概念 (概念) | 2.83 | 0.0152171 | 976.3810 | 0.0695193 | 1032.4349 | 61.7966 |
“盲盒经济”的波段流入率和单日流入率都高于“知识产权”,但其两个 score 反而更低;“元宇宙概念”的 `Ratio_Score` 高于二者而 raw 流入率不最高。这排除了“score 只是 raw 值乘固定倍数”这一解释。
按当前分片计算的相关性也只能说明共同变化,不能证明公式:`pct_change → Ratio_Score` 在概念/行业约为 `r=0.714/0.584`,`pct_change → Swing_Score` 约为 `r=0.392/0.259`。对应 raw 值与 score 的相关性更高,但 `R²` 仍不是 1,且存在板块类型差异。因此“加权评分由涨跌幅+资金字段构成”目前只能列为合理推断,不能列为已确认事实。
### 可复现的最小替代策略
如果目标是先跑通系统而非伪装成原站,可定义独立版本,例如:
```python
def independent_ratio_score(pct_change, ratio_raw, amount_raw):
# 所有标准化参数必须按 trade_date + type 保存并版本化。
z_pct = winsorized_zscore(pct_change, group="type")
z_ratio = winsorized_zscore(ratio_raw, group="type")
z_amount = winsorized_zscore(amount_raw, group="type")
return 500 + 100 * (0.30 * z_pct + 0.50 * z_ratio + 0.20 * z_amount)
```
这里的权重只是替代策略示例,不是 OneChartLab 参数。生产结果必须命名为自建 `metric_version`,同时保留与原站 score 的排名重合率、Spearman 相关、覆盖率和低流动性样本分层误差。
## 三、波段流入率 `Swing_Ratio_Val`
### 作者语义与页面字段
作者视频 `01:58—02:23` 将它解释为“统计 3—10 天加权的单日流入率并排名”,排名靠前意味着资金在板块内留存比例较高,后续行情延续性可能相对更好。这里的“可能”是使用启发式,不是收益保证。
页面显示时使用 `Swing_Ratio_Val * 100`。同一截图中左侧“流入 +3.21%”就是这一字段的百分比展示;右侧“流出 -5.60%”是负向榜板块的同一波段字段,不等于 `pct_change`。
### 可确认的结构与不可确认的参数
可以写成如下抽象形式:
```text
r_t = daily 主力净流入 / 当日成交额 # 作者口径;生产字段未确认
Swing_Ratio = Σ_{h∈H} w_h · aggregate(r_{t-h+1:t}), H ⊆ {3,...,10}
```
作者口头给出窗口范围 `3—10`,但没有说明是选择一个窗口、多个窗口协同,还是对 3 到 10 日结果再加权;也没有披露 `w_h`、缺失日处理、成员变更、截尾和板块低流动性门槛。
在当前公开日期分片上,把连续日期的 `Ratio_Raw_Pct` 与板块匹配后,最近 3 日简单均值与 `Swing_Ratio_Val` 最接近:概念和行业可匹配样本的 `R²` 约为 0.886/0.882;但拟合有非零斜率和截距,4—10 日候选更弱。因此“接近 3 日均值”是验证实验结果,不是原站公式。
### 为什么 Tushare 直接复现条件不足
Tushare 可提供 `moneyflow_dc.net_amount` 和 `daily.amount` 等候选字段,但还缺少原站精确的:
1. “主力流入”与“成交额”的字段口径和单位转换顺序;
2. 先逐股求比后聚合,还是先板块聚合后求比;
3. 3—10 日每个窗口的权重与窗口之间的协同方法;
4. 成员股停牌、缺失资金流、零分母、小样本和低流动性处理;
5. `Swing_Ratio_Val` 如何与 `Swing_Amount_Val` 合成为 `Swing_Score`。
## 三个指标之间的正确关系
```mermaid
flowchart LR
A[成员/行情/资金原始事实] --> B[pct_change:板块收益聚合]
A --> C[Ratio_Raw_Pct:单日资金流入率候选]
C --> D[Swing_Ratio_Val:3—10日加权波段特征]
B --> E[后端综合评分候选特征]
C --> E
D --> E
A --> E
E --> F[Swing_Score / Ratio_Score]
F --> G[按 type 分池、前后10%、排名百分位]
```
图中从 `B/C/D` 到 `E` 的箭头是合理推断,不是页面代码已证实的 score 公式。页面真正确认的是:`F` 已在后端生成,`G` 的排序和榜单筛选逻辑公开;`B/C/D` 的部分字段在页面中展示,但构建过程不公开。
## 可执行的验证实验
后续若能取得目标 Tushare 账号和连续数据,建议按以下顺序验证,而不是直接硬编码一个公式:
1. 对同一交易日、同一板块同时计算 `sum(net_amount)/sum(amount)`、板块级 `net_amount_rate`、逐股比例均值和成交额加权比例,与公开 `Ratio_Raw_Pct` 比较。
2. 保存至少 30 个连续交易日的 `Ratio_Raw_Pct`,比较 3、4、5、6…10 日候选窗口;用留出日期验证,不只做同日拟合。
3. 以 `pct_change`、单日流入率、波段流入率、净额、成员数量和流动性特征分别做消融实验,检查哪一组特征能解释 score 的横截面和时间序列变化。
4. 以概念/行业分开校准,并对小样本、停牌、零成交额和成员变更样本单独报告误差。
5. 用 Spearman 排名重合率而非只看 Pearson 相关,因为页面最终用途是排序;所有结果带 `metric_version`、`trade_date`、`type`、输入覆盖率和版本 hash。
## 最终复现建议
- 若目标是页面一致性:直接保存 OneChartLab 的日期分片和 score/raw 字段;本地只复刻格式化、排序、前后 10% 和排名变化。
- 若目标是独立生产:先实现 `pct_change_v1`、`ratio_v1`、`swing_v1` 和 `score_v1` 等明确命名的替代策略,不要命名为“原站算法”;把 Tushare 原始响应、成员快照和参数版本全部落库。
- 若目标是研究原站算法:需要作者或后端提供 score 特征定义、3—10 日权重、板块涨跌幅聚合和异常值规则;仅凭截图、最终 JSON 和 Tushare 公共字段无法唯一反演。
本文只用于技术与产品逻辑研究,不构成投资建议,也不代表替代指标具有预测能力。
## 主要证据
- [OneChartLab 首页](https://onechartlab.com/):当前表格模板、字段读取、格式化和排序逻辑。
- [`radar_manifest.json`](https://onechartlab.com/radar_manifest.json):日期分片入口和当前版本。
- [2026-08-31 日期分片](https://onechartlab.com/radar_data/dates/2026-08-31.c094ac3098c9.json):791 条记录与三个指标字段。
- [成分排行 manifest](https://onechartlab.com/sector_rankings/manifest.json):Tushare 字段来源、单位与 `compound_return` 契约。
- [作者视频](https://www.bilibili.com/video/BV16Hur6rEq2/):`01:36—02:23` 的单日流入率、波段流入率概念口径和限制说明。
- 既有板块资金雷达报告:本项目此前页面逻辑、排名和数据协议调研,仓库文件为 `docs/research/onechartlab-sector-capital-radar.md`。