文章

A 股资金流仪表盘:比排行榜更重要的是可复算的数据口径

复盘 A 股资金流、RPS 与 ETF 仪表盘的口径设计、独立验证和原子发布。

A 股资金流仪表盘:比排行榜更重要的是可复算的数据口径

做一个资金流排行榜并不难:取数、求和、排序、画表。困难的是回答下一句——这个排名真的可以复算吗?日期是交易日还是自然日?停牌股票如何处理?资金流接口是否触顶?ETF 份额缺了一天时,窗口资金流还能不能比较?

a-share-flow-dashboard 最近完成公开发布,并连续修复了数据质量和中国市场颜色约定。这个项目现在能生成行业与个股资金榜、全市场 RPS、ETF 价格强度和申赎估算,但我最看重的是它把每个结论的口径与验证证据一起保存。

先定义样本,再计算指标

资金流窗口和 RPS 窗口都支持任意正整数交易日,例如资金流 2,6,9 日、RPS 8,15 日。指定截止日遇到非交易日时,系统回退到此前最新交易日。

“日”必须明确为交易日,因为自然日窗口在春节、周末和临时休市附近会产生完全不同的样本量。RPS 也不是简单对涨幅做序号:项目使用前复权区间收益、未舍入值排序,真实并列采用平均秩,RPS >= 95 才进入前 5%。先四舍五入再排名,会人为制造大量并列。

个股资金强度使用窗口累计净额除以最新交易日总市值,并设置最低市值门槛。绝对净流入回答“钱去了哪里”,市值归一化则回答“这笔钱相对公司体量有多强”,两者不能混成一个榜。

不同接口不能假装是同一市场

同花顺个股资金接口覆盖沪深,不覆盖北交所;标准资金流接口可以用于北交所覆盖复核,但二者算法不同,不能把结果直接混排。项目因此把相关榜单准确命名为“沪深个股资金榜”,而不是“全 A 榜”。

行业成员使用当前 ths_member 快照。一只股票可能属于多个行业,所以行业数值不能跨板块加总;历史 as-of 运行也不等于恢复了历史时点的行业成分。把这些限制写在结果旁边,比生成一个看似完整但语义错误的数字更重要。

ETF 资金流则按日累计:

1
(当日份额 - 前一交易日份额) × 当日收盘价

只有份额完整覆盖整个窗口时才生成正式数值和排名。部分覆盖值只进入带 partial_ 前缀的字段,不能悄悄参与比较。而且这只是申购赎回估算,无法仅凭结果识别汇金、央行或任何具体机构。

独立验证不能复用生产聚合函数

很多项目会在计算后再调用同一个函数检查一次,结果只是把相同错误重复两遍。这个仪表盘的 validate_market_dashboard.py 绕过生产聚合代码,直接从保存的原始 CSV 重新推导交易日、样本资格、端点和各周期指标。

验证覆盖:

  • 原始事实表主键和关键字段;
  • 每个交易日分区是否为空;
  • 各接口返回量是否碰到分页或条数上限;
  • 分单金额的内部算术;
  • 两套资金流的方向与相关性;
  • 交易所、市值、RPS 和 ETF 份额覆盖;
  • 未舍入 RPS 与平均秩;
  • 文件哈希、代码版本和敏感 token 泄漏。

任何关键复算失败,一键更新命令都会返回非零状态,并阻止 latest.html 被替换。这才让“验证”真正成为发布门禁。

用快照和原子切换保留可追溯性

每次运行都会保存原始数据、计算结果、元数据、独立验证报告和自包含 HTML。完整更新先在隐藏暂存目录执行,全部通过后再原子切换正式快照;同日期旧版移入 _previous,而不是直接覆盖删除。

这套结构带来两个好处。第一,页面上的数值总能回到当时的原始数据和参数;第二,渲染代码改变后,可以使用 --skip-data 基于旧快照重建并复验,不需要再次消耗接口额度。

网页使用 Python 标准库生成,不依赖前端构建链。真实 token、原始行情和生成快照全部忽略提交,仓库安全测试还会持续检查这些边界。开源的是研究方法和代码,不是第三方数据的再分发权。

仪表盘是结果,数据契约才是产品

近期更新把涨跌颜色调整为中国市场习惯,但视觉正确只是最后一层。一个可用于研究的仪表盘,应该能准确说出样本范围、计算口径、缺失处理、验证方式和数据授权边界。

排行榜会每天变化,方法和证据链才是可以复用的资产。项目不预测未来表现,也不构成投资建议;它解决的是更基础的问题:在讨论市场之前,先保证大家看到的是同一个、可复算的事实。

项目地址:cyijun/a-share-flow-dashboard

本文由作者按照 CC BY 4.0 进行授权