Commit Graph
100 Commits
Author SHA1 Message Date
shy3130 65f46a1e7f feat(mainline): 主线与情绪周期统计默认剔除风险警示(ST)股
问题: ST板块 241 天中 209 天上主线榜、108 天第一。原因: ① ST 是跨行业
状态桶(416只)非投资题材, 真实主线被概念拆分而 ST 统一聚桶; ② 主板 ST
2026-07-06 前涨跌幅 5%(价格规则已内置切换日), 封板成本减半, 弱市刷板
(7/1 全市场 218 家涨停中 67 家 ST); ③ 概念成分/ST 标记按当前维表快照
回写历史存在归属污染。

改动:
- market_mainline: load_risk_warning_symbols(维表名称含 ST, 与涨跌停
  判定共用 price_limits 权威实现, 600s 缓存); compute_mainline_range
  聚合前剔除, exclude_st 参数可覆盖
- regime_builder: run_regime_batch 汇聚点统一剔除(情绪驱动与主线同
  口径); 宽度类指标同 df 过滤, 占比几乎不受影响
- preferences: sentiment_exclude_st 默认 True; 经 mainline-filter
  API 可读写; 前端过滤面板加开关, 切换时自动全量重算
- 测试: 符号集加载/缓存、主线剔除(计数/龙头/最小涨停门槛交互)、
  regime 剔除 A/B、偏好往返; 说明书 FAQ 24.11

验证: 后端 918 测试通过(新增 5 个); tsc 通过; 全量重算后主线 0 行
ST 上榜(此前 209 天), rank1 变为海工装备/卫星导航/液冷服务器等真实
主题; 7/1 涨停数 218→151 与 ST 占比精确吻合; A/B 对照: 阶段标签
34/242 天变化(rally/ignite→repair 为主, 方向符合预期 — 剔除 ST 灌水
后正面阶段更难触发), repair 主导(78%)为口径切换前既有特征。
2026-08-17 16:49:28 +08:00
shy3130 7c30f5bcac feat(regime): 情绪周期易用性完善 — 阶段指南/历史分位/阶段规律/切换提醒
- 当前阶段卡: 阶段含义 hover 提示 + 应对建议常显 (六阶段操作指引)
- 5 张指标卡: 所选时间窗口内的历史分位徽标 p{N} (≥20 样本才显示)
- 阶段规律卡: 当前阶段历史段数/平均/最长天数 + 下阶段转移分布,
  持续天数超历史平均时给警示徽标
- 时间轴: 今日竖线 markLine + ▲彩色阶段切换点 markPoint
- 后端: regime_builder.latest_phase_transition 检测末两日阶段切换,
  daily_pipeline 计算后经 push_alerts 推送通知 (切入退潮/冰点为 warn,
  其余 info); 软失败不阻断管道

验证: tsc 通过; pytest regime/phase/market 67 通过;
浏览器实测 (截图 + DOM 双重核实): 应对建议/分位徽标 p27~p100/
阶段规律 31段平均50天/今日线与切换点均正常渲染;
ruff 相对 HEAD 无新增问题。
2026-08-17 15:23:32 +08:00
shy3130 867698a696 fix(monitor): 通知进入/移出配色对齐 A 股红涨绿跌惯例
原配色: 进入=绿(emerald)/移出=黄(warning)+列表里移出=红, 语义反直觉。
调整为 进入=红(text-danger)/移出=绿(text-bear), 与买入/卖出、涨跌幅
配色语义一致 (红=正向, 绿=负向)。

- strategyMonitorEvents.ts META: 事件动作短语配色中心定义, 弹窗/监控页/
  看板/语音播报四处共用, 一处修改全局生效
- AlertToast.tsx SOURCE_BADGE: 弹窗顶部"进入/移出"角标同步换色
- Monitor.tsx renderMessage: 正则补"进入"分支 (原只匹配 新入选|移出,
  实际通知文案是"策略「X」进入选股结果…", 进入消息从未着色) + 换色

验证: tsc 通过; 实测监控中心页面 getComputedStyle — 进入选股结果
rgb(242,76,64)/红, 移出选股结果 rgb(38,192,120)/绿。
2026-08-17 13:19:18 +08:00
shy3130 41e99b6974 feat(regime): 阶段×主线表格限高滚动 + 吸顶表头
段数多时(2y 范围 50+ 段)表格把页面拉得很长。改为 max-h-420px 内滚动,
表头 sticky 吸顶保证滚动时列名可见。

实现注意:
- sticky 必须加在 th 而非 tr (后者在 Chromium 不生效)
- 表格改 border-separate border-spacing-0 — Chromium 在 preflight 默认的
  border-collapse:collapse 下表格元素 sticky 完全失效 (computed 为 sticky
  但不粘, crbug.com/702927); separate 模式下 tr 边框不绘制, 行分隔线
  相应从 tr 挪到 td, 视觉不变

验证: tsc 通过; 实测容器 clientH=420/scrollH=1860 (页面少滚 ~1440px),
容器内滚动 1441px 后 th 与容器顶 delta=0 (吸顶生效), 截图确认列名行
固定、数据行正常。截图 gui-test-screenshots/regime-segments-*.png
2026-08-17 13:03:19 +08:00
shy3130 72c56963dd feat(regime): 市场环境/情绪周期 tab 切换 — 减少单页滚动高度
页面原为长滚动: 情绪周期组(阶段概览/时间轴/阶段×主线/主线排行)与
市场环境组(最新日概览/状态时间轴/趋势分布/日历热力图)全部纵向堆叠。

- 头部下方新增「市场环境 / 情绪周期」分段切换 (样式对齐时间范围按钮组),
  副标题随视图切换; 默认市场环境 (基础数据始终有, 情绪周期需重算回填)
- 两组区块分别包 hidden 容器切换显隐 — 保持挂载不销毁 ECharts 实例,
  切回无需重建
- useEChart 在 setOption 后追加 resize(): 容器从 display:none 恢复可见时
  画布尺寸从 0 重算; 三个图表 deps 增加 view 触发

验证: tsc 通过; 实测默认加载/切情绪周期/切回三态 — tab 激活正确、
两组内容互斥显隐、图表 canvas 尺寸随可见性正确变化 (1254x280 /
822x320 / 391x320, 隐藏态 0), 截图存 gui-test-screenshots/regime-tab-*.png
2026-08-17 12:53:53 +08:00
shy3130 5d6669d4f3 fix(regime): 情绪周期时间轴冷加载空白 — useEChart 惰性 init
useEChart 的 init effect 依赖为 [] 仅组件挂载时执行一次, 而情绪周期图的
容器 div 是条件渲染 (hasPhaseData && rows.length > 0)。冷加载/硬刷新时
history 查询异步未返回 → 首帧 rows 为空 → div 不在 DOM → init 扑空且
永不再执行; 数据到达后卡片出现但 ECharts 实例从未创建, 280px 画布永久
空白 (趋势图/分布图容器为无条件渲染故不受影响)。5 分钟缓存内的二次
导航首帧即有数据, 所以表现为"时好时坏"。

修复: init 从挂载 effect 挪入 setOption effect 做惰性创建 — option 变化
时若 div 已挂载且实例不存在则补建, 再 setOption。无条件容器行为不变。

验证: tsc 通过; 新标签页冷加载 /regime 实测 — canvas 数 3 (修复前冷加载
该图为 0), 情绪周期画布 1254x280, 截图确认红线/琥珀柱/蓝虚线/图例/
双轴刻度/缩放滑块/阶段色带全部渲染 (gui-test-screenshots/regime-phase-
chart-after-fix.png)。
2026-08-17 12:43:33 +08:00
shy3130 8929cb310e fix(depth): 五档盘口轮询依赖实时行情开关
depth 盘中轮询原只受「连板梯队监控」开关 + DEPTH5_BATCH 能力门控,
与实时行情开关无关。实时行情关闭时 enriched 内存缓存停留在上一
交易日, 轮询线程整个盘中反复拉取陈旧的涨跌停名单 (如周一开盘仍在
拉上周五的 49 只), 浪费 API 额度且数据无意义。

- start_polling 增加 realtime_quotes_enabled 门控: 三重 AND
  (监控开关 ∧ 实时行情 ∧ 能力), boot 启动/监控开关切换路径自动生效
- update_realtime_quotes 保存偏好后同步启停 depth 轮询: 开实时行情
  → start_polling (仍受监控开关/能力门控), 关 → stop_polling 立即停

盘后 15:02 定版 job 与启动补跑 (boot_check/finalize 单次拉取) 不受
影响, 历史 sealed 数据链路保持完整。

验证: 5 组偏好组合单测门控行为; 13 个 depth 窗口测试通过;
实测重启后 (监控开+实时关) 不再出现「盘中轮询已启动」。
2026-08-17 12:18:17 +08:00
shy3130 eb869c7ad2 fix(logging): 开发模式追加文件日志 backend.log
dev 模式 (uvicorn) logging.basicConfig 只有 StreamHandler, 同步/管道等
运行时日志 (daily_pipeline 的 logger.info 等) 仅出现在 dev 终端, 关掉或滚屏
后即丢失, 排查「同步后日志没落」时无处可查。

追加 RotatingFileHandler 落盘到 data/backend.log, 与桌面版
(desktop.py:_setup_logging → desktop.log) 行为对齐。frozen (桌面版) 已由
desktop.py 负责, 此处跳过避免重复落盘。RotatingFileHandler (10MB×3) 防止
长期运行/频繁 reload 导致文件无限增长。

注: 同步进度日志 (job_store JSON, 经 /api/pipeline/jobs 返回) 一直正常落盘,
本次只补应用级日志的文件落盘。
2026-08-14 13:40:57 +08:00
shy3130 a0cb899163 perf(backtest): 因子批量回测预计算共享下期收益并向量化统计
P1 — run_batch 进入因子循环前对 close 有效序列计算一次 _next_return
(仅依赖 symbol/date/close/rebalance, 与因子无关), 通过 left join 附着到
共享面板; _evaluate_panel 检测到预计算列时直接复用, 跳过逐因子 shift/
调仓日 JOIN。因子空值集中在预热期前缀, 过滤后无内部空洞, 故与逐因子
在过滤后面板上重算的结果完全等价 (daily/weekly/monthly 均数值一致)。

P2 — 将 _calc_group_nav / _calc_group_stats / _calc_long_short 三段
逐行 Python 循环改为向量化:
- 分组净值: Polars cum_prod 替代 dict 累乘
- 分组统计: numpy maximum.accumulate 计算回撤, 向量化周期收益序列
- 多空组合: cumprod 合成净值, 向量化峰值/回撤
峰值初值沿用原逻辑 max(1.0, 历史最高), 400 组随机序列 (含 null/负收益)
下与旧实现逐值等价。

测试: tests/backtest 全量 184 passed。
2026-08-14 13:24:24 +08:00
shy3130 2b792dee44 chore(dev): uv run --no-sync 跳过依赖解析
从 --frozen 改为 --no-sync, 直接用已安装的 .venv, 不再校验 lockfile。
避免镜像源 403/网络抖动导致后端起不来。与 main 保持一致。
2026-08-14 13:10:01 +08:00
shy3130 81daf018c5 perf(indicators,kline): 热路径信号缓存 + 日K快路径跳过全量指标
三处性能优化 (后端内部, 不改 API 契约):

1. 增量热路径自定义信号缓存 (pipeline.py)
   compute_enriched_today 每秒级执行, 原每轮 glob + 读所有 JSON + 重编译
   表达式。新增 _custom_signal_exprs_today 模块级缓存 (allow_shift=False),
   与全量版分开缓存, invalidate_custom_signals 统一失效。

2. ETF/指数迷你蜡烛图跳过全量指标 (repository.py)
   get_index_daily/get_etf_daily 增加快路径: 请求列全是 parquet 存储列时
   scan + 列下推直接返回, 跳过 150 天 warmup + 全套指标计算。缺列回退完整路径。

3. 单股日K跳过全量指标 (repository.py)
   get_daily 同样加快路径并保留缓存覆盖最新日。采用最保守的列下推方案,
   不引入 needed 裁剪, 避免依赖闭包漏算金融数据的风险。

验证: pytest 全套 582 passed; Ruff 无新增告警; 快路径功能验证通过。
2026-08-14 13:08:57 +08:00
shy3130 8fe5dac7bd feat(v0.2): 完善量化研究与二次开发能力 2026-08-13 20:16:02 +08:00
shy3130 57eb641275 fix(backtest): 修复市场环境过滤未生效 2026-08-11 12:43:46 +08:00
shy3130 2a2d3b764e feat: add watchlist groups and multi-day intraday view 2026-08-10 11:39:08 +08:00
shy3130 ecfddb451e feat(monitor): 新增板块异动监控 2026-08-06 19:28:39 +08:00
shy3130 8b83f9e1bd fix(regime): 修复日历热力图交易日错位到周末列
calendarMonths 只在月初按 dow 算了前导空位, 之后把真实交易日逐个 push,
不按日期补齐缺失的天。当某月数据不是从 1 号连续到月末(最早月份只有
下半月数据或中间缺几天)时, 后续交易日格子整体左移, 被挤到周末列,
看起来像周六周日也有数据。

改为遍历该月每一个自然日: 交易日且有数据填 RegimeRow, 其余日子填 null,
每个格子都对齐到正确的周几列。月内数据不连续不再错位。

验证: pnpm build 通过。
2026-08-06 19:12:04 +08:00
shy3130 f8fca96f42 修复停复牌股票实时涨跌停漏算 2026-07-30 13:09:07 +08:00
shy3130 4b6e94e020 修复回测风控参数恢复旧缓存的问题 2026-07-29 21:27:02 +08:00
shy3130 6e4d6b9784 docs: 完善项目贡献与复审指南 2026-07-28 18:55:05 +08:00
shy3130 b29efebe68 docs: 新增项目完整操作说明书 2026-07-28 13:34:03 +08:00
shy3130 60fe9e6fa6 修复回测指标数据缺失提示问题 2026-07-22 13:30:02 +08:00
shy3130 a12e49d66d 修复实时行情下策略图表闪烁问题 2026-07-22 11:42:57 +08:00
shy3130 2d9fe4a4af 修复策略文件无法删除问题 2026-07-22 11:21:13 +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 c8c1a01d55 更新交流群二维码 2026-07-20 13:56:04 +08:00
shy3130 72918fe602 优化策略卡片结果加载性能 2026-07-20 13:01:03 +08:00
shy3130 0635698a08 修复策略监控开启后结果归零 2026-07-20 11:12:19 +08:00
shy3130 e1dbd1cafb 修复监控中心涨跌停信号误报 2026-07-20 10:33:06 +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
shy3130 8e4258cf20 feat: support historical price limits and share capital 2026-07-18 23:37:54 +08:00
shy3130 e462c63b45 fix: align AI strategy prompt constraints 2026-07-18 18:31:02 +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
shy3130 77876c7ee4 fix(data): avoid destructive enriched rebuild cleanup 2026-07-15 21:34:44 +08:00
shy3130 0b3b769ca8 fix(strategy): clear saved strategy drafts 2026-07-15 20:51:07 +08:00
shy3130 f317377bef fix(strategy): apply saved params to builtin screeners 2026-07-15 20:06:11 +08:00
shy3130 89115e6f73 fix(strategy): apply saved parameters during execution 2026-07-15 19:03:48 +08:00
shy3130 de1b1713fa fix(backtest): 参数优化页日期选择器被布局遮挡
根容器缺少高度约束, 配置列内容撑高后整页在外层滚动容器滚动,
DatePicker 弹层 (absolute 内联) 被裁剪无法完整显示。

对齐 StrategyBacktest 的布局: 根容器加 h-full min-h-0 overflow-hidden
使整页不滚动, 配置列/结果列各自 overflow-y-auto 内部滚动, 日期弹层
向下展开时在可视区完整显示。
2026-07-10 17:31:07 +08:00
shy3130 e61c228002 fix(ai): base_url 归一化保留非 v1 版本段, 修复 GLM /v4 被 404
normalize_openai_base_url 旧实现只检查「是否以 /v1 结尾」, 不是就强制补 /v1。
智谱 GLM 的 OpenAI 兼容地址是 /api/paas/v4, 被补成 /api/paas/v4/v1,
SDK 再拼 /chat/completions → 不存在路径 → 404。

改用正则检测 URL 末尾已有的版本段 (/v1、/v2、/v4、/v1.1 等):
- 已有版本段 → 保持原样
- 无版本段 → 补 /v1 (无版本号网关行为不变)
- 去 /chat/completions 后缀逻辑保留

补 4 条单测覆盖 GLM /v4 场景, 原有 v1/无版本网关回归不变。

Closes #60
2026-07-10 17:06:17 +08:00
shy3130 fd0a83b276 polish(layout): SSE 断连提示移至底部居中 + 文案调整 2026-07-10 16:37:31 +08:00
shy3130 d9fe050b1f fix(realtime): 策略页实时行情闪烁 + 策略结果刷新机制
策略页开启实时行情时, 被监控的策略列表反复闪烁 (变 0 → 全部失效 → 又出现),
非监控策略不受影响。

根因: 每个行情周期后端先广播 quotes_updated 再重算策略, 重算时先清空内存结果
再逐个回填 (非原子窗口)。前端 quotes_updated 与 strategy_results_updated 两个
SSE 事件都刷新 screener-cached, 第一次撞上清空窗口拿到空结果, 第二次拿到重算
结果, 每周期重复 → 闪烁。

修复:
- 前端: 从 SSE_INVALIDATE_PREFIXES 移除 screener, quotes_updated 不再刷新策略页,
  每周期只剩 strategy_results_updated (重算完成后才发) 触发一次刷新。
- 后端: monitor.evaluate 改为临时容器收集结果, 算完后整体替换 _latest_strategy_results,
  /cached 并发读取永远拿到完整结果, 不会读到空中间态。

配套:
- 新增 strategy_results_updated SSE 事件 + subscriber 合并通知机制
- 策略卡片 loading 时不显示旧命中数, 避免刷新时数字跳动
2026-07-10 16:37:11 +08:00
shy3130 9c6c1fce61 fix(watchlist): 支持重置全部筛选 2026-07-10 15:18:40 +08:00
shy3130 fdee661d47 fix(watchlist): 保留冷缓存自选占位行 2026-07-10 15:07:14 +08:00
shy3130 be626c73e1 release: v0.1.83 2026-07-10 12:00:49 +08:00
shy3130 aea694ee83 fix(strategy): keep AI-generated strategies in AI pool 2026-07-08 18:38:14 +08:00
shy3130 f8914c9140 feat: 新增企业微信推送、个股分析页重构、价位算法优化及多处交互改进 (v0.1.82)
- 推送: 新增企业微信群机器人通道(与飞书并列), 监控告警/复盘报告多渠道分发
- 个股分析: 历史报告改为右侧常驻栏(展示全部股票报告), 进页面自动恢复上次选股
- 价位算法: 成交密集区改用换手率衰减模型(国内主流筹码分布); 缺口回补判定修正(必须完全穿越缺口)
- 回测: 回撤止盈改纯峰值口径(与 trailing_stop 一致); 佣金/印花税/滑点合并一行; 建仓口径加问号气泡说明
- 分时图: 自选列表迷你分时图加渐变填充(对齐个股对话框风格)
- 图表: 个股分析日K图右侧标签适配浅色主题; 价位标签与下方文字行双向 hover 高亮联动
2026-07-07 17:56:25 +08:00
shy3130 03e99bd05f feat(stock-sdk): 取数入口补充 INFO 日志, 便于确认切换后实际走 stock-sdk 2026-07-07 13:07:59 +08:00
shy3130 9b22030166 fix: 数据源切换按 datasets 动态分流, 修复切换到 stock-sdk 后分钟K仍走 tickflow
- DataSources.tsx switchProvider 非 tickflow 分支原只传 4 个字段(漏 minute_data_provider),
  后端 exclude_none 保留旧值导致 minute 永远停在 tickflow。改为按源声明的 datasets
  动态构建: 支持的数据集切到该源, 不支持的显式写 tickflow(消除 UI/后台不一致)
- README License 段补充 stock-sdk (ISC) 协议声明
2026-07-07 12:39:23 +08:00
shy3130 fb7cf921a9 feat: 看板刷新按钮改为后端缓存重载
原「刷新」只重新请求前端数据(overview.refetch), 不动后端缓存, 跨天
残留时拿到的是旧数据。改为「重载」:
- 新增 POST /api/data/refresh-cache 端点: clear_cache + refresh_cache
  重建 enriched 内存缓存, 同时清 overview 聚合缓存 + screener TTL 缓存
- 看板按钮先调后端重建缓存, 再刷新看板数据
- 与设置页「清理并刷新」(清前端 react-query)互补, 这个重建后端 Polars 缓存
2026-07-07 11:43:39 +08:00
shy3130 a688690f15 fix: 盘前维表同步后刷新 enriched 缓存, 修复跨天连板梯队不准
根因: 服务跨天不重启时, enriched 内存缓存残留前一交易日数据, 连板梯队/
选股读到旧的涨跌停信号。盘前维表 (instruments) 含当日精确涨跌停价, 但同步
完成后未触发缓存重建。

修复: run_instruments_sync 完成后 (rows > 0), 执行 clear_cache + refresh_cache,
让 enriched 缓存基于最新维表 (含当日 limit_up/down) 重建。与设置页「清理并刷新」
按钮同等效果, 但盘前自动执行, 无需手动操作。
2026-07-07 11:10:17 +08:00
shy3130 9217efa1da docs: README 添加交流群二维码
- 新增「💬 交流群」板块(免责声明上方)
- 二维码文件重命名为英文 community-qr-code.jpg
2026-07-07 10:48:58 +08:00
shy3130 9f78fdebd4 style: 主题切换只保留图标, 与设置同行
左侧菜单底部: 主题切换(纯图标)+ 设置同一行排列, 更紧凑。
原来上下两行各占满宽, 现在左边小图标按钮 + 右边设置占满剩余空间。
2026-07-06 17:45:25 +08:00
shy3130 9ef9b4e6ec chore: bump to 0.1.81 2026-07-06 17:42:19 +08:00
shy3130 966d94ab03 feat: 数据源插件化架构 + stock-sdk 首个插件
将可选数据源改为插件化架构: 插件代码放 backend/app/plugins/<name>/,
用户在设置页点击安装依赖, 主仓库不背运行时依赖(nodejs 等)。

架构:
- loader.py 新增 _load_builtin_plugins() 扫描 plugins/ 目录, 通过
  plugin.yaml 清单动态发现并注册插件(委托自检 + 优雅降级)
- runtime 字段支持 node/python, 安装/卸载分别用 npm/pip
- 现有 tickflow + YAML 自定义源逻辑 100% 保留, 插件是叠加层

stock-sdk 插件 (plugins/stocksdk/):
- 原始实现来自 @forrany 的 PR #57, 迁移到插件化架构, 署名保留
- Node 桥接 (bridge.py/mjs) + Python provider, 覆盖日K/除权/分钟/实时
- 设置页主列表直接显示: 未装灰显+安装按钮, 装完可切换/卸载

配套:
- instrument_sync: 通用增强, 任何 provider 都能提供标的维表
- install/uninstall: uv 优先回退 pip, 容错坏 uv.toml + 国内镜像
- 10 例单测全过, tsc 零错误
2026-07-06 17:00:56 +08:00
shy3130 cc697e8ea4 fix: 分时图跟随实时行情自动轮询
实时行情开启后(realtimeRunning), 自选列表分时图自动按 15s 轮询刷新,
无需用户单独开启 minute_intraday_refresh 开关。
2026-07-06 17:00:55 +08:00
shy3130 17188e16db docs: 补传缺失的使用文档(configuration/deployment/features/strategy) 2026-07-03 15:23:24 +08:00
shy3130 60dec142ea Merge PR #45: feat 亮色主题 — 明暗切换 + 全部图表主题化 2026-07-03 14:12:13 +08:00
shy3130 2cbdc99659 Merge PR #44: fix(docker) 修复 .env 相对路径覆盖导致每次重建容器丢数据 2026-07-03 14:07:55 +08:00
shy3130 c1a5a6c367 Revert "fix: 修复海外服务器部署后交易时段时区误判为休市"
This reverts commit f02a88ebaa.
2026-07-03 14:07:26 +08:00
shy3130 574b163cb3 docs: README 与首次引导页增加"非 TickFlow 官方项目"声明
- README 顶部加醒目声明 badge(红+绿)+ 声明正文,功能介绍改为按页面分组的清单
- Onboarding 引导页新增 Step 0"使用前请知悉"声明步骤(个人开源/与官方无关/盈亏自负/不建议商用),原 4 步顺延为 5 步
2026-07-03 13:31:40 +08:00
shy3130 f02a88ebaa fix: 修复海外服务器部署后交易时段时区误判为休市
- 新增 backend/app/timezone.py 统一上海时区入口(ZoneInfo + UTC+8 兜底)
- quote_service / depth_service 的 _is_trading_hours() 改用显式 Asia/Shanghai
- Dockerfile 加 ENV TZ=Asia/Shanghai + tzdata,docker-compose.yml 加 TZ 环境变量
- 代码与容器双保险,解决裸 datetime.now() 在 UTC 容器下永远判为休市的问题
2026-07-03 13:31:33 +08:00
shy3130 7c51bf5054 refactor(docs): 策略提示词文档统一归入 prompts/,docs/ 专放使用指南
将 4 个策略运行时文档(strategy-guide/step1/step2/example)从 docs/
迁至 backend/app/strategy/prompts/,与运行时加载路径一致;docs/
回归「项目使用指南与配置说明」定位。

- prompts/ 现自包含 4 个 md,guide 内对 example 的相对链接可正确解析
- 更新 README 与前端 StrategyBuilderDialog 的引用路径
- docs/ 保留 deploy-password.md / screenshots / zhihu 等面向人类的文档

承接 #41 Docker 文档缺失修复
2026-07-03 11:03:24 +08:00
shy3130 56276384e5 fix(strategy): 修复 Docker 镜像中 AI 策略提示词文档缺失
将运行时依赖的 3 个提示词文档(strategy-guide.md / step1 / step2)
从 docs/ 复制到 backend/app/strategy/prompts/,使其随 COPY backend/app
自动进入镜像;并将 GUIDE_PATH/_DOCS_DIR 改为相对当前文件的 prompts/,
路径在开发环境与 Docker 容器中解析一致。

修复 #41
2026-07-03 09:51:30 +08:00
shy3130 b203e07e22 chore: 更新 uv.lock 2026-07-02 17:46:31 +08:00
shy3130 d4dcbb1797 chore: 版本号升至 0.1.70 2026-07-02 17:45:30 +08:00
shy3130 e283d487ce feat: Free 档实时行情监控限制提示
实时行情开关区新增 Free 档限制提示「监控自选股前 5 只,
全市场监控需 Starter+」,位于交易时段状态上方,可手动关闭
(不持久化,刷新后恢复显示)。
2026-07-02 17:40:41 +08:00
shy3130 fca0e261db feat: 系统工具页新增封单监控触发验证
- 新增封单监控 tab: 模拟触发 (纯条件判断) 与真实触发 (落盘+推送)
  供验证规则是否生效
- 页面标题与文案中性化, 避免暴露内部调试性质
2026-07-02 17:22:52 +08:00
shy3130 33a7be0deb feat: 连板梯队封单监控卡片 UI 与 API
- monitor_rules API: RuleModel 加 metric/threshold 字段; ladder 类型
  需 DEPTH5_BATCH 能力校验; 加模拟触发与真实触发端点供验证
- 连板梯队卡片: 右上角监控按钮 + 设置菜单 (段控指标/阈值+单位/
  胶囊推送/权限提示); 开启监控的卡片置顶 + 背景区分
- 推送默认取全局设置; 单位默认万手/亿元
- 非付费用户可见功能入口但保存禁用, 提示后续适配免费数据源
2026-07-02 17:22:42 +08:00
shy3130 000a9ead77 feat: 连板梯队封单监控规则引擎
- monitor_rules 新增 ladder 类型 (封单量/封单额 <= 阈值预警)
- monitor 加 _evaluate_ladder: 封单判断 + 炸板/翘板预警, message 体现封单量
- monitor 加 has_rule_type 供评估前判断是否需注入特殊数据
- quote_service: 有 ladder 规则时从 depth_service 注入封单量到 enriched
2026-07-02 17:22:32 +08:00
shy3130 255688fab4 feat: 概念涨幅轮动 AI 分析
- 新增 concept_rotation_analyzer: 从涨幅排名矩阵预计算轮动信号
  (主线/新晋/退潮/机构vs游资), 结合大盘背景生成分析报告
- rps API 加 /rotation-analyze 流式端点 (NDJSON)
- 轮动对话框: AI 占位替换为流式 Markdown 报告区 + 自动滚动
- 删除搜索框, 新增选中概念排名行 (前10红/后10绿)
2026-07-02 17:22:16 +08:00
shy3130 c394a365e1 revert: 撤回连板梯队 queryKey 扁平化修复
撤回 e7615fb 中 [...QK.limitLadder(...)] 改写, 恢复为 [QK.limitLadder(...)]
嵌套写法。
2026-07-02 12:28:16 +08:00
shy3130 09ec2a55c3 fix: 当日涨跌停判定改用维表 limit_up/limit_down 权威值
原逻辑用 _limit_price(prev_close, 推断涨幅) 自算理论涨停价, 涨幅靠 symbol
前缀 + ST 名字匹配推断, 存在两类缺陷:
1. 浮点精度: 自算涨停价比真实价多 0.01, 超出 0.005 容差导致漏判 (12 只)
2. ST 匹配漏洞: 名字含 "S" 不含 "ST" (如 S佳通) 被漏判 ST 5% 档 (1 只)

改为优先读 instruments 维表的 limit_up/limit_down (交易所级别精确价),
仅新股 (limit_up 为 null 或哨兵 100000) 回退自算。输出 schema 不变,
下游 depth_service/screener/market_overview 零改动。

历史路径 compute_limit_signals 不动 (instruments 仅存当天 as_of)。
2026-07-02 12:28:13 +08:00
shy3130 5a9fa9b255 feat: 概念涨幅RPS轮动分析 2026-07-01 17:48:28 +08:00
shy3130 ff9d7a9ac4 fix: filter_history 策略(反包等)实时监控可触发通知 2026-07-01 14:38:40 +08:00
shy3130 8127bd3c99 chore: 版本号升至 0.1.68 2026-07-01 11:27:30 +08:00
shy3130 ce5c705ab4 fix: 跨日后连板梯队整体少算一档
根因: live_agg 缓存的昨日连板数 (_prev_consec_up/down) 跨日不失效,
盘中增量计算永远基于前天基准, 导致次日开盘连板数整体 -1。

- get_live_agg() 加跨日失效守卫: date.today() 变化时按需重建
  (fast-path 仅比较 today ~0.24ms/次, 跨日当天一次性磁盘校验)
- cron 盘后管道补 refresh_cache(), 与手动触发 /api/pipeline/run 对齐
  (此前 cron 路径漏了这步, 盘后落盘的新 enriched 不反映到内存缓存)
2026-07-01 11:19:32 +08:00
shy3130 4a7d405d9d docs: 新增飞书推送截图(个股监控/自动复盘) 2026-07-01 10:15:29 +08:00
shy3130 68841af662 feat: 定时复盘飞书推送 + SSE 实时进度
- 定时复盘支持推送到飞书(卡片消息, 完整报告), 渠道多选(飞书可选, 微信开发中)
- 推送开关独立常驻, 与定时/实时行情解耦; 手动/定时生成都可推送
- 定时复盘改流式生成, 通过 SSE(review_progress)实时推给前端, 开着页面可见边生成边显示
- 修复定时任务协程未 await 的 bug(lambda 包裹 async → 改传函数对象 + args)
- LLM 断流自动重试(最多2次), 后端归档 + 飞书推送, 异常兜底通知前端
- 复盘定时下限改为 15:00, 默认 15:10
- 版本号 0.1.66 → 0.1.67
2026-06-30 17:28:18 +08:00
shy3130 5d4d643bd8 fix: 同步后端 __version__ 到 0.1.66 2026-06-29 17:53:29 +08:00
shy3130 ec941e1eb1 chore: bump version to 0.1.66 2026-06-29 17:50:12 +08:00
shy3130 47a87fca2b feat: 环境变量预置访问密码 + 飞书推送文档 2026-06-29 17:41:32 +08:00
shy3130 73490fdf5e chore: bump version to 0.1.65 2026-06-29 17:21:01 +08:00
shy3130 a72445d782 fix(pipeline): 修复盘后管道除权因子拉取范围逻辑
daily_pipeline 除权因子改用日K范围回填 (实时增量模式兜底最近数日),
移除 max_date/incremental 依赖;kline_sync 修复 _normalize_adj_factor
重复列重命名崩溃, 新增 fetch_adj_factor_single 单股拉取;
kline.py fallback 改用 compute_enriched 应用复权;
index_sync 指数/ETF 日K同步增加批次进度回调;
同步指数日K步骤输出详细日志。
2026-06-29 17:17:44 +08:00
shy3130 37934091ac feat(notify): 推送通知接入飞书 Webhook
新增 webhook_adapter 飞书群机器人推送 (含签名校验);preferences/settings
增加 feishu_webhook_url/secret 与 webhook_enabled_default (新建规则默认推送)
配置与端点;Monitoring 设置页重构为「推送通知」卡片 (渠道列表+飞书地址折叠
+默认渠道勾选);RuleEditor 规则编辑器支持单条规则勾选飞书。
QMT/ptrade 渠道文案统一改为「待定」。
2026-06-29 17:17:33 +08:00
shy3130 9dbd32246c feat(backtest): 风控新增固定止盈 + 优化回测范围
风控: MatcherConfig 增加 take_profit_pct, 单标的与组合引擎风险检查新增
涨破止盈线卖出逻辑 (退出原因 take_profit);strategy.py 透传 overrides,
api/strategy.py 与前端类型暴露 take_profit;风控 tab 增加止盈输入框,
摘要/结果头/退出标签同步展示;修复未设止损时止盈检查被跳过的 bug。

回测范围: StockPoolPicker 输入框右侧增加「导入自选」「清空」按钮与
「当前范围」指示器, 移除冗余的「留空=全市场」提示。
2026-06-29 17:17:20 +08:00
shy3130 cd76796a5c feat(monitor): 触发记录展示命中条件与当前价位
告警事件落盘时增加 conditions + logic 条件快照, 经 quote_service 透传到
SSE 推送;前端触发记录详情行渲染命中条件与现价, 替代原先仅显示
「信号触发」的通用文案。
2026-06-29 17:17:08 +08:00
shy3130 0724fd3721 fix(docker): PyPI 源多级兜底,避免单源同步延迟导致构建失败
修复国内镜像(清华源)同步 uv 包延迟时,USE_CN_MIRROR=1 构建报
"Could not find a version that satisfies the requirement uv" 的问题,
用户此前需手动传 --build-arg PYPI_INDEX 换源才能通过。

- pip install uv 加三重 fallback:主源(清华) → 备用源(阿里云) → 官方源
- uv sync 同时挂双 index(UV_DEFAULT_INDEX + UV_EXTRA_INDEX_URL),
  uv 自动在两源查找,任一源缺包时另一源补位
- 新增 PYPI_FALLBACK build arg(默认阿里云),可自定义

正常构建零影响(fallback 首环即成功,--frozen 严格按 lock 安装),
仅在主源故障/同步延迟时自动兜底。
2026-06-26 17:39:45 +08:00
shy3130 b8ed0f8177 fix(analysis): 新用户无数据时概念/行业分析配置按钮无响应
根因:配置弹窗 <AnimatePresence> 在主 return 内,而无数据的早期
return 分支没有渲染弹窗,导致新用户点按钮 showConfig=true 无组件响应。

- ConceptAnalysis: 早期 return 分支补上弹窗渲染
- IndustryAnalysis: 早期 return 分支补上配置按钮(原来缺失)+弹窗渲染

修复后新用户在两个页面点配置按钮均可正常弹出。
2026-06-26 16:26:11 +08:00
shy3130 1e0e9b422b feat(stock-analysis): 添加「点位提醒」按钮占位(开发中)
在 AI 个股分析按钮旁新增点位提醒入口,预留关键价位触发提醒功能。
当前点击提示「开发中」,后续可复用监控引擎实现价格触及通知。
2026-06-26 16:16:39 +08:00
shy3130 3948d2555e feat(stock-analysis): 带状指标改为跟随行情漂移的曲线
布林带/Keltner通道/ATR止损从「水平直线(仅最新值)」改为
「跟随时间漂移的曲线(ECharts line series)」,还原通道的真实形态。

后端(stock_analysis.py):
- 新增 _build_series(): 提取 5 组带状指标每日时间序列
  · boll(布林带上下轨)
  · keltner_s/m/l(短/中/长三档 MA±n×ATR,MA120 现场算)
  · atr(close±2ATR 动态止损止盈)
- get_levels 返回新增 dates + series 字段

前端(AnalysisKChart.tsx):
- Props 加 series/seriesDates,数据预处理做日期对齐映射
- buildOption 按开关添加 type:'line' 曲线(复刻 maLine 模式)
- collectPriceLines 过滤布林带/Keltner/ATR 水平线,避免与曲线重复
- Keltner 三档渐变青色系区分档位
- 水平直线(枢轴/前高前低/成交密集/缺口/斐波那契/整数关口)不变
2026-06-26 16:02:16 +08:00