单行业资金流深度分析 + 零依赖图表交付
三十秒说清它能帮你做什么
问「某个行业最近资金是在进还是在出」,最没用的回答就是把数字念一遍。这个技能给的是判断:
- 这个流出属于什么水平——用 z 值定位(噪声级 / 偏强偏弱 / 显著 / 极端),不算绝对值口径的骗人账
- 是"对打"还是"撤离"——双轴读法:总量 ↑ 而占比 ↓ 是放量对打、天平倒向空方,不等于资金撤离
- 一张能直接给人看的图——零依赖纯静态 SVG,不加载任何 CDN,永远渲染得出来
- 口径可复现——两种 z 值口径分开算、分别标注,不混用
〇、先读这一条(最容易翻车的地方)
给用户看的图表,一律零依赖纯静态 SVG。禁用 CDN 图表库(Chart.js 等)。
理由(实测,因此连栽 3 次):本地 HTML 预览面板 / 内网环境加载不到外部脚本(实测 cdn.jsdelivr.net 超时 15.8s),图会渲染成空白画布——而用户说明问题时只会讲「看不清」,你无法从文字区分"空白"和"字太小"。前两次都在调配色和尺寸,方向全错。
配套三条硬约束:
- 画布固定像素 1:1 输出(如
width="1360" height="640"),禁止用 viewBox 做等比缩放——容器一窄字号会缩到 6–7px,同样"看不清" - 窄屏走横向滚动(外层
overflow-x:auto),绝不让字号缩水 - 不要用内联 widget 承载密集图表——宽度是硬天花板,多列数据必挤
> 诊断口诀:用户说「看不清」时,先问是「一片空白」还是「字太小」,不要猜。空白 = 外部依赖没加载;太小 = 尺寸/缩放问题。
一、取数
> 依赖说明:本节的取数需要你能访问行情/资金流数据源(任何一家券商或数据商的接口均可)。
> 第三节的出图脚本不依赖任何数据源——它只吃一个 JSON,有数据就能出图。
板块码规则
申万一级 = pt0180 + 4 位。例:建筑材料 pt01801710、农林牧渔 pt01801010、基础化工 pt01801030。
完整的 31 个板块「code → name」映射,可从你所用数据源的板块列表接口拉一次后本地缓存;
也可自行维护一份 sw1_mapping.json,只在自己项目内部使用。
通道优先级
- 首选支持板块码 + 历史区间的资金流接口(一次拿全逐日序列:主力流入 / 流出 / 净额)
- 若报「服务限频」→ 不硬重试,切到另一家数据源或自然语言金融数据检索通道,通常可一次拿全逐日序列(含流入/流出/净额三列明细)
- 再失败才考虑网页检索兜底
必做校验
- 当日净额至少与第二个来源交叉核对一次(两家同值即通过)
- 不一致时以「等式自洽 + 多源」裁决,勿随意取舍——先把两家口径差异写清楚
- 滚动窗口字段(如
MainNetFlow5D/10D)可能不含当日,见踩坑清单第 5 条
二、水平定位(回答"今天这个流出属于什么水平")
两种口径都要算,并明确说明差异
| 口径 | 公式 | 特点 |
|---|---|---|
| 净额绝对值口径 | z = (净额 − μ) / σ,σ 用样本标准差(n−1) | 受规模放大干扰:量大的日子绝对值天然大 |
| 净额占比口径(推荐) | z = (净额占比 − μ) / σ,占比 = 净额 ÷ (流入+流出) | 剔除规模,纯反映多空强弱 |
判读标尺:|z| < 1 噪声级 / 1 ~ 1.5 偏强偏弱 / 1.5 ~ 2 显著 / ≥ 2 极端。
⚠️ 两个口径的 z 值不同源,不可混用(同一天可能一个 −2.08σ、另一个 −1.62σ)。报告里必须写明用的是哪个口径。
双轴读法(核心洞察框架——不要只把数字报一遍)
| 总量 | 占比 | 含义 |
|---|---|---|
| ↑ | ↑ | 放量高效流入 |
| ↑ | ↓ 或转负 | 放量对打、天平倒向空方(≠ 资金撤离) |
| ↓ | 负 | 缩量撤离 |
- 边际效率:总量持续放大而占比递减 = 单位成交量净贡献衰减,增量资金吃不掉抛压
- 拆结构:把最后两日的流入端 / 流出端分别看变化,才能区分「对打」与「撤离」(总量持平但流入 −8.5%、流出 +5.5% = 对打)
- 筹码语境:N 日累计 vs 更长窗口(如 20 日)累计的差额,能判断这波资金是"刚进场"还是"已经拿了很久"
三、出图(用脚本,不要手算坐标)
PY="<你的 python 解释器路径>"
"$PY" "<skill_dir>/scripts/gen_flow_chart.py" <input.json> <output.html>
脚本零第三方依赖(纯标准库),输入输出都是文件,可离线跑。
input.json 字段见 examples/jiancai_20260918.json:industry / code / period / dates / inflow / outflow / net / source / conclusion。
🔴 必须提供 net(官方净额):inflow/outflow 通常只有 2 位小数,直接相减会漂移 ±0.01(如 79.36−81.60 算得 −2.24,官方是 −2.23)。脚本会打印偏差并自动优先采用 net,偏差 > 0.05 亿则直接报错退出。
脚本自动完成:算总量/占比/μ/σ/z → 动态定轴 → 渲染 SVG(柱=总量走左轴、折线=占比走右轴、负值落零线下方)→ KPI 四卡 + 完整数据表 → 自检 0 个 <script> / 0 个外部 http 引用,不通过则退出码非 0。
改样式时遵守的设计规范:
- 涨红跌绿(A 股习惯):流入 #C0392B、流出 #2F7D32
- 柱=总量用中性蓝(总量本身无方向,用红绿会误导);折线=占比才用红绿
- 数值标签用 paint-order="stroke" + 白色描边 → 落在柱内柱外都可读
- 柱顶不标数字,柱值下沉到数据表——折线点常落在柱体内部,两者必然打架
- 最后一日必须视觉突出:柱加 3px 深色描边、折线点放大到 r=8、x 轴标「今日」
四、图表交付通用规范(跨项目适用)
- 0 个
<script>、0 个外部 http 引用(唯一允许的http是 SVG 的xmlns命名空间声明) - 不用 webfont,字体走系统栈:
"Microsoft YaHei","PingFang SC","Segoe UI",sans-serif - 画布固定像素、1:1 输出;窄屏横向滚动
- 交付前自检:
<script>数 = 0、外部 http 数 = 0、SVG 能过 XML 解析器 - 数据表随图一起交付——图上标不下的数字在表里能读全
- 结论必须结论先行:先给判断,再给数据表和口径说明
五、踩坑清单(勿回退)
- CDN 图表库 → 空白画布,用户只会说「看不清」
- viewBox 等比缩放 → 字号随容器缩到 6–7px,同样「看不清」
- 流入/流出 2 位小数相减 → 净额漂移 ±0.01,必须优先用官方
net - 折线标签与柱顶标签必然重叠(折线点常落柱内)→ 柱值下沉表格
- 滚动窗口字段(如
MainNetFlow5D/10D)可能不含当日(实测某数据源的 5D 恰等于 T−5~T−1 之和)→ 自算时按含当日口径,勿直接采信 - 资金流接口限频时不要连试,直接切另一家数据源
- 写 HTML 必须
newline="\n",否则 CRLF 导致整文件 diff - 脚本里做数值格式化时,负号统一用 U+2212(
−)而非 ASCII-,与已交付版式保持一致 - SVG 属性值必须用引号包裹:
font-family这类值内部自带引号,拼接时若漏掉外层引号,属性会被 XML 解析器拆散、整段 SVG 非法(脚本现已内置 XML 自检,不通过直接非 0 退出)
六、交付流程
- 产物落盘:
<输出目录>/<行业>资金流_组合图_<YYYYMMDD>.html - 用
present_files展示给用户 - 回复结构:结论先行(这个流出属于什么水平 + 什么性质)→ 数据表 → 口径说明
- 数据源与免责声明必须完整:
本报告仅供研究参考,不构成个人投资建议