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

12 KiB
Raw Blame History

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 反推出来。

对板块层聚合,至少存在以下候选:

# 候选 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,且存在板块类型差异。因此“加权评分由涨跌幅+资金字段构成”目前只能列为合理推断,不能列为已确认事实。

可复现的最小替代策略

如果目标是先跑通系统而非伪装成原站,可定义独立版本,例如:

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。

可确认的结构与不可确认的参数

可以写成如下抽象形式:

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。

三个指标之间的正确关系

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 首页:当前表格模板、字段读取、格式化和排序逻辑。
  • radar_manifest.json:日期分片入口和当前版本。
  • 2026-08-31 日期分片:791 条记录与三个指标字段。
  • 成分排行 manifest:Tushare 字段来源、单位与 compound_return 契约。
  • 作者视频:01:36—02:23 的单日流入率、波段流入率概念口径和限制说明。
  • 既有板块资金雷达报告:本项目此前页面逻辑、排名和数据协议调研,仓库文件为 docs/research/onechartlab-sector-capital-radar.md。