第 4 课
把一只股票画成第一张 K 线图
先检查虚构教学数据的身份、日期与价格关系,再在本地画出第一张 K 线图。
上一课结束时,AI 已经读过教学数据包里的四张表,还汇报了每张表装着什么。
蛙兄听完,只问了一句:
“既然数据已经能读了,那我们画张图看看?”
蛙博士伸手按住了回车键。
“可以。不过先别急。坏数据也能画出一张很好看的图。”
蛙兄想了想:
“所以,画图以前还要先问问,数据有没有明显问题?”
“对。但我们今天不做一场数据大体检,只做几项最基本的检查。”
这一次,我们只完成一件事:从教学数据里选择一家虚拟公司,让 AI 检查它的日线数据,再生成一张 K 线图。
我们不研究图形,不寻找买点,也不猜它接下来会涨还是会跌。
K 线图是数据链路第一次变得可见。图画出来了,说明程序已经能够读取并呈现当前数据;它不代表我们发现了市场规律。

这一次,先统一使用教学数据
如果你已经接通自己的外部数据源,那条路线可以继续保留。
不过,不同平台的字段名称、复权方法和返回格式可能不一样。为了不让第一次画图变成一场接口排错大会,这一课先使用已经解压到实验室里的 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 线至少需要四个价格:开盘、最高、最低和收盘。
它们不能缺失,彼此之间也要说得通:
- 最高价不应该低于当天的开盘价或收盘价;
- 最低价不应该高于当天的开盘价或收盘价;
- 最高价不应该低于最低价。
这些检查并不能证明数据百分之百正确。它们只是先拦住几种特别明显的问题。

现在可以把任务交给 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 线。要判断它相对前一天究竟涨了还是跌了,还要比较今天收盘价和前收盘价。
中国市场常见的图表习惯是红色表示上涨、绿色表示下跌。许多欧美行情图正好相反,常用绿色表示上涨、红色表示下跌。
颜色只是显示习惯,不会改变数据本身。后面制作英文版课程时,我们会采用英文读者更熟悉的绿涨红跌,并明确写出图例。

图的下方还会出现成交量。它告诉我们当天交易了多少,但这一课不分析“放量”“缩量”意味着什么。我们只是把日线数据里已经存在的信息如实画出来。
为什么只画最近 120 个交易日
教学数据包含三年日线。如果把全部蜡烛一次塞进一张普通图片里,每根 K 线都会细得像一根头发。
所以,我们先检查完整数据,再只展示最近 120 个交易日。
这个数字不是投资参数,也没有预测意义。它只是让第一张图保持清楚,方便我们看见每根蜡烛。
检查范围和展示范围不是一回事:
完整数据:负责接受基本检查
最近 120 个交易日:负责出现在第一张图里
我们没有为了让走势好看而删除前面的数据,只是没有把全部日期挤进同一张图片。
图生成了,也要亲眼打开看看
AI 说“图片已经保存”,还不等于我们已经看到了图片。
打开它,先看最普通的几件事:
- 图片是不是确实存在;
- K 线和成交量是不是都能看到;
- 日期是不是从左到右前进;
- 标题和坐标有没有挤在一起;
- 红色和绿色的含义有没有写清楚。
有时程序已经成功运行,只是标题太长、文字被裁掉,或者 120 根蜡烛挤得不舒服。这时不需要推翻程序,更不需要修改数据。
把你看到的问题直接告诉 AI,例如:
图已经生成了,但标题和坐标挤在一起。请只调整图表布局,让文字能够完整显示,不要修改数据和检查逻辑。
这仍然是我们一直在练习的协作方式:先看真实结果,再只处理眼前的问题。

第一张图不负责告诉我们该不该买
蛙兄终于打开了图片。
红红绿绿的蜡烛排在屏幕上,他盯着最后几根看了一会儿:
“它最近跌了不少,是不是快该涨了?”
蛙博士摇了摇头。
“我们刚刚只证明了这份数据能够被读取、检查和画出来。至于跌过以后会不会涨,那是另一个需要定义和验证的问题。”
一张 K 线图很容易让人产生故事,但故事还不是证据。
图表是数据的呈现方式,不是研究结论。没有明确假设、比较方法和检验过程,我们不能只凭一张图判断规律,更不能把它变成买卖建议。
到这里,我们已经让本地实验室真正碰到了市场数据:AI 能够读取 Parquet 文件,找到一家公司,完成几项最基本的检查,并保存第一张 K 线图。
如果你觉得有趣,可以继续和 AI 聊聊,换一家虚拟公司,或者换一段时间再画一次。这里没有标准玩法,也不属于本课必须完成的任务。
下一次,我们不再只看一家公司。我们会把视线扩展到许多虚拟股票,并研究一个听起来有点不靠谱、却可以被认真测一测的问题:虚构股票代码里的数字 8,真的会和后来的表现有关吗?
课后讨论
留下你的问题、理解或不同意见,也看看其他学习者怎么想。