第 3 课
网页明明能看股价,为什么程序拿不到?
分清网页展示与可研究数据,认识数据来源、使用权限、复权口径和课程教学数据包。
小游戏顺利跑起来以后,蛙兄觉得实验室已经可以正式开张了。
他打开一个行情网页,找到一只股票,又回到 AI 面前:
“网页上明明写着每天的股价。你帮我拿下来,我们开始研究吧。”
AI 没有马上动手。
“你想拿哪一段时间?只要收盘价,还是也要开盘、最高、最低和成交量?价格要不要复权?这个网页允许程序反复获取吗?”
蛙兄看了看网页,又看了看 AI。
“我只是想拿个股价,怎么突然多出这么多问题?”
蛙博士把行情页面转向他:
“因为你现在看到的是一个给人看的数字。量化研究需要的,是一份程序能反复读取、口径说得清楚、也允许我们这样使用的数据。”
网页上能看到,不等于程序就能稳定地拿到。
程序偶尔拿到,也不等于这份数据已经适合研究。
这一章,我们先把进入市场数据的门找出来。

先让小游戏下班
上一章的小游戏已经完成了任务。
它帮我们确认 AI 能在这间实验室里创建文件、准备 Python 环境、安装依赖并运行程序。接下来真正要进入市场数据了,不需要让青蛙继续守着泡泡加班。
可以在原来的对话里请 AI 清理工作台:
交给 AI 研究助手
小游戏已经完成了环境测试任务,现在不再需要。
请先检查当前项目,列出哪些代码、运行产物和依赖只属于小游戏,并说明准备删除什么、保留什么。保留 uv、Python、项目里的 .venv 和后续数据研究仍然需要的项目配置,不要碰实验室以外的文件。
现在先不要删除。列完清单以后停下来,等我确认。
看清清单以后,如果范围没有问题,再继续说:
我确认按这份清单清理。请执行删除,完成后告诉我实际删除了什么、保留了什么,以及当前项目是否仍能继续使用 Python。
AI 清理完成后,建议在同一个实验室项目里打开一段新对话。
这样做不是因为旧对话坏掉了,而是因为前一段对话里装满了游戏规则、窗口报错和泡泡颜色。新对话可以从一个更干净的上下文开始,专心处理市场数据。
打开新对话后,先确认它仍然站在同一间实验室里:
现在开始处理市场数据。请先确认当前项目根目录,并用大白话告诉我清理后还留下了什么。暂时不要创建、修改或安装任何内容。
如果它看到的不是原来的实验室,先切换回正确的本地文件夹,再继续下面的内容。
这次先不要把整个市场搬回家
市场数据可以细到每一笔成交,也可以快到每秒不断变化。
这些数据当然有研究价值,但它们会带来更大的文件、更多的接口请求、更复杂的交易时间和更高的数据成本。我们现在还不需要同时处理这些问题。
这套课程先把一天当作最小单位。
我们主要使用:
- 个股日线数据;
- 大盘指数和行业指数的日线数据;
- 为了理解这些数据而需要的少量公司基础资料。
一条最常见的日线记录,大致会告诉我们:
今天是哪一天
→ 开盘时多少钱
→ 盘中最高和最低到过哪里
→ 收盘时多少钱
→ 成交了多少
这已经足够我们在后面的课程里画 K 线、定义条件、检查假设并完成日频回测。
它不能回答盘中某一分钟发生了什么,也不适合高频交易研究。这个限制不是缺点,而是我们主动划定的课程边界。
数据不是越快、越多越专业。
先拿到真正适合当前问题的数据,比一上来搬回整个市场更重要。
“股票数据”其实装在几个不同的抽屉里
蛙兄本来以为,股票数据就是一张很长的股价表。
真正打开数据平台以后,他才发现里面像一只文件柜,每个抽屉放的东西都不一样。
为了避免把一堆字段混在一起,我们先把常见数据分成四类。
第一类:这只股票是谁
这类数据像股票的身份证,常见内容包括:
- 股票代码;
- 公司名称;
- 所属市场和交易所;
- 所属行业;
- 上市日期;
- 当前是否仍在交易。
它们通常叫作基础数据或证券基础信息。
价格表里只有代码时,我们需要靠这份资料知道每个代码代表谁。后面扩大到多只股票时,它也能帮助我们按行业分组,或者排除已经不符合研究范围的证券。
第二类:市场每天留下了什么记录
这类数据包括:
- 开盘价、最高价、最低价和收盘价;
- 成交量和成交额;
- 当日市值;
- 市盈率、市净率等每日估值指标;
- 停牌、涨跌停等与当天交易有关的状态。
课程里把它们统称为每日市场数据。
有些资料会把其中一部分叫作行情数据、技术数据或每日指标。名字不必死记,先看它记录的究竟是价格、交易活动,还是根据当天数据计算出来的指标。
第三类:公司定期交出的成绩单
公司不会每天发布一份完整财报。利润表、资产负债表和现金流量表,通常按照季度、半年或年度披露。
这些属于财务数据。
它们和日线价格的时间节奏不同。研究时不能因为某份财报写着某个季度,就假设整个季度的人每天都已经知道它。以后真正使用财务数据时,还要留意它是什么时候对外发布的。
这一章先认识它,不急着把整套财报搬进实验室。
第四类:拿什么和一只股票比较
一只股票上涨了,不代表它跑赢了市场。
如果同一时期大盘涨得更多,这只股票反而可能是落后的。为了给研究准备一把尺子,我们还需要指数数据,例如宽基指数和行业指数的日线记录。
指数数据可以帮助我们观察整个市场或某个行业大致走到了哪里。它不是普通公司股票,也不能在数据表里不加说明地和个股混为一类。

数据从哪里来,没有唯一答案
不同市场有不同的数据渠道,同一个平台的接口、权限和价格也可能变化。
我们的课程以 A 股作为主要案例,同时介绍美股中常见的选择。这里列出的名字是进入调查的起点,不是永远有效的平台排行榜。
A 股常见起点
AKShare 是一个开源 Python 数据接口库。它把许多公开数据入口整理成可以由 Python 调用的接口,适合快速尝试和学习。它并不是证券交易所本身,上游网页或接口变化时,某些功能也可能跟着变化。
Tushare 是需要注册使用的数据服务。它提供股票基础资料、日线行情、复权因子、每日指标、财务数据和指数数据等接口。具体权限、积分或套餐要求需要以你使用时的官方说明为准。
美股常见起点
yfinance 是一个社区维护的 Python 工具,可以从 Yahoo Finance 获取历史行情等资料。它的门槛较低,适合快速实验,但它不等于交易所提供的正式数据服务。使用范围和稳定性仍然需要查看当前文档与数据来源规则。
Massive 是面向美国市场的正式数据 API 服务,原名 Polygon.io。它通常需要注册账户并使用 API Key,不同数据、历史范围和请求能力可能属于不同套餐。
以上入口核对于 2026 年 8 月 31 日。
我们故意不在这里抄写“免费版能调多少次”“可以下载多少年”或者“哪个套餐包含什么”。这类信息很容易变化,而且不同人的市场、用途和预算也不同。
真正值得学会的,是让 AI 帮你根据当前官方资料重新调查。
可以把自己感兴趣的平台名称填进下面的任务说明:
交给 AI 研究助手
我正在考虑使用 [平台名称] 获取股票数据,用于个人量化学习,不用于实时交易。
请查阅这个平台当前的官方网站、官方文档和数据许可说明,不要只凭记忆回答。帮我确认:
- 它主要支持哪些市场和证券类型;
- 能否获取个股日线、证券基础资料、财务数据和指数日线;
- 历史数据覆盖多长时间,数据多久更新一次;
- 股价是否复权,默认口径是什么;
- 是否需要注册、API Key、积分或付费套餐;
- 当前请求额度和主要限制是什么;
- 是否允许用于个人研究,是否允许公开再分发;
- Python 通常怎样接入。
请在回答中标明查询日期,并为关键结论附上官方链接。遇到官方没有说清楚的地方,请直接标记为“需要向平台确认”,不要自行补全。
现在只做调查,不要安装依赖、编写接入程序或替我注册账户。
你不一定需要把四个平台都调查一遍。
先确定自己要研究 A 股还是美股,再比较同一市场里的一两条路线,通常已经足够做出第一步选择。

先问“适不适合”,不要只问“免不免费”
免费当然很好。
但免费接口也可能有请求次数、历史范围、更新时间和使用许可方面的限制。一个接口技术上能够调用,也不代表我们可以把拿到的数据重新打包公开发布。
选择第一条路线时,先让 AI 和你一起检查这些问题:
- 市场对不对:它是否覆盖你要研究的市场、个股和指数;
- 时间够不够:历史范围是否能覆盖你的研究区间;
- 字段够不够:是否包含当前真正需要的数据,不为“字段很多”买单;
- 口径说不说得清楚:价格是否复权,市值和估值指标怎样定义;
- 能否重复获取:接口、SDK 或下载方式是否适合程序再次运行;
- 门槛能不能接受:注册、额度、费用和网络条件是否适合你;
- 是否允许这样使用:个人研究、公开展示和再分发可能有不同边界。
没有一个平台会在所有方面永远最好。
AKShare 或 yfinance 可能让第一次实验更快开始;Tushare 或 Massive 这类注册 API 则能让我们练习账户、密钥和正式接口的连接方式。具体选择应以你当前查到的事实为准。
注册和密钥这一步,必须由你亲手完成
如果选择的平台需要账户,你需要亲自完成注册、阅读条款,并决定是否接受付费方案。
AI 可以帮你找到官方入口、解释页面上的要求,却不能替你接受协议、购买服务,也不应该索要你的密码或 API Key。
API Key 可以把它想成程序进入数据服务时使用的一把钥匙。
拿到钥匙以后,不要把它直接写进课程代码,也不要贴进公开对话、截图或 Git 仓库。比较稳妥的做法是:让 AI 在项目里准备本地配置方式和不包含真实值的示例文件,再由你亲手把 Key 填进只留在本机的安全位置。
可以分两次和 AI 交流。
第一次,先让它只负责带路:
交给 AI 研究助手
我决定尝试 [平台名称]。
请根据当前官方教程,告诉我需要亲手完成哪些注册、权限申请或 API Key 创建步骤。只使用官方入口,并说明哪些选择可能涉及费用或数据许可。
现在不要替我填写表单,也不要创建代码。等我完成以后,我会回来继续。不要要求我把密码或 API Key 发到对话里。
注册完成以后,再让它准备连接:
交给 AI 研究助手
我已经完成 [平台名称] 的注册,并在自己手里拿到了 API Key。
请先检查当前项目已有文件和 .gitignore,不要覆盖或删除无关内容。根据当前官方文档,为这个项目设计最小、安全的本地配置方式:
- 真实 Key 不写进源代码、公开说明或版本管理;
- 你只需要告诉我应该把 Key 亲手填在哪里,以及程序将读取哪个变量名称;
- 提供不包含真实 Key 的示例配置;
- 在执行任何请求以前,先用大白话说明将创建或修改什么。
准备好以后先停下来,让我亲手填写。不要读取、打印或复述 Key 的实际值。
不同 AI 工具可能采用不同的安全配置方式。我们不要求所有人的文件名完全一样。
真正需要守住的是:密钥只留在合适的本地位置,程序通过变量名称引用它,公开内容里看不到真实值。
如果你实在不会编辑配置文件,也可以把 API Key 交给 AI,让它代为写入。
但这不是安全做法,也不是我们推荐的路线。真实 Key 可能出现在对话记录、操作日志或其他你没有留意到的位置。尤其不要把它发给公开聊天工具,也不要贴进课程讨论区。
正确做法是先请 AI 教你怎样亲手完成:
“我不会编辑这个配置文件。请告诉我可以用什么软件打开它、应该修改哪个位置、格式是什么,并给我一个使用假 Key 的示例。不要读取或代填真实 Key,等我手动完成后再继续。”
这一步看起来比“直接丢给 AI”多花了一分钟,却能让钥匙始终留在你自己手里。
第一次接通,只拿一小口数据
钥匙准备好以后,不要马上下载几百只股票和很多年的数据。
第一次请求只需要回答一个问题:当前项目能不能通过这条路线,拿到一小段结构清楚的日线数据?
你可以选择一只仅用于练习的股票,再给 AI 一个很小的日期范围:
交给 AI 研究助手
现在请根据 [平台名称] 的当前官方文档,完成一次最小连接测试。
只获取一只练习股票的一小段日线数据,不要下载全市场,也不要开始分析涨跌规律。请求至少需要包含日期、开盘价、最高价、最低价、收盘价和成交量;如果平台同时返回其他字段,先保留原始结果并解释字段含义。
请使用当前项目的环境和安全配置,不要打印 API Key。实际运行请求,并告诉我:
- 请求是否成功;
- 返回了多少行;
- 日期范围是什么;
- 包含哪些字段;
- 数据来自哪个具体接口;
- 当前价格采用什么复权口径。
如果失败,请保留真实错误,先判断属于本地代码、网络、认证、权限、额度、参数还是服务端问题。一次只处理一个主要方向,不要通过绕过认证、额度或平台限制来获取数据。
有的平台不需要 API Key,这时 AI 可以跳过密钥配置。
有的平台需要安装 Python 包,这时让它继续使用上一章准备好的项目环境,不要把依赖随手装进整台电脑共用的 Python。
第一次成功的目标也很克制:真实请求有回应,返回的数据能够被程序读出来,字段和时间范围说得清楚。
它还不能证明数据已经适合回测。
数据跑通以后,先问一句:这个价格动过手脚吗?
假设某只股票昨天收盘是 100 元,今天因为拆股等公司行动,持有者手里的股票数量和每股价格同时发生变化。
如果我们只把前后两个价格直接连起来,图上可能出现一次很大的跳动。但这个跳动不一定代表公司突然变差,也可能只是股票计价方式发生了变化。
为了让不同日期的价格更容易比较,数据平台可能会按照拆股、分红、送股或其他公司行动,对历史价格进行调整。这个过程叫作复权。
用大白话说:
- 未复权价格更接近当时屏幕上实际出现过的报价;
- 复权价格会按某种规则调整历史序列,让公司行动前后的价格更容易放在一起比较;
- A 股资料中还经常出现前复权、后复权和复权因子;
- 不同市场和平台的调整对象、默认值与计算方式可能不同。
这里最危险的不是暂时分不清每一种公式,而是看到一列 close 就默认它一定是自己想要的口径。
让 AI 继续调查当前真实数据:
和 AI 研究助手一起检查
请结合刚才实际使用的接口和当前官方文档,检查这份日线数据的价格口径。
告诉我它默认是未复权、前复权、后复权,还是平台定义的其他调整方式;具体考虑了拆股、分红或哪些公司行动。请引用官方说明,不要只根据列名猜测。
如果接口允许选择不同口径,请说明当前请求实际使用的是哪一种。把结论写进一份简短的数据说明里,但暂时不要改变数据,也不要开始回测。
AI 如果回答“已经自动复权”,还不算检查完成。
它需要说清楚是谁做的、按什么口径做的,以及依据来自哪里。如果官方文档本身没有说明清楚,就把它记录成一个还没有解决的问题。

外部路线可以保留,课程数据也要准备好
注册、网络、额度和平台变化,都可能让某些人暂时无法完成真实数据连接。
这不应该把整套课程堵死。
即使你的外部数据已经接通,也建议完成下面这一步。下一课会统一使用 Hoppy 教学数据画第一张 K 线,避免不同平台的字段、复权方法和返回格式把共同教学变成接口排错大会。你自己的外部数据路线可以继续保留,后面再慢慢完善。
我们准备了一份可以直接下载的 Hoppy 教学数据。数据中的公司代码和公司名称均为虚拟编造,与现实中的公司没有对应关系。整个数据包只用于编程、数据分析和量化研究学习,不构成任何投资建议,也不能作为投资或交易依据。
为了方便后续画 K 线和完成课程实验,stock_daily.parquet 中的开盘价、最高价、最低价、收盘价和前收盘价已经采用前复权口径,对应字段名称都以 adjusted_ 开头。
如果你使用自己的数据源,不要默认拿到的价格已经复权。先把平台文档、实际字段和一小段样本交给 AI,和它确认当前是未复权、前复权还是其他口径;如果需要转换,再让 AI 根据数据源提供的复权因子或官方方法完成处理,并把采用的口径记录下来。不要把未复权和前复权价格混在同一次实验里。
下载完成后,把 ZIP 压缩包放进你的 hoppy-lab 根目录,再在这里解压。解压完成后,实验室里应该出现一个名为 hoppy-teaching-dataset 的文件夹:
hoppy-lab/
├── hoppy-teaching-dataset.zip
└── hoppy-teaching-dataset/
├── README.md
├── manifest.json
├── data_dictionary.json
├── companies.parquet
├── stock_daily.parquet
├── hs300_daily.parquet
└── py_l1_daily.parquet
这个数据包覆盖 2021 年 1 月 4 日至 2023 年 12 月 29 日,共 727 个教学交易日。里面有 300 家虚拟公司,分在 11 个教学行业中,每个行业包含 12 至 41 家公司。
| 数据表 | 行数 | 主要粒度 |
|---|---|---|
companies | 300 | 每家虚拟公司一行 |
stock_daily | 216,913 | 公司 × 交易日 |
hs300_daily | 727 | 大盘 × 交易日 |
py_l1_daily | 7,997 | 11 个行业 × 727 个交易日 |
这些表采用 Parquet 格式。普通文本编辑器不能直接打开它,但这正适合我们练习:把一个陌生数据包交给 AI,让它先读说明、检查环境,再告诉我们里面究竟有什么。
回到刚刚打开的新对话,可以这样说:
交给 AI 研究助手
我已经把 hoppy-teaching-dataset 解压到当前项目根目录。
请先阅读其中的 README.md、manifest.json 和 data_dictionary.json,再检查当前项目是否已经具备读取 Parquet 文件的 Python 依赖。如果缺少,请通过 uv 在当前项目环境里安装完成这次检查所需的最小依赖,不要装进整台电脑共用的 Python。
然后实际读取四张 Parquet 数据表,用大白话向我汇报:每张表的作用、行数、主要字段和日期范围,以及数据包含多少家公司和行业。请同时确认 stock_daily.parquet 中哪些字段是前复权价格,并把实际结果与说明文件对照;如果不一致,直接指出。现在不要分析涨跌规律,也不要开始回测。
AI 选择 Polars、PyArrow 或其他合适的读取方式都可以。我们不要求它生成和课程完全相同的代码,只要求它实际打开数据并根据真实结果汇报。

如果外部数据暂时没有接通,但课程数据已经顺利读取,请把当前状态记成:
外部数据连接:尚未解决
课程样本读取:已经成功
当前可以继续学习:是
这样我们既不会把卡住说成失败,也不会假装外部问题已经消失。
如果外部路线也已经接通,就分别记录两条路线的状态。下一课仍然先使用课程数据,外部路线成功不会白费,它已经帮助你学会怎样调查平台、配置接口和确认复权口径。
最后,让 AI 把这条数据路线说清楚
无论外部路线是否已经接通,都可以让 AI 对当前项目里的两条路线做一次简短验收:
和 AI 研究助手一起验收
请根据当前项目、实际请求结果和我们查过的官方资料,用大白话总结:
- 如果我尝试过外部数据路线,它当前是什么状态,为什么它可能适合我的市场和日频学习目标;
- 它能够提供哪些数据,当前明确缺少或受限的是什么;
- 是否需要 API Key,以及项目怎样避免泄露真实值;
- 最小请求是否真的成功,实际返回了什么;
- 当前价格采用什么复权口径,依据是什么;
- 共同使用的课程教学数据是否已经成功解压和读取,它能与不能用来做什么;
- 下一步为了从课程数据中选择、检查并绘制一只虚拟股票,还需要完成什么。
不要给我打分,也不要因为程序运行成功就声称数据已经正确或研究已经完成。遇到仍不确定的地方,请列成待确认问题。
到这里,我们应该已经能够分清三件事:
网页上能看到价格
≠ 程序能够稳定获取数据
≠ 数据已经适合量化研究
我们既找到了外部原料的入口,也把下一课共同使用的教学数据放进了实验室。
下一步,我们会从教学数据里选出一家虚拟公司,检查它有没有明显问题,再把它画成第一张 K 线图。
课后讨论
留下你的问题、理解或不同意见,也看看其他学习者怎么想。