Skip to content

12_Tech_Actions_Operations

youngcan edited this page Jun 13, 2026 · 4 revisions

GitHub Actions 运维

本篇是定时任务排障指南——"任务为什么没跑"或"跑挂了怎么查"。

当前 workflow 完整清单见 docs/ARCHITECTURE.md


术语速查

英文术语 中文释义
Workflow GitHub 自动任务,一组按计划或手动触发的步骤
UTC cron UTC 时区定时表达式,GitHub Actions 用它决定触发时间
Secret 密钥变量,用来存 API Key、Webhook 等敏感配置
Variable 普通配置变量,不适合放密钥
Dry run 试运行,只验证流程和输入,不执行真实副作用
Artifact 运行产物,Actions 结束后可下载的日志或报告
Step 工作流里的单个执行步骤
Job 工作流里的一组步骤,可独立运行

1. 当前定时任务

只有配置了 schedule 的 workflow 才会自动跑;只有 workflow_dispatch 的任务需要手动触发。

任务 北京时间 UTC cron(UTC 定时表达式) 主脚本
Premarket Risk 周一-周五 08:20 20 0 * * 1-5 scripts/premarket_risk_job.py
Wyckoff Funnel HK 周一-周五 16:35 35 8 * * 1-5 scripts/market_funnel_job.py --market hk
Wyckoff Funnel 周一-周五 17:17 17 9 * * 1-5 scripts/daily_job.py
Review List Replay 周一-周五 19:25 25 11 * * 1-5 scripts/review_list_replay.py
Theme Radar Weekly 周五 21:10 10 13 * * 5 scripts/theme_radar_job.py
Pattern Replay Reprice 周一-周五 23:00 0 15 * * 1-5 scripts/recommendation_tracking_reprice_job.py
Signal Feedback 周一-周五 23:30 30 15 * * 1-5 scripts/signal_feedback_job.py
Wyckoff Funnel US 周二-周六 05:35 35 21 * * 1-5 scripts/market_funnel_job.py --market us
US Recommendation Performance 周二-周六 06:15 15 22 * * 1-5 scripts/us_recommendation_performance_job.py
DB Maintenance 周二-周六 06:20 20 22 * * 1-5 scripts/db_maintenance.py
Backtest Grid 每月 UTC 1/15 日 20:00,北京时间次日 04:00 0 20 1,15 * * scripts/backtest_runner.py

手动触发任务

任务 触发方式 主脚本
Tail Buy workflow_dispatch scripts/tail_buy_intraday_job.py
Holding Diagnosis workflow_dispatch scripts/holding_diagnosis_job.py
Sector Continuity Report workflow_dispatch scripts/sector_continuity_report.py
Step4 From Supabase workflow_dispatch scripts/step4_from_supabase.py
Web Quant Jobs workflow_dispatch scripts/web_background_job.py
Wyckoff Input Preview workflow_dispatch scripts/daily_job.py preview mode
Single Symbol Funnel Diagnosis workflow_dispatch scripts/single_symbol_funnel_diagnosis.py
Backtest Grid US workflow_dispatch scripts/us_backtest_strategy_replay.py

Wyckoff Funnel 与 Signal Feedback 的关系

sequenceDiagram
  participant Funnel as Wyckoff Funnel 17:17
  participant DB as Supabase
  participant Feedback as Signal Feedback 23:30
  Funnel->>DB: 读取上一轮 health / registry
  Funnel->>Funnel: 跑漏斗、AI 研报、OMS
  Funnel->>DB: 写 signal_observations
  Feedback->>DB: 读 signal_observations
  Feedback->>DB: 写 outcomes / health / registry
  Note over DB,Funnel: 下一轮漏斗读取新的策略状态
Loading

这两个 workflow 是独立定时任务,不会自动互相等待。当前错峰设计是“漏斗先产样本,feedback 晚上验收,下一轮漏斗使用结果”。如果手动触发导致重叠,feedback 只处理当时已经落库的数据,漏掉的 observation 会在下一次 feedback 补上。


2. Secrets(密钥变量)配置

必需

Secret(密钥变量) 用途
FEISHU_WEBHOOK_URL 飞书推送
GEMINI_API_KEY AI 研报模型
TUSHARE_TOKEN A 股行情降级源
TICKFLOW_API_KEY TickFlow A 股 / 港股 / 美股行情

可选

Secret(密钥变量) 用途
SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY / SUPABASE_USER_ID 云端持仓同步
TG_BOT_TOKEN / TG_CHAT_ID Telegram 推送
RAG_SEMANTIC_PROVIDER / RAG_SEMANTIC_API_KEY / RAG_SEMANTIC_MODEL / RAG_SEMANTIC_BASE_URL RAG(检索增强生成)防雷的可选语义否决模型;默认新闻检索走 akshare,无需额外 key
OPENAI_API_KEY 或其它 *_API_KEY / *_MODEL / *_BASE_URL 兼容 OpenAI 协议的备用模型

注意:Actions 通过 Secrets 注入环境变量,和本地 .env 文件无关。

Variables(普通配置变量)配置

Variable(普通配置变量) 推荐值 用途
FUNNEL_DYNAMIC_POLICY shadow 控制动态策略:off 静态、shadow 旁路观察、on 正式生效。

FUNNEL_DYNAMIC_POLICY 不是密钥,优先放 GitHub Variables(GitHub 普通配置变量);workflow(GitHub 自动任务)也兼容同名 Secret(密钥变量)。


3. 常见故障和排查

Secret(密钥变量)缺失或过期

日志特征配置缺失: ... 或模型调用返回 401

处理:去 GitHub → Settings → Secrets 检查对应变量是否存在且有效。

数据源超时

现象:运行时间比平时长很多

处理:A 股日线有自动降级机制(tickflow → tushare → akshare → baostock → efinance),通常自愈。港股 / 美股目前依赖 TickFlow,失败时优先检查 TickFlow key、套餐权限和请求频次。

tushare IP 超限

日志特征您的IP数量超限,最大数量为2个!

原因:多个并行 job 同时访问 tushare。

处理:确保回测用两阶段架构(Phase 1 单 job 拉数据 → Phase 2 并行格读快照)。不要让多个 job 直接调 tushare。

回测快照缺失

日志特征snapshot missing file: .../hist_full.csv.gz(快照文件缺失)

原因:Phase 1 的 upload-artifact 路径和 Phase 2 的 download-artifact 路径不一致。

处理:检查 workflow yml 里 artifact 的 path 配置。

Step4 被跳过

原因:未配置 SUPABASE_USER_ID 或 Telegram 参数。Step4 按设计跳过——这不是故障。

Signal Feedback 没有更新动态策略

排查顺序

  1. 检查 signal_observations 是否有最近样本。
  2. 检查 signal_outcomes.status 是否仍大量为 pending
  3. 检查 signal_health_daily.sample_count 是否低于阈值。
  4. 检查 signal_registry.status 是否把信号置为 EXPERIMENTALRETIRED
  5. 如果漏斗没有写 signal_policy_shadow_runs,确认 FUNNEL_DYNAMIC_POLICY=shadow 是否已配置到 GitHub Variables / Secrets。

合规简报降级

现象:收到的是模板格式的简报而非 AI 生成的

原因:合规简报模型未配置 / 模型调用失败 / 输出触发合规校验。降级为本地模板是正常保护行为,不影响主研报。


4. 运维建议

  • 改完策略参数后,先手动触发一次 workflow(GitHub 自动任务)做 dry run(试运行)
  • 关注 Actions 页面的 Artifacts(运行产物)输出,回测结果会存在那里
  • 关键版本变更后,固定 snapshot(快照)跑一轮回测确认效果

Clone this wiki locally