Files
tick-stock-panel/docs/features.md
T
Jinfeng SunandClaude Opus 4.8 e5a94c42d5 feat: ETF 支持(选股 / 回测 / 监控) (#61)
* feat(screener): 选股引擎支持 ETF

- 12 个内置策略打 asset_types 白名单 + strategy_supports_asset;涨停类
  (连板/断板反包)仅股票,其余 10 个技术类对 ETF 开放
- ScreenerService(repo, asset_type) 分流取数,ETF 复用 kline_etf_enriched,
  跳过股票专用历史缓存与涨停信号;进程级 _history_cache key 含 asset_type
- API /run、/run_preset 透传 asset_type;/strategies 按资产过滤;
  股票专有策略在 ETF 下返回空
- 新增 enriched_dirname(asset_type) 共享 helper;get_enriched_latest_asset
  增 refresh 参数(供轮询线程避免冷缓存同步重算)
- 前端「策略」页加 股票/ETF 切换,ETF 走实时单跑(空日期→用 ETF 自身最新日);
  QK.screenerStrategies 按 asset_type keyed
- 测试:test_screener_etf.py

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(backtest): 回测支持 ETF(个股/因子/策略组合)

- 三条回测路径 + 共用 BacktestEngine 面板加载按 asset_type 路由到
  kline_etf_enriched(复用 enriched_dirname);PanelCache key 隔离资产;
  ETF 跳过股票专用 get_enriched_range 缓存
- 面板 compute_all/名称 JOIN 按 asset_type 取维表(get_instruments_asset),
  修复 ETF 策略回测用错股票维表致名称为空/涨停信号算错
- BacktestConfig/FactorConfig/StrategyBacktestConfig 增 asset_type
- 三个回测 API + SSE stream 透传 asset_type;_make_job_key 纳入 asset_type
  (修复 stream 与 cancel job_key 不对齐致取消失效的回归)
- 前端策略组合页/因子页加 股票/ETF 切换,标的搜索与策略列表跟随资产;
  assetType 持久化
- 测试:test_backtest_etf.py(含 job_key 一致性回归);既有回测测试替身同步

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(monitor): 监控规则支持 ETF

- engine.evaluate(df, asset_type) 按规则 asset_type 分轮评估;quote_service
  增开 ETF 评估轮(用 ETF enriched 快照),股票轮不受影响、不重置其策略结果
- ETF 评估轮独立 try(异常不丢弃已算出的股票告警)+ refresh=False(不在轮询
  线程触发 ETF 冷缓存同步重算)
- ETF 版历史加载器(main.py 注入)+ 按规则 asset_type 选加载器
- _strategy_pools 按 (sid, asset_type) 键,避免同策略股票/ETF 规则互相覆盖
- name_map 仅在有 ETF 规则时补 ETF 维表, setdefault 保股票名优先
- RuleModel/normalize 增 asset_type(默认 stock,持久化往返)
- 前端 RuleEditor 加 股票/ETF 选择,策略列表与标的搜索跟随资产
- 测试:test_monitor_etf.py

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(etf): 前端 API 绑定透传 asset_type + 文档

- api.ts: screener/backtest 绑定加 assetType 参数,MonitorRule 类型加 asset_type
- docs/features.md: 标注选股/回测/监控的 ETF 支持范围与前提

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(reliability): 管道并发/原子写/能力探测/监控告警多处加固

后端可靠性专项修复(均带回归测试, backend 全套 64 passed):

并发与数据完整性:
- 盘后管道单飞: JobStore.create() 去重纳入 pending∨running, 关闭"两次快速点击"
  并发双跑窗口; 新增 _heavy_run_lock 执行槽挡住 reap 后僵尸线程并发写 parquet
- adj_factor/minute 全部改走原子写(tmp+replace), 消除 kill/断电致 all.parquet 损坏
- 分块拉取失败聚合 WARNING 可见化(不再静默当成功); 复权失败标的会保持旧价已提示

能力探测:
- 周期重探(60min)热更新 app.state.capabilities, 付费 Key 过期/续费无需重启即可见
- 瞬时探测失败(超时/连接/5xx, 按 _is_transient 判定)不降级、保留旧付费档;
  真 401/无权限仍正常降级回落 free-api

监控告警:
- 评估仅在连续竞价(9:30-11:30/13:00-15:00)+ 快照当日新鲜度下进行, 避开集合竞价/
  收盘后陈旧价与节假日误告警
- scope=sector fail-closed(validate 拒绝新建 + _apply_scope 返回空), 修复板块规则
  对全市场刷屏
- 飞书 webhook 加退避重试并移到独立线程池 fire-and-forget, 不再阻塞行情轮询线程

单标的新鲜度: 新增 repo.symbols_lagging() 检测掉队标的并 WARNING + 计入 job 结果

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 12:12:29 +08:00

6.0 KiB

功能手册

各功能模块的详细说明。配置见 configuration.md,部署见 deployment.md,策略相关见 strategy.md

首次使用建议顺序:设置 → 凭据与能力(重新检测) → 立即跑盘后管道(拉日 K + 算指标) → 自选页加标的 → 选股页扫描 → 回测页验证 → 监控中心配规则。


🔍 选股引擎(Screener)

20 个内置策略,每个策略一个独立 Python 文件,基于 Polars 表达式向量化实现(backend/app/strategy/builtin/):

类型 代表策略
趋势 / 形态 趋势突破 · 均线多头 · MA 金叉 · MACD 金叉放量 · 布林突破
量价 / 涨停 量价齐升 · 高换手强势 · 连板股 · 断板反包 · 涨停动量
反转 / 波动 超跌反弹 · 超卖反转 · 新低反转 · 低波动龙头 · 回踩 MA20

全 A 股一次扫表,Polars 毫秒级返回。选股页点策略卡片即可扫描,结果支持导出。

ETF 支持:选股页顶部可切换 股票 / ETF。ETF 复用已算好的 kline_etf_enriched 技术指标,仅开放技术类内置策略(趋势/量价/反转/波动);依赖涨停信号的策略(连板股、断板反包)为股票专有,ETF 模式下不显示。需先在数据页开启 ETF 拉取(pipeline_pull_etf)并跑一次盘后管道。

扩展策略的三种方式见 strategy.md → 扩展策略


📊 指标流水线(Indicators)

原生 Polars 向量化,全 A 股一次扫表落盘 enriched Parquet:

  • 均线 / 趋势:MA(5-60) · EMA · MACD · 动量 · 布林带
  • 震荡 / 波动:RSI · KDJ · ATR · 年化波动率 · 振幅
  • 量能 / 涨跌停:量比 · 量均线 · 涨停信号 · 连板数
  • 原子信号:MA / MACD 金叉死叉 · N 日新高新低 · 布林突破
  • 复权:基于除权因子自动前复权,回测与指标口径一致

盘后管道(15:30 CST 自动触发)会重新拉日 K + 重算 enriched 表。


🧪 回测引擎(Backtest)

基于 vectorbt(三种模式):

模式 说明
个股回测 单标的 + 策略,看个股历史表现
策略组合 一个策略扫描全市场,按组合约束回测
自由信号组合 多个自定义信号组合,自定义权重

真实约束:T+1 · 手续费 · 滑点 · 止损 · 最大持仓天数。

组合管理:最大持仓数 · 敞口控制 · 等权 / 自定义仓位。

输出净值曲线 · 夏普 · 最大回撤 · 胜率 · 交易明细。SSE 流式进度支持切页重连,不会丢失回测任务。

ETF 支持:三种模式的后端与 API 均支持 asset_type=etf,回测面板改从 kline_etf_enriched 读取(单次回测为单一资产类型,不混合股票与 ETF)。策略组合与因子回测页均有 股票 / ETF 切换,ETF 模式下策略列表与标的搜索跟随资产。需先开启 ETF 拉取并跑盘后管道。


📡 监控中心(Monitor)

统一规则引擎,一个页面管理四类监控:

类型 场景
策略监控 策略扫描结果有变化时触发(如新增符合标的)
个股信号监控 特定个股的指标条件(如 RSI > 80)
价格涨跌监控 涨跌幅 / 价格突破阈值
全市场异动 全市场异动(如快速拉升/跌停)

ETF 支持:规则可选资产类型 股票 / ETF。监控引擎按规则 asset_type 分轮评估——ETF 规则用 ETF enriched 快照评估(engine.evaluate(..., asset_type="etf")),策略型规则走 ETF 历史加载器(读 kline_etf_enriched)。盘中触发需开启 ETF 实时行情(realtime_pull_etf),使 ETF 报价进入 enriched 快照。

特性:

  • 多条件 AND/OR + 冷却期去重 + 严重级别(info / warn / critical)
  • 多入口配置:监控中心新建 / 个股详情页「加监控」/ 策略卡片一键开启
  • 命中后右下角弹窗(可配声效)+ 持久化到 alerts.jsonl,菜单未读徽标
  • 触发记录详情:每条记录展示命中的具体条件(如 RSI>80)与当前价位,一眼看清为何触发

飞书 Webhook 推送

全局一处配置飞书群机器人地址,启用推送的规则命中即推送到飞书群(支持签名校验)。可在设置页设「默认推送渠道」,新建规则自动预填。


📈 个股分析(Beta)

以「行情 + 关键价位」为主体的单标的决策页:

  • 专用日 K 图表:主图 + 成交量 + 滑块,默认近 6 个月
  • 9 类关键价位(纯函数实时计算,毫秒级):压力支撑 · 成交密集区 · 枢轴点 · 前高前低 · Keltner 通道 · ATR 止损 · 缺口位 · 斐波那契 · 整数关口
  • AI 四维分析:技术 / 基本面 / 财务 / 消息面流式生成,实战派交易员视角

🏆 连板梯队 & 概念分析

  • 连板梯队:实时统计各连板层级(首板 / 2 连板 / 3 连板...)的标的与封单,捕捉市场情绪与题材热度
  • 概念涨幅轮动:基于 ths 概念 / 行业,统计概念板块涨幅与 RPS 轮动,AI 分析资金主线
  • 盘后 AI 复盘:盘后自动生成市场复盘,可推送至飞书群

🧰 数据与扩展

TickFlow 多源数据

日 K / 分钟 K / 指数 / 财务 / 实时行情,基于 TickFlow 官方 SDK。

🔌 第三方数据接入(重点)

支持将自有量化项目的数据并入,与内置数据同台分析:

方式 说明
HTTP 定时拉取 Tushare 等 API,定时拉取并入库
CSV / Excel 上传 页面直接上传文件
JSON 写入 程序化写入

接入后自动 schema 发现 + 符号归一,页面可视化配置,最终并入 DuckDB 同台分析。

盘后定时管道

APScheduler 15:30 CST 自动:拉日 K → 重算 enriched 表 → 跑监控规则。

令牌桶限流

适配各档位 rpm / batch 限制,批量合并 + 增量拉取,避免触发数据源限流。