一、案例背景与采集目标
上一个案例我们采的是「此刻」的行情——一张快照,看完就旧了。真正有价值的,是历史:把一只股票过去一年的每个交易日都取回来,才能看趋势、算指标、做回看。
示范站点选东方财富网的历史行情页,以 600519 为例,地址 https://quote.eastmoney.com/sh600519.html。这只股票的页面里带有「历史行情」入口,能按日期区间取到每一交易日的开盘、最高、最低、收盘、成交量、成交额等日线数据。本案例要做的事是:批量取历史日线,落成 CSV 和 SQLite 两张表,并学会增量更新——只补没有的交易日,不重复下载已有的。
1.1 这个案例要拿到什么
- 某只股票一段时间的历史日线:日期、开盘、最高、最低、收盘、成交量、成交额;
- 两张落地文件:一份 CSV(便于人工查看),一份 SQLite(便于程序查询);
- 学会增量更新:每天只把新增的交易日追加进去;
- 算两个简单指标:日涨跌幅和 5 日均线,并看懂公式。
1.2 为什么要「入库」
| 做法 | 适合场景 | 短板 |
|---|---|---|
| 只存 CSV | 小数据、人工查看 | 数据量大时打开慢,查起来不方便 |
| CSV + SQLite 双份 | 既要人工看、又要程序查 | 需要维护两份,但收益最大 |
| 只存 SQLite | 纯程序查询 | 不打开数据库就看不了 |
| 每次全量重下 | 偶尔采一次 | 浪费、易错、无法增量 |
目标站点与交付产物
下表是本篇用到的真实站点。绿色是课堂可稳定复现的示范站点;橙色是延伸站点,多数有登录墙或风控,课堂上只讲结构、原理与合规边界,不教绕过。
| 项目 | 内容 |
|---|---|
| 示范站点 | 东方财富 · 个股行情(贵州茅台) https://quote.eastmoney.com/sh600519.html 个股页带 K 线与历史行情入口,可按日期区间取日线;配合案例 13 的实时行情做「存量入库 + 增量更新」 |
| 延伸站点 |
|
| 交付产物 |
|
| 难度 | ★★☆ 中 |
| 合规提示 | 同案例 13。另需注意:历史行情接口常有频次限制,批量取多只股票时要加延时。 |
二、数据源与字段设计
数据源:东方财富网历史行情页,示范股票 sh600519,地址 https://quote.eastmoney.com/sh600519.html。页面里的历史行情模块按日期区间返回日线数据,是「按代码 + 日期区间取数」的典型形态。
2.1 站点信息
| 项目 | 内容 |
|---|---|
| 站点全称 | 东方财富网 · 个股行情与历史行情(quote.eastmoney.com) |
| 示范网址 | https://quote.eastmoney.com/sh600519.html |
| 页面形态 | 个股页顶部为实时行情,下方 K 线 / 历史行情区可按日期区间取日线数据,字段规整 |
| 代码前缀 | 沪市用 sh、深市用 sz,如 sh600519、sz000001 |
| 规模说明 | 单只股票上市以来通常数千个交易日;每股每日约 10 余个字段 |
| 访问约束 | 公开数据,无需登录;批量取多只股票时要加延时,避免频率过高 |
2.2 延伸站点(可作对照)
| 站点 | 网址 | 教学用途 |
|---|---|---|
| 新浪财经 · 个股页(贵州茅台) | https://finance.sina.com.cn/realstock/company/sh600519/nc.shtml | 老牌公开行情页,可按代码查看历史数据,便于对照 |
| AKShare 开源数据接口 | https://akshare.akfamily.xyz/ | 开源数据接口,课堂只讲数据口径与合规边界 |
2.3 完整字段表(15 个字段)
示例值取自 600519(贵州茅台)2026-10-09 的真实日线;均线5 按最近 5 个交易日(2026-09-28 至 10-09)收盘计算。
| 字段名 | 字段含义 | 示例值 | 口径与备注 |
|---|---|---|---|
日期 | 交易日 | 2026-10-09 | 主键之一,统一成 YYYY-MM-DD |
代码 | 股票代码 | 600519 | 主键之一,六位数字 |
名称 | 股票简称 | 贵州茅台 | 以官方披露为准 |
开盘 | 当日开盘价 | 1255.42 | 单位:元 |
最高 | 当日最高价 | 1282.00 | 单位:元 |
最低 | 当日最低价 | 1255.42 | 单位:元 |
收盘 | 当日收盘价 | 1263.00 | 单位:元,最常用 |
前收 | 前一交易日收盘价 | 1255.79 | 单位:元,算涨跌幅的基准 |
涨跌幅 | 相对前收的百分比 | 0.57 | 计算列:正涨负跌,单位 % |
涨跌额 | 相对前收的绝对变化 | 7.21 | 计算列:单位元,可与涨跌幅互校 |
成交量 | 当日成交手数 | 35111 | 单位:手,1 手 = 100 股 |
成交额 | 当日成交金额 | 4453220000 | 单位:元 |
振幅 | 当日振幅 | 2.12 | 计算列:(最高−最低) ÷ 前收 × 100% |
换手率 | 换手率 | 0.28 | 单位 %;成交量 ÷ 流通股本 |
均线5 | 最近 5 日收盘均价 | 1251.37 | 计算列:前 4 天凑不满 5 天,留空 |
2.4 数据表结构怎么设计
落地成 SQLite 时,表结构要提前定好。主键决定了一行数据的唯一性,日期要用统一格式而不是随便存文本。
| 表设计要素 | 取值 | 说明 |
|---|---|---|
| 表名 | daily_quote | 日线行情表 |
| 主键 | (代码,日期) | 两只股票同一天不会冲突 |
| 日期格式 | TEXT,格式 YYYY-MM-DD | 统一格式才能排序与比较 |
| 数值类型 | REAL(价格)/ INTEGER(成交量) | 价格用小数,成交量用整数 |
| 唯一约束 | 代码 + 日期 唯一 | 防止重复插入同一天 |
2.5 两个指标的公式
① 日涨跌幅 = (今日收盘 - 昨日收盘) ÷ 昨日收盘 × 100%
注意:第一行没有「昨日」,涨跌幅留空。
② 5 日均线 = 最近 5 个交易日收盘价的算术平均
示例(2026-09-28 至 10-09 真实收盘):
收盘价依次 1243.88、1235.58、1258.62、1255.79、1263.00
均线5 = (1243.88 + 1235.58 + 1258.62 + 1255.79 + 1263.00) ÷ 5 ≈ 1251.37
前 4 天凑不满 5 天,均线留空。
AI 助手小贴士|让 AI 把指标公式用大白话讲一遍,再对照结果首尾几行看:涨跌幅第一行是不是空的、均线前四行是不是空的。
打开 WorkBuddy 或任意 AI 对话工具,试试这样问:请用最通俗的话解释什么是 5 日均线,并说明数据开头几天为什么算不出来。
课程思政|工匠精神与严谨求实 · 主键定得好,重复无处跑
历史数据最怕重复。把「代码 + 日期」设成主键或唯一约束,就能从结构上杜绝同一天被插两次。设计数据结构时多花五分钟定好主键和类型,能省下日后几小时的数据清理——这就是严谨的价值。
三、零代码操作步骤
工具与技能|先看清三个角色,再动手
本篇全程零代码:你把要求说清楚,AI 去执行,你负责验收。三个角色分工如下——浏览器技能指的是腾讯开源的 BrowserSkill,它能让 AI 直接操作你电脑上真实的浏览器(可复用已经登录的状态),自己开一个独立窗口干活,不打扰你正在看的网页;遇到验证码、登录或确认弹窗,它会停下来交给你本人处理。
| 角色 | 负责什么 | 在本案例里具体做什么 |
|---|---|---|
| 你 | 确认字段清单、验收结果、清洗与合规把关 | 盯字段清单、核对结果、处理异常(如验证码) |
| WorkBuddy | 接中文指令:探字段 → 批量采 → 清洗 → 导出交付物 | 拆解本篇的采集任务并跑完全量、产出交付物 |
| 浏览器技能 BrowserSkill | 以真实浏览器打开页面:跑脚本渲染、滚动 / 翻页 / 点开详情、截图留证;可复用本机浏览器已登录状态,遇到验证码或登录弹窗会停下来交给你处理 | 打开历史行情页,确认日期区间怎么选、表格怎么翻 |
五步操作主线(全课程统一,每一篇都按这个顺序推进):
- 定目标与字段:先看本篇第二节的字段表,把「要哪几列、每列什么口径、要多少条」说清楚——字段清单就是验收标准,说不清就会拿回一张字段乱七八糟的表。
- 现场踩点(浏览器技能 BrowserSkill):打开
https://quote.eastmoney.com/sh600519.html,确认历史行情的入口在哪、日期是什么格式。 - 小样试采(WorkBuddy):先取
2026 年 8 月一个月的数据,确认字段与日期格式。 - 核对与清洗:① 涨跌幅第一行、均线前四行为空是不是合理的边界;② CSV 与 SQLite 的行数一致吗;③ 连跑两次增量更新,第二次应该是「0 条新增」。
- 导出与归档:导出交付物(数据明细表 / 可筛选明细页 / 数据看板 / 可复用的技能包),文件名带上采集日期,并写清数据来源、采集时间与已知局限。
用浏览器技能 BrowserSkill 打开 https://quote.eastmoney.com/sh600519.html(东方财富 · 个股行情(贵州茅台)),把这一页每条记录能采到的字段名和示例值列出来,先不要采集。- 新建对话,粘贴提示词(见下一节),把历史行情页地址和股票代码填好。
- 先取一段试试。说「先取 2026 年 8 月一个月的数据」,确认字段与日期格式。
- 检查指标。看涨跌幅第一行、均线前四行是不是空的——空得对说明边界处理正确。
- 落成两张表。说「请把结果同时导出成 CSV 和 SQLite,表名 daily_quote」。
- 试一次增量更新。说「请只补充数据库里没有的交易日,已存在的不动」。
- 验证增量。再跑一次,如果条数没变,说明增量逻辑正确。
- 导出归档。说「CSV 名叫
daily_600519.csv,SQLite 名叫market.db」。
四、提示词模板与追问技巧
请帮我完成一个股票历史行情采集与入库任务。
【数据来源】东方财富网历史行情页:
https://quote.eastmoney.com/sh600519.html
【股票代码】600519(沪市,前缀 sh)
【时间范围】2025-10-09 至 2026-10-09
【需要字段】按这个顺序:
1. 日期(YYYY-MM-DD)
2. 代码
3. 名称
4. 开盘(元)
5. 最高(元)
6. 最低(元)
7. 收盘(元)
8. 前收(元)
9. 涨跌幅(%,正涨负跌)
10. 涨跌额(元)
11. 成交量(手)
12. 成交额(元)
13. 振幅(%)
14. 换手率(%)
15. 均线5(元)
【处理要求】
1. 计算「涨跌幅」= (今收 - 昨收) ÷ 昨收 × 100%,第一行没有昨收,留空
2. 计算「均线5」= 最近 5 个交易日收盘价的平均,前 4 天凑不满 5 天,留空
3. 落成两份:
- CSV:daily_600519.csv
- SQLite:market.db,表名 daily_quote
主键为(代码,日期),日期用 TEXT 格式 YYYY-MM-DD
4. 先取 2026-08-01 至 2026-08-31 给我验证,再取全年
【增量更新要求】
以后我说「更新」,你只补充数据库里没有的交易日,
已存在的日期一律不动,并告诉我新增了多少条。
4.1 三条追问指令
追问一(讲清公式):
请用大白话解释均线5 是怎么算出来的,
并指出数据开头几行为什么是空的。
追问二(增量验证):
请再执行一次「更新」,如果数据库没有新交易日,
应该报告「新增 0 条」,不要重复插入。
追问三(改主键):
请确认 daily_quote 表的(代码,日期)是唯一的,
如果存在重复行,请只保留一条并告诉我删了几行。
AI 助手小贴士|做增量更新时,最怕「按行数判断」。让 AI 用日期集合做比对,才能准确知道缺哪几天。
打开 WorkBuddy 或任意 AI 对话工具,试试这样问:请列出接口返回的全部交易日集合,和数据库里已有的日期集合做差集,告诉我缺少哪几天。
五、结果核对、清洗与保存
结果样例(节选,600519 真实日线,2026 年 9 月末至 10 月初;均线前 4 行为空是正常边界):
| 日期 | 代码 | 开盘 | 最高 | 最低 | 收盘 | 成交量 | 涨跌幅 | 均线5 |
|---|---|---|---|---|---|---|---|---|
| 2026-09-24 | 600519 | 1250.01 | 1256.13 | 1231.05 | 1237.00 | 31239 | -1.14 | |
| 2026-09-28 | 600519 | 1236.00 | 1244.01 | 1228.10 | 1243.88 | 28218 | 0.56 | |
| 2026-09-29 | 600519 | 1244.60 | 1245.87 | 1230.88 | 1235.58 | 26366 | -0.67 | |
| 2026-09-30 | 600519 | 1239.53 | 1268.00 | 1236.05 | 1258.62 | 38331 | 1.86 | |
| 2026-10-08 | 600519 | 1252.90 | 1258.00 | 1242.00 | 1255.79 | 25168 | -0.22 | 1246.17 |
| 2026-10-09 | 600519 | 1255.42 | 1282.00 | 1255.42 | 1263.00 | 35111 | 0.57 | 1251.37 |
5.1 四项核对
| 核对项 | 正常表现 | 发现问题怎么问 |
|---|---|---|
| 日期连续性 | 按交易日递增,无重复 | 「请找出重复日期并列出来」 |
| 涨跌幅 | 全年第一行为空;样例各行与前收对得上 | 「第 3 行涨跌幅与收盘价对不上,请复核」 |
| 均线 | 前 4 行空,第 5 行起有值 | 「均线5 请按最近 5 日收盘平均重算」 |
| 入库 | 数据库行数与 CSV 一致 | 「SQLite 和 CSV 的条数对不上,请核对」 |
5.2 保存与增量
daily_600519.csv ← 全量历史(人工查看用)
market.db ← SQLite 数据库(程序查询用)
表 daily_quote 主键(代码,日期)
daily_600519_log.txt ← 日志:本次新增条数、日期范围、异常
AI 助手小贴士|定期抽查数据库里有没有重复日期或缺口,比等到做分析时才发现问题要主动得多。
打开 WorkBuddy 或任意 AI 对话工具,试试这样问:请检查 daily_quote 表:有没有重复的(代码,日期),有没有缺失的交易日,各列出来。
课程思政|科技自立自强 · 自己攒一个数据库
会取数据的人很多,会攒数据的人不多。把历史行情一点点存进自己的数据库,日积月累就形成了别人没有的资料库。数据能力不是会背多少公式,而是能不能持续、规范地积累和管理自己的数据资产。
六、常见问题与合规红线
| 现象 | 原因 | 怎么处理 |
|---|---|---|
| 同一天出现了两行 | 增量更新没做去重 | 以(代码,日期)为唯一键去重,只留一条 |
| 日期是乱序的 | 未按日期排序 | 要求按日期升序排列后再落库 |
| 均线算出来是空的 | 开头行数不足 5 天,属正常 | 确认只有前 4 行为空即可 |
| SQLite 打不开 | 用 Excel 直接打开了 .db 文件 | 用支持 SQLite 的工具,或改成导出 CSV 查看 |
| 增量更新后条数反而变少 | 误用了覆盖模式 | 明确「只追加、不覆盖」,并保留备份 |
| 多只股票批量取时接口报错 | 频率过高或参数有误 | 加延时、核对代码前缀(sh/sz),失败就记录并跳过 |
6.1 三条规范
- 口径写进文档。涨跌幅、均线、复权方式的公式与边界处理要写成一句话留在文件里。
- 增量更新必须幂等。同一天执行两次,结果应完全一致。
- 数据仅用于教学。不构成投资建议;对外分享必须注明来源与口径。
课程思政|数据安全与法治素养 · 数据库里的每一行都要讲得清
把数据落库,意味着它会被长期引用。日期格式、主键、口径说明,这些看似琐碎的规范,决定了数据是可用的资产还是一堆垃圾。规范不是束缚,是让数据在半年后还能被人信任、被人复现。
七、随堂自测(10 题)
点击选项即可判分,答错的题会立刻显示解析。
1本案例把历史行情落成哪两份文件?
- A. 只存一份 Excel
- B. CSV 与 SQLite 各一份
- C. PDF 与 Word
- D. 图片与文本
2日线行情表 daily_quote 的合适主键是?
- A. (代码,日期)
- B. 只按日期
- C. 只按收盘价
- D. 随便加一个自增序号即可
3数据库里的日期字段,更合适的做法是?
- A. 存成「9月30日」这样的中文
- B. 存成任意文本
- C. 存成统一格式 YYYY-MM-DD 的文本或日期类型
- D. 不存日期
4某股票连续 5 日收盘为 1243.88、1235.58、1258.62、1255.79、1263.00,5 日均线约为?
- A. 1263.00
- B. 1246.17
- C. 1235.58
- D. 1251.37
5增量更新做对的话,同一天连续执行两次,第二次应该?
- A. 新增 0 条
- B. 新增全部行
- C. 报错退出
- D. 随便插几行
6涨跌幅这一列,第一行通常应该是?
- A. 0
- B. 100
- C. 等于收盘价
- D. 留空
7要确认数据库里缺了哪些交易日,最靠谱的办法是?
- A. 看文件大小
- B. 问 AI「你确定采全了吗」
- C. 用接口返回的日期集合与库内日期集合做差集
- D. 数一数有多少行
8关于本案例的数据用途,正确的说法是?
- A. 可以直接作为买卖依据
- B. 仅用于教学分析,不构成投资建议
- C. 可以随意对外传播
- D. 属于内部数据,需授权
9指标(涨跌幅、均线)应该由谁算?
- A. 让 AI 现算并解释公式,学生核对边界
- B. 必须学生手写全部公式
- C. 随便估一个
- D. 不用算
10把每天的增量更新记进日志,主要目的是?
- A. 让文件更多
- B. 凑字数
- C. 没有实际作用
- D. 留痕可追溯,日后能查数据是怎么来的