 wshyandshy3130
|
773cd2fe12
|
chore(polling): 调整各档位轮询间隔范围 (#96)
* fix(ai): 兼容 reasoning 模型 temperature 限制 + 透出上游真实错误
Kimi kimi-k2.7-code 等 reasoning 模型拒绝非约定 temperature (Moonshot
报 "only 1 is allowed for this model"), 之前无条件下发导致 400 配置失败。
- 捕获 temperature 相关 400 后自动去掉 temperature 重试一次 (非流式 + 流式),
不再依赖模型名猜测, 对任意 reasoning 模型稳健
- _format_openai_error 优先透出上游真实 detail, 仅无可读 detail 时回落到
状态码通用文案, 避免吞掉 "model not found" 等排障关键信息
- 前端 Kimi 预设 model 更正为 kimi-k2.7-code
* chore(polling): 调整各档位轮询间隔范围
实时行情 (quote_service):
- pro 最小间隔 2s → 3s, starter 3s → 6s (expert/free 不变)
- DEFAULT_INTERVAL 10s → 6s
五档盘口 (depth_service):
- expert 区间上限 300s → 120s
- 默认值 20s → 10s
前端兜底默认值同步 (Data/Monitoring/DepthConfigCard):
- quote interval fallback 10→6, min 5→6
- depth interval fallback 20→10, expert hi 300→120
---------
Co-authored-by: shy3130 <shy3130@users.noreply.github.com>
|
2026-07-11 10:22:11 +08:00 |
|
 Jinfeng SunandClaude Opus 4.8
|
9aa96edbd7
|
改进: 并发韧性 + 数据性能 + 死代码清理 + 前端 UX + ST/Sharpe 修复 (#78)
* fix(concurrency): 共享缓存/任务表加锁, 全局限速, depth 原子写, 认证热路径缓存
修复多线程下的竞态与阻塞:
- overview/strategy_cache/PanelCache/StrategyMonitor._watching 四处共享状态加锁,
消除 "dict/OrderedDict mutated" 与丢更新/半写读取
- strategy_cache/depth parquet 改临时文件 + os.replace 原子写
- rate_limits 改进程级共享时间轴限速, 并发同步不再聚合超过单能力 rpm;
scheduler 令牌账目与 sleep 分离, sleep 不再独占锁串行化其他请求
- auth.is_configured() 内存缓存, 认证中间件不再每请求读盘阻塞事件循环
- api/backtest 任务清理/取消全程持 _jobs_lock, 并用 Semaphore(2) 限并发重回测
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* perf(data): limit_ladder 去 N+1 全市场重算, 指标裁剪, factor 向量化
- limit_ladder 前一日 consecutive 改窄读单日 parquet 存储列 (谓词/投影下推),
替代 range(1,10) 逐日 _load_enriched_for_date 全市场指标重算 (最坏 9x)
- compute_indicators 新增可选 needed 裁剪 (默认 None 行为逐位不变, 已对照验证),
factor 只算所需因子列
- factor._calc_period_return 用 Polars join 替代 Python 逐行 price_map 循环,
_add_groups 去 map_elements 改纯表达式 (输出逐位一致)
- screener ext value_map 按 parquet mtime 记忆化, 免每请求磁盘重读
(DuckDB 过滤仍用隔离 :memory: 连接, 不扩大注入面)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(backend): 报表存储去重, 删死代码, DuckDB 视图重建收敛, 管道失败如实标记
- 三份近乎逐字复制的 *_reports.py 收敛到共享 JsonReportStore (原子写 + 锁),
各模块公有 API/id 格式/上限/落盘 schema 完全保持不变
- 删除 ext_pull.py 中字节相同的死 _run_loop (Python 只绑第二个) 及无用 import
- 13 张 DuckDB 视图重建收敛为唯一权威 repository.rebuild_views(),
daily_pipeline 与 /api/data/clear 改为调用 (修好 clear 路径漏挂视图的漂移)
- daily_pipeline 累积 stage_errors 并在末尾抛出, 部分失败不再误报成功;
free/None 模式的能力门控跳过不计入失败
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(frontend): SSE 连接态, 路由代码分割, 查询失效修复, 三态与无障碍
- 实时行情 SSE: 连接态 store + 指数退避 + 断线徽标/toast (避免静默丢告警);
回测 SSE 断线有界重连 + 可重试, 不再永久卡住进度条
- router 全部 React.lazy + Suspense, vite manualChunks 拆图表库
(echarts 变独立 1MB 懒加载 chunk, 首屏包显著减小)
- 修 Data 清库后其它页显示旧数据 (改回广域失效); 修 Watchlist kline 失效键
永不匹配; query key 收敛到 QK 工厂 (新增 strategyDetail)
- Monitor/Analysis/StockAnalysis/ExtPages/CustomSignals 补 loading 门控与
error/empty 三态区分
- 新增共享 Modal 原语 (焦点陷阱/ESC/焦点还原/aria), 改造 3 个高频弹窗;
Toast/AlertToast 加 aria-live 与键盘可达; Watchlist/LimitUpLadder 卡片 memo
修复本轮 review 发现的缺陷:
- Modal 焦点 effect 依赖 onClose 致每次输入抢焦点 → 改 ref 只装一次
- StrategySettingsDialog 删除确认框被 Modal 面板裁剪 → 移出作兄弟节点
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(quant): 修正 ST 板块限价套错 与 因子 Sharpe 年化频率
两个不报错但会算错数的领域 bug:
1. ST 5% 涨跌停限幅被无条件套到创业板/科创板 ST 股:
注册制改革后 创业板(300/301)、科创板(688/689) 的风险警示股仍执行 20%,
北交所 30%, 只有主板 ST 才是 5%。原代码 _is_st 先判且覆盖板块限幅, 导致
创业板/科创板 ST 的涨停价按 5% 计算 → +5% 被误报涨停、真 +20% 涨停被漏报,
污染 signal_limit_up / consecutive_limit_ups / 连板梯队 / near_limit_up。
修正: ST 5% 仅在 ~(创业板|科创板|北交所) 时生效 (EOD + 盘中两条路径 + near_limit_up)。
2. 因子回测 Sharpe 一律乘 √252, 但 group_nav 每点是一个调仓周期收益:
月频调仓下是月收益, 乘 √252 会把 Sharpe 高估 √(252/12) ≈ 4.6x (周频 ≈2.2x),
使无效因子显示成明星因子, 废掉"先筛无效指标"的用途。
修正: 年化系数按 config.rebalance 取 √252/√52/√12。
新增 tests/test_st_limit_and_sharpe.py (5 例) 覆盖两处修正。
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 18:10:19 +08:00 |
|
wshy
|
5b2c88c93e
|
fix(depth): 午间休市停止 sealed 轮询, 修复集合竞价盘口覆盖致涨停误判 (#73)
_poll_loop 原用宽窗口 _is_trading_hours() (9:25-11:35 / 12:55-15:05),
12:55-13:00 午后集合竞价准备期会恢复拉 depth. 此时 ask1/bid1 为竞价盘口,
语义不同于连续竞价, 「涨停价上卖一==0」的真封判定失效, 会用竞价盘口覆盖
11:30 已定格的正确 sealed 值, 导致涨停股误判为 sealed=False (假涨停) 被错误
扣减, 部分错误归入「炸板」, 连板梯队与涨跌停计数失真.
修复: depth sealed 轮询改用新增的 _is_continuous_trading()
(9:30-11:30 / 13:00-15:00, 仅工作日), 与 quote_service 同名方法窗口一致.
午间 11:30-13:00 停止轮询, _sealed_cache 定格在 11:30 的正确值供正常显示,
quote_service 的价格轮询保持宽窗口 (合理, 盘前预热/收盘捕捉) 不受影响.
is_sealed_ready 不改动: 数据已落盘/缓存, 午间正常连续运行时本就不会降级,
直接复用定格值即可.
新增 13 个测试覆盖连续竞价窗口边界 + 午间休市/集合竞价准备期/周末回归点,
并逐点校验与 quote_service._is_continuous_trading 一致.
|
2026-07-08 13:42:53 +08:00 |
|
shy3130
|
fa08981851
|
feat: 自定义数据源扩展 + 限频集中化 (v0.1.80)
|
2026-07-05 22:57:46 +08:00 |
|
Gundy
|
ad83a5f960
|
fix(realtime): 交易时段判断与落盘日期显式使用北京时间
quote_service/depth_service 的 _is_trading_hours 原用 naive
datetime.now() 取服务器本地时间; Docker 镜像 (python:slim) 默认
UTC, 北京 9:15-15:05 = UTC 1:15-7:05, 轮询窗口完全错开——Docker
部署的实时行情/五档监控在真实交易时段一次都不会跑。
- 新增 app/market_time.py: CN_TZ 固定 UTC+8 (A股无夏令时,
不依赖系统 tzdata, Windows 桌面版同样可用)
- 两个服务的 _is_trading_hours / date.today() 全部切换
- monitor.py 的 as_of 日期同步对齐
- Dockerfile 加 ENV TZ=Asia/Shanghai 兜底 (日志时间戳)
|
2026-07-03 14:11:26 +08:00 |
|
shy3130
|
c1a5a6c367
|
Revert "fix: 修复海外服务器部署后交易时段时区误判为休市"
This reverts commit f02a88ebaa.
|
2026-07-03 14:07:26 +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
|
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
|
3bedd3e209
|
fix(limit-ladder): 五档修正后实时刷新连板梯队封单 + 组内按封单排序
问题: 开启「修正」后后台 depth 轮询持续更新封单缓存, 但页面封单/个数不实时
变化。根因是 depth 轮询 (depth_service._poll_loop) 与行情 SSE 刷新是两条
断开链路 — depth 修正后不广播任何事件, 前端刷新完全依赖 quotes_updated
(仅行情轮询发送), 封单数据延迟或读旧值。
修复: 新增独立的 depth_updated SSE 通道。depth 轮询每次 _fetch_and_seal
成功后经 quote_service.notify_depth_updated 触发信号, intraday SSE
event_generator 并行等待三类信号 (行情/告警/修正), 推送 depth_updated;
前端 useQuoteStream 监听后 invalidate limit-ladder + overview-market。
该通道不受实时行情开关限制 (修正轮询独立于行情轮询)。
另: 连板梯队组内排序增强 — 涨停/跌停状态股票按封单从高到低排
(vol/amount 跟随 sealMode), 封单为 null 排末尾, 其他状态不动。
|
2026-06-23 14:00:29 +08:00 |
|
shy3130
|
d89b9068a7
|
feat: 五档盘口真假涨停修正 + 连板梯队涨跌停切换 + 自动版本管理
连板梯队:
- 新增涨停/跌停方向切换(胶囊式, 涨停红/跌停绿)
- 跌停侧三状态: 跌停/翘板/止跌(对称涨停侧)
- 涨跌停双计数 + 真假板修正/降级标识(问号弹窗)
五档盘口 sealed(真假涨停):
- depth_service 独立旁路线(只读enriched, 不动计算逻辑)
- 涨跌停一体(一次depth.batch双向覆盖)
- 假涨停归炸板/假跌停归翘板, 真封板显示封单量
- 三层防护节流(套餐clamp+限速clamp+接管通知)
- Pro/Expert盘中轮询 + 盘后定版job + 启动补跑
- 收盘job可配置(15:01~18:00, 默认15:02)
- 设置页'连板梯队降级修正'卡片(开关+配置+立即修正)
- 看板页同步应用sealed修正+降级标识
配置/SDK:
- tiers.yaml拆分depth5/depth5.batch, 补全quote.batch
- tickflow SDK升级0.1.21→0.1.23(depth.batch可用)
- 实时行情轮询间隔下限调整(pro 2s/expert 1s)
- capabilities缓存schema版本化(v3)
其他:
- 档位配色抽共享组件TierTag/tierStyle
- Keys页档位问号弹窗(4档位tag+检测说明)
- git hooks自动版本号+0.0.1+打tag
|
2026-06-19 20:09:09 +08:00 |
|