tick-stock-panel零运维的秘密:15:30盘后定时管道全流程解析
【免费下载链接】tick-stock-panelTSP自托管、零运维的 A 股「选股 + 监控 + 回测」量化工作台 | LLM能力驱使策略定制+个股分析+复盘 | 自由接入第三方数据源与个性化扩展数据 | 个人开源项目地址: https://gitcode.com/GitHub_Trending/ti/tick-stock-panel
tick-stock-panel 是一个自托管、零运维的 A 股「选股 + 监控 + 回测」量化工作台。它的零运维核心,是一条在收盘后自动执行的盘后定时管道:同步日K、补除权因子、重算指标、结算模拟盘、推送复盘报告——全程无需人工干预。本文带你完整拆解这条 A 股量化盘后管道是如何做到"开机即忘"的。
为什么默认设在 15:35,而不是 15:30?
A 股的盘后固定价格交易要到 15:30 才彻底终止,且供应商的日线数据还需要一点时间定稿。所以管道默认15:35触发,用 5 分钟缓冲保证拿到的是"官方收盘价",而非 15:30 前的盘中快照(源码注释里明确写着这个原因)。
调度器start_scheduler在 backend/app/jobs/daily_pipeline.py#L1271-L1397 里注册了整套工作日(mon-fri、Asia/Shanghai)定时任务:
| 时间 | 任务 | 说明 |
|---|---|---|
| 09:10 | 盘前维表同步 | 同步个股维表(含当日涨跌停价),刷新缓存 |
| 15:02 | 五档盘口定版 | 收盘快照 sealed 定版 |
| 15:35 | 盘后管道 | 本文主角,日K + 除权 + 指标 + 结算 |
| 15:40 | AI 定时复盘 | 可选,流式生成报告并归档、推送 |
时间均可在面板设置页调整,偏好读取逻辑见 backend/app/services/preferences.py#L490-L512。
管道全流程:从维表到视图刷新的 8 个阶段
整条管道的主函数是run_now(backend/app/jobs/daily_pipeline.py#L192-L800),每个阶段都会向前端汇报进度,你在数据页能看到实时进度条:
1. 同步个股维表
先更新 instruments 维表,确保涨跌停价、连板梯队等读到的是当日最新值,避免"前一日残留"。
2. 解析标的池
_resolve_universe优先拉取沪深京 A 股全市场(约 5500+ 只);无批量拉取能力时自动降级为"自选 + 维表"兜底,免费用户也能跑通管道。
3. 日K同步(最聪明的一步)
这里不是无脑全量拉取,而是按场景分四条路径:
- 今天已有数据→ 用一次实时行情请求覆写全市场(1 个请求搞定)
- 有历史缺口→ 从最新日期或"最早坏日"批量补齐
- 首次运行→ 拉取 1 年历史
- 数据修正→ 指定起始日强制批量回补
拉取前还有一道完整性自愈:data_integrity扫描会检查最近交易日是否存在盘中快照残留或分区缺口(比如服务器中午停机留下的半截数据),命中后自动把拉取起点提前到坏日,降级为范围拉取修复——这正是"零运维"的关键一环。
4. 除权因子增量同步
从已有数据最新日期的下一天开始增量获取,与日K范围对齐;实时增量分支则兜底拉最近 15 天,覆盖春节/国庆长假期间的新除权事件。merge + unique幂等设计让多拉无副作用。
5. enriched 指标计算(全量/增量四分支)
指标宽表的计算策略非常精细:首次运行或往前扩展历史 → 全量重建;往后新增日期 → 增量补新区块 + 受除权影响个股全日期重算;无新日期但有新除权 → 只重算受影响个股;毫无变化 → 直接跳过。计算前还会剪枝两类脏分区:覆盖不全的分区(#L37-L73)和收盘价停留在竞价前快照的分区(#L76-L115),删掉后当"新日期"重算,实现值级自愈。
管道产出的指标数据直接驱动连板梯队、选股等页面
6. 指数 / ETF 同步
物理分开存储(指数不复权、ETF 可复权),支持独立开关,起点取本地最新日期到今天,完整性修复时自动提前到最早坏日。
7. 市场环境 + 市场主线增量计算
regime聚合每日环境指标(情绪周期、阶段切换),检测到阶段切换(如退潮→冰点)还会通过监控通道推送告警;mainline聚合概念/行业的涨停梯队,增量通常只有 1 天,开销可忽略。
盘后管道第 7 步产出的市场环境分析页
8. 模拟盘结算 + 刷新视图
按当日开盘/收盘价撮合模拟盘顺延单 → 除权调整 → 定版净值。订单状态与除权台账双重守卫保证幂等:重跑同日不会重复成交或二次除权。最后刷新全部 DuckDB 视图并失效内存缓存,次日开盘连板梯队等基准列不会停留在旧交易日。
零运维的 5 个工程细节
读懂源码后会发现,"自动"背后是一组防御性设计:
- 单飞 + 执行槽:调度或手动触发时,若已有活跃任务直接复用/跳过,杜绝并发写同一批 parquet(backend/app/services/pipeline_jobs.py);管道运行期间还会暂停实时行情取数,防覆写竞态。
- 软失败不误报:非关键阶段(环境、主线、结算)单独 try/except 不阻断主管道,但只要有阶段失败,管道末尾抛出
PipelineStageError,任务终态如实标记为 failed——不再"部分失败却报成功"(#L118-L128)。 - 卡死自愈:任务按"进度停滞"而非总时长判定卡死,
reap_stale在轮询时自动收割僵尸任务,无需人工重启。 - 北京时间锚定:管道内的"今天"用
cn_today()计算(backend/app/market_time.py),美西主机 15:35 仍是本地昨天,不锚定北京时间会把昨日日K误判为已齐。 - 能力热更新:每小时重探一次数据源能力,Key 过期/续费无需重启服务即可被感知。
监控中心可看到盘后结算成交留痕与各类触发记录
管道跑完之后:AI 复盘自动接力
盘后管道成功后,若开启了 AI 定时复盘(默认 15:40),系统会流式生成当日大盘复盘报告:边生成边推送到打开的页面,断流自动重试 2 次,完成后归档并可选推送到飞书 / 企业微信 / Webhook / 邮箱(#L1046-L1113)。另外每周挖掘任务也会在管道成功后自动入队。
盘后定时任务自动生成的 AI 复盘报告
上手三步 & 源码索引
- 首次使用:设置里配置数据源 → 立即跑一次盘后管道(拉日K + 算指标)→ 选股/监控页面即可用,顺序建议见 docs/features.md
- 调整时间/拉取范围:面板设置页可视化修改,配置项说明见 docs/configuration.md
- 手动触发:
POST /api/pipeline/run异步返回 job_id,轮询进度,AI 助手也走同一条触发路径(backend/app/api/pipeline.py)
想深入阅读,从这几个文件开始:
- 管道主体与调度:backend/app/jobs/daily_pipeline.py
- 指标计算:backend/app/indicators/pipeline.py
- 完整性自愈:backend/app/services/data_integrity.py
- 任务化执行:backend/app/services/pipeline_jobs.py
【免费下载链接】tick-stock-panelTSP自托管、零运维的 A 股「选股 + 监控 + 回测」量化工作台 | LLM能力驱使策略定制+个股分析+复盘 | 自由接入第三方数据源与个性化扩展数据 | 个人开源项目地址: https://gitcode.com/GitHub_Trending/ti/tick-stock-panel
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考