shy3130
e89ea9becf
fix: 修复 4 个 P1 issue (#224/#232/#223/#215)
...
- #224 screener 自定义 SQL 的内存连接关闭 enable_external_access,
注入的 read_parquet/COPY 文件读写直接报错 (安全)
- #232 指数展示缓存百分数口径在消费边界显式 /100:
pipeline._bench_rt_pct_of 与 abnormal_moves._bench_rt_pct 两处,
修复 3/10/30 日偏离值被放大两个数量级
- #223 盘后管道按同日 daily/enriched 行数比较检测实时合并提前
创建的部分分区, 删除后由增量重算全市场补齐
- #215 _basic_filter_for_asset 扩展中和股票专属键 (price_min/max/boards),
并应用到回测/挖掘/策略扫描三个运行期入口, 修复 ETF 静默零信号
2026-09-03 13:01:43 +08:00
shy3130
41205b197c
chore: follow-ups for PR #231/#233 reviews
...
- monitor_rules: raise from None in remind_date validation (B904)
- lots: log warning on asset-type fallback to stock (fail-open traceability)
- matrix: demote turnover NaN-column notice to debug
2026-09-03 12:45:24 +08:00
wshy
8b12fc7a65
Merge pull request #231 from thinkbuf/feat/lots-alerts
...
feat(lots): holdings-reminder page — per-buy-lot auto stop/profit & expiry monitoring
2026-09-03 12:39:58 +08:00
SeerGlaucus
ba83e0241b
fix(backtest): ETF矩阵回测不因缺失换手率字段而失败
...
非股票资产(etf/index)无股本数据(维表仅 symbol/name/code/asset_type),
数据源也不提供换手率; 但矩阵缓存档 common_filter 强制 turnover_min:0.0,
依赖解析仍为 ETF 请求 turnover_rate(需 float_shares 派生), 导致矩阵缓存
构建失败。实测内置 low_volatility_leader 也报
"matrix turnover_rate requires float_shares"。
- _basic_filter_for_asset 将 turnover_min/max 一并中和(与市值界同族, 上次修复遗漏)
- _populate_matrix_derived_arrays 对无股本的 etf/index 把缺失的 turnover_rate
降级为全 NaN 列(与运行期 _optional_field 语义一致), 股票派生路径行为不变
- 新增回归测试: ETF 无股本时降级 NaN 不报错; 有 float_shares 时仍正常派生
2026-09-03 02:37:52 +08:00
richard and Claude
adc7ab52a9
feat(lots): holdings-reminder registry with auto stop/profit & expiry monitoring
...
新增「持仓提醒」页(/lots),登记买入批次(个股/ETF),每批自动生成并同步两条
监控规则: lot_{id}_p(type=price 止盈止损)与 lot_{id}_d(type=date 到期提醒)。
- 核心监控引擎新增 date 规则类型: 纯日历窗口、每个交易日仅在首个轮询评估一次、
按天 cooldown、跨天清理过期键; 消息按触发当天显示"N天后到期/今日到期"。
- 批次派生规则继承默认 webhook 渠道; 监控中心只读展示(批次/批次托管徽标),
通用 monitor-rules 接口对带 lot_id 的规则写/删返回 409, 避免与批次页脱节。
- 通知正文统一在缺省时追加触发现价与涨跌幅, 并避免与引擎自带引语重复。
- 后端分层: strategy/lots.py 域(校验/存储/批次→规则纯映射) + api/lots.py 薄路由
(写锁/校验先行/级联删规则/复用 _sync_engine 重载); services/fs_utils.py 原子写。
- 前端: api/queryKeys 契约、DateShortcuts、Lots 页(数值输入可留空、加载/出错态、
文案打磨)、Monitor 日期提醒/批次徽标; RuleEditor 不手工建 date(由持仓页生成)。
- 记账/加仓减仓属"交易口径", 不在本改动(issue #230 ); 到期提醒按自然日窗口,
休市/节假日顺延的交易日历口径待 issue 定夺。
验证: 新增 tests/test_date_rule.py + tests/test_lots.py 全绿(20), 监控族回归通过,
ruff 新文件干净, pnpm build 通过。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 20:20:38 +08:00
wshy
a28f9e852f
Merge pull request #228 from thinkbuf/feat/watchlist-import-csv-groups
...
feat(watchlist): batch import CSV / pasted codes into groups
2026-09-02 15:55:18 +08:00
richard and Claude
e9f5c606b6
feat(watchlist): batch import CSV / pasted codes into groups
...
自选页新增批量导入:支持 CSV/TXT 文件与粘贴证券代码两种来源,解析出
候选并在弹窗内确认后按 M:N 分组一次性写入(目标分组可多选或就地新建,
默认只勾新增标的,已在自选的可并入所选分组)。
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 14:48:32 +08:00
richard and Claude
40fea3236e
feat(monitor): add webhook test message button
...
Add a test button to the push-notification settings so users can verify Feishu and WeCom group-webhook configs after saving.
Backend: POST /api/settings/preferences/webhook-test reads the saved webhook URL/secret and sends a one-shot test message (max_attempts=1 to skip production retry backoff). All failure modes return HTTP 200 + {ok:false, detail} so the UI renders a single path.
Frontend: api.sendTestWebhook(); TestSendButton/TestResult components shared by both channels; success feedback auto-dismisses after 2s.
Tests: 7 cases covering both channels, failure modes, and single-attempt behavior.
Co-Authored-By: Claude <noreply@anthropic.com >
2026-09-02 13:36:06 +08:00
wshy
27d4a5bbca
Merge pull request #207 from shuolol/feat/strategy-index-data
...
feat(strategy): 策略可读取指数/ETF日K (market_data 模块 + 白名单 + 测试)
2026-09-02 10:53:12 +08:00
wshy
7b754c0ff4
Merge pull request #192 from Marquis03/codex/fix-stocksdk-realtime-normalization
...
fix(stocksdk): normalize realtime quote units and timestamp
2026-09-02 10:53:08 +08:00
shy3130
576850d0fa
feat(data): 数据页同步任务支持手动停止 (二次确认)
...
- 同步运行中顶栏出现「停止」按钮, 点击先弹二次确认: 注明协作式停止
(当前分块完成后中断, 不损坏已写入数据) + 停止后再次拉取需重新走
完整管道 (拉取→指标计算→监控规则), 无法从停止处续跑
- api.ts 新增 pipelineJobCancel, 调用既有 POST /api/pipeline/jobs/{id}/cancel
(取消标志 + 分块回调检查 + JobCancelledError 协作式退出, 后端零改动)
- 补 cancel 端点契约测试: running/pending 可停、终态 400、未知 404、
停止后可立即新建任务
2026-09-01 22:42:59 +08:00
shy3130
67b271285c
Merge branch 'pr-218' into merge/pr-218
2026-09-01 22:40:50 +08:00
shy3130
bfe76e8273
Merge branch 'pr-206' into merge/pr-206
2026-09-01 22:38:50 +08:00
shy3130
d266131f90
Merge branch 'pr-213' into merge/pr-213
2026-09-01 22:33:28 +08:00
shy3130
e8c870af73
Merge branch 'pr-219' into merge/pr-221-220-219
2026-09-01 22:20:01 +08:00
shy3130
d0595eb4d7
Merge branch 'pr-220' into merge/pr-221-220-219
2026-09-01 22:20:01 +08:00
shy3130
a9c00fd567
Merge branch 'pr-221' into merge/pr-221-220-219
2026-09-01 22:20:01 +08:00
shy3130
95cd99ab8c
merge: 同步 main (辐射本地读 + 传输压缩/网络设置) 到全量分钟分支
...
冲突两处均为 minute-refresh status 字段两侧各自新增, 两者全保留
(healthy + provider/provider_effective/repair_only)。
2026-09-01 13:05:21 +08:00
shy3130
bc9461da9a
feat(net): 分时/日K批量响应可选 gzip 压缩与网络设置
...
- _gzip_payload: 偏好开启 + Accept-Encoding 协商 + 超 1KB 才压
(level 6); datetime 序列化与非压缩路径一致, 保证 since 增量
字符串字典序合并不受影响
- minute-batch / daily-batch 端点各自独立偏好键, 逐请求即时生效;
实测分时 9.1MB→1.28MB (86%), 日K 736KB→156KB (79%)
- 超时设置 tab 更名网络设置, 卡内新增压缩区: 大开关 OR 联动
(任一子开即亮, 全关才灭, 点击全开/全关) + 分时/日K两个子开关
- preferences.save() 加线程锁: 修复并行 PUT read-modify-write
互相覆盖 (总开关批量关不齐的根因), 存量偏好写入一并受益
- 测试: 双端点压缩/关闭直通/无协商头直通/偏好默认 + 并行 save 竞态
2026-09-01 13:04:00 +08:00
shy3130
f84cb671ef
feat(data): 全量分钟健康时策略页与监控注入切读本地分时
...
- 策略页: healthy 时解除分时列 100 只截断并 prefer_local 读本地分区
- 监控信号注入: 股票 healthy 时直接读本地当日分区, 免每分钟 bucket
一次的全量 API 拉取; ETF 不在服务 universe, 不健康/读失败回落原路径
- minute-refresh status 增加 healthy 读侧新鲜度字段 (前端共享判断)
- 测试: 注入本地读 3 用例 (健康读本地/不健康回落/ETF 恒走 API)
2026-09-01 13:03:54 +08:00
shy3130
010c484289
feat(data): 全量分钟 (full_minute) 数据集开放插件/自定义源接入
...
像其他能力一样可路由: 声明 full_minute 数据集并在设置页路由, 即接入
盘中全市场分钟落盘服务 (与 TickFlow Expert 同一能力键 intraday.universe)。
- policy: _DATASET_CAP_MAP 增补 full_minute → INTRADAY_UNIVERSE, 自定义源
声明且被路由时自动补授能力, 服务门控对两类源统一口径
- capabilities 注册表: full_minute 从不可路由 (field=None) 改为
full_minute_data_provider 偏好路由; preferences/settings API 收发新字段
- 插件契约: get_intraday_batch (修复轮, 未实现回退 get_minute 当日窗口) +
get_intraday_latest (稳态增量, 可选; 未实现降级仅修复轮, 节奏下限 60s)
- YAML 声明式源: full_minute 数据集与 minute 同形, loader 白名单放行,
源编辑器 UI 可配置; 仅修复轮语义
- kline_sync 边界: fetch_intraday_custom_batch / _fetch_intraday_custom_latest,
帧过北京墙钟守卫, 与 TickFlow 边界函数同纪律
- minute_refresh: 删「自定义分钟源让位」逻辑, 改按路由取数;
status 增 provider / provider_effective / repair_only
- 前端: 监控页卡片按能力驱动, 数据源页路由矩阵, api.ts 类型
- 测试: 门控/路由/降级/增广新增用例, 后端 1332 全过
- 文档: plugin-development / custom-data-source / configuration / features /
CONTRIBUTING 契约细化 (AI 可照文档接入)
2026-08-31 22:53:24 +08:00
shy3130
dab8a2c676
test(screener): 矩阵策略计数 18→25 — 补 58f8d7b 新增 7 策略漏改
2026-08-31 22:53:12 +08:00
shy3130
58f8d7b883
feat(strategy): 新增 7 个矩阵原生内置策略, 公开计数 18→25
...
- 趋势/形态: 均线粘合突破 · 平台整理突破 · 放量创60日新高
- 量价/涨停: 涨停基因活跃股 (max_change_pct 参数过滤当日已大涨)
- 反转/波动: MACD 零下回升 · 长下影反击 (close_position>=0.5 兼容假阴线) · RSI 中轴回踩
- 阈值统一小数制口径 (change_pct/momentum 除以 100), 一致性测试计数 26
2026-08-31 22:30:44 +08:00
shy3130
be799abfa0
fix(intraday): since 增量时区崩溃 — 客户端直传原始时间串, 服务端归一 aware 输入
...
客户端 toISOString 生成带 Z 的 UTC, Python 3.12 解析为 aware datetime,
与行内 naive 北京时间比较 TypeError (第二轮轮询 500), 且换算差 8 小时。
- 客户端: since 直接回传最旧最后一根的原始 datetime 字符串 (同格式同时区,
字典序即时间序), 消灭一切换算
- 服务端: fromisoformat 后 aware 输入先转北京墙钟再去 tzinfo, 防御旧客户端
2026-08-31 22:01:46 +08:00
shy3130
ed2f81c312
feat(realtime): 首用门禁 — 本地无数据时禁止开启实时行情
...
日K/enriched 均空 (与看板首用弹窗同口径) 时开启实时行情返回 409 并给
同步指引, 不落偏好。展示/监控/梯队全部依赖本地数据底座, 空数据下轮询
只是空转耗配额且缺 instruments 维表。只拦开启不影响关闭, 已开后清库
下次重开自然被拦。
2026-08-31 21:45:07 +08:00
shy3130
320969497a
perf(intraday): 分时链路增量传输 + SSE 续画 + 视口感知
...
- minute-batch 支持 since 增量响应: 只回 >= since 的K (含动态最后一根),
客户端按 (symbol, datetime) upsert 合并, 轮询流量从全天序列降到每轮一两根
- 自选分时 SSE 续画: enriched tick 前端续写分钟序列最后一根/滚动追加新K
(纯视图叠加不写缓存, 服务端定版值始终权威); tick 新鲜时轮询降为 30s 兜底
- 视口感知: 从虚拟器直读渲染中 symbol 集合 (可见+overscan), 数据层只拉视口内;
since 只按本轮请求集合取最旧尾部, 视口外落后不放大窗口; 集合变化 300ms
防抖补拉; 剔除指数保持端点契约
- since 过滤专项测试: 含 since 当根 / 早于全部K / 无 since 三态
2026-08-31 21:45:06 +08:00
shy3130
869c49bb0b
fix(kline): 分钟增量起点改为最后一根本身 — 形成中的动态K需重拉覆盖
2026-08-31 20:54:56 +08:00
shy3130
b78ba9940d
perf(kline): 分钟批量补拉取到即落盘 + 尾部增量窗口
...
- 补拉结果经 _write_minute_partition upsert 落盘 (持仓库写锁, 与全量分钟
服务/盘后同步同一纪律), 下一轮命中本地, 大自选从每轮全天重拉降为增量
- 完整性判定由 0.9 根数比例改为 期望-2 根: 比例阈值会让持久化数据在 90%
处冻结尾巴
- 分类三态: fresh 直读本地零请求 / 尾部落后从最后一根+1min 增量拉 /
中间有洞 (间距非 1min/午休 91min) 退回全天重拉回填, 防增量窗口漏数据
- 落盘失败降级为仅返回本轮数据 (持久化是优化而非正确性前提)
2026-08-31 20:53:23 +08:00
shy3130
df5cae143e
feat(minute): 自选分时接入全量分钟本地供给 (prefer_local + freshness 判定)
...
- MinuteRefreshService.is_healthy(): 偏好开 + 线程活 + 最近一轮距今
≤ max(2×间隔, 30s)。last_round_at 只在取数+落盘成功后更新, 连续失败
自动超时判不健康, 冷启动修复轮期间天然不健康
- /api/kline/minute-batch 加 prefer_local 标志: 服务健康时股票 incomplete
不再批量补拉, 本地有多少给多少 (服务下一轮落盘补全; 停牌票补拉也是空,
无损); ETF 不在全量分钟 universe 内维持补拉; 不健康回落现状兜底。
响应加 full_minute_local 标记
- 大自选 (数百上千只) 不再每 6s 轮询持续打批量分钟接口
- 4 个新用例: 健康跳过股票补拉/ETF 仍补, 不健康回落, 无标志不受影响,
is_healthy 三条件边界
2026-08-31 17:10:02 +08:00
shy3130
3c6ed99922
feat(index): 指数收敛为固定核心四只 + fuyao 指数快照接入
...
- 新建 app/services/index_const.py 单一权威: 展示层固定四只核心指数
(上证/深证成指/创业板/科创综指), quote_service/overview/
market_overview_builder/sector_monitor 四处重复定义全部收敛
- fuyao 插件接入指数快照端点 (/api/a-share-index/prices/snapshot):
client 增加 index_snapshot (批量上限 627 码), provider 实现可选协议
get_realtime_indices — .BJ 后缀先行过滤 (未知代码整批 1002 连坐),
volume 不做股转手; 修复 fuyao 路由下指数冻结在日K兜底的 bug
- quote_service 自定义源分支鸭子类型调用 get_realtime_indices 补拉指数,
请求清单 = 核心四只 + 启用指数监控规则标的; 未实现的源走日K兜底
- TickFlow 分支指数固定按码显式拉取, 移除 CN_Index 全量 universe 与
mode core/all 分支; 指数落盘固定 merge 不截断
- 指数偏好全套下线: realtime_index_symbols / sidebar_index_symbols /
indices_nav_pinned / realtime_pull_index / realtime_index_mode
- /api/index/list 与 /search (全指数浏览搜索) 删除; daily/minute 保留
供指数详情页, sync_instruments/sync_daily 保留供数据页
- sector_monitor 指数标的恒可监控, catalog 签名不再依赖指数偏好
- 新增 7 个用例: 指数快照映射/.BJ 过滤/软失败 + 自定义源指数补充链路
(含监控规则并入/无协议源静默/指数失败软降级)
2026-08-31 16:50:21 +08:00
shy3130
e287a55e82
fix(capabilities): redetect 同步刷新 app.state 快照并升级 tickflow SDK 0.1.25
...
- /api/capabilities/redetect 重新探测后同步写回 app.state.capabilities,
minute_refresh 等门控服务即时读到新档位, 不再需要重启
- tickflow 0.1.24 缺 intraday_universe 方法导致 Expert 档全量分钟探测失败,
升级到 0.1.25
- 全量分钟轮次异常与模式补充 warning 日志, 便于线上诊断
2026-08-31 16:50:12 +08:00
shy3130
d29f9c0ea8
perf(data): TickFlow 取数切换 as_dataframe=False 列式直转; 修复除权因子日期 UTC 偏移一天
...
- 全部 K 线取数点改走 CompactKlineData 列式直转 polars (无 pandas 中转,
全市场单轮本地转换 ~1.1s → ~0.1s), 时区口径统一 _timestamp_to_beijing_datetime
- 除权因子 trade_date 原取 UTC 日期, 北京零点事件整体早一天 → 转北京墙钟后取日期
- 盘中分钟增量间隔上限 300s → 120s (universe 仅回最新 3 根, 超限必留缺口)
2026-08-30 22:29:33 +08:00
shy3130
1a7e6ad32c
Merge remote-tracking branch 'origin/main' into feat/capability-routing
...
# Conflicts:
# README.md
# backend/app/backtest/worker.py
2026-08-30 19:47:11 +08:00
shy3130
80ecb6e409
chore(release): 版本号统一升级至 v0.2.2
2026-08-30 19:43:52 +08:00
shy3130
a8a6c81fff
Merge remote-tracking branch 'origin/feat/volume-delta-alert' into feat/capability-routing
...
# Conflicts:
# backend/app/services/quote_service.py
2026-08-30 19:42:43 +08:00
shy3130
fb7785ceb9
feat(abnormal,dashboard): 盘中异动聚合、维度 source_field 与板块分时端点
...
- abnormal_moves 新增 build_intraday: enriched 七类当日信号聚合,
优先级(涨停>炸板>翘板>跌停>新高>新低>放量)+涨跌幅排序, GET /api/abnormal/intraday
- 维度排名项携带 group_source 与 source_field(configId.field),
前端可精确判定概念/行业而非字符串包含
- ext_data 新增 dimension-intraday: 成分股×当日分钟分区等权聚合,
prev_close 优先/首根退化基准、成分网格化 ffill、全市场对照线,
小数制涨跌幅契约、60s 进程内缓存、点击触发不预计算
- 板块分时 7 测 + 盘中异动 4 测
2026-08-30 19:05:32 +08:00
shy3130
3d627aba5e
feat(recap): 盘前风向标服务与 AI 复盘注入
...
- fuyao 客户端新增 short-term-benchmark 端点透传
- auction_benchmark 服务: 历史按日 JSON 缓存(当日不缓存)、交易日回退、
四态降级(ok/fallback_prev/source_unavailable/no_data)
- 读取时从相邻日K分区现算当日/次日收益对照, 不落缓存
- 复盘 user prompt 注入「盘前风向标(竞价)」上下文
- 11 个测试覆盖回退/缓存/富化数学/上下文
2026-08-30 19:05:31 +08:00
shy3130
cff3b07527
feat(recap): 龙虎榜卡片信息密度与可读性增强
...
- 摘要行扩为净买/净卖/机构净买/机构净卖各 Top5, 四行药丸左缘固定槽对齐
- fmtVolume 负数按绝对值分级补万/亿单位 (净卖席位原显示裸数字)
- 个股名称后复用 boardTag 加创/科/北板块徽章 (表格/药丸/游资chips)
- 三榜表格数值列头可点击排序 (升降切换, 空值恒垫底, 切tab重置)
- 游资席位金额去掉「净买」前缀
- AI 复盘提示词龙虎榜摘要四段统一 Top5
2026-08-30 19:05:30 +08:00
shy3130
381038e94f
feat(recap): 复盘页龙虎榜卡片与 AI 复盘资金动向注入
...
- fuyao dragon-tiger-list 三榜接入 (非路由数据集, tickflow 无对应能力)
- services.dragon_tiger: 本地日K分区做交易日回退(规避接口非交易日报错), 历史日 JSON 按日缓存(不可变), 当日未发布自动回退上一期
- 卡片视觉对齐市场摘要条: 奖杯徽章/排名药丸/分段式tab/净买额比例条/席位奖牌, 收起两行摘要展开三榜明细, 点股票开日K预览
- AI 复盘 prompt 注入龙虎榜摘要段 (净买/净卖/机构/游资 Top), 未配置 fuyao 时空串不占段
- displayDate 联动: 历史复盘显示当期榜单
2026-08-30 19:05:29 +08:00
shy3130
9d290f003d
feat(market): 交易日探针——工作日休市剔除行情轮询与分钟增量
...
- 探测链: fuyao 交易日历(权威) → tickflow 行情时间戳(5只篮子 OR 判定, 9:40 开盘缓冲窗) → None 未知回退周几近似
- 周末零成本直判; 结论分档 TTL 缓存 (交易日 1h / 休市 30min 自愈 / 未知 5min 防重试风暴), 纯读不落盘
- 实时行情: 休市日跳过轮询/盘前预热/定版, fuyao 周五数据误归属从源头消除
- 分钟增量: gate_reason 新增 holiday; 探针未知时空轮升级机制仍为第二道防线
- 实测(周六): 三层链路真实验证, fuyao 日历连调休周一均正确判休市
2026-08-30 19:05:28 +08:00
shy3130
3b09fac15e
feat(realtime): 自选实时分流与数据落盘可靠性
...
- quote_service 实时通道重构与自选分流, 旧 watchlist 批量测试相应移除
- repository.replace_with_retry 原子写重试; pipeline_jobs 任务记录落盘
- stock-sdk provider 适配增强; 分时图组件与预览入口调整
2026-08-30 19:05:27 +08:00
shy3130
d70a960750
feat(fuyao): 日K dump 链路强化与财务数据集适配
...
- 财务接入(股本除外): 三大报表多期 + 指标单期, 字段映射至项目 canonical 列
- metrics: bps 由估值 pb_mrq 反推, eps_basic 取自利润表, report 期由最新披露期反查
- financial_sync 报告期合并升级为逐列填空: 多源数据并集共存, 新值覆盖缺列保留
- 前序未入库工作一并提交: 10 年/10d 日K dump、除权因子事件推导与涨跌停自检
2026-08-30 19:05:26 +08:00
shy3130
cda69fb9e1
feat(routing): 能力路由矩阵支持不可路由能力行
...
- CAPABILITY_REGISTRY 新增 full_minute 行 (field=None, 生效源恒为 TickFlow)
- 全量分钟排于财务数据之后; 非路由候选标签改为非交互展示保留完整高亮
- 设置页数据集标签/服务中状态覆盖非路由能力
2026-08-30 19:05:25 +08:00
shy3130
657d4d9948
feat(minute): 全量分钟能力位与两阶段日内分钟落盘
...
- tickflow SDK 0.1.25: intraday.universe 标的池单请求拉全市场当日分钟
- 新能力位 Cap.INTRADAY_UNIVERSE (TickFlow Expert 专有) + 探测/别名/schema v6
- 分钟刷新两阶段: 冷启动与缺口修复走 intraday_batch 全天突发(分块容错), 稳态走 universe 增量
- 覆盖看门狗: 落后>3min / 无数据 / 连续空轮自动升级全量自愈
- 刷新间隔钳制 [3,300]s 默认 6s; 监控页全量分钟开关与状态入口
- CONTRIBUTING: 分钟 K 北京时间墙钟契约 (naive, 入口强制归一)
2026-08-30 19:05:25 +08:00
shy3130
b4aa5918fc
feat(data): 能力路由矩阵落地——五档入册、除权独立路由、插件源下限放宽
...
- 新增能力注册表 capabilities.py 与 /capability-matrix: 六能力(实时/日K/
分钟/五档/除权/财务)统一 candidates/pending/usable, 各页门控以 usable 为准
- 五档盘口 (depth5) 进入矩阵: tf_tier=pro, 插件数据集白名单暂未开放
- 除权「跟随日K」(same_as_daily) 下线: 每能力独立路由, 四处跟随解析移除,
存量旧值经 preferences getter 回退 tickflow 自愈; 矩阵显示与实际拉取口径一致
- 实时轮询下限: 路由到插件/自定义源时不受 TickFlow 档位限速, 通用下限 1s
(默认间隔仍 6s, TickFlow 路由档位查表不变)
- 插件 manifest 新增 homepage 透传; loader 输出 api_key_masked (Key 脱敏
与 TickFlow 同一展示契约); fuyao 声明官网
2026-08-30 19:05:21 +08:00
shy3130
578a531743
fix(data): 自定义源比例字段单位改为显式声明 pct_unit 未声明 fail-closed
...
amplitude/turnover_rate 的百分制与小数制数值区间重叠(0.05 既可能是
0.05% 也可能是 5%), 截面中位数启发式不可判, 赌错即整体放大 100 倍,
违反 CONTRIBUTING §3.1 禁止启发式转换的约束。
- realtime 数据集新增 pct_unit: percent|decimal 显式声明, 声明即契约
(percent 无条件 /100, decimal 无条件透传, 不受数值外观影响)
- 未声明时 change_pct 保留涨跌停 30% 上限的截面判定(物理可判),
amplitude/turnover_rate 置 None 交 enriched 管道按价格/股本口径重算
并记录 WARNING; 已配置 transforms 的列视为用户接管单位, 透传
- 配置解析/清洗/序列化全链路校验取值, 非 realtime 数据集声明即报错
- 契约测试重写覆盖声明优先、边界值、fail-closed 与 transforms 兼容
2026-08-30 19:05:20 +08:00
shy3130
0b4bde6dda
feat(fuyao): 快照单页 limit=6000 一次拉完全市场
...
实测服务端单页 6000 不截断(全市场 ~5600 只), 一轮轮询从 11 请求降到
1 请求, 大幅降低 4001 限频压力; 分页循环保留作未来扩容/服务端截断兜底。
插件开发文档重写并补充单页上限实测结论与页间隔自限速要求。
2026-08-30 19:05:20 +08:00
shy3130
b8fa08f027
fix(worker): 消除回测子进程结果消息丢失竞态
...
现象: 整年区间回测偶发 'backtest worker exited without result (exitcode=0)'。
根因: 子进程 event_queue.put 只是把消息交给后台 feeder 线程, 主线程随即退出,
feeder 随进程销毁, 大结果/高负载下消息尾部未刷入管道; 父进程 0.1s 轮询
恰在 Empty+进程已死时跳出循环, 未读到的 result 被丢弃。
修复 (双侧):
- 子进程 finally 中 close+join_thread 队列, 保证退出前消息完整刷入管道
- 父进程在判定无结果前做一次兜底排空 (join 后 1s×2 轮 get)
2026-08-30 19:05:19 +08:00
shy3130
d4aa9ed6ad
test(backtest): 分钟回测守卫与六项语义测试
...
- _guard_minute_strategy_backtest: 非股票资产与回测起点早于本地分钟K起点
均返回 400 并提示「扩展分钟K历史」, 覆盖 run 与 SSE stream 两入口
- 合成分钟分区+日线面板夹具, 断言: 触发分钟收盘成交价/日线窗口严格止于
T-1 的因果性/涨停拒买计数/缺分区日跳过/离场走日K次日开盘/入口守卫
2026-08-30 19:05:18 +08:00
shy3130
0559632de6
feat(backtest): 分钟策略回测 v1 — 逐交易日回放信号分钟收盘入场
...
- 新增 MinuteSignalReplayer: 枚举区间内分钟分区日, 逐日组装 StrategyDataContext
(timeframe=1m, 日线窗口严格止于 T-1) 并复用 strategy_engine.run, 与实盘选股同路径
- 缺分区日显式跳过并记入 skipped_days, 不回退最近分区
- 涨停拒买: 信号分钟收盘 >= 当日涨停价(T-1 raw_close + 板块幅度)剔除并计数
- MarketMatrix 新增 entry_price 覆盖矩阵, 引擎在有限值处优先于 open/close 惯例
- repository.list_minute_dates 按目录名枚举分钟分区日, 零 parquet 扫描
- strategy.run 增加 minute_filter 分支: 入场 delay 0/离场沿用日K matcher,
trades.entry_date 补全为 YYYY-MM-DD HH:MM (北京时间)
2026-08-30 19:05:16 +08:00