Sequoia-X 项目研究站 · 数据层

Sequoia-X 数据层:baostock 后复权存进本地 SQLite

整套选股系统的地基是一张本地表:stock_daily。数据来自 baostock 的日 K(按后复权口径拉取),日常模式用多进程把当日增量补进来,首次用回填模式把历史一次性灌满。数据库就是一个文件,路径由 DB_PATH 控制,默认落在项目的 data/sequoia_v2.db,可以直接拷贝到另一台机器继续用。

数据源:baostock 日 K(免费、无需注册)存储:本地 SQLite 单文件依据 data/engine.py(2026-09 核验)
baostock 日 K后复权 adjustflag=1,免费免注册
stock_daily 表UNIQUE(symbol, date) + 索引
策略读取get_ohlcv 逐只 或 直连 sqlite3
数据层分层示意(依据 data/engine.py 整理,非官方架构图)。
Why

Sequoia-X 为什么用 baostock + 后复权 + 本地库

这三个选择决定了它与其他取数方式的不同。

免费数据源,无需注册

README 说明数据层使用 baostock 拉取历史与增量日 K,并称其免费、无需注册、不限流。项目不需要你申请 API Key,也不产生数据费用;代价是数据频率只有日线,且依赖该服务的可用性。

后复权,适合增量存储

拉取时使用 adjustflag="1"(后复权)。README 的解释是后复权保持历史价格不变,因此增量写入不会因为后续除权导致既有数据错乱——这是「本地增量存库」这条路能成立的前提。

本地库,可拷贝可复盘

数据落在单个 SQLite 文件里,意味着同一天的形态判断在本地是确定的、可重复的,也能整库搬迁或备份。README 用「彻底规避东方财富反爬」来描述动机,这属于项目自述的表述,不是技术保证。

Schema

Sequoia-X 的 stock_daily 表结构与字段

建表语句在 data/engine.py 里,字段与 baostock 返回列一一对应。

字段类型与约束来源 / 含义注意点
idINTEGER PRIMARY KEY AUTOINCREMENTSQLite 自增主键仅用于行标识,策略不使用该列
symbolTEXT NOT NULL纯数字股票代码(如 600519000001入库前会从 baostock 的 sh.600000 形式里去掉市场前缀
dateTEXT NOT NULL交易日,文本格式日常模式按「最新日期 + 1 天」推算增量起点,格式必须是可解析的日期字符串
open / high / low / closeREAL后复权的开高低收后复权价与行情软件显示的真实成交价不同,不要直接与看盘软件比数字
volumeREAL成交量落库前过滤 volume <= 0,停牌与异常行不会进入策略计算
turnoverREAL成交额;回填路径由 baostock 的 amount 改名而来海龟策略的「成交额过亿」判断用的就是这一列
约束与索引UNIQUE(symbol, date) + 索引 idx_symbol_date(symbol, date)保证同股同日不重复,加速按股票查询两条写入路径都依赖它:日常先删后写、回填把冲突静默跳过
建表方式CREATE TABLE IF NOT EXISTS + CREATE INDEX IF NOT EXISTS每次启动引擎时执行首次运行会自动创建目录与库文件,不需要手工建表
Writes

Sequoia-X 的两条写入路径:先删后写 vs 只追加

同一个库被两种方式写入,容错策略完全不同。

对比项日常增量 sync_today_bulk历史回填 backfill适用场景
并发多进程(最多 8)单线程顺序拉取日常求快、回填求稳
起点每只股票「最新日期 + 1 天」到今天库内为空的用 START_DATE,已有的从断点续拉首次建库用回填,之后用日常
写入前动作对涉及的每个日期先 DELETE FROM stock_daily WHERE date = ?无删除,直接追加日常可安全重跑同一天
列名映射拉取时直接请求 amount 并命名为 turnover先取 amountrenameturnover两条路最终落到同一列
冲突处理先删后写,一般不触发约束冲突捕获 sqlite3.IntegrityError 后静默跳过回填重跑不会因重复行中断
失败重试子进程内单只失败即跳过(记录在返回结果里)单只重试 3 次(2s / 4s / 8s),每次重试前重连回填更适合应对长连接超时
进度可见性汇总后打印写入条数每 500 只打印成功 / 跳过 / 失败计数,结束再汇总回填耗时长,需要进度反馈
重连策略每个子进程各自 login / logout每处理 200 只强制 logout 后重新 login规避单连接长时间存活被断开
别混用:日常模式会按日期整体删除再写入,如果用它去补一段历史区间,只会把「今天」这一天重写一遍(其余日期根本没被拉取);补历史要用回填模式。选择依据见排障续传页的决策表。
Symbols

Sequoia-X 的股票清单与代码转换规则

清单来自 baostock 的基础信息接口;展示与链接时会再转一次格式。

环节规则适用场景注意点
取全市场清单bs.query_stock_basic(code_name="", code="")回填前确定标的范围接口一次性返回基础信息,需要自己按字段过滤
过滤条件仅保留 status == "1"(上市)且 stock_type == "1"(股票)排除退市与指数等非股票品种这也是「约 5200 只」这个口径的由来
入库代码"sh.600000".split(".")[1] 的纯数字部分库内统一为 6 位数字策略与推送都基于纯数字代码,不带市场前缀
取数时代码6 / 9 开头 → sh.,其余 → sz.把库内代码转回 baostock 格式北交所标的的代码段不在这条规则的显式分支里,实际以你能拉到的数据为准
推送链接代码6 开头 → SH,4 / 8 开头 → BJ,其余 → SZ生成雪球链接(xueqiu.com/S/<code>两套前缀规则不同,读源码时注意区分
股票名称推送前用 bs.query_stock_basic(code=...) 逐只查名称卡片上显示中文名查不到名称时回退用代码本身,不会中断推送
Storage

Sequoia-X 数据库文件的位置、备份与迁移

单文件存储带来的便利与要留意的地方。

项目说明适用场景注意点
默认路径data/sequoia_v2.db(相对项目根目录)本地开发与定时任务相对路径意味着必须在项目目录下执行,cron 里要显式 cd
改路径.envDB_PATH想放到数据盘或共享目录父目录会被自动创建,不需要手工建文件夹
起始日期START_DATE 默认 2024-01-01决定回填的历史深度它只影响「库里还没有的股票」的起点;要改历史深度需要清库重填
备份直接复制该文件(建议在程序未运行时进行)迁移到新机器或留档写入过程中复制可能拿到不一致的快照
体积未给出官方数字;随标的数与历史长度增长容量规划第三方页面给出的「2GB 磁盘」等数字非官方口径,本站不采用
并发写多进程只并行「拉取」,写库在父进程串行完成避免 SQLite 写锁竞争不要在任务运行时另开进程写同一文件
Boundary

Sequoia-X 数据边界:能给你什么、不能给什么

先确认口径,再决定要不要用它做研究。

维度实际情况适用场景注意点
频率只有日线(frequency="d"日频形态扫描没有分钟线与分时数据,日内策略不适用
复权方式后复权(回填与增量一致)跨除权日的区间比较价格数值不等于真实成交价,展示时不要与行情软件混用
基本面没有任何财务字段纯技术面研究估值、业绩类筛选需要另找数据源
品种覆盖按基础信息过滤后的 A 股股票个股形态扫描不含 ETF / 基金 / 指数成分(指数只用于对照)
停牌处理过滤 volume <= 0 的行避免停牌日污染形态窗口窗口按实际入库的交易日滚动,与自然日不等长
数据质量依赖上游数据源;项目未做完整性校验研究用途可接受本站不宣称数据「完全没有缺失」,重要决策前请自行交叉核对
声明:本站整理的是数据层的实现方式与字段口径,不对数据准确性、完整性或任何基于该数据的判断结果作保证。所有内容仅供研究参考,不构成投资建议。
FAQ

数据层常见问题

Sequoia-X 为什么用后复权而不是前复权?

源码里拉取参数是 adjustflag="1"(后复权)。README 给出的理由是后复权下历史价格不变,增量写入时旧的记录不需要重算,适合这套「每天只补增量」的存储方式。口径细节以官方 README 与 baostock 文档为准。

Sequoia-X 库里的价格为什么和行情软件对不上?

因为库里存的是后复权价,行情软件默认多显示不复权价。两者在除权除息后会分叉,这是设计使然而不是数据错误。要做展示或对比时,请注明复权口径。

能自己往 Sequoia-X 库里加数据吗?

表结构是公开的,理论上可以手工插入或另写脚本导入,但要注意两点:UNIQUE(symbol, date) 约束会拒绝重复行;以及策略假定 date 是可排序解析的日期字符串。自行写入导致的结果差异由你自己承担,本站不做保证。

Sequoia-X 两种模式写同一张表会打架吗?

写库动作都在单个进程里串行执行,并发只用在「拉取」阶段;日常模式按日期先删后写,回填模式靠 UNIQUE 约束把重复行静默跳过。因此不要在同一时间同时跑两个模式,正常使用下二者是互补的。

Sequoia-X 数据不够 40 或 60 根怎么办?

高窄旗形与上升趋势跌停这两个策略会直接跳过 K 线不足的标的。解决办法是把 START_DATE 往前提(例如更早的年份)并重跑回填;默认值是 2024-01-01,历史深度越深,能参与计算的标的越多,但回填耗时也越长。

Sequoia-X 数据库能直接搬到别的机器吗?

可以。它是单个 SQLite 文件,迁移后把 DB_PATH 指向新位置即可继续日常更新。注意目录相对路径的基准是「执行命令时所在的目录」,在定时任务里要显式切到项目目录。

数据就位后,看结果怎么推出去

每个策略有独立的 webhook 标识,可以推给不同的飞书群。