← 返回目录
p1.8动手⏱ 约 14 分钟

绘图工程:让数据的问题自己跳出来

同一条曲线,线性坐标藏起了一次 -62.5% 的回撤

🔎 最后验证 2026-07📚 来源:五联诊断图与坐标对比于 2026-07-31 在 ECS 实测(样本股 2005-01-04~2026-07-29,5238 行),图与输出见 code/outputs/🧰 matplotlib 3.11.1、pandas 3.0.5、baostock
为什么学这个

这一章前七节,我们靠代码去数问题: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% 的最大回撤,在图上几乎看不见了

想明白:同一条净值曲线,线性坐标会把早期的剧烈波动压扁成一条平线,一次腰斩级的回撤就这样被藏了起来。长周期净值一律用对数纵轴,否则你会对早期风险毫无感觉。图不会撒谎,但坐标轴的选择决定了你看得见什么

三、三条绘图纪律

  1. 长周期用对数坐标 —— 否则早期风险被系统性低估(本节实测:7.2% vs -62.5%)
  2. 异常点必须标注 —— 不要指望人眼在 5238 个散点里找出那 26 个;让代码标红
  3. 每张图带血缘水印 —— 标的、数据源、区间、行数、拉取时间

再加一条给 ECS/服务器环境的实务提醒:服务器通常没有中文字体。本课所有图一律用英文标签,中文解读写在课文里——这比在服务器上折腾字体配置省事得多,也避免了图上出现方块乱码。

❓ 测验
同事发来一张策略净值图:线性坐标、21 年、曲线在最后 5 年陡峭上扬,前面一段几乎是平的。你最该先问什么?
✏️ 填空
长周期净值曲线一律用 ___ 坐标,让相同的百分比变化在图上占相同的高度。

📌 免责:本课为技术教学,样本股仅因分红多、有停牌而被选作诊断演示,与其投资价值无关,不构成投资建议。

✅ 小结

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.7PIT滞后 54 天、年报 102.5 天、47.8% 错位
p1.8诊断绘图线性坐标藏起 -62.5% 回撤

下一章 P2 开始做指标与因子:从手写 SMA/EMA/MACD 开始,再到 KDJ、ATR、BOLL、OBV,最后落到真正区分专业与业余的那一节——因子评价体系(IC/IR、分层回测、衰减半衰期)。

而所有这些指标,都会跑在你这一章亲手建起来的干净数据上。

下一节 → 趋势指标:SMA / EMA / MACD 手写与向量化
🔎 来源与核验· 3 条,点开核对
本节每个关键论断都对应一个可追溯的来源 —— 这是本课程"靠谱、不过时"的底线。
「线性坐标下 2015 年之前的行情仅占纵轴高度 7.2%;该区间内存在 -62.5% 的最大回撤」
📚 本节 code/diagnostic_plot.py,2026-07-31 于 ECS 实测(样本股后复权 2005-01-04~2026-07-29,5238 行),输出见 code/outputs/stdout.txt✓ 已核验 2026-07
「五联诊断图自动标出除权嫌疑日 26 个、停牌占位 68 天,与 p1.3 代码统计结果一致」
📚 同上实测,图见 code/outputs/diagnostic.png✓ 已核验 2026-07
「服务器环境通常缺少中文字体,matplotlib 中文标签会显示为方块;本课图表统一使用英文标签」
📚 ECS 环境实测(fc-list 无 CJK 字体)✓ 已核验 2026-07
智图软件的赞赏码
都看到这了,打个赏呗!
接下来 · p2.1
趋势指标:SMA / EMA / MACD
继续读下一节 →