HoppyQuant
EN

第 4 课

把一只股票画成第一张 K 线图

先检查虚构教学数据的身份、日期与价格关系,再在本地画出第一张 K 线图。

上一课结束时,AI 已经读过教学数据包里的四张表,还汇报了每张表装着什么。

蛙兄听完,只问了一句:

“既然数据已经能读了,那我们画张图看看?”

蛙博士伸手按住了回车键。

“可以。不过先别急。坏数据也能画出一张很好看的图。”

蛙兄想了想:

“所以,画图以前还要先问问,数据有没有明显问题?”

“对。但我们今天不做一场数据大体检,只做几项最基本的检查。”

这一次,我们只完成一件事:从教学数据里选择一家虚拟公司,让 AI 检查它的日线数据,再生成一张 K 线图。

我们不研究图形,不寻找买点,也不猜它接下来会涨还是会跌。

本章重点

K 线图是数据链路第一次变得可见。图画出来了,说明程序已经能够读取并呈现当前数据;它不代表我们发现了市场规律。

AI 已经准备画图,蛙兄兴奋地看着屏幕,蛙博士提醒他坏数据也能画出一张很好看的图。
图 1|图画得漂亮,不代表送进去的数据已经可靠。

这一次,先统一使用教学数据

如果你已经接通自己的外部数据源,那条路线可以继续保留。

不过,不同平台的字段名称、复权方法和返回格式可能不一样。为了不让第一次画图变成一场接口排错大会,这一课先使用已经解压到实验室里的 Hoppy 教学数据。

我们会直接读取:

hoppy-teaching-dataset/
├── companies.parquet
└── stock_daily.parquet

前一张表负责告诉我们“它是谁”,后一张表负责告诉我们“它每天怎样变化”。

AI 可以直接从这两张 Parquet 表里筛选我们选中的公司,不需要再制作另一份数据文件。

如果你还没有成功读取教学数据包,先回到上一课完成下载、解压和第一次读取。缺少原料时,画图程序再努力也只能对着空气比划。

先挑一家虚拟公司

教学数据里有 300 家虚拟公司。它们的代码、中文名和英文名都是为了课程编造的,与现实公司没有对应关系。

我们先让 AI 列出几家公司,再由你挑一家顺眼的。

交给 AI 研究助手

请读取当前项目中 Hoppy 教学数据的 companies.parquet,列出 5 家虚拟公司的代码、中文名和所属教学行业,让我选择其中一家。

现在先不要写绘图程序,也不要分析哪家公司更值得研究。列出候选后停下来等我选择。

这一步没有正确答案。

名字好听、行业看着有趣,甚至只是排在第一位,都可以成为这次选择它的理由。我们选的不是投资标的,只是第一张 K 线图的练习对象。

选好以后,直接用普通话告诉 AI:

我选“晨塔绿境”(003382)这家,请继续。

请把例子里的名字和代码换成你刚刚选中的公司。只写名称或只写代码也可以,重要的是不要只说“这家”,让 AI 能够明确知道你选的是谁。

不需要重新写一份长提示词。AI 已经看得到刚才的对话,我们只需要把这次选择说清楚。

不做全面体检,只看三个地方

AI 找到这家公司的日线数据以后,不要马上画图。

我们先请它检查三个最容易理解的问题。

第一,真的找到数据了吗

至少要知道:

  • 一共有多少行;
  • 最早和最晚分别是哪一天;
  • 读到的数据是不是刚才选择的公司。

如果筛选以后只剩下零行,问题通常不是“这家公司没有人生经历”,而是代码、字段名称或者筛选条件没有对上。

第二,日期有没有乱

日线数据要按照日期从早到晚排列,同一天也不应该无缘无故出现两次。

日期乱序,图可能会左右乱跳;重复日期,则可能让同一天在图上出现两根蜡烛。

所以我们只检查两件事:日期是否排好,是否存在重复日期。

第三,开高低收有没有明显矛盾

一根 K 线至少需要四个价格:开盘、最高、最低和收盘。

它们不能缺失,彼此之间也要说得通:

  • 最高价不应该低于当天的开盘价或收盘价;
  • 最低价不应该高于当天的开盘价或收盘价;
  • 最高价不应该低于最低价。

这些检查并不能证明数据百分之百正确。它们只是先拦住几种特别明显的问题。

画 K 线以前先经过三道轻量检查:确认数据身份和日期范围、检查日期顺序与重复、检查开高低收缺失和关系矛盾。
图 2|正式画图前,先做身份、日期和价格关系三道轻量检查。

现在可以把任务交给 AI 了

确定公司以后,可以把检查和绘图任务一起说明:

交给 AI 研究助手

请使用我刚刚明确选定的虚拟公司,直接从 companies.parquet 和 stock_daily.parquet 读取数据,不要另外制作一份重复的数据文件。

先检查并向我汇报:数据行数和日期范围、日期是否已经从早到晚排列、是否存在重复日期、前复权的开盘价、最高价、最低价和收盘价是否有缺失,以及它们之间是否存在明显矛盾。

如果发现问题,请先停下来解释,不要偷偷删除、填补或修改数据。

如果这些基本检查没有发现问题,请使用 mplfinance 绘制最近 120 个交易日的静态 K 线图,并在下方保留成交量。请先检查当前项目是否已经安装 mplfinance;如果缺少,通过 uv 将它安装到当前项目环境,不要装进整台电脑共用的 Python。

中文版采用 A 股常见配色:收盘价高于开盘价的 K 线使用红色,收盘价低于开盘价的 K 线使用绿色,同时在图中写明颜色含义。

图中请写清虚拟公司的名称和代码、展示日期范围、使用的是前复权价格,以及数据来自 Hoppy 教学样本。只生成这一张图,不添加均线、技术指标、买卖标记或涨跌预测。

请把图片保存到当前项目的输出目录。完成后实际运行程序,并告诉我图片保存在哪里。

这一次统一使用 mplfinance,避免不同绘图库带来额外的安装和调用差异。不过,AI 创建的程序结构和文件名仍然不要求与课程完全相同。

我们关心的是结果有没有做到三件事:实际读取数据、先做检查、再保存一张能够打开的图。

一根 K 线到底装了什么

等待 AI 工作时,我们顺便认识一下即将出现的图。

一根 K 线负责装下一天的四个价格:

最高价
  │
收盘价 ┐
       │  K 线实体
开盘价 ┘
  │
最低价

开盘价和收盘价之间的部分叫作实体。上下伸出去的细线,负责告诉我们当天还到过多高、跌到过多低。

如果收盘价高于开盘价,这根 K 线表示价格从开盘到收盘走高,常被叫作阳线;如果收盘价低于开盘价,它表示价格从开盘到收盘走低,常被叫作阴线。两者相等时,还可能出现实体很薄的平盘 K 线。

这里比较的是当天开盘价与收盘价,不是收盘价与前一天收盘价。一只股票可能低开以后有所回升,收盘仍然低于昨天,却画出一根收盘高于开盘的 K 线。要判断它相对前一天究竟涨了还是跌了,还要比较今天收盘价和前收盘价。

中国市场常见的图表习惯是红色表示上涨、绿色表示下跌。许多欧美行情图正好相反,常用绿色表示上涨、红色表示下跌。

颜色只是显示习惯,不会改变数据本身。后面制作英文版课程时,我们会采用英文读者更熟悉的绿涨红跌,并明确写出图例。

一根 K 线包含开盘、最高、最低和收盘;中文行情常用红色表示收盘高于开盘,英文行情常用绿色表示收盘高于开盘。
图 3|一根 K 线压缩了一个交易日的开盘、最高、最低和收盘。

图的下方还会出现成交量。它告诉我们当天交易了多少,但这一课不分析“放量”“缩量”意味着什么。我们只是把日线数据里已经存在的信息如实画出来。

为什么只画最近 120 个交易日

教学数据包含三年日线。如果把全部蜡烛一次塞进一张普通图片里,每根 K 线都会细得像一根头发。

所以,我们先检查完整数据,再只展示最近 120 个交易日。

这个数字不是投资参数,也没有预测意义。它只是让第一张图保持清楚,方便我们看见每根蜡烛。

检查范围和展示范围不是一回事:

完整数据:负责接受基本检查
最近 120 个交易日:负责出现在第一张图里

我们没有为了让走势好看而删除前面的数据,只是没有把全部日期挤进同一张图片。

图生成了,也要亲眼打开看看

AI 说“图片已经保存”,还不等于我们已经看到了图片。

打开它,先看最普通的几件事:

  • 图片是不是确实存在;
  • K 线和成交量是不是都能看到;
  • 日期是不是从左到右前进;
  • 标题和坐标有没有挤在一起;
  • 红色和绿色的含义有没有写清楚。

有时程序已经成功运行,只是标题太长、文字被裁掉,或者 120 根蜡烛挤得不舒服。这时不需要推翻程序,更不需要修改数据。

把你看到的问题直接告诉 AI,例如:

图已经生成了,但标题和坐标挤在一起。请只调整图表布局,让文字能够完整显示,不要修改数据和检查逻辑。

这仍然是我们一直在练习的协作方式:先看真实结果,再只处理眼前的问题。

使用 Hoppy 教学数据实际生成的第一张 K 线图,展示同一家虚拟公司最近 120 个交易日的前复权价格和成交量。
图 4|第一张 K 线图把同一家虚拟公司最近 120 个交易日的价格和成交量放到一起。

第一张图不负责告诉我们该不该买

蛙兄终于打开了图片。

红红绿绿的蜡烛排在屏幕上,他盯着最后几根看了一会儿:

“它最近跌了不少,是不是快该涨了?”

蛙博士摇了摇头。

“我们刚刚只证明了这份数据能够被读取、检查和画出来。至于跌过以后会不会涨,那是另一个需要定义和验证的问题。”

一张 K 线图很容易让人产生故事,但故事还不是证据。

本章重点

图表是数据的呈现方式,不是研究结论。没有明确假设、比较方法和检验过程,我们不能只凭一张图判断规律,更不能把它变成买卖建议。

到这里,我们已经让本地实验室真正碰到了市场数据:AI 能够读取 Parquet 文件,找到一家公司,完成几项最基本的检查,并保存第一张 K 线图。

如果你觉得有趣,可以继续和 AI 聊聊,换一家虚拟公司,或者换一段时间再画一次。这里没有标准玩法,也不属于本课必须完成的任务。

下一次,我们不再只看一家公司。我们会把视线扩展到许多虚拟股票,并研究一个听起来有点不靠谱、却可以被认真测一测的问题:虚构股票代码里的数字 8,真的会和后来的表现有关吗?

课后讨论

留下你的问题、理解或不同意见,也看看其他学习者怎么想。