shy3130
93558cf3b3
feat(regime): 市场环境页全面增强 — 内存可控/开关/画像/美化/分批可配
...
后端
- 修复 /recompute 全量分支误调增量函数致 computed 恒 0: 改为 earliest~today
走 run_regime_batch + upsert 强制覆盖
- 修复 /history 日期范围模式被 limit 默认 120 截断: limit 仅在未传 start/end 时生效
- _scan_enriched_fallback:
· 修复 compute_limit_signals 漏传 instruments 参数致慢路径必抛异常
· needed 白名单: 只算 regime 用到的列, 全量峰值 6.8GB→3.2GB
· 分批 + warmup: 范围超 batch_days 时切片, 每批带 warmup 前缀算后 concat,
全量峰值再降至 ~1.9GB; batch/warmup 参数从用户偏好读取
- _aggregate_daily: 逐日 filter 扫全表(O(N²))改为 polars 向量化 group_by
- 新增 enriched_date_set / earliest_enriched_date 辅助函数
- 盘后管道 regime 计算加开关(preferences.get_pipeline_regime_enabled), 默认关闭
- 新增偏好: regime_batch_days(默认60, 25~500) / regime_warmup_days(默认40, 35~90)
- 新增 API: PUT /preferences/pipeline-regime-enabled, PUT /preferences/regime-batch-params
前端
- 市场环境页时间范围控件: select 三档 → 4 档按钮组(1年/2年/自定义/全部)
· 自定义弹窗手动输入天数(1~1000 钳制) + 快捷预设
· 全部走 regimeCoverage 拿实际日期范围用 start/end 请求
- 市场环境页美化(对齐 Dashboard 设计语言): 渐变条头部/半透明卡片/SectionTitle/
指标卡进度条/语义色 bull-bear
- 新建 RegimeConfigCard: 盘后自动计算开关 + 全量回填分批参数(每批天数/预热天数/
快捷预设省内存·默认·更快)
- 数据页画像加市场环境卡片(独立 regimeCoverage 查询, 同步后刷新, 齿轮设置弹窗)
- 菜单排序设置 + 侧边栏 nav 加入市场环境, 默认排在复盘上面
- Layout 市场环境菜单 badge 改用琥珀胶囊(对齐 Settings 数据源标签)
验证
- 后端 582 passed; 真实数据全量回填产出 986 天, 内存峰值 ~1.9GB(原 6.8GB)
- 前端 tsc + pnpm build 通过
- 分批参数实测生效: batch=30 峰值 1896MB / batch=500 峰值 3772MB
2026-08-02 16:25:21 +08:00
shy3130
46ebcd89c8
fix(regime): 修复重算无产出并补全 beta 标签
...
后端
- /recompute 全量分支原本误调 compute_regime_incremental(增量补差),
无缺口/stale 时直接返回 0 行; 改为用 earliest_enriched_date ~ 今天
走 run_regime_batch + upsert 强制覆盖, 真正实现"全量重算"
- _scan_enriched_fallback 原本漏调 compute_limit_signals 的 instruments
参数致慢路径必抛异常 → enriched 缓存未预热时拿不到含信号列数据 → 聚合
返回空; 改用主管道同款 compute_all(df, instruments, historical_shares)
一站式补算, 与 indicators/pipeline.py 对齐
- 新增 enriched_date_set / earliest_enriched_date 辅助函数(抽出复用)
前端
- Regime 重算按钮: 加"重算中…"文字反馈 + 完成 toast(区分有/无新数据) +
catch 捕获错误(原异常被静默吞掉)
- 市场环境菜单加 beta 胶囊标签(对齐 Settings 数据源标签样式)
验证
- 后端 582 passed; 真实数据全量重算产出 986 行(2022-07-08 ~ 2026-07-31)
- 前端 tsc + pnpm build 通过
2026-08-02 12:22:48 +08:00
shy3130
4ee55e40c6
feat(regime): 新增市场状态识别系统并接入叠加策略回测过滤器
...
后端
- 新增 services/regime_builder.py:5 档日级市场状态分级(strong/lean_strong/range/lean_weak/weak)
- 新增 api/regime.py:5 个 regime 查询接口
- daily_pipeline 接入 regime 构建(step 2.6,soft-fail + 双检测自愈)
- 回测 strategy.py 新增 regime_filter 过滤:采用 T-1 防未来函数,仅作用于入场信号
在 composite / matrix_native / prepared 三处注入 entry_time_mask
- backtest API 透传 regime_filter(REST + SSE);_make_job_key 纳入 regime_filter 以隔离缓存
- 兼容 _RepoStub 测试夹具(store 属性缺失场景)
前端
- 新增 Regime 页面、路由、导航入口、api 类型与 queryKeys
- 叠加策略回测页新增 regime 过滤器控件
测试
- 新增 tests/test_regime_builder.py(18 项),覆盖分级逻辑、T-1 防未来函数、空值降级、三处 mask 注入
- 全量后端测试 582 passed;前端 pnpm build 通过;git diff --check 无空白错误
2026-08-02 12:05:20 +08:00
shy3130
a2bea0240a
fix(ui): 修复所有弹窗拖拽穿透导致误关闭的问题
...
问题: 用户在弹窗内容内拖选文本时, 鼠标移到遮罩松开会触发遮罩 click, 导致弹窗意外关闭(click 派发给 mousedown/mouseup 共同祖先)。
方案: 抽取共享 hook useDialogBackdrop, 用 mousedown 跟踪——只有按下和松开都在遮罩上才关闭。Modal.tsx 内置同样逻辑。所有手写遮罩弹窗统一接入。
2026-08-02 10:56:24 +08:00
shy3130
4696fef959
feat(composite): 新增叠加策略(composite)支持选股与回测
...
引入第四种执行后端 composite: 声明式引用多个子策略, 复用现有注册表/缓存/撮合全链路。
核心设计:
- 退出采用来源投影(每个子策略 exit 仅在自己持仓窗口生效, 不串平其他子策略仓位)
- 评分用标准化排名加权(跨子策略可比, 不依赖 per-strategy 的 min-max 量纲)
- 来源归因(entry_signal_code 标记来源子策略)
后端:
- engine.py: CompositeSpec 数据模型, 两阶段引用校验(孤儿移除/嵌套禁止/asset_types 子集/≤8 上限), _run_composite_strategy 选股执行, find_dependents 删除防护, override_loader 注入保证子策略与单独跑同口径
- composite.py(新): 选股 merge_results + 回测 merge_signal_matrices 合并器(退出投影/排名融合/归因)
- backtest/strategy.py: composite 回测分支(特征计划合并/逐子信号/统一风控/basic_filter/归因)
- api/strategy.py: POST /composite/save 端点, _strategy_detail 返回 composite_children(含 name/source), 删除依赖 409 防护
- monitor.py: 实时监控 fail-closed(回退盘后缓存)
- walkforward.py: 对 composite 显式中文报错
- worker.py: _strategy_dirs 补 composite 目录(修复回测子进程找不到 composite 的 bug)
前端:
- CompositeStrategyDialog(新): 创建/编辑弹窗(自动生成 composite_ ID, 权重归一, 类型标签, 增删子策略)
- StrategySettingsDialog: composite 设置面板(子策略增删改/归一/类型标签)
- StrategyBacktest: 回测页 composite 适配(分组/参数区/结果区展示子策略构成)
- api.ts: 类型扩展(source/backend 加 composite, composite_children 含 name/source)
测试: 36 个 composite 专项测试(加载/选股/回测退出投影/排名/归因/override 透传/API/删除防护), 端到端验证真实内置策略回测通过
2026-08-02 10:56:03 +08:00
shy3130
e803aa374d
chore: 版本号升至 0.1.88
...
统一升级 4 处版本号至 0.1.88:
- VERSION / backend/app/__init__.py / frontend/package.json: 0.1.87 → 0.1.88
- backend/pyproject.toml: 0.1.83 → 0.1.88 (原已滞后 4 个版本, 一并追上)
本版本包含:
- feat(search): 拼音首字母搜索 + 创业/科创/北交所徽标 (#151 )
- fix(security): ext_columns DuckDB SQL 注入修复 (#152 , closes #150 )
2026-07-31 20:03:43 +08:00
shy3130
192f6c4aa9
feat(search): 标的搜索支持拼音首字母 + 创业/科创/北交所徽标
...
## 1. 拼音首字母搜索 (同花顺式)
后端 search_instruments 新增拼音匹配层, 输入 payh 可命中「平安银行」。
- 辅助函数 _name_pinyin_keys 用 lru_cache 缓存「名称→首字母串」, 命中后
近似 dict 查找, 全市场遍历 < 1ms
- 多音字用 heteronym 笛卡尔积展开, 「重庆」同时匹配 cq/zq 两种读音;
并加载 A 股高频地名词典 (重庆/长安/长春/长沙/长城/长江)
- 拼音分支仅在纯 ASCII 字母输入时触发, 中文/数字搜索零开销跳过,
完全向后兼容
- 搜索分层: ① code/symbol 前缀 → ② 拼音首字母前缀 → ③ 包含匹配
新增依赖: pypinyin>=0.50 (纯 Python, 无 C 扩展)
新增测试: tests/test_instrument_search.py (15 用例覆盖拼音/多音字/兼容/边界)
## 2. 搜索结果显示板块徽标
自选/财务搜索/监控规则/回测选标的 四个搜索入口的结果项, 现在会显示
创业板(橙「创」)/科创板(青「科」)/北交所(紫「北」)彩色徽标。
- 复用项目既有的 boardTag (@/components/stock-table/primitives),
与自选/策略/Dashboard 表格徽标样式完全统一
- 沪深主板不显示徽标 (信息量低, 保持简洁)
## 验证
- 后端全量测试 503 passed (含新增 15)
- 前端 tsc --noEmit 零错误
2026-07-31 19:38:36 +08:00
wshy
84bc6cb875
Merge pull request #145 from intfoo/feat/index-support
...
自选/监控/个股分析支持指数(asset_type="index")
2026-07-31 19:19:17 +08:00
wshy
b59be65107
Merge pull request #143 from CJ0Hn/feat/watchlist-screenshot-import
...
fix: 自选截图导入优化
2026-07-31 19:11:12 +08:00
wshy
ceb53735b5
Merge pull request #134 from CJ0Hn/fix/numba-parallel-serialize
...
fix: 串行化 Numba parallel 内核,避免策略页并发崩溃
2026-07-31 19:08:07 +08:00
shy3130
4b6e94e020
修复回测风控参数恢复旧缓存的问题
2026-07-29 21:27:02 +08:00
intfoo
865e75fc8b
fix(index): 修复 PR #46 四个阻断项
...
阻断项1: 前端 TypeScript 类型扩展
- MonitorRule.asset_type 加 'index' (api.ts:517)
- screenerStrategies 参数加 'index' (api.ts:1412)
- klineMinute 响应 asset_type 去重 (api.ts:1296)
阻断项2: 指数监控独立评估
- _evaluate_monitors 股票早期 return 降级为 stock_ready 标志
仅跳过股票轮, ETF/指数轮独立判断数据新鲜度
- 纯指数行情/自选场景下指数规则可正常触发
阻断项3: 核心指数模式不截断分区
- _process_full_market_records 按 index_mode 条件分支:
mode=all (完整 CN_Index) → flush 覆盖; mode=core (部分标的) → merge 不截断
- merge_live_enriched_asset 对 index 正确更新 _index_enriched_cache
阻断项4: Free 档额度分批
- _fetch_watchlist_quotes 用 resolve_limit + chunked 按 capability batch 上限分批
- 失败批次跳过不整轮退出, 已有股票实时刷新不受影响
- 复用进程级共享限速器 sleep_between_batches
测试: +7 测试覆盖 4 个阻断项核心场景
2026-07-28 21:13:10 +08:00
intfoo
76202e0937
fix(index): 前端指数分钟K降级与文案资产中立化
...
- StockIntradayChart 指数不显示「获取分钟K/重新获取」按钮, 改静态提示
(指数分钟K仅实时读取, 后端 sync_minute_single 显式拒绝落库)
- api.ts klineMinute 响应类型加 asset_type 可选字段
- RuleEditor/Monitor 文案: 默认规则名/徽标/placeholder/报错/空状态
"个股信号(监控)→信号(监控)" "指定股票→指定标的" "股票→标的"
2026-07-26 19:59:30 +08:00
intfoo
4d069cc10f
feat: 指数(asset_type=index)前端接入 — 自选/监控规则/分析页
...
- 自选: 搜索含指数+徽标; 板块筛选豁免非股票行; 分时列指数降级
- 监控: RuleEditor 指数资产选项 (仅 signal/price, 隐藏涨停/分时信号); 规则列表指数徽标
- 分析: StockFinancialSearch assetTypes prop; StockAnalysis 搜索开放指数
2026-07-26 18:35:54 +08:00
shy3130
b43b177899
feat(monitor): add strategy signal event controls
2026-07-26 16:08:42 +08:00
CJohn
3e150ff600
feat(ocr): 截图导入支持多选并串行识别合并
...
- 文件选择与拖拽支持一次选多张截图,前端按队列逐张调用
import-image,同一时刻只跑一路 OCR,避免加重小内存机器峰值
- 多张识别结果按股票代码合并去重,优先保留已匹配项,已在自选标记取并集
- 展示多图缩略预览与「识别中 x/y」进度;一次最多 10 张
- request 增加 quiet 选项,队列内失败不逐条弹 toast,结束后统一提示
2026-07-26 12:51:55 +08:00
CJohn
e526d25fd0
fix(ocr): 完善截图导入的安全限制与交互状态
...
- 在 Pillow 完整解码前检查图片像素数,并将 DecompressionBombError
转为明确的参数错误,避免压缩大图在校验前占用过多内存
- 为 OCR 线程任务设置独立的 AnyIO CapacityLimiter(2),最多同时执行
两次图片解码与 Tesseract 识别,其余请求排队等待
- 前端调用 ocr-status 检查 Tesseract 是否可用;不可用时禁用截图导入
入口,并按 Windows、macOS 和 Linux 显示对应安装说明
- 关闭弹窗或重新选择图片时取消旧请求,并通过请求代次校验忽略迟到
的异步结果,防止旧候选回写到新弹窗
- 禁用已存在于自选列表中的候选项,批量添加接口返回实际净新增数量,
成功提示使用后端返回值
- 补充图片类型与大小校验、解压炸弹、OCR 状态、并发限制以及批量添加
数量等测试
2026-07-26 12:19:55 +08:00
CJohn
33921fcc51
fix: 串行化 Numba parallel 内核,避免策略页并发崩溃
...
并发 run_all 会触发 workqueue Concurrent access,导致后端进程中断。
为 matrix parallel 内核加进程锁,前端对 run_all 做 pending 去重。
2026-07-26 11:56:10 +08:00
shy3130
6f1c4032bb
feat(backtest): toggle auxiliary nav series
2026-07-26 00:31:38 +08:00
shy3130
6d7092089c
fix(data-source): harden custom source testing
2026-07-25 22:51:27 +08:00
shy3130
96fcbe4fff
fix(data-source): validate custom request settings
2026-07-25 22:13:38 +08:00
wshy
fffd89fce0
Merge pull request #138 from intfoo/feat/custom-source-timeout-param-ui
...
自定义数据源超时与请求参数名支持前端配置
2026-07-25 22:01:11 +08:00
HelloByeAll
852cc2f319
新增: 在回测净值图叠加仓位曲线
2026-07-24 21:12:26 +08:00
intfoo
a15d0468cc
feat(data-source): expose custom source timeout & request param names in UI
...
- backend: pass timeout through DatasetConfigIn / _config_to_dict / _sanitize_dataset
(previously a hand-set YAML timeout was silently wiped on UI save, resetting to 30s)
- frontend: add per-dataset timeout input; collapsible 请求参数字段映射 with
symbols/start/end_param (non-realtime) + asset_type/freq_param (minute);
rename 字段映射 -> 响应参数字段映射; chevron at title end; realtime empty-state hint
- test: timeout config round-trip (custom value persists, default 30 not emitted)
- docs: document timeout in custom-data-source.md
2026-07-23 16:22:18 +08:00
shy3130
60fe9e6fa6
修复回测指标数据缺失提示问题
2026-07-22 13:30:02 +08:00
shy3130
a12e49d66d
修复实时行情下策略图表闪烁问题
2026-07-22 11:42:57 +08:00
shy3130
2c14fde788
完善个股点位提醒并发布0.1.87
2026-07-21 22:14:07 +08:00
shy3130
b4dae4bca1
修复股票与ETF切换误清策略池
2026-07-21 21:39:05 +08:00
shy3130
0ac6d6f56c
修复分析报告复制按钮兼容性
2026-07-21 20:50:34 +08:00
shy3130
0cb0b38437
修复看板监控通知个股弹窗
2026-07-20 17:10:15 +08:00
shy3130
72918fe602
优化策略卡片结果加载性能
2026-07-20 13:01:03 +08:00
shy3130
ed41f7b950
修复:个股详情量比开关显示异常
2026-07-20 09:59:14 +08:00
shy3130
4df3062002
fix: 完善自定义分钟数据源配置与异常处理
...
- 补齐资产类型和周期参数在 API、YAML 与前端编辑器中的保存回读
- 权限判断和分时监控统一复用安全的数据源解析边界
- 增加配置往返及解析异常回归测试
2026-07-19 17:01:33 +08:00
shy3130
b1b2494db9
merge: 合并 PR #128 自定义分钟数据源支持
2026-07-19 16:52:52 +08:00
shy3130
b17c882e27
feat: 完善历史换手率重算入口
...
- 财务数据统计纳入历史股本,并在数据页提供分批重算入口
- 缺少股本历史时阻止重算,并接入现有任务进度
- 财务分析卡片使用更新图标,明确数据拉取语义
2026-07-19 16:42:03 +08:00
intfoo
91e16db547
fix(layout): 修复 None 档+自定义实时源用户侧边栏指数行情不显示
...
承接 #121 review: Layout.tsx:631 的 !isNoneTier 一刀切判定与同文件
546 行实时行情开关判据不一致, 导致 None 档+自定义实时源用户监控页
放行、实时开关可用, 但侧边栏指数行情卡片不渲染。后端
/api/intraday/indices 从缓存读取不调 TickFlow, 对该用户有数据,
纯前端拦截导致 UI 体验不一致。
将 !isNoneTier 改为 (!isNoneTier || !!realtimeProviderName),
与实时行情开关判据对齐。
2026-07-19 13:35:36 +08:00
intfoo and shy3130
e2ffde99d5
fix(minute,monitoring): 自定义数据源用户单股补拉/监控页打通 ( #121 )
...
承接 #126 : 能力探测已补 KLINE_MINUTE_BATCH, 但两处取数/UI 仍按 TickFlow
档位拦截, 配了自定义分钟/实时源的 None 档用户依旧被挡。
- kline_sync.fetch_minute_single: 与 sync_minute_batch 一致, 先查
preferences.get_minute_data_provider(), 非 tickflow 且自定义源有
minute dataset 时走 custom provider, 避免分时图首次打开(本地无数据)
补拉返回空。
- Monitoring.tsx: None 档但配了自定义实时源时, 后端
is_realtime_allowed(realtime_mode=full_market) 仍返回 True。
以 quoteStatus.realtime_allowed 作为最终判据, 不再用 isNoneTier
一刀切拦截实时监控页。
Co-authored-by: shy3130 <shy3130@users.noreply.github.com >
2026-07-19 13:26:52 +08:00
shy3130
8e4258cf20
feat: support historical price limits and share capital
2026-07-18 23:37:54 +08:00
shy3130
ff12790042
feat: add trading-day volume comparison
2026-07-18 17:46:58 +08:00
shy3130
44ab51e65d
feat: improve strategy scoring and backtest execution
2026-07-18 16:59:53 +08:00
shy3130
a1e8be58db
feat: release v0.1.86
2026-07-18 00:49:28 +08:00
shy3130
34eaba3010
fix: handle uncovered walk-forward folds
2026-07-17 14:00:16 +08:00
shy3130
1e38c8cebb
fix: reset strategy builder identity
2026-07-16 16:12:06 +08:00
shy3130
c763a6970f
fix: restore strategy and data compatibility
2026-07-16 14:34:07 +08:00
lytem28
b6cf0495e1
feat: complete matrix-native backtest engine
...
Unify strategy execution across backtest, screener, and monitoring; isolate backtest workloads in spawn workers; and add shared matrix caching plus valid-bar indicator acceleration.
2026-07-16 12:17:27 +08:00
ChenJunheng
6f084e1b29
feat(watchlist): 支持从券商自选截图批量导入
...
基于 Tesseract OCR 识别六位代码并校验证券主数据,前端提供导入确认弹窗;
修复批量添加后 enriched 缓存未刷新导致需手动刷新页面的问题。
2026-07-15 23:25:46 +08:00
shy3130
0b3b769ca8
fix(strategy): clear saved strategy drafts
2026-07-15 20:51:07 +08:00
wshy and shy3130
e456d018fc
feat(strategy): AI生成/自定义编写 tab 加策略开发指南链接 ( #125 )
...
两个 tab 的描述行都加了指向 GitHub strategy-guide.md 的链接,
方便用户参考指标列/信号列/filter_history 写法/参数类型等。
Co-authored-by: shy3130 <shy3130@users.noreply.github.com >
2026-07-14 21:59:56 +08:00
wshy and shy3130
ee17261feb
fix(strategy): parsePyValue 对非 JSON 值兜底, 修复 AI 修改 date 参数崩溃 ( #124 )
...
get() 对字符串值去外层引号后传给 parsePyValue, 字符串型 default
(如 date 类型的 "2024-01-01") 去引号变成 2024-01-01, JSON.parse
在 position 4 报错 → 整个 StrategyBuilderDialog 白屏。
parsePyValue 加 try/catch: JSON.parse 失败时返回原始字符串。
数字/布尔不受影响, 字符串值兜底为字符串。
Co-authored-by: shy3130 <shy3130@users.noreply.github.com >
2026-07-14 21:52:24 +08:00
wshy and shy3130
f470e46f2b
fix(security): 策略代码 RCE 漏洞三层修复 ( #122 )
...
漏洞链 (安全研究员 Aeon 报告):
1. StrategyCodeSaveRequest.strict 由客户端控制, 传 false 完全跳过安全校验
2. AST 名单只拦 ast.Name 直接调用, dunder 遍历可绕过
((lambda:0).__globals__["__builtins__"]["__import__"]("os"))
3. _load_file 用 exec_module 执行策略文件, 执行侧零校验
=> 未认证局域网用户可写入任意代码并立即执行 (RCE)
修复:
- strategy.py: 移除 strict 字段, 安全校验无条件执行 (第1层)
- ai_generator.py: _validate_safety 加固, 拦截 dunder 属性访问
(__globals__/__builtins__/__class__/__subclasses__ 等) 和字符串下标
访问 (第2层)
- engine.py: _load_file 在 exec_module 前读文件内容跑一次 _validate_safety,
防止策略文件被直接篡改绕过 API 校验 (第3层 纵深防御)
前端: api.ts 移除 strict 参数, StrategyBuilderDialog/StrategyPoolDialog
移除 strict:true 传参 (前端本就全部传 true, 行为不变)
验证: PoC 三种攻击 payload 全部拦截, 正常策略(只import polars)无误杀
Co-authored-by: shy3130 <shy3130@users.noreply.github.com >
2026-07-14 21:32:39 +08:00