Sequoia-X 项目研究站 · 排障续传

Sequoia-X 报错排查:先分清是配置、数据还是推送

大部分「跑不起来」其实只有这几种:配置文件里少了必填项导致程序根本不启动、本地还没有数据就跑了日常模式、今天不是交易日所以没有新数据、以及推送环节被飞书拒绝。它们的日志长得完全不同,按下面的对照表定位,比重装环境快得多。回填中断也不用从头再来——已入库的会被跳过。

四类失败:配置 / 数据 / 交易日 / 推送回填支持中断续跑依据源码容错分支与日志文案(2026-09 核验)
配置缺失补齐 .env 必填项
无本地数据先跑 --backfill
非交易日无新数据属正常
推送失败查 code != 0 与日志
失败恢复路径示意(依据源码日志文案与容错逻辑整理,非官方流程图)。
依据来源官方 README · pyproject · .env.example
本页引用main.py · sequoia_x/data/engine.py · core/logger.py
核验方式静态源码核验(只读;本项目未在本机安装或运行)
核验基准commit 444c0db(2026-05-09)· Python ≥3.10 · 2026-09-23 核验
Lookup

Sequoia-X 报错现象速查表

先按现象找到对应分支,再去看该分支的处理步骤。

现象日志/报错文案原因处理
程序一起步就退出配置校验异常(pydantic ValidationError),主流程打印 traceback 后 sys.exit(1)缺少必填的 FEISHU_WEBHOOK_URL在项目根目录建 .env 并填默认 Webhook
日常模式什么都没做本地无股票数据,请先执行 --backfill库里没有股票记录,属于首次运行先跑 python main.py --backfill,再跑日常模式
周末或节假日跑出「没数据」无新数据(可能非交易日)当天没有新的交易日数据属预期行为,无需处理;crontab 也照跑不误
提示所有股票已最新所有股票已是最新,无需更新库里最新日期已经是今天重复执行时的正常输出
有推送日志但群里没消息飞书推送失败 [key] HTTP状态=... 飞书响应=...响应体 code != 0,或地址/权限有问题按响应体定位;核对机器人是否还在群内
推送请求直接异常飞书推送请求异常 [key]:...网络不可达、DNS 或代理问题换网络环境;超时为 10 秒,网络差时可能超时
回填卡住或很慢每 500 只打印一次进度,单只失败会打印重试等待长连接超时或上游限速让它继续跑,中断后重跑会跳过已入库股票
定增策略没有结果获取定增数据失败 或 近期无新定增公告外部接口不可用,或最近 7 天确实没有定向增发公告两条日志含义不同:前者是故障,后者是正常空结果
Resume

Sequoia-X 回填的断点续传与重试

回填之所以能中断后续跑,靠的是「已入库就跳过」这个判断。

机制实现适用场景注意点
跳过已入库回填前查 MAX(date),若已是今天则计入「跳过」中断后重跑、或重复执行回填已经完整的股票不会重复拉取,重跑成本远低于首次
单只重试最多 3 次,等待 2s / 4s / 8s,每次重试前重连偶发查询失败3 次都失败才计入「失败」并继续下一只
定期重连每处理 200 只强制 logout 后重新 login长时间连续拉取重连失败会终止回填并记错误日志
UNIQUE 约束兜底写入冲突时捕获 IntegrityError 静默跳过同一股同日重复写入静默意味着不会因为重复而中断,但也不会提示你重复了
进度可观测每 500 只打印「已处理 x/N,成功 a 跳过 b 失败 c」判断是否还在推进长时间看不到新进度才算真卡住
结束汇总输出「回填完成 — 成功 / 跳过 / 失败」三计数评估是否需要再跑一轮失败计数不为零时,直接再跑一次即可补上
不要用删除数据库来「修复」:清库意味着下次要重新回填全市场历史,代价远高于重跑一次。除非你确认数据本身写坏了,否则优先用「重跑回填跳过已入库」的方式补齐。
Diagnose

按日志定位失败环节

四条命令式的自助检查,不用改代码。

  1. 先看程序有没有真的启动

    日志首行应是启动记录,随后是「数据库初始化完成:<路径>」。缺少这两行说明失败发生在配置或导入阶段,重点看 traceback 的最后一行。

  2. 确认数据是不是到了今天

    查找同步相关的那一行:写入条数为 0 且带有「无新数据」字样时,是交易日判断问题;提示「本地无股票数据」时,是先跑回填的问题。

  3. 看每个策略的输出行

    七个策略各会打印「XXXStrategy 选出 N 只股票」。某个策略完全没打印,说明它在遍历前就返回了(例如 RPS 读库失败会记 error 后返回空列表)。

  4. 最后看推送行

    命中为空的策略不会出现推送记录;有推送记录时,成功与失败文案不同——成功记 info,失败记 error 并附带 HTTP 状态与响应体。

日志形态示意(来自源码的打印格式,非真实运行记录)[时间] sequoia_x.core.logger - Sequoia-X V2 启动 [时间] sequoia_x.data.engine - 数据库初始化完成:data/sequoia_v2.db [时间] sequoia_x.data.engine - 需要更新 5183 只股票,启动多进程并行拉取... [时间] sequoia_x.data.engine - sync_today_bulk: 写入 5183 条数据 [时间] sequoia_x.strategy.rps_breakout - RpsBreakoutStrategy 选出 21 只股票 [时间] sequoia_x.notify.feishu - 飞书推送成功 [rps],共 21 只股票
Health

Sequoia-X 数据体检:先确认库的状态

用 SQL 或任意 SQLite 工具查这几项,比反复重跑更快。

检查项怎么看正常范围异常时的含义
股票数量SELECT COUNT(DISTINCT symbol) FROM stock_daily与「获取股票列表完成,共 N 只」的 N 接近远小于 N 说明回填只完成了一部分
最新日期SELECT MAX(date) FROM stock_daily最近一个交易日落后多个交易日说明日常模式没在跑
总行数SELECT COUNT(*) FROM stock_daily约等于股票数 × 交易日数明显偏小说明历史区间短
重复行按 (symbol, date) 分组查计数大于 1应为零(由 UNIQUE 约束保证)出现重复说明表被外部工具改过
零成交量行查 volume <= 0 是否还存在正常为 0 行(写入时已过滤)有残留说明数据来源不是本项目脚本
窗口可用性按股票数历史长度是否 ≥60多数标的应满足不足 60 根的标的会被两个策略跳过
Decision

Sequoia-X 何时重跑回填、何时只跑日常

选错方式会白等或补不上数据。

情形该跑什么适用场景注意点
初次使用回填(--backfill),完成后再跑日常库为空README 自述约 12 分钟,实际随网络与区间变化
回填被中断再跑一次回填断电、断网、手工终止已入库的会被跳过,重跑成本集中在未完成部分
漏跑了一两天日常跑日常模式即可缺口在最近几天日常模式按每只股票的最新日期往后补,能覆盖短期缺口
想加深历史改 START_DATE 后重跑回填需要更长窗口的策略已有数据的股票默认仍从断点续拉,不会自动向前补历史
只是想重发一次推送修好 Webhook 后重跑日常当天数据已入库当天记录会被整体重写,不产生重复行
怀疑数据写坏先备份库文件,再评估是否重建外部工具改动过库删库是最贵的一步,务必先确认并留备份
已知边界:项目没有 Web 界面、没有进程守护、推送失败后不会自动重试,也没有任何自动修复机制。定时任务失败时不会有额外通知——这也是建议把输出重定向到日志文件、并养成定期查看习惯的原因。
No switches

Sequoia-X 没给的三个开关,以及怎么绕过去

跑久了总会遇到这些需求:只补几只票、只跑策略不补数、单独重跑某个策略。Sequoia-X 的 main.py 里 argparse 只定义了一个参数 --backfill,所以下面这些只能自己动手。

想做的事源码现状可行做法(教程扩展,非官方功能)代价与风险
只跑策略、不补数据Sequoia-X 日常模式一定会先执行 sync_today_bulk(),没有跳过开关临时注释掉那一行,或直接写个小脚本:DataEngine(settings) → 实例化策略 → run() → 打印结果改动源码后要注意环境安装方式(pip install . 需重装,可编辑安装才即时生效)
只补某几只股票Sequoia-X 的增量按整库分组执行,没有单票参数用 Sequoia-X 的 engine.backfill(["600519"]) 直接调用回填接口,传入你关心的代码列表回填里已有「已入库则跳过」判断,重复调用是安全的
单独重跑某个策略Sequoia-X 的策略列表在 main.py 里按顺序执行,无法从命令行指定写一份三行脚本单独实例化那个策略类并调用 run()不会自动推送——推送逻辑在主流程里,需要自己补 FeishuNotifier(settings).send(...)
补某一天的缺口增量只补「最新一根 K 线之后」的日期先 DELETE FROM stock_daily WHERE date = 'YYYY-MM-DD'; 再跑日常模式危险操作:删库前先备份文件;删除的是当天的全市场记录,不是单只股票
换一个干净的库重来库路径来自配置 DB_PATH把 DB_PATH 指向新文件,再跑一次 --backfill旧库别删,保留下来做对照
# 示例:单独跑一次海龟突破并打印结果(放在项目根目录执行)
from dotenv import load_dotenv; load_dotenv()
from sequoia_x.core.config import get_settings
from sequoia_x.data.engine import DataEngine
from sequoia_x.strategy.turtle_trade import TurtleTradeStrategy

settings = get_settings()
engine = DataEngine(settings)
hits = TurtleTradeStrategy(engine=engine, settings=settings).run()
print(len(hits), hits)
边界:以上做法都是本站按源码结构给出的教程扩展(④级),不是官方提供的开关,也没有在本机跑过。改动前先备份 data/ 目录,任何因改动源码造成的数据差异由你自己承担;以官方源码为准。
FAQ

排查类常见问题

程序报错退出,退出码 1 是什么意思?

主流程捕获到未处理异常后会打印 traceback 并以退出码 1 结束,这是源码里显式的处理方式。定时任务建议据此判断当天是否执行成功;具体异常原因看 traceback 的最后一行与上文的配置检查项。

非交易日到底算不算故障?

不算。没有新数据时会输出「无新数据(可能非交易日)」并正常返回,写入条数为 0。周末与法定节假日都属这一类,crontab 照常触发也没有问题。

回填跑到一半断了,数据会坏吗?

不会。逐只写入且靠 UNIQUE 约束去重,中断只影响「还没拉到的那些股票」;重跑时会跳过已完成的部分,从缺口继续。本站没有实测运行数据,以上描述依据源码的跳过与冲突处理逻辑。

为什么某个策略一直没结果?

三种常见原因:一是它的最小 K 线要求没被满足(如需要 60 根),二是阈值本身很严导致当天没有标的符合,三是它依赖外部接口而接口不可用(定增类)。对照日志里该策略那一行可以区分前两者。

推送失败会导致当天白跑吗?

不会。推送异常在源码里被捕获并只记错误日志,数据已经写入库中。修好配置后重跑当天,日常模式会重写当日数据并重新尝试推送。

有没有官方的问题清单?

仓库没有单独的 FAQ 或 troubleshooting 文档(文件树里没有 docs 目录)。本站的排查项来自源码里的容错分支与日志文案;遇到本篇未覆盖的问题,建议对照源码或到仓库 Issues 检索,具体以官方仓库为准。

能只跑策略、不补数据吗?

没有现成开关:main.py 的 argparse 只定义了 --backfill,日常模式必定先执行增量同步。可行做法是自己写一小段脚本,实例化 DataEngine 与目标策略后直接调用 run()(本页有示例)。注意这样做不会自动推送,需要自己调用 FeishuNotifier(settings).send(...)。属于教程扩展,改动前先备份数据目录,以官方源码为准。

跑通之后,看看两条路线怎么选

自建流水线与本机技能路线在数据、调度与前置成本上的差别,对比页逐项列了。