绘图工程:让数据的问题自己跳出来
同一条曲线,线性坐标藏起了一次 -62.5% 的回撤
这一章前七节,我们靠代码去数问题:26 个除权日、68 天停牌占位、209 个假交易日、47.8% 的错位因子。
这一节换个方式:让问题自己跳出来。
先看一个实测数字。同一条 21 年的净值曲线,用线性坐标画:2015 年之前的全部行情,只占纵轴高度的 7.2%。
而那段被压扁的历史里,藏着一次 -62.5% 的回撤。
不是数据错了,是你画错了。默认参数的图,会替你把最重要的东西藏起来。
体检报告上的心电图,如果把纵轴拉到 ±10 伏,任何人的心跳都是一条平线。
图没有撒谎——它只是用了一个让问题看不见的刻度。而看不见,和不存在,在决策层面是一回事。
一、坐标陷阱:线性 vs 对数
同一条后复权净值曲线,两种坐标:
| 线性坐标 | 对数坐标 | |
|---|---|---|
| 你看到的故事 | "2015 年之前什么都没发生" | 2008 年的崩盘清晰可见 |
| 早期行情占纵轴 | 7.2% | 与后期同等权重 |
| 那段里的最大回撤 | -62.5%(几乎不可见) | -62.5%(一眼可见) |
原因很简单:线性坐标衡量的是绝对差值,而收益是乘法的。当价格从 1 涨到 200,早期从 1 到 2 的那次翻倍(+100%),在纵轴上只占 0.5%,而后期从 150 到 160 的一次小波动(+6.7%)却占 5%。
长周期曲线一律用对数坐标。这不是审美偏好,是让"相同的百分比变化,在图上占相同的高度"——否则你的眼睛会系统性地低估早期风险。
二、五联诊断图:一张图看完这一章所有的坑
diagnostic.png 把 P1 章的坑逐个可视化,每一联对应一节:
| 面板 | 画什么 | 暴露什么 | 来自 |
|---|---|---|---|
| (1) | 后复权收盘,对数坐标 | 长周期的真实形状 | 本节 |
| (2) | 不复权 vs 后复权,同起点 | 两条线的缝隙就是分红 | p1.3 |
| (3) | 日收益散点,除权嫌疑日标红 | 26 个红点,最低那个 -56.69% | p1.3 |
| (4) | 成交量 + 停牌日竖线 | 68 天橙色竖线,密集在 2006 年 | p1.3 |
| (5) | 每年每月交易日数热力图 | 覆盖缺口、春节效应 | p1.4 |
实测输出:
图上自己暴露出来的问题:除权嫌疑日 26 个、停牌占位 68 天
这两个数字与 p1.3 的实测一致 —— 区别只在于:那时要靠代码去数,现在一眼就能看见
热力图那一联值得多说
第五联是我最喜欢的一个面板,因为它不需要你事先知道要找什么:
- 2026 年 8–12 月整片深色 → 数据到 7 月底为止,一眼确认覆盖区间
- 每年 2 月都比其他月份浅 → 春节长假,符合预期
- 如果某个月突然变深 → 那里有缺口,而你原本可能永远发现不了
好的诊断图不是用来展示结论的,是用来发现你没想到要找的问题的。
每张图都要带血缘水印。
meta = f"{SAMPLE} | baostock | {start}~{end} | {rows} rows | fetched 2026-07-31"
fig.text(0.005, 0.002, meta, fontsize=7, color="#666")
图会被截屏、被贴进微信、被转发到群里、被三个月后的你翻出来。到那时:
- 这是哪个标的?哪个数据源?
- 后复权还是不复权?
- 什么时候拉的数据?
没有水印的图,三天后就是一张不可追溯的图片。这是判据七(可复现)在可视化层的落法,成本只有一行代码。
🔧 动手做:一次坐标切换,让 -62.5% 的回撤消失(4 分钟)
跑 python diagnostic_plot.py 生成五联诊断图,看第一联净值曲线(对数纵轴)。然后把它改成线性纵轴重新生成。
你会看到(实测):线性坐标下,2015 年之前的整段行情被压成只占纵轴高度的 7.2%——那个区间里一次 -62.5% 的最大回撤,在图上几乎看不见了。
想明白:同一条净值曲线,线性坐标会把早期的剧烈波动压扁成一条平线,一次腰斩级的回撤就这样被藏了起来。长周期净值一律用对数纵轴,否则你会对早期风险毫无感觉。图不会撒谎,但坐标轴的选择决定了你看得见什么。
三、三条绘图纪律
- 长周期用对数坐标 —— 否则早期风险被系统性低估(本节实测:7.2% vs -62.5%)
- 异常点必须标注 —— 不要指望人眼在 5238 个散点里找出那 26 个;让代码标红
- 每张图带血缘水印 —— 标的、数据源、区间、行数、拉取时间
再加一条给 ECS/服务器环境的实务提醒:服务器通常没有中文字体。本课所有图一律用英文标签,中文解读写在课文里——这比在服务器上折腾字体配置省事得多,也避免了图上出现方块乱码。
📌 免责:本课为技术教学,样本股仅因分红多、有停牌而被选作诊断演示,与其投资价值无关,不构成投资建议。
P1 数据工程章完结。八节走下来,你手里有一整条可信的数据链路:
| 节 | 交付 | 记忆点 |
|---|---|---|
| p1.1 | 多源降级 + 血缘 | 东财全挂,yfinance 少给 16 年 |
| p1.2 | 扰动检测法 | 3/40、5661 个被污染的历史点 |
| p1.3 | 价格四陷阱 | 3524% vs 16993% |
| p1.4 | 交易日历 | 209 个假交易日、月频标签 34.5% 错 |
| p1.5 | 幂等落库 | 第二次灌入新增 0 行 |
| p1.6 | 质量流水线 | 六种注入 6/6 全抓 |
| p1.7 | PIT | 滞后 54 天、年报 102.5 天、47.8% 错位 |
| p1.8 | 诊断绘图 | 线性坐标藏起 -62.5% 回撤 |
下一章 P2 开始做指标与因子:从手写 SMA/EMA/MACD 开始,再到 KDJ、ATR、BOLL、OBV,最后落到真正区分专业与业余的那一节——因子评价体系(IC/IR、分层回测、衰减半衰期)。
而所有这些指标,都会跑在你这一章亲手建起来的干净数据上。
🔎 来源与核验· 3 条,点开核对
