shy3130
|
bfa87d1f0b
|
fix(screener): 策略池按日线/分钟周期隔离, 修复分钟视角下整池显示失效
原设计: 日线/分钟共用一份策略池。切到分钟模式后, 池中 15 个日线策略
在分钟策略列表里解析不到, 策略池对话框右侧全部标成「失效」; 此时确认
还会把混合名单回写全局池, 日线池同样被污染。
- 池按周期隔离: 'strategy-pool' (日线, 沿用原 key 存量无损) +
'strategy-pool-1m' (分钟, 新 key); useStrategyPool(timeframe) 返回
当前周期的池, 任一池变更幂等落库双 key, 切换周期不会交叉写
- 「失效」徽章回归本义: 仅当策略真被删除 (不在本周期列表) 时出现
- prune 解除仅日线限制: 各周期用自身策略列表清理各自的池, 互不误删
- 策略构建器/叠加策略创建的是日线策略, 固定入日线池 (即使分钟页保存)
验证: 分钟对话框无失效列表、可正常添加分钟红7; 日线 15/31 ↔ 分钟 1/1
往返切换稳定; 刷新后双池持久。
注: 开发中 vite HMR 热替换瞬间曾把本地日线池写空 (旧代码对话框与新
模块混布的开发态一次性产物, 生产构建无 HMR 不受影响); 已从用户截图
复原原 15 策略及顺序 (boll_breakout → five_consecutive_yang)。
|
2026-08-30 19:05:08 +08:00 |
|
shy3130
|
1746a0e305
|
feat(minute): 分钟红7改用开盘窗口 + 盘中增量卡片移至设置右列
分钟红7: 检查窗口从「最近7根」改为「当日最早7根(开盘7根)」—
捕捉开盘急拉形态, 窗口在早盘即固定, 不随盘中新K线漂移;
close 取开盘窗口末根收盘价 (基础过滤口径同步更新)。
- 窗口选择: tail → head (sort 后 int_range < bars), 输出列契约不变
- 新增两个区分性测试: 开盘命中后转绿仍命中且 close 取窗口末根;
开盘不足红K数、尾盘转红不救回 (旧最近窗口口径会命中)
- 实盘验证: 252 只命中, 每只窗口末时间均为 9:36 (开盘第7根)
- 设置页「盘中分钟增量」卡片从左列顶部移至右列 (连板梯队修正之后)
注: 本地 runtime 覆盖文件 minute_red_streak.json 的 description
快照已同步新文案 (gitignored, 不入库)
|
2026-08-30 19:05:07 +08:00 |
|
shy3130
|
2f8d1e5e60
|
refactor(settings): 盘中分钟增量刷新开关迁至实时监控设置
该功能是交易时段常驻运行的实时服务, 心智模型归实时行情设置更合理;
数据页分钟K弹窗还原为纯盘后批量同步语义。
- 配置端点归属迁移: minute_refresh_enabled/interval 由 PUT
/api/settings/preferences/realtime-monitor 拥有 (set_realtime_monitor_config
写入 + getter 返回, clamp [60,300] 不变); minute-sync 端点还原原状
- 前端 Monitoring.tsx 新增「盘中分钟增量」卡片 (开关/间隔滑杆 60-300s/
运行轮次状态行), 沿用 Card/ToggleRow/滑杆防抖既有模式
- MinuteSyncConfig 移除盘中增量区块; api.ts updateMinuteSync 还原 3 参签名
- 新增归属测试: realtime_monitor_config 拥有 refresh 键且越界 clamp
验证: 28 项分钟相关测试通过; UI 开关双向回路 (curl 置开→UI 显示开,
UI 点击→偏好翻转 False 且服务 gate_reason=disabled); 数据页弹窗无残留
|
2026-08-30 19:05:06 +08:00 |
|
shy3130
|
5e2358ce48
|
feat(minute): 分钟策略执行后端 + 分钟红7策略 + 盘中增量落盘 (Expert)
一期 · 分钟策略执行链路:
- 引擎新增 minute_filter 执行后端: 策略声明 filter_minute_history(df, params),
timeframes 必须且仅为 ["1m"]; 输入为当日分钟K窗口, 命中行事后联表 enriched
快照补基础过滤列 (name/total_shares/change_pct), close 用最新分钟价
- 内置策略「分钟红7」(minute_red_streak): 最近 N 根(默认7)分钟K至少 5 根
close>open, 且按最高价排序的最高的 2 根全红; 全向量化, 671k 行约 230ms;
参数 bars/min_red/top_red/rank_by_close, 不足 N 根不触发, 同值取更晚K线
- ScreenerService 1m context: 优先读 as_of 当日 kline_minute 分区, 缺失回退
全市场最近分区; 单分区直读与全量 glob 解耦
- run_preset/run_all 分钟周期结果不写日线盘后缓存 (语义隔离)
二期 · 盘中分钟增量落盘 (Expert 专有):
- kline_sync.fetch_intraday_full_market_burst: intraday.batch 独立限流池,
全市场 5546/200=28 块线程池一次打出, 轮内不重试
- MinuteRefreshService: 后台线程, 门控链 = 开关→自定义分钟源让位→INTRADAY_BATCH
能力→连续竞价时段(9:30-11:30/13:00-15:00); 固定节奏 next=max(起点+间隔,完成),
不补跑; 每轮单次合并落盘 (_write_minute_partition unique 幂等)
- 偏好 minute_refresh_enabled(默认关)/minute_refresh_interval([60,300]s 默认60);
GET /api/settings/minute-refresh/status 状态端点
前端:
- 策略页日线/分钟周期切换 (1m 下 ETF 置灰、不触发盘后 runAll、prune 仅日线),
策略卡片「分钟」徽章, 策略池对话框按周期拉取
- 数据页分钟K设置弹窗新增盘中增量区块: 开关/间隔(60-300s)/能力缺失置灰/
服务状态行(运行中·时段暂停·最近一轮)
测试: 26 项新增 (形态7/引擎4/context4/服务11), 更新 3 个 matrix 不变量测试;
全量 1112 passed; 前端 build 通过; 浏览器端到端实测通过
|
2026-08-30 19:05:05 +08:00 |
|
 kevin9327andClaude Opus 4.8
|
ebf1a89254
|
fix(ext-data): 扩展数据上传增加体积上限并分块落盘 (#204)
问题: 扩展数据上传 /api/ext-data/{id}/upload 与字段检测 /api/ext-data/detect-fields
都直接 `content = await file.read()`, 无任何字节/行数限制。上传超大 CSV/XLSX
会把整个文件读入内存再交给 Polars/Excel 解析, 可能造成高内存占用、进程 OOM 或
服务不可用。自选截图 OCR 已有 12MB 上限, 扩展上传却没有统一上限。
修复: 抽出 _write_upload_capped(file, dest, max_bytes), 以 1MB 分块把上传写入
临时文件, 累计超过上限即拒绝(413), 不再一次性读入内存; 两个上传入口统一改用它。
上限常量 _MAX_UPLOAD_BYTES = 50MB(对扩展快照数据足够宽裕, 亦便于按需调整)。
兼容性: 后缀白名单、解析与映射逻辑不变; 仅新增体积上限。413 由 detect_fields 的
`except HTTPException: raise` 与 upload_data 的 finally 清理临时目录正常传播。
验证: 新增 tests/test_ext_upload_size_limit.py 覆盖未超限完整写入、恰好等于上限、
超限抛 413 三例, 全过; ruff 无新增告警(B008 与 origin/main 同为 2 个, 均为既有
FastAPI File(...) 默认值写法)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-08-30 18:51:24 +09:00 |
|
 kevin9327andClaude Opus 4.8
|
d92ef17851
|
fix(backtest): max_hold_days 强制退出信号真正生效 (#198)
问题: /api/backtest/run 设置 max_hold_days 时, 强制平仓完全不生效, 持仓不会
按最大持有天数退出, 导致交易记录、持仓周期和收益统计失真。
根因(services/backtest.py 的 max_hold 内联逻辑, 两处缺陷叠加):
1. `exits_idx.iloc[end_i][col] = True` 是链式索引: iloc[end_i] 先取出一行副本,
再对副本赋值, 在 pandas Copy-on-Write 语义下写入不会落到原矩阵(pandas 3.x
直接抛 ChainedAssignmentError)。强制退出单元格始终为 False。
2. `exits_idx = entries.copy()` 以入场矩阵起步, 使强制退出矩阵天然带上所有入场位;
即便修好第 1 点, 也会在入场当日就强制平仓, 而非 max_hold_days 之后。
修复: 抽出纯函数 _build_max_hold_exits(entries, max_hold_days), 从全 False 起步,
用单步定位 iloc[row, col_loc] 写入入场后第 max_hold_days 个交易日的强制退出位;
run() 中改为与用户 exits 做 OR, 保留原有信号退出。抽出后该逻辑不依赖 vectorbt,
可独立回归(run() 整体仍需 vectorbt 可选依赖)。
边界: end_i 越界 clamp 到最后一根 K; 入场即最后一根 K 时 end_i==i 不产生退出。
验证: 新增 tests/backtest/test_max_hold_exits.py 覆盖强制退出落位、不误标入场位、
越界 clamp、末根不退出、多入场、多列独立 6 例, 修复后全过; 并以复刻旧内联逻辑的
脚本在 pandas 3.0.5 上确认修复前目标退出单元格恒为 False(ChainedAssignmentError)。
ruff 通过。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-08-30 18:47:08 +09:00 |
|
 kevin9327andClaude Opus 4.8
|
8aa6e8d89b
|
fix(backtest): 因子回测默认区间改用 180 天而非 3 年 (#202)
问题: `/api/backtest/factor/run` 与 `/api/backtest/factor/batch` 省略 start
时, 使用了策略默认区间 STRATEGY_DEFAULT_DAYS(3 年), 而非为因子回测定义的
FACTOR_DEFAULT_DAYS(180 天)。以 end=2026-08-24 为例, 会解析成 2023-08-25。
影响: 用户只选因子直接运行会加载约 3 年数据, 徒增内存与耗时; 也与前端
「默认最近 3 个月」的提示不一致。且服务器区间守卫上限为 186 天, 该默认区间
在开启守卫时会被直接拒绝。
根因: factor_run / factor_batch 调用 _resolve_start 时误传 STRATEGY_DEFAULT_DAYS。
同文件的 strategy_run 已正确使用 FACTOR_DEFAULT_DAYS, 仅两个因子入口写反。
修复: 两处改为 FACTOR_DEFAULT_DAYS。显式传 start=null(全部历史)与显式日期的
语义保持不变(由 _resolve_start 的 model_fields_set 判定, 未改动)。
验证: 新增 tests/backtest/test_factor_default_range.py, 用替身 Service 捕获
传入配置, 覆盖省略 start、显式 null、显式日期三种情况(factor_run + factor_batch)。
修复前 2 例失败(解析为 2023-08-25), 修复后 4 例全过; 相邻 factor/optimizer
回归 28 passed; ruff 通过。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-08-30 18:42:32 +09:00 |
|
 kevin9327andClaude Opus 4.8
|
64ab9a0818
|
fix(pipeline): A 股盘后拉取开关生效 (#216)
问题: 在设置里取消勾选「A 股」拉取(pipeline_pull_a_share=false)后完全不
生效, 每次同步仍拉取全市场 A 股日K。
根因: 两处联合导致开关不可用:
1. get_pipeline_pull_a_share() 硬编码 return True, 从不读取偏好, 使
jobs/daily_pipeline.py 里 `if not pull_a_share` 的跳过分支永不可达。
2. set_pipeline_pull_types() 的白名单 _PIPELINE_PULL_KEYS 遗漏
pipeline_pull_a_share, 即使 API 模型接受该字段, 值也会被静默丢弃、无法落盘。
(ETF / 指数两个开关均正常读写, 仅 A 股异常。)
修复:
- get_pipeline_pull_a_share() 改为 load().get("pipeline_pull_a_share", True),
与 ETF / 指数保持一致, 默认仍为 True (向后兼容, 旧配置无此键时行为不变)。
- 白名单补入 pipeline_pull_a_share, 使 PUT /api/settings/preferences/
pipeline-pull-types 能正确落盘。
验证: backend/tests/test_pipeline_pull_types.py 覆盖默认值、关闭后 getter 生效、
setter 落盘与三开关独立性; 修复前 3 例失败, 修复后全过。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-08-30 18:38:24 +09:00 |
|
yushenglin
|
d280dd59b2
|
修复同步后停牌残留触发完整性误判
|
2026-08-28 10:15:54 +08:00 |
|
shy3130
|
afbf432eae
|
fix(backtest): 子进程退出收尾超时不再丢弃已送达的回测结果
终态消息入队后显式冲刷队列并以 os._exit 立即退出, 跳过大数据量下
可达数十秒的解释器 teardown (GC/DuckDB 线程 join/DLL 卸载); 父进程
在子进程超时未退出时改为强杀并采纳已送达结果, 记录 worker_exit_forcibly
指标, 错误场景优先抛出 worker 真实异常。
|
2026-08-26 22:07:40 +08:00 |
|
wshy
|
e346e25101
|
Update README.md
|
2026-08-26 14:14:19 +08:00 |
|
shy3130
|
55b8e739c3
|
fix(mining): enriched 数据并发更新时重读快照而非整轮失败
用户在数据更新进行中跑挖掘: 面板读取期间 enriched 发布提交新世代,
assert_data_generation 直接抛 EnrichedGenerationUnavailableError,
整轮运行作废且只留一句英文堆栈; 启动接口撞上发布中状态还会 500。
- mining_runtime: 面板+撮合矩阵读取包进有限重试环 (默认 3 次)。
世代变化时丢弃半新半旧的读取, 用新世代整体重读; 发布未完成时先等
5s; 耗尽后以带指引的中文错误终止。排队指纹仍只在首轮校验, 重试跟随
新世代等价于"更新后立刻重跑"
- api/mining: build_data_fingerprint 撞上发布中状态映射为 400 中文
提示 (原来未捕获直接 500), 前端 task.error 红字通路直接可见
- 测试: 读取中单次世代漂移重读后成功 / 持续漂移耗尽后带指引失败 /
发布中启动返回 400; 全量挖掘回归 103 passed
|
2026-08-26 13:19:16 +08:00 |
|
shy3130
|
de51929a44
|
fix(mining): 市场环境数据缺失时挖掘启动即失败并前置提示
用户在未计算市场环境的数据目录跑挖掘: 搜索阶段的 regime 评估被
evaluator 软捕获成 error 字符串, 整轮嵌套搜索照常跑完后, artifacts
阶段的 _regime_date_count 硬抛 ValueError, 计算全部浪费且只在最后
给出指引。
- mining_runtime: require_regime 时在因子面板就绪后立即用与
artifacts 相同的 fold 口径预构建一次 regime mask (required 区间取
全部外层 fold 测试窗并集), 数据为空/覆盖不完整即刻带指引消息终止
- MiningWorkbench: 启动前查询 /api/regime/latest, 未计算时侧栏显示
警告横幅(直达数据页)并在开始时 toast 阻止, 避免产生必败的运行记录
- 测试: 缺数据 fail-fast / 覆盖充足通过 / fold 窗口内缺口报错 三例
|
2026-08-26 12:55:38 +08:00 |
|
 shuo-hugeandClaude Fable 5
|
2f7a4b0979
|
feat(strategy): 策略可读取指数/ETF日K (market_data 模块 + 白名单 + 测试)
Custom/AI 策略此前被沙箱隔离, filter_history(df, params) 只能拿到个股历史窗口,
无法读取指数K线, 也就做不了「大盘指数 MACD 死叉」这类市场级过滤。
本改动新增框架侧受信模块 backend/app/strategy/market_data.py, 暴露只读纯函数:
- get_index_daily / get_etf_daily: 读取指数/ETF 日K(含技术指标, 支持列下推)
- get_daily: 按 repo.resolve_asset_type 自动分派(指数/ETF/股票)
- list_index_symbols: 枚举已收录指数
模块线程安全懒加载 repo (DataStore() 默认 settings.data_dir, 与 main.py 同源),
未知 symbol/缺数据返回空 DataFrame 不抛; 不向策略暴露文件访问或写能力。
ai_generator._ALLOWED_IMPORT_MODULES 放行 "app.strategy.market_data",
使 AI 生成与磁盘 Custom 策略均可 import 该模块; 其余模块/危险调用照旧拦截。
附 9 项框架级测试: 白名单放行/拦截、注入 fake repo 后委托与日期规范化、
按资产类型分派、坏 symbol/缺数据返回空、list_index_symbols。对既有策略零影响。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-08-26 09:36:06 +08:00 |
|
hanbinli52-sys
|
a36709ccbc
|
fix: make extension-loader isolation test version-agnostic
|
2026-08-26 00:54:39 +08:00 |
|
shy3130
|
f7b5f13945
|
feat(monitor): 轮询放量监控 — 相邻快照成交量/额差值阈值告警
新监控类型 volume_delta: 全市场相邻两次行情轮询的成交量增量 >= 阈值(默认
9000 手)即提醒, 镜像 ladder 封单监控的临时列注入模式。开盘保护(9:25 竞价
撮合/午休缺口不误报)、跨天清空、数据源重置防御; metric 支持手数/金额双
口径(金额对不同股价更公平); basic_filter 基础过滤(股价/总市值/流通市值/
成交额/剔除ST, 与策略 basic_filter 语义对齐); 命中超5只合并批量通知;
冷却期默认300s; 触发记录/SSE/Webhook 全链路复用。16项专项+104回归测试。
|
2026-08-25 14:07:16 +08:00 |
|
shy3130
|
196af2fa06
|
feat(monitor): 策略监控新建规则默认通知事件改为选股结果
DEFAULT_STRATEGY_NOTIFY_EVENTS 从买/卖信号改为进入/移出选股结果,
新建规则、类型切换、策略页创建监控三处默认随之生效; 与后端省略
notify_events 字段时的回填口径一致。旧规则空值回退(LEGACY)不变。
|
2026-08-25 09:52:56 +08:00 |
|
shy3130
|
0eb3e54b67
|
fix(data): 自定义源实时行情百分制涨跌幅截面自动归一为小数制
契约要求 change_pct/amplitude/turnover_rate 小数制(0.0366=3.66%),
但 a-stock-data 等第三方接口返回 3.66 表示 3.66%, 原样透传导致行业/
概念统计与前端展示整体放大 100 倍(用户反馈)。get_realtime 摄取边界
按截面中位数判定(|值|中位数>0.31 必为百分制, 小数制受 30cm 涨跌停
约束不可能超过), 整批归一; 小样本退用最大值; 附 7 项回归测试与文档说明。
|
2026-08-24 17:14:55 +08:00 |
|
shy3130
|
9883208847
|
fix(mainline): 维度映射返回值按形态取用, 修复重算偶发 Series 报错
用户反馈市场环境点重算偶发 'Series' object has no attribute 'group_by':
若 _load_concept_map_df 返回裸 DataFrame, 元组解包会把两列拆成 Series
(Series.is_empty 可通过, group_by 不存在)。改为按 tuple/DataFrame 实际
形态取值, market_mainline 与 build_rps_rotation 两处解包点同修,
附回归测试(裸 DataFrame 假实现端到端不炸)。
|
2026-08-24 17:14:48 +08:00 |
|
shy3130
|
b14ffda1bd
|
feat(ui): 数据源能力卡片显示 TickFlow 订阅档位要求与全档位标识
每张能力卡右上角显示该能力所需最低档位(全档位/Starter+/Pro+/Expert+,
配色与左侧菜单档位体系一致, 当前档位不足时琥珀描边提示), 替代原
"当前提供方"徽标(信息已由下方高亮标签承载)。TickFlow 详情头部与
列表卡片在"第三方"后增加 Expert 三色渐变的"已适配全档位"标识。
|
2026-08-24 17:14:48 +08:00 |
|
shy3130
|
971b4376d1
|
fix(ai): Codex CLI 状态检测实跑 --version 并移除老版本不支持的 --ephemeral
状态检测原为浅检查, 误报已连接; 改为 codex --version 实测。
--ephemeral 在 codex 0.58 等老版本不存在(unexpected argument),
隔离已由临时 CODEX_HOME 保证, 移除该参数。
|
2026-08-24 17:14:39 +08:00 |
|
shy3130
|
46635074e8
|
fix(ai): PR #193 新增 AI 调用放开 max_tokens 限制
合并 #193 引入的 3 处显式 max_tokens(信号生成 2000/策略代码 3000×2)
重新踩中 0ee3aa8 修过的问题: 推理模型思考 token 计入 max_tokens 预算,
显式限制挤占正文导致 JSON/代码截断。统一改为 None(请求不传该参数,
输出上限交给服务端默认)。四个分析器本就是 None, 标题生成 max_tokens=8
为刻意保留的小任务限制, 均不动。
|
2026-08-24 14:21:55 +08:00 |
|
shy3130
|
6c7c7088a9
|
feat(ui): 数据源能力卡片标签式路由 — 每个数据集单独选择提供方
- 每个数据源详情展示能力卡片, 卡片上以可点标签列出所有具备该能力的
数据源(TickFlow 恒为候选), 点标签即刻切换该数据集路由, 跨源自由组合
- 右上角徽标显示当前提供方; 除权因子含「跟随日K」标签(默认态)
- TickFlow 详情含全部能力 + 恢复默认; 插件 Key 配置区对齐 TickFlow 布局
- 插件详情「整体切换为该源」= 一键套用其全部适配能力, 其余回退 TickFlow
|
2026-08-24 14:21:45 +08:00 |
|
shy3130
|
ea746b97c7
|
feat(plugins): 新增 fuyao 同花顺官方实时行情插件(默认 hidden)与插件 Key 界面配置
- fuyao 插件: 全市场实时快照分页拉取, 字段对齐数据契约(pct 百分制÷100),
兼容官方文档与实际返回两种信封/字段名; 优化完成前 plugin.yaml 标记
hidden: true, 加载器跳过注册不展示, 删除该行即可开放
- plugin.yaml 新增 api_key_env 约定: 设置页提供 Key 输入框, 先探后存
(POST/DELETE /api/settings/plugin-key), secrets.json 优先于 .env
- secrets_store.get_env_backed_secret(field, env_name) 支持插件取 Key
- loader: 插件状态透出 api_key_env, 新增 probe_plugin_key 委托探测
- 31 个插件测试; docs/plugin-development.md 补充约定说明
|
2026-08-24 14:21:38 +08:00 |
|
shy3130
|
a4554794fc
|
fix(dev): macOS 下 dev.sh 启动失败修复
- bash 3.2 空数组在 set -u 下展开报 unbound variable, 加 ${arr[@]+...} 守卫
- 全局 /usr/local/bin/uvicorn (Xcode python3.9) 劫持 venv, 改用 python -m uvicorn
|
2026-08-24 14:21:27 +08:00 |
|
wshy
|
17ca24581a
|
Update README.md
|
2026-08-23 21:31:39 +08:00 |
|
shy3130
|
2e7673aa99
|
test: 修复 PR #193 合并后的 12 个测试 (alerts 参数/None 语义/自包含插件)
|
2026-08-23 19:36:00 +08:00 |
|
shy3130
|
0bb9d64f60
|
merge: 试验性合并 PR #193 (feat/ai-generate-signal) 到最新 main
|
2026-08-23 19:29:44 +08:00 |
|
shy3130
|
ea59c5da27
|
docs(screenshots): 更新监控中心截图为当前版本界面
|
2026-08-23 19:13:07 +08:00 |
|
shy3130
|
ff4274a5ed
|
fix(data): 僵死 enriched 发布标记不再阻塞清空与实时落盘
外部进程(崩掉的脚本/中断的管道)残留 state=publishing 标记且 owner pid
已死时, recover=False 的发布器会永久抛
"another enriched publication is incomplete":
- POST /api/data/clear 因此 500 (用户实测)
- 实时 enriched 落盘被持续挡住, 只能等下一次盘后管道 recover
修复: clear 端点与 repository 三处 enriched 写路径 (日K分区写 + 两处
实时 merge flush) 全部改 recover=True — 死进程残留首次写入即接管自愈;
活进程的发布仍抛 "another publication is active", 写盘竞态保护不变。
测试: 僵死标记+死 pid 下 clear 正常完成且标记回 ready、实时写入接管自愈;
全量 1002 passed。
|
2026-08-23 19:13:03 +08:00 |
|
shy3130
|
e15acddb2f
|
fix(pipeline): 停机缺口检测与自动修复, 防止盘中快照数据永久损坏
场景: 用户盘中停机后次日启动并开实时行情, 实时 flush 写出"今天"分区后,
盘后管道的「今天已有数据→只刷今天」分支会让停机日的半日快照永久留存
(close=停机时刻价, volume=半日累计, 技术指标全错且污染后续 lookback)。
判据 (quote_ts 列, 仅实时 flush 写入真实毫秒时间戳):
- null → batch 拉取/盘后计算的权威历史 → 完整
- 历史交易日时刻 < 15:00 → 盘中快照 → 坏
- ≥ 15:00 → 尾盘定版 → 完整; 今天不校验
读取走 parquet 元数据 statistics, 实测 ~0.5ms/分区。
三个钩子层层设防:
- 启动自检 (main.py): boot 后 30s 后台扫描, 窗口内坏数据自动创建修复任务
(复用 repair_daily 管道 + JobStore, ActiveJobCard 可见进度)
- 开实时门禁 (settings.py): 坏数据在 5 天窗口内 → 自动建修复任务并 409,
前端经现有 toast 机制展示; 窗口外放行不拦
- 盘后管道自愈 (daily_pipeline.py): 分支3前完整性扫描, 坏日 → 降级分支4
从 min(最新日, 坏日) 范围重拉; ETF/指数起点同步提前到各自族最早坏日
修复原语补强: 股票 enriched 的坏分区由 prune_enriched_partitions 先删再
当"新日期"重算 (增量重算只算不存在的日期, 分区已存在虽错也永不重算)。
分钟K缺口经修复管道 Step 2.5 增量同步天然补洞 (start=max(datetime) 幂等)。
测试: 新增 24 个 (判据/门禁/boot/端到端离线集成复刻用户场景),
全量 1002 passed。
|
2026-08-23 19:12:57 +08:00 |
|
shy3130
|
61130cfdff
|
fix(backtest): ETF/指数矩阵链路不再要求股本字段, 修复因子挖掘准备阶段失败
etf 维表(index_sync)物理上只有 symbol/name/code/asset_type, enriched 窄表
也不落盘股本字段; 而 DEFAULT_BASIC_FILTER 与矩阵缓存档 common_filter 均带
非 None 市值界, 依赖解析会无条件要求 total_shares/float_shares, 导致
_resolve_matrix_storage_fields 抛
"matrix parquet fields unavailable: ['float_shares', 'total_shares']"
(用户反馈: ETF 因子挖掘死于「准备共享撮合矩阵」阶段)。
- 新增 _basic_filter_for_asset: 非股票资产将市值/流通市值四项界置 None,
依赖解析前中和; 运行期过滤本就对缺失股本列降级 no-op, 无需改动
- StrategyDependencyResolver.resolve 新增 asset_type 参数(默认 stock,
旧调用行为不变), 四个调用点传入真实资产类型:
build_matrix_cache_profile / prepare_matrix_optimization /
单次回测 / composite 子计划
- mining_runtime._prepare_base_market 两处 resolve 传入 request.asset_type
- 新增回归测试: ETF 计划与缓存档不含股本字段、股票行为不变、
ETF 维表下字段解析成功、反向对照锁定失败模式
验证: 全量 pytest 976 passed; 真实组件端到端复现用户失败路径已转绿
(ETF enriched + 四列维表, 共享矩阵 (280,3) 构建成功)。
|
2026-08-23 17:46:54 +08:00 |
|
shy3130
|
f11d46a26d
|
docs(readme): 智谱致谢语句润色并附开放平台链接
|
2026-08-23 17:23:48 +08:00 |
|
shy3130
|
a6a4bcde43
|
fix(sync): 卡死判定改进度停滞 + 协作式取消 + 执行槽所有权
- reap 判定从总时长一刀切改为进度停滞(心跳 last_progress_at),
慢带宽冷启动不再被误杀; 12h 总时长硬上限兜底
- 协作式取消: JobCancelledError(BaseException) 经分块进度回调穿透,
僵尸线程在下一分块自行退出, UI 状态与执行体对齐
- 执行槽带所有权 token, 僵尸 finally 不得误释放新任务的槽
- 手动取消端点同样走协作式终止
- 前端超时卡片文案对齐停滞语义, 失败提示引导调整阈值
- 新增 10 个回归测试(972 passed)
|
2026-08-23 14:57:12 +08:00 |
|
shy3130
|
45bdbcbe65
|
fix(ci): 镜像版本标签规则 type=match 正则误写为 glob,改为 type=ref,event=tag
|
2026-08-23 14:36:50 +08:00 |
|
shy3130
|
0b57c33ca2
|
feat(ui): 异动监控新增 ST 过滤,默认开启
|
2026-08-23 14:21:06 +08:00 |
|
shy3130
|
fe8cb2ee1d
|
fix(ci): 移除 pyproject 指向仓库根的 readme 路径,修复 Docker 构建
|
2026-08-23 14:21:06 +08:00 |
|
shy3130
|
38186e2ce1
|
docs(readme): 界面截图更新为最新版本 + 数据源声明改插件化
- 预览表替换为最新中文命名截图, 新增 挖掘/自选 两格;
索引页同步重写并补 自选/挖掘/市场环境/异动监控 章节
- 项目声明改为 "数据源插件化, 可任意接入第三方数据源"
|
2026-08-23 13:48:25 +08:00 |
|
shy3130
|
725db30e47
|
docs: 数据源口径对齐插件化
- configuration.md: "本项目基于 TickFlow 数据源" 改为内置默认 +
插件化接入第三方, 链接两篇接入文档
- features.md: 「TickFlow 多源数据」节改为「数据源插件化」,
补 YAML 自定义源/插件源(stock-sdk)与五数据集自由组合说明
- custom-data-source.md: 支持范围三类 → 五类, 补 minute/financial
数据集契约 (与后端 DatasetName 和 provider 实现一致);
仅 depth5 暂无数据集契约仍由 TickFlow 提供
|
2026-08-23 13:48:24 +08:00 |
|
shy3130
|
89563541e6
|
fix(ui): 回测页标题 量化研究 → 回测
|
2026-08-23 13:48:24 +08:00 |
|
shy3130
|
c3ba43da95
|
Merge branch 'v0.2'
# Conflicts:
# dev.sh
|
2026-08-23 12:37:20 +08:00 |
|
shy3130
|
d0f91faec4
|
docs: 仓库地址更新为 tick-stock-panel (GitHub 重命名)
|
2026-08-23 12:36:02 +08:00 |
|
shy3130
|
dcb5814acf
|
docs(readme): 补齐 v0.2 能力清单与数据源插件化描述
- 核心功能表新增 因子挖掘/市场环境/异动监控 三行, 数据扩展行
改为数据源插件化 (stock-sdk 示例 + YAML 自定义源)
- 页面清单补 挖掘/市场环境/异动监控 三页; 自选补多分组管理,
监控中心补自选分组作用域, 设置页描述与能力标准口径对齐
- 技术栈数据源行、路线图 v0.2 行、文档表补 market-phase.md
与 plugin-development.md
|
2026-08-23 12:34:49 +08:00 |
|
shy3130
|
feab972de0
|
feat(ui): 数据源页徽章/按钮统一 + 操作后即时刷新实时行情状态
- 第三方徽章统一琥珀色; 插件化说明精简为一句 AI 接入提示并置顶;
三处「切换为当前数据源」按钮与「使用中」徽章统一样式
- 数据源列表卡片新增「已适配」数据集标识; TickFlow 详情格
描述去档位词, 改为事实描述
- 修复: Key 保存/清除/重新检测与数据源切换/删除/安装/卸载/
编辑保存后未失效 quoteStatus, 侧边栏实时行情最长 60s 才
刷新, 检测成功仍显示「不可用」; 现同步失效 capabilities +
quoteStatus 即时生效
|
2026-08-23 12:34:45 +08:00 |
|
shy3130
|
da3ada28e1
|
feat(v0.2): 功能门槛统一为数据源通用的能力标准
- 后端: 数据集→能力映射增广 (daily/adj_factor/minute/financial),
非 tickflow provider 按声明数据集动态 grant; 数据源偏好更新与
删除数据源后刷新 app.state.capabilities 快照; 新增 8 项测试
- 前端: 通用界面去档位词, 缺能力统一「{能力名} · 不可用」徽章
(capability-labels 新增 MissingCapChip, 点击跳设置→数据源);
StatCard/深度配置/分钟同步/历史扩展/财务页等 20+ 文件对齐;
实时模式判定改用 quoteStatus.mode 与 realtime_allowed,
替代前端 tierRank 推断; 监控设置页放开整页拦截
- 档位词仅保留 TickFlow 专属界面 (Key 配置/端点测速/引导页),
docs/configuration.md 档位表加注解说明
|
2026-08-23 12:34:40 +08:00 |
|
shy3130
|
0f2c7ce9b0
|
fix(backtest): 因子环境统计容忍数据边界=正式首日, 全部/1年范围不再报错
数据边界即正式首日 (本地数据首日=回测起点, 如「全部」/「1年」) 时, 首日
无 T-1 环境属正常。策略回测已有 clamp_formal_start_for_regime 首日让渡,
因子回测的环境分组统计路径漏了同样容差, 会整体报错阻断回测。
- align_regime_t_minus_one 新增 first_day_boundary_ok 参数 (默认 False,
过滤场景 fail-closed 行为不变): 统计场景首日无前驱时跳过首日不参与分组
- 因子 _calc_regime_stats 传入容差, 与策略侧首日让渡同口径;
内部缺口 (次日 T-1 缺环境) 仍 fail-closed 报错
- 回归测试: 边界容忍 + 分桶数正确 / 容差仅放行首日 / 内部缺口仍拒绝
|
2026-08-22 20:57:40 +08:00 |
|
shy3130
|
254e1962d0
|
feat(v0.2): 自选分组监控作用域 + 自选页交互增强 + 弱化默认数据源绑定
后端:
- 监控规则新增 scope=watchlist_group: 规则只存 group_id, 引擎按版本号缓存的
分组成员动态解析, 分组增删标的自动同步监控范围, 无需改规则
- 分组删除 fail-closed (规则暂停+runtime_warning), API 层校验分组存在性
- watchlist 服务增加数据版本号 _REVISION, 读取免锁、写后立即失效引擎缓存
- stock-sdk 插件 display_name 去掉括号合规备注 (说明保留在 description)
前端:
- RuleEditor 分组模式交互 (选择分组/成员预览/动态绑定提示), Monitor 列表分组摘要
- 自选搜索: Plus 快速加当前分组 + FolderPlus 展开分组菜单; 多分组圆点叠瓦显示
- 搜索下拉加宽防名称截断, 创/科/ETF 标签紧贴名称
- 自选筛选新增「排除ST」开关 (默认关, 持久化)
- 个股详情新增异动信息条: 状态着色/窗口偏离/接近度/计算时间 (无数据不显示)
- 引导页: 能力探测按数据源分流 (仅选 TickFlow 才显示 Key/档位), 切换 loading 收进卡片
- 看板空态/首次弹窗按数据源分流文案, 去除 Key/None 档引导注册表述
- 侧边栏实时行情无权限态改为「不可用 + 去配置数据源」
- 设置-数据源页: 新增插件化与配置文档说明块, 内置/插件标识统一改为第三方
测试: test_monitor_group_scope.py 8 例 (动态成员/删除分组/校验/API), 全量 946 passed
|
2026-08-22 20:26:34 +08:00 |
|
shy3130
|
f856b4a8f8
|
回测「全部」范围与环境过滤冲突时自动顺延正式起点
正式首日 = 面板首日 (数据边界, 如「全部」范围从本地数据第一天开始) 时,
T-1 环境校验所需的上一交易日不在面板内, fail-closed 直接报错且用户
无法补更早数据。新增 clamp_formal_start_for_regime: 首日让渡为预热,
正式起点顺延到第二个交易日 (首日环境即成为次日 T-1), 仅损失 1 个
正式交易日。接入 run() 三条数据分支与优化器共享矩阵路径, 结果 config
回显实际生效起点。
|
2026-08-21 17:41:42 +08:00 |
|
shy3130
|
21260f1053
|
异动监控修复与规则口径对齐 (上交所交易规则 2026 修订)
- 盘中增量路径补算偏离列: compute_enriched_today 补 momentum_3d,
live_agg 新增 _close_3d_ago 递推状态, 增量/全量回退两路径统一附着
今日偏离 (基准 = 历史帧昨收 × (1+指数实时涨跌) 外推, 排除盘中
写入的今日指数行), 修复盘中异动列表恒为空的问题
- 主板 ST 口径统一: 2026-07-06 起风险警示股票涨跌幅 10% 且异常波动
特别规定废止, 删除原 ±15%/10日+50%/30日+100% 从严表, ST 与普通
主板同标准
- 严重异常波动负向阈值对齐官方不对称口径: 10日 +100%(-50%),
30日 +200%(-70%), 跌方向更早触发; 前端规则表/窗口徽标同步双侧显示
|
2026-08-21 17:41:35 +08:00 |
|
dev
|
8519a2bd16
|
feat(ai): AI 生成自定义信号条件
- 新增 /api/signals/ai/generate 接口:自然语言描述 → 结构化信号条件
- 新增 custom_signals_ai 模块:组装提示词 + 解析校验 AI 返回的 JSON
- 复用 custom_signals.validate() 白名单安全闸门
- 新增输出 token 上限和上下文窗口设置
- 实现 AI 请求 max_tokens 钳制和输入预算检查
- 自定义信号右值字段名容错处理
- 增强 JSON 解析容错(尾随逗号、垃圾字符)
- 前端自定义信号对话框接入 AI 生成
|
2026-08-21 09:55:24 +08:00 |
|