DOCS
stock-analyzer · 变更日志
← 返回文档中心 · 来源:Languangxun/stock-analyzer · 同步于 2026-10-25
版本摘要与历史变更记录;用户向说明见 README,技术架构见 ARCHITECTURE, 回测复核与代码审查见 reports/。
版本历史
v6.6.5:日K 新增同花顺第三梯队源 + 设置→数据源可配自定义源 + 回填多源兜底 + 增量拉取瘦身 + 基期漂移检测存量缺陷修复(2026-10-24): ① 同花顺 v6 line 新源(
_fetch_ths):d.10jqka.com.cn/v6/line/{市场}_{代码}/01/JSONP,无需 cookie;个股/ETF/科创板/深证系列指数可用(上证指数无映射,自动交回 其他源)。last.js 近 140 根做增量,更早历史按年文件回拼(实测年文件仅保留最近 ~20 年,连续 3 个空年即停)。口径实测备案(重要):同花顺数据为完整前复权 (送转+分红均已折减,除权日收益≈复权真实收益),与库内「腾讯送转调整价×新浪 分红因子」的真后复权差一个时变因子(2016→2026 约 10%,复权表黑盒不可重构), 故原样入库、绝不乘新浪因子(会双重补偿分红),排在腾讯 6 域+新浪之后、 东财之前;与库内口径不同时由 rebase 机制整段自洽替换。同轮对拍澄清:新浪CN_MarketData原始数据与腾讯空 fq 位同口径(×因子后与库内 2000 日重叠偏差 0.000%),v6.5.9 新浪源口径无存量问题。 ② 设置→数据源新分区(ini[data]):内置 K 线源 9 条支持启用/停用/排序 (上移下移/恢复默认/逐源「测试」按钮后台探测 sz002241);自定义源最多 10 个 (类型:腾讯格式/同花顺/东财/新浪/网易,URL 填基址,添加前可实测验证), 追加在内置源之后参与熔断多源链(源名自定义:名称);「腾讯」源域与固定变体 当前 URL 相同时自动去重(此前 ini kline_url=ifzq 时同 URL 撞两次);全停用且 无自定义时保存自动回默认链。保存即重建运行时源链生效(_reload_kline_srcs), 急救箱切换 kline_url 后联动重建。 ③ 回填多源兜底(_bf_fetch_one):腾讯不复权翻页 → 同花顺深历史 (last+按年,前复权口径原样使用)→ 东财;腾讯整域 501/断连或浅返回(<300根) 时回填不再中断;_BF_RAW_HINT抽成_bf_hint_set两路复用。 ④ 增量拉取瘦身(get_daily):本地已有 ≥120 根且非异常时,过期回补只拉 120 根小窗(载荷约 1/17,实测 sz002241 增量 2000→120 根、合并 2412→2415 无损); 小窗检出基期漂移但不足以整段重定基时自动升级拉满全量重试,绝不混写接缝。 ⑤ 修复基期漂移检测存量缺陷(P0):get_daily与backfill_full_market的重叠偏差检测旧逻辑「命中 >0.5% 即 break 再验 checked≥5」——当分叉从重叠 第一天就开始(口径级差异,如换源接管)时 checked 恒=1,确凿的口径不同被误判 为”重叠不足”而直接混写接缝(实测:THS 接管腾讯口径缓存,旧逻辑在窗口起点留 +95.7% 人为跳变);现扫完重叠区再判(bad≥1 且 checked≥5),实测 THS 接管正确 触发小窗→全量→整段替换,跳变清零。历史上东财接管偏差缓变(首日 <0.5%)才未踩中。 ⑥ 新增国内域名10jqka.com.cn进_DOMESTIC_SUFFIX(直连优先);stock_firstaid.py体检增加「同花顺K线」套件(当日实测:腾讯 5/5、新浪 1/1、 同花顺 1/1 活,东财 0/5、网易 0/1 挂——多源容灾实际生效中)。 ⑦ 修复「分析后 K 线长时间不显示」(sm701 缓存 mtime 误失效,2026-10-24 排障): v6.6.4 起 sm701 并入消融候选后被大量股票选中(全库 稳健 2326 / 均衡 1911 只), 这些股票每次analyze都走_sm701_live_predict对新交易日做全市场实时复算 (6000+ 只 × 180 根 pandas 特征 + LightGBM,实测 ~110s),期间主图一直空白—— 用户表现为「点了分析 K 线不显示」。更糟的是_SM701_CACHE三个缓存 key 都含 库文件 mtime(live 用取数库 mtime、scores 用主库 mtime、probmap 用副本库 mtime),GUI 每轮预取/增量回填写库都会改 mtime → 缓存近乎永久失效 → 每次 分析都卡 110s(v6.6.4 基线同病,git 对照实测 105s,非本轮数据源改动引入)。 现三个 key 全部改用数据内容指纹:库 mtime →_db_latest_date()(日K最新 日期),当日数据追加 30 分钟桶(_sm701_cache_epoch,盘中变化可感知、收盘后 稳定);_db_latest_date()加 60s 进程内缓存——daily_bars 无独立 date 索引, 全表 MAX(date) 主库实测 0.6s、sm701 副本(7GB)更慢,key 计算高频调用时 每次分析多付 1~3s 后台开销(实测缓存后 0.0000s)。 实测:首算 115s → 二次 5.3s → 模拟写库(touch 主库)后 2.4s; 数据推进到新交易日时 key 变化正常重算。stock_predict.py重新生成。 ⑧ 买卖点懒加载(K线先行):analyze()新增defer_signals参数——GUI 五个入口(点分析/消融选策略后重分析/15分钟自动刷新/跨快照日重分析)传 True, sm701/lgbm 这类重信号算法(全市场模型复算/滚动训练,冷缓存 110s+)的 历史买卖点延后生成,K线/MA/预测区间/筹码秒级渲染(实测首屏 1.2s, 此前同场景 110~210s 白屏);新增analyze_finish_signals()由App._maybe_finish_signals在渲染后派后台线程补算(信号生成器/250根截断/ 密度兜底与主路径同口径,失败回退多维评分),完成后App._signals_done重绘叠画买卖点并在状态栏提示;切换股票由self.res is res丢弃过期更新,_signals_started防重复派发。CLI 与完整报告路径默认不 defer,口径零变化; 异动覆盖块(_sig_analog/analog_scan)与报告专区耦合深,不进延后集合。 ⑨ 修复「打开工具窗/切数据工具页就卡死」(2026-10-24 用户反馈定位): 工具窗打开 80ms 后自动执行「信号胜率」计算(after(80, run_bt)),而run_bt在主线程同步跑strategy_signals_full(sm701 策略 → 全市场 模型复算,冷缓存 ~110s)+backtest_signals+_bt_segments(detail=True)→ 整个 UI 冻结数分钟,用户表现为”打开工具后再点数据工具就卡死”。 现run_bt拆为后台计算 + 主线程渲染(懒加载同模式):计算期间按钮禁用、 结果区提示”后台计算中…”,完成后回主线程填充汇总/交易明细/净值曲线; 窗口已关或已切换股票(self.res is res)时丢弃过期结果,win._bt_busy防重入。实测(真实 mainloop):打开工具窗自动计算期间切数据工具页签 0.147s(此前冻结至计算完成)、全程 UI 事件延迟 worst 0.63s、264s 后 结果自动就绪。 ⑩ 数据清洗加进度输出:scan()新增 progress 回调(每 500 只或每 5s 报 「清洗进度 x/y 只 (p%) 已发现问题 n 处」,实测 1282 万根 33s 扫完,进度行 每 2~5s 一条);--fix修复循环每 3 只报「修复进度 i/n(成功 s 保留 k)已用 xx s」;--check-adj体检循环每 20 只/每 10s 报「体检进度 i/n」——三者此前 全程静默(扫描/逐只联网修复各需 1~10 分钟,GUI 日志与 CLI 都像卡死)。 进度行走plog只进控制台与 GUI 数据工具页日志回流,不写入 reports/ 清洗 报告(migrate_all迁移进度原已有,保持不变)。 ⑪ 手动消融加进度 + 策略缓存过期沿用旧策略 + 新消融自动替换清理: ①run_ablation详细进度:13 个信号生成逐个报(消融进度: 生成信号 i/13 (算法名)——sm701/lgbm/analog 单个可达数分钟,此前全程静默像卡死), 42 候选评估每完成一个报(候选评估 i/42 (p%)),自动/手动/弹窗本地重算 三入口共用;实测 13+43 条进度消息。② 策略缓存过期不再丢弃旧策略:load_strategy(allow_stale=True)过期返回旧策略(_stale标记,label 标注 「缓存已过期(沿用)」),analyze 沿用旧策略出买卖点;_ensure_strategy发现 过期 → 状态栏提示 +_auto_reablation后台重跑该股消融,期间图上始终是 旧策略,绝不下沉默认多维评分。③ 新消融完成后自动替换清理:消融完成 自动保存推荐档(训练集 Calmar 最优,与弹窗「用推荐档」同口径)、重分析;save_strategy落库即覆盖旧值并顺带清除全库过期策略缓存(防旧策略 滞留 meta 被误沿用)。过期自动链路不弹窗(手动「重选策略」弹窗不变); mock 消融实测全链:过期→后台消融→保存推荐档→清理→自动重分析。 ⑫ 多维评分动态权重(信号对错在线训练):_composite_signals的 8 维 静态IND_W升级为「基础权重 × 质量系数」——每维度维护其看多/看空贡献在DYN_W_HORIZON(1) 日后收盘方向上的命中率(EWMA α=0.02):命中率 50% 保持 基础权重、越高放大(上限 ×3)、越低缩小(下限 ×0.3),样本 <60 时按比例 收缩到基础权重防早期噪声;结算严格因果(第 i 日只结算 i−1 日贡献, 次日收盘此时才可知),截断等价性实测证明对消融/回测无前视污染(无筹码 维度时 k=600/800 截断信号逐条一致);冷却日也参与训练(训练与信号生成 解耦)。ini[predict] dyn_weights=0关闭回静态口径(实测可复现); 信号 reason 尾标「·动态权重」便于核对。单次耗时 4.2ms(静态 2.4ms), 消融回归通过(33 候选正常产出)。注意:存量chip_tail=400(筹码维度 只算尾段)导致不同截断长度的信号序列本就不可逐条对拍,属既有行为。 ⑬ 交易记录插件重构(实盘/模拟双账本 + 真实性校验 + 收益曲线): ① 日期只能是交易日:PluginAPI新增trading_days()/align_trading_day()/ close_map()(宿主上证指数日K作交易日历,显示价口径=hfq×adjust.k),添加 记录非交易日自动对齐到上一交易日并提示;② 实盘/模拟双账本:记录带account字段(旧数据自动归入实盘)、独立本金(旧capital迁移为capital_live,模拟盘默认 100 万)、面板顶部切换,联动固定使用实盘; ③ 真实性校验(按日期重放拒单):买入整手(100股倍数,卖出可零股)、 T+1(当日买入不可当日卖)、卖出不可超持仓、买入不可超可用现金; ④ 费用更真实:过户费仅沪市收取、新增可选滑点费率(双边计入费用); ⑤ 持仓显示升级:现价(on_tick/on_analysis 缓存)→ 市值/浮动盈亏 (¥与%)/合计,当日买入标 [今仓T+1];⑥ 联动可选:设置新增link_analysis开关,关闭后account_context返回 available=False (荐股自动降级回默认 10 万口径),开启时上下文扩展 last_price/ market_value/today_buy 字段(capital/cash/positions 保持兼容); ⑦ 收益曲线:新增「收益曲线」弹窗——逐交易日净值(现金+持仓按当日 收盘市值,停牌沿用最近收盘),Canvas 折线+回撤填充+基准线,报告总收益/ 年化/最大回撤/交易笔数,双账本各自计算。无头实测:交易日对齐(周六→ 周五、元旦→前一交易日)、四类校验全部拒单、过户费 sh>sz、曲线净值 正常、联动开关、旧数据迁移全部通过。 ⑭ 无网启动优化(缓存口径确保显示):① 全局离线熔断——连续 ≥3 次 连接类失败(refused/超时/DNS/不可达;HTTP 4xx/5xx 与 Connection reset 是 服务器可达/反爬,不计入)判定离线 120s,期间_http_get毫秒级快速失败 (实测 0.0000s,此前每个源等 15-20s 超时 ×重试 ×多源,启动/分析拖几分钟), 任一请求成功立即恢复,到期自动半开探测;② analyze 行情快照三级降级: 网络 →quote_cache持久快照(复用既有 stale_snap 机制锚定”最近收盘”并 标注快照日期)→ 最近收盘合成最小快照,K线/预测/筹码照常显示,res["offline"]=True时状态栏提示「无网络:已显示缓存K线与最近快照」; 无网 analyze 实测秒级返回、缓存 K 线 2415 根完整。_tick/指数栏/批量行情 原有缓存降级不变,叠加离线熔断后全部即时返回。 ⑮ 分时线视图(缓存周期=一个交易日):数据层fetch_minute_lines()—— 腾讯minute/query(今日/最近交易日 1 分钟:HHMM 价格 累计量 累计额, 实测 267 分钟含盘后段);均价线用分钟增量 VWAP(Σprice×Δvol/ΣΔvol, 与量纲无关、必然落在当日价格区间,规避累计额字段单位歧义);缓存三层: 内存(盘中 60s TTL、收盘后当日定型)→ SQLite 新表minute_cache(每代码 只保留最新一个交易日,写入即清旧行——缓存周期=一个交易日,跨重启/离线 可显示)→ 拉取失败回退缓存。GUI:工具栏「分时」开关(普通/紧凑两处), 主图切分时(价格线+黄色均价线+昨收基准虚线+双轴:左价格/右涨跌幅, 对称区间),副图切分钟量柱(相对昨收红/绿);盘中由_tick每 60s 自动 重拉重绘,收盘/休市直接用定型缓存不联网;切股票分时跟随重拉;十字光标 在分时模式跳过(无日K scales 映射);纯展示不参与预测/信号,切回日 K 完整恢复。实测:拉取 0.42s、二次走内存 0s、渲染 主图 19 元素+量图 265 柱、 minute_cache 表落库(2026-10-23)、模式往返正常。 ⑯ 多市场合并(桌面 market-sniper → 本项目:港股/美股/期货/加密 快速切换): ① 市场前缀代码空间:hk00700 / usaapl / fugc(GC=F)/ cryptobtcusdt (BTC-USD),与 cn(sh/sz/bj)同库同表(daily_bars/quote_cache/minute_cache/ stocks),复用全部缓存/显示/分时/负缓存链路;normalize_code支持前缀直通 与模式感知归一(港美期加模式下无前缀输入自动加前缀);② Yahoo chart v8 自实现(_yf_chart,urllib 走_http_get——复用节流/数据源熔断/离线快速 失败/代理路由,不依赖 sniper 代码):日K 10y 一次拉足差量入库、快照 5d meta、 分时 1m;四市场实测 0.8s/只(hk00700 2462 根、usaapl 2514、fugc 2514、 cryptobtcusdt 3651);③ get_daily/fetch_quote/分时 三处分流,cn 链路零 改动;_limit_pct对非 cn 返回 None(港美期加无涨跌停,钳制/异常校验自动 放行);analyze非市场专用部分全兼容(预测/多维信号/回测通用,行业/板块 无数据自动空层);④ 顶栏市场下拉(A股/港股/美股/期货/加密,普通/紧凑 两处):切换即注入内置池进 stocks(借 sniper 默认池 HK17/US20/CRYPTO18 + 期货 14 主力合约),搜索补全重建、模式感知归一生效、ini[market] mode持久化重启恢复;refresh_all_codes的 A 股清理逻辑不会误删多市场行。 实测:五模式切换往返 normalize 正确、各市场 analyze/分时渲染全通过。 ⑰ 自选池按市场分开:self.watchlist属性化(按_CUR_MARKET返回当前 市场账本,全部既有引用点——面板/预取/更新缓存范围——零改动);ini[watchlist]每市场一键(codes_cn/hk/us/futures/crypto),旧codes键 自动迁移到 A股后删除;add_watch按_market_of归入代码所属市场的 池(A股模式下加 hk00700 会正确归入港股自选);切换市场自动刷新自选面板 与名称;fetch_batch_quotes含非 cn 代码时逐只走市场快照路由(腾讯批量 仅支持 cn)。实测:旧 ini 迁移、五市场各自池、跨市场加自选、持久化往返、 港股自选批量快照(00700=386.00 HKD)全部通过。
v6.6.4:荐股 sm701 数据源修复 + 代码表防截断 + sm701 并入全库消融候选 + 三档全库对照(2026-10-20): ① 修复「荐股打不开/列表为空」:
test档历史分数只到 sm701 副本落盘末日 (2026-09-30),而主库已更新到 10-16+;旧_sm701_live_predict()只读副本日K, 目标日没有行 → 最新信号日全 NaN → 荐股列表 0 只。新增_db_latest_date(), 实时复算自动选数据较新的行情库(sm701 副本落后时用主库;两库重叠段逐值一致);_sm701_live_predict/sm701_score_matrix缓存 key 加取数库与主库 mtime;tier_latest_picks空结果在列表内明确提示「数据源未更新或权限过滤为空」, test 页标注实时复算至哪一天;首次加载提示改为约 1~3 分钟。 ② 代码表部分刷新防截断:refresh_all_codes()仅在拿到 ≥5000 只且 ≥现有 A 股 90% 时才 DELETE+INSERT 全量替换;免费源中途断流拿到残缺列表时改为合并 保留旧行、不刷新stocks_updated(下次重试)。此前一次只拉到 3396 只的部分 刷新把 5799 只 A 股代码表截断,导致后续只更新 3237 只日K。 ③ sm701 并入消融候选:GUIrun_ablation与研究backtest_strategy_ablation.py的 gens 增加sm701(13 算法;GUI 候选 13×3+多维评分×3=42);新增_sig_sm701_from_probs()复用概率滞回口径; 研究批量消融由父进程一次性构建sm701_score_matrix、经 initializer 注入 worker,worker 只按 code×date 取值,避免每只股重复扫描 70MB+ 预测文件。 ④ 全库对照(数据先补齐):回填 6298/6299 个过期对象至 2026-10-19;backtests/compare_tier_sm701.py在同一全库面板、2024-03-12~2026-10-19 对比「当前三档」与「仅 score 换成 sm701、其余风控保留」:全A 稳健 +13.1%→+15.9%(回撤 -15.4%→-10.9%),但均衡 +27.9%→+20.4%、激进 +26.5%→+14.0%;主板稳健 +11.3%→+12.2%,均衡/激进一胜一负;sm701 原生 test 口径仍为负(全A 年化 -36.2%)。结论:不整体替换三档生产策略, sm701 作为消融候选 + 对照数据保留(research/compare_tier_sm701.json)。 ⑤ 全库消融重跑:7198 个有效对象(7239 纳入,ETF 1469);sm701 入选稳健 2326 只(32.3%)、均衡 1911 只(26.6%),原 LGBM 降至 551/497;候选层同股 同档验证集中位 sm701 年化 +3.6%/胜率 50.0%/IC5 +0.105,LGBM 为 -2.8%/38.5%/-0.002(sm701 在 63.6% 的股票上验证年化更高)——预测精度 明显占优,但三档 score 整体替换只有稳健获益,故生产配置保持不变。 ⑥APP_VERSION=6.6.4,stock_predict.py由build_cli.py重新生成; README/ARCHITECTURE 与第七节同步。v6.6.3:test 档 sm701 切换生产定稿三周期模型(h1/h5/h10 等权)(2026-10-18):
test(预测参数·风险偏好=test / sm701 实验档)由旧单模型lgbm_output/lgbm_model.txt切换为桌面 sm701 生产定稿production/三周期 tech 模型: ①sm701_paths()新增_sm701_production_set():副本production/命中(features_tech.json+prod_h1|h5|h10_tech.txt齐全)即启用生产档, 历史分数改读production/valid_predictions.csv.gz;不齐则回退旧单模型口径,SM701_MODEL显式指定时强制单模型、跳过production/; ② 新增_sm701_predict_feats():对_compute_feats结果按features_tech.json列序(tech 40 特征)对 h1/h5/h10 三模型分别打分、 等权平均为 test 分数;sm701_score_matrix()/_sm701_live_predict()/sm701_prob_map()共用;③ 缓存失效 key 改_sm701_model_mtimes()(三模型逐个 mtime),sm701_status()增prod_dir/prod_models/prod_n_feat; ④ 副本侧新增production/make_predictions.py:用生产三模型对 2024-01 起 全市场样本外打分,生成production/valid_predictions.csv.gz(date,code,prob_h1,prob_h5,prob_h10,prob,prob=等权平均)。 实测末交易日 2026-09-30 实时复算与落盘逐元素一致(sh600000 0.42401537); 生产 h1 模型 2024+ 全A 可交易样本 AUC 0.5446(≈sm701 README §18 0.5440)。APP_VERSION=6.6.3;stock_predict.py由build_cli.py重新生成; README 3.x、ARCHITECTURE 3.7 与第七节同步。v6.6.2:数据层缓存优先 + 无网络优雅降级(2026-10-18): 修复主程序多处「跳过缓存直接联网」的数据逻辑: ①
fetch_daily改为调用缓存优先的get_daily,禁止绕过本地库直接拉 K线; ②fetch_quote_cached扩展为全代码通用入口:内存缓存 → SQLite 持久缓存 → 网络,网络失败时返回库内旧缓存;新增quote_cache表; ③fetch_batch_quotes改为缓存优先,仅缺失/过期代码参与网络请求,全失败时 返回已有缓存而非空字典; ④fetch_f10_metrics增加 SQLite 持久缓存(f10_cache表),无网络时降级到 旧财报数据;GUI 实时行情与首次拉取未上市判定均切到fetch_quote_cached。APP_VERSION=6.6.2;stock_predict.py重新生成;CHANGELOG 同步。v6.6.1:更新缓存增加范围弹窗(全A / 自选 / 单股)(2026-10-17): 工具栏/小屏工具菜单的「更新缓存」不再固定只刷代码表,先弹窗选范围: 全A=刷新代码表 +
stale_codes()筛出的全部 A 股(剔除 ETF/北交所) 日K增量;自选=仅自选池;单股=输入/当前代码(默认预填当前分析代码)。 只拉缺失/过期数据,已最新的标的由get_daily/prefetch自动跳过; 全A/自选走后台prefetch并显示进度,单股完成回报最新日K日期/根数; 新增_cache_busy与后台主动预取互斥,避免重复拉取;弹窗范围默认按 「当前代码→自选→全A」智能选择。纯 GUI/缓存调度,信号与回测口径零改动;APP_VERSION=6.6.1,stock_predict.py重新生成;ARCHITECTURE 2.2、 README 与第七节同步。v6.6.0:支持导入「股票策略工坊」自定义策略 + 外部策略参数化风控(2026-10-17): 设置新增「外部策略」分区:一键扫描
~/桌面/stock_strategy_studio/strategies/custom/*.json或手动选择 JSON 导入(复制到仓库studio_strategies/,可刷新/删除)。规则引擎 按工坊core/indicator_catalog.py同口径纯标准库移植——42 个技术指标、 AND/OR、数值/指标比较、上穿/下穿、介于区间、较前值升/降,成交量=手、 无成交额时vol×100×close估算;全部 42 指标已与工坊 pandas 实现逐点对拍一致。 启用导入策略后,单股分析不再走消融、不再使用风险偏好:买卖点直接来自 导入规则,交易层改用 止损% / 止盈% / 最长持有天数(0=不启用), 设置内风险偏好下拉自动禁用;_bt_simulate/_bt_events新增use_atr_stop=False百分比退出路径(交易明细原因=止损/止盈/最长持有), 信号胜率面板、报告与导出同步。analyze/strategy_signals_full接入algo="studio";外部策略启用时跳过消融弹窗与「重选策略」,报告标注 外部策略。另修复生成版 CLI 缺import datetime导致last_completed_tdNameError。APP_VERSION=6.6.0;stock_predict.py重新生成;README/ ARCHITECTURE 1.1、3.16、第七节同步。v6.5.9:日K多源扩容(8 源,新增新浪/腾讯web)(2026-10-17): 用户报「所有源失效」。
_fetch_remote_rows在腾讯 4 域与东财之间补入 腾讯web.ifzq.gtimg.cn(HTTPS+HTTP,实测不复权请求正常;历史 hfq 501 不影响本链路) 与新浪日KCN_MarketData.getKLineData:新浪返回 不复权 OHLC、volume 股/100 对齐「手」,再乘_sina_hfq_factors得真乘法 后复权(与腾讯链路同口径;实测单次可取 3000 根)。熔断/代理/直读机制 复用,无新增单源调用。验证:正常调度命中腾讯;把腾讯 6 域+东财全部置熔断 后,info["src"]="新浪"成功接管。APP_VERSION=6.5.9;stock_predict.py重新生成;ARCHITECTURE 2.1、README 与 CHANGELOG 同步。 文档补漏:README 标题/标准回测产品数(三类→四类)/项目文件表(消融 10→12 算法、progress.py④、发布包改为以最新 Release 为准)与 ARCHITECTURE 版本头、脚本数、消融算法数、Web 端涨跌停钳制口径统一到 v6.5.9。
v6.5.8:工具窗可最小化(2026-10-17): 工具窗原以
transient(self.root)创建,多数窗口管理器不给 transient 子窗最小化按钮(且父窗会压住它)。open_tools去掉 transient,改为独立 顶层窗:可最小化、任务栏独立切换、仍非模态不锁主界面(v6.5.2 热修①); 其余三个弹窗(基本面/策略消融推荐/全部组合)保持原状。纯 GUI 行为, 回测/信号零改动;APP_VERSION=6.5.8;stock_predict.py重新生成; ARCHITECTURE 3.13、README 与 CHANGELOG 同步。
v6.5.7:回测运行中主界面保持可用(2026-10-17): 工具页日志回流原来每 120ms 无上限抽取队列并逐行
insert+see,一键全量 回测/消融刷屏时 Tk 主线程被日志渲染占满,主界面近乎卡死。现_ext_poll改为限量限时批量(每轮 ≤400 行且 ≤30ms;有积压 1ms 后续批,否则 150ms 轮询),_ext_log_many单次 insert 并把日志控件裁剪到末尾约 4000 行; 重开工具页时若任务仍在跑,保留子进程句柄与日志队列并自动续上轮询(此前 会重置_ext_proc导致日志中断且无法停止)。设置/算法零改动;APP_VERSION=6.5.7;stock_predict.py重新生成;ARCHITECTURE 3.13、 README 与 CHANGELOG 同步。
v6.5.6:全量消融进度查询 + 更新K线源(2026-10-17): ①
backtests/backtest_strategy_ablation.py每 ≤2s 原子写research/ablation_progress.json(pid/阶段/done/total/有效/跳过/已用/ETA/ finished),GUI「数据工具 → 全量策略消融」新增进度查询按钮并每 3s 自动 刷新(进程消失未标完成显示「已中断」);progress.py新增 ④ 同源展示; ②同页新增「更新K线源」按钮:子进程跑stock_firstaid.py体检+自救, 实测可用域写回 ini[data] kline_url(本次体检:腾讯 5/5、新浪 1/1 活, 东财 0/5、东财列表 0/4、网易 0/1 挂 → kline_url 已切https://ifzq.gtimg.cn/appstock/app/fqkline/get,重启生效)。APP_VERSION=6.5.6;stock_predict.py重新生成;ARCHITECTURE 3.13、 README 与 CHANGELOG 同步。
v6.5.5:数据工具新增「全量策略消融」(2026-10-17): 「工具 → 数据工具」页新增区块:并发(0=自动 min(16,cpu))/ 限制只数(0=全部)/ 勾选「跑完刷新 GUI 策略缓存」,一键运行
backtests/backtest_strategy_ablation.py(全市场逐只 12算法×3档消融)并可选串联tier_picks_from_ablation.py刷新荐股/消融缓存(bash&&链);_ext_spawn/_ext_stop支持group独立进程组,【停止】整组杀除防孤儿进程继续写库。算法/回测口径零改动;APP_VERSION=6.5.5;stock_predict.py重新生成;ARCHITECTURE 3.13 数据工具页 小节与 README/CHANGELOG 同步。
v6.5.4:修复「不爬新数据」死锁(2026-10-17): 本库指数日K停在 2026-09-30 后,节假日锚(库内指数最新日期)把全库判「新鲜」 ——个股两周无新根、指数自身也永不重拉(同期日志:扫描”个股应有=2026-09-30 过期=7”,实缺 10-09..10-16 共 6 根)。新增
_anchor_dead:锚落后自然日历5 天(长假窗口内不动)判失真,
last_completed_td/_index_expected_td退回自然日历口径 → 全库强制回补 10 月缺根,指数补拉后锚自我修复。APP_VERSION=6.5.4;stock_predict.py重新生成;ARCHITECTURE 2.2、 README、CHANGELOG 同步。
v6.5.3:预测匹配只参考自身(大盘指数项默认关闭,2026-10-17): L1 形态匹配打分去掉「大盘涨跌点差」项、样本分层筛选去掉「大盘±0.8pp」条件 (量能/板块/缺口/开盘缺口兜底照旧),L2/L3 池匹配
_pool_match同口径去掉 指项权重(distance_idx=0);上证/创业板指行情继续用于展示与 AI 市场简报, 不再影响预测区间与样本挑选。旧口径可用 ini[predict] match_idx_env=1恢复 (三项全上,含缺数据 0.40 平均惩罚)。新增CFG.MATCH_IDX_ENV(默认 False, ini 持久化);APP_VERSION=6.5.3;stock_predict.py重新生成; README/ARCHITECTURE 3.1/3.2、第七节同步。
v6.5.2 热修②:预测K线涨跌停钳制 + AI市场简报后台预热(2026-10-17): ①预测K线异常修复——
_fusion_prediction/_multi_day_prediction新增lim(当日单日涨跌停,按_limit_pct板块口径:创业板/科创板20%、主板10%、 北交所30%;复牌/上市首日不设限传 None 跳过)与prev_close: t_pred/pred 的 价位钳到 昨收±涨跌停 内,多日幽灵K线逐日单日收益钳 ±lim; 此前样本池含20%/30%板样本,主板股(如 sz002241)预测出”跌停都不够跌”的 非法跌幅;analyze()与load_pools_progressive均传入,ctx 增limit; stock_web.py 预测同步钳制。②AI页点【开始分析】卡死修复——ai_market_brief()曾在GUI主线程直接构建激进档板块轮动闸门 (tier_load_panel 18~170s + tier_build_features ~20s,主线程日志可证); 现拆分:ai_market_brief()主线程只做轻量指数简报,闸门读后台缓存 (10分钟TTL),冷缓存返回”后台预热中”并自动派 daemon 线程_ai_market_brief_full()预热(打开AI页即触发);ai_choose_tier改全量版(本就在后台线程)。回测/信号口径零改动;stock_predict.py重新生成;README 极限与 ARCHITECTURE 3.1/3.9、第七节同步。
v6.5.2 热修①:工具窗非模态化(2026-10-11): 工具/基本面/策略消融推荐/全部组合四窗拆除
grab_set(全库仅剩的4处模态), 与主窗口可同时操作;各窗打开前先销毁旧实例防堆叠(结果窗恒展示最新一次),transient置顶与居中/聚焦保持;纯GUI行为,回测/信号口径零改动;stock_predict.py重新生成;ARCHITECTURE 3.13 节与第七节同步。
v6.5.2:AI画线落图(2026-10-11): AI分析首次出图:prompt追加机器可读画线块(```ai-lines JSON,最多6条水平价位+ 2段趋势,kind限buy/sell/stop/support/resistance/target,价位须在近60日区间±30%内),
parse_ai_lines()校验(非法/越界静默丢弃)后存res["ai_lines"], 主图以ACCENT色虚线+左侧“AI·标签 价格”绘制(水平线全宽、趋势段按日期映射视野, 越界不画);AI完成(首轮/追问/缓存复用)即解析重绘,工具栏“AI线”开关显隐, 清空对话/新一轮提问同步清线,切换股票随res更换自动清线;APP_VERSION=6.5.2;stock_predict.py重新生成;README/ARCHITECTURE(3.9节与第七节)同步。 说明:当前为“完成后即画”(后台线程阻塞调用+完成回调),token级流式边想边画暂未做。
v6.5.1 热修③:SELL冷却独立可配(2026-10-11): SELL信号冷却不再写死(此前展示侧写死5天、回测跟买入冷却8/8/3);
RISK_PARAMS每档新增sell_cooldown(默认=买入冷却,行为零变化),_composite_signals的SELL分支经_sell_cd()取值(旧策略缓存无此键自动回退), 设置→预测参数新增三档SELL冷却行(0-30天,0=SELL后不冷却)、ini[predict]sell_cooldown_<档>落盘;全部组合窗口选中行同步显示“冷却/卖冷”; 回测/消融/研究脚本(同传rp)口径自动一致,无需重跑; 改动SELL冷却后需重选策略刷新缓存参数;stock_predict.py重新生成; ARCHITECTURE 3.3 节与第七节同步。
v6.5.1 热修②:多维评分展示与回测单源化(2026-10-11):
analyze()展示侧曾手搓120根打分循环,与消融/回测用的_composite_signals分叉三处——BOLL多算下轨回升/上轨回落±1、SELL冷却写死5(回测用各档rp)、 弱势BUY+1只在展示侧生效,图上信号与消融评估的不是同一套 (抽查 sh600608 近1000根:62天BOLL维度差±1,足以翻转±2阈值信号)。 现展示侧直接调_composite_signals全量生成再截后120根,弱势过滤与消融一致 (不加严);复合图表信号文案变为精简版“多维偏多(分)”;回测/消融口径零改动, 旧策略缓存与历史回测数字不变;stock_predict.py重新生成;ARCHITECTURE 3.3 节与第七节同步。
v6.5.1 热修①:预测分位数 OHLC 一致性钳制(2026-10-11): 收/高/低三组分位数此前独立加权+
INTERVAL_K放大,尾部必然交叉 (如 sz000725 休市快照 P10 收5.41 < 低5.42,预测K线自身不成立)。_fusion_prediction现逐分位强制lo<=cl<=hi且高≥开/收、低≤开/收;_multi_day_prediction同口径逐分位+累计价格双钳制(_build_ghosts本就自洽不动); 盘中live钳制后显式再钳一次防舍入反转。区间只向外扩、P50/上行概率/信号/回测口径不变;stock_predict.py由build_cli.py重新生成;ARCHITECTURE 3.2 节与第七节同步。
v6.5.1:消融策略选择窗可配三档/全表(2026-10-11): ① 设置→预测参数新增「消融策略选择」下拉(三档推荐/全部组合,
CFG.ABLATION_VIEW,ini[predict] ablation_view,默认三档推荐保持旧行为); 消融完成(研究批量直读/本地重算)后按此设置分发:三档走原三选一推荐窗, 全表走_rerun_strategy复用研究全量候选直读 + 本地重算兜底链路; 三档窗内「全部组合…」与信号胜率页「重选策略(全部组合)」仍可单次直达大表。 ②APP_VERSION=6.5.1;stock_predict.py由build_cli.py重新生成; README 同步一句;纯 GUI 行为,不涉及算法/数据口径,回测数字不变。
v6.5.0:档位重构——均衡接管老稳健,新稳健拉长持有(reb20/buffer20)(2026-10-10): ① 原 beta-Top5 / blend_mom-Top20 均衡策略淘汰(
blend_mom评分保留仅研究对照); 均衡接管 v6.4.2 老稳健口径:四口径统一blend等权 Top10 / reb10 /hold_buffer=10/ic_filter=True/mdd_guard=0.08/ 上证 MA20 闸门(中期持有档); ② 新稳健在老稳健基础上拉长持有:reb 10→20、hold_buffer 10→20(Top10/IC/熔断8%/上证MA20 不变,长期低换手档;reb/buffer 均取自然数、未寻优); ③ 均衡主基准科创50→上证(TIER_BENCH四口径均衡切sh000001, 与其承接的老稳健策略同基准;激进仍对标科创50);ai_choose_tier提示词与RISK_AI_GUIDE同步(新增“均衡=中期持有”条,稳健条追加 20 日+缓冲20 说明);tier_make_scoredocstring 中 blend/blend_mom 归属同步。 ④ 全量重跑(数据截至 2026-09-30):标准回测 full(research/backtest_v6.5.0_20261010_222735_full/)+ val + bull 四口径三档;picks10 full/val/bull(10 万口径)。 实测(相位平均·含费用):全A全期 稳健 +22.1%/-15.5%( reb20/buffer20,新)/ 均衡 +69.3%/-16.4%(=老稳健 v6.4.2 口径);主板 +14.2%/+52.2%; ETF +0.7%/+5.7%;全A含ETF +20.5%/+73.3%。 样本外 val(全A)稳健 +16.1%/均衡 +48.9%;强势段 bull 稳健 +45.5%/均衡 +88.7%; picks10 全期稳健 +11.3%/均衡 +61.2%、val +12.4%/+40.1%、bull +38.4%/+76.4%。 诚实声明:拉长持有在动量策略上全面跑输(20 日动量信号配 20 日调仓=信号过期; buffer20=Top30 保留留恋弱股;reb20 相位平均天然 20 相位、区间起点晚 10 个交易日 至 2022-09-29,与 reb10 批次区间不完全可比)。APP_VERSION=6.5.0;stock_predict.py由build_cli.py重新生成;README/ARCHITECTURE(3.7 节与第七节)同步。 生产端“当前目标持仓”不受 reb 影响(仍走 IC+Top10 快照;长期持有请按 20 日节奏手动执行, 熔断同口径手动止损)。
v6.4.2:稳健档只做高胜率 + 严格控制回撤(2026-10-07): ① 单股选型高胜率导向:
_ablation_weights("稳健")由 Calmar 0.45/PF 0.25/胜率 0.20/年化 0.10 改为 0.30/0.30/0.30/0.10 (胜率+PF 合计 0.60 主导,Calmar 0.30 保留回撤约束,年化 0.10 不追收益; 保守档经映射同步受益,激进档保持偏年化不变);_pick_one_from_pool对保守/稳健强制 训练段 ≥8 笔才可参选 (防“1~2 笔 100% 胜率”假策略,不足自动回退 ≥3 笔/全量), 并兜底过滤test候选(研究脚本若全量跑出 test 也不泄漏进稳定档)。 ② 单股稳健风控收紧:RISK_PARAMS["稳健"]由 (1.5/1.02/0.94/3/8) 改为 (1.5/1.015/0.95/3/8)——+1.5%即启动移动止盈、回落5%即走 (原 +2%/回落6%);仍宽于保守 (1%/4%)、严于激进 (5%/10%), 保持三档单调,入场门槛 3/冷却 8 不变(已是严进)。 ③ 组合稳健加 8% 回撤熔断:四口径TIER_CFG*["稳健"]新增mdd_guard=0.08;tier_sim_phase跟踪本相位净值峰值, 回撤超 8% 即按收盘清仓(reason=mdd_guard,跌停/停牌顺延), 清空目标、峰值重置,下个调仓日才可重建。 实测(全A·相位平均·含费用):全期 +73.5%/-19.5%/4180 笔 → +69.4%/-16.4%/4281 笔(回撤 -3.1pp,代价 -4.1pp; 荐股逐笔胜率 46.1%→43.7% 系熔断止损笔数(794 笔mdd_guard)增加所致, 属“以胜率换回撤”的预期代价;单股选型的高胜率导向在逐股层面体现, 组合逐笔胜率不作高胜率考核); 样本外 val +50.5%→+48.9%、强势段 bull +87.9%→+88.7%, 熔断未损样本外。RISK_AI_GUIDE["稳健"]同步“只做高胜率、严控回撤”口径。 ④APP_VERSION=6.4.2;stock_predict.py由build_cli.py重新生成; README/ARCHITECTURE(3.6/3.7/3.8 节与第七节变更索引)同步。 生产端“当前目标持仓”仍走 IC 确认+Top10(熔断只作用于回测引擎; 实盘请结合净值回撤手动执行同口径熔断)。
设置窗口切页不再跳动(2026-10-07):设置左侧分区切换时窗口忽大忽小、 上下跳动——改为打开时按全部分区最大需求一次定死窗口/画布尺寸并只居中一次, 切页仅换内容+刷滚动范围;短页下方留白、长页内部滚动。 纯 GUI 行为修正,不涉及算法/数据口径。
v6.4.1:预测参数·风险偏好新增
test(sm701 模型直出、不消融)(2026-10-07): ① 预测参数·风险偏好CFG.RISK_PARAMS增加test:单股分析的买卖点 不参与策略消融,直接由 sm701 LightGBM 概率滞回映射(≥0.55 BUY、 <0.50 SELL,同一方向不重复);参数只作用于 ATR 止损/移动止盈(沿用激进档 宽松风控)。analyze()在 test 下跳过消融缓存与自动消融弹窗,「重选策略」 给出提示;消融任务与「全部组合」窗口经ablation_risk_params()显式排除 test; 设置页、报告、AI 系统提示词(RISK_AI_GUIDE["test"])同步标注该口径。 ② 新增单股概率桥sm701_prob_map():历史段流式读valid_predictions.csv.gz(按库/模型/预测文件 mtime 缓存),预测文件之后的 新交易日走_sm701_live_predict()全市场特征实时复算(与组合矩阵共用缓存); 信号生成_sig_sm701()供图表、信号胜率回测共用(实测 sh605198 2024-01~2026-09 概率 661 日、146 个信号,回测链路正常)。 ③ 同步 sm701 主文件夹新版本代码到副本(只同步 .py:train_ablation.py新增 horizon(T+1/T+5/T+10)与 flow/margin/lhb/events 特征组、eval_calibrate.py新增),未复制 7GB 库与正在运行的回测产物。 ④APP_VERSION=6.4.1;stock_predict.py由build_cli.py重新生成; README/ARCHITECTURE 同步。
v6.4.0:新增独立实验风险档
test(接入桌面 sm701 副本与模型数据)(2026-10-07): ① 独立档位:TIER_CFG*新增test(Top10、每日按分数重排、无指数闸门), 与稳健/均衡/激进并列但标记为实验档;GUI 荐股下拉、设置荐股偏好和工具菜单均提供 手动入口,默认研究/回测与 AI 自动选档仍只跑稳定三档(偏好选 test 时回退稳健并注明)。 ② sm701 接入:默认优先只读连接~/桌面/sm701 (副本),可用SM701_DIR/SM701_DB/SM701_MODEL/SM701_PRED覆盖;股票表、 行业表与日K来自副本stock_cache.db,不复制 7GB 扩展库。 ③ 评分链路:2024-01 起读取lgbm_output/valid_predictions.csv.gz历史概率; 已有预测之后的新交易日用副本lgbm_output/lgbm_model.txt+ 原特征工程实时复算, 已实测 2026-09-29 复算值与历史落盘逐元素一致,并生成 2026-09-30 最新 Top10。 ④ 口径冲突备案:sm701 标签是「次日开盘买→收盘卖」的日频截面 alpha (A股 T+1 不可当日卖出),与本仓库「T-1 信号→T 收盘成交」引擎错位;实测test组合(Top10 日调仓、全A、含费用)2024-01-02~2026-09-30 总收益 -96.0%(年化 -69.1%、回撤 -96.0%),同区间 sm701 自报样本外 Top10 年化净 +49.0%/回撤 -32.0%,两组数字不可互推;GUI 报告/荐股页与 README/ARCHITECTURE 已加显著提示,荐股列表仅作研究观察。 ⑤APP_VERSION=6.4.0;stock_predict.py由build_cli.py重新生成; README/ARCHITECTURE 同步 test 档路径、手动选择与实验边界。
v6.3.3:信号胜率加「交易明细」子页 + 重选策略改「全部组合」窗口(排列方式可选)(2026-10-06): ① 交易明细:
_bt_events新增可选detail_out(逐笔记录 买入/卖出日期·价格· 收益·原因:信号卖出/ATR止损/移动止盈/持仓中),_bt_segments(detail=True)为 全期/训练/验证三段附带detail;工具→信号胜率页新增「交易明细」子页 (Treeview:段/序号/买入日价/卖出日价/收益/原因,可按段筛选、点列头排序, 盈绿亏红、浮仓金色);导出 txt 追加逐笔明细段,JSON 新增trades_detail(full/train/val;并顺带不再把_rows原始K线写进full)。 ② 全部组合:run_ablation返回值新增candidates(全部算法×风险档候选); 新增load_full_ablation流式读取research/strategy_ablation_per_stock.json(约600MB,按行建 code→字节偏移索引、按需 seek+raw_decode,不整文件加载; 首次约 4s、之后秒开),「重选策略」按钮改为打开「全部策略组合」窗口—— 列出全部候选,顶部「排列方式」可选 推荐/档位优先、按算法/风险档分组、 训练/验证综合评分、年化、胜率、Calmar、回撤、交易数等 14 种;选中行直接应用 (双击同);窗口内「本地重算(当前参数)」后台消融完成后刷新;研究文件无覆盖时 自动回退本地消融。三档选择弹窗新增「全部组合…」入口,按钮文案改 「重选策略(全部组合)」。 ③APP_VERSION=6.3.3;stock_predict.py由build_cli.py重新生成; README/ARCHITECTURE(3.6/3.8 节与第七节变更索引)同步。
v6.3.2:设置窗口改 PyCharm 式分区导航 + 指标参数可调(ADX 平滑等)(2026-10-05): ① 设置分区导航:设置窗口由单页滚动改为左侧分区 + 右侧内容页(PyCharm 式)—— 左侧
ttk.Treeview分区「外观 / 预测参数 / 指标参数 / 荐股 / AI 接口 / 关于」, 点选切页;窗口宽高随当前页自适应(上限屏高 88%),底部按钮栏固定, 滚轮仍递归绑定全部子控件;「关于」页作者信息按要求移到最下方 (版本 → 免责声明 → 作者/邮箱/QQ)。 ② 指标参数可调:CFG新增 13 个指标参数并持久化到 ini[inds]—— MACD 快线/慢线/信号线(12/26/9)、KDJ N/M1/M2(9/3/3)、 RSI 短/长(6/12)、BOLL 周期/倍数(20/2.0)、 ADX 周期 / ADX 平滑 / ADX 趋势阈值(14/14/20); 设置→「指标参数」页可改并「恢复默认指标参数」;set_ind_param统一钳制(快线2-60、慢线3-120、ADX 2-60/阈值10-60 等, MACD 自动保证慢线>快线),非法输入保留原值。 ③ 计算函数接入:calc_macd/calc_kdj/calc_rsi/calc_boll/calc_adx缺省参数改读CFG;calc_adx新增smooth参数将「DX 平均/ADX 平滑」 与 TR/±DM 的 Wilder 周期分离;分析页指标/买卖点打分(含ADX_TH)/ 消融/逐股回测/backtest_bsmatrix.py共用;图表与右栏标签 (RSI{短}/RSI{长}、BOLL({N},{K})、ADX/DMI({N})、ADX≥阈值) 随参数动态显示。默认值与原硬编码完全一致,numpy/序列级回归对照 逐元素相等,历史回测结果不变(未重跑)。 ④APP_VERSION=6.3.2;stock_predict.py由build_cli.py重新生成; README/ARCHITECTURE(3.13 节)同步。
v6.3.1:稳健档收紧(IC 确认层 + Top10 + 换仓缓冲带)+ 买卖点稳健档更严格(2026-10-05): ① 组合策略「稳健」降交易/严指标:四口径
TIER_CFG*["稳健"]由 「blend等权 Top20 / 无确认」改为 「Top10 + IC 确认层 + 换仓缓冲带10」——ic_filter=True为档位默认(候选须过tier_ic_confirm:120 日窗近5日→未来5日 Pearson IC>0 且 t≥2 且样本≥60,且 T-1 日 MA20/60 多头趋势在场), 确认不足宁缺毋滥;hold_buffer=10让在位股排名在 Top20 内即保留,只有跌出 缓冲带才被替换。tier_eval/tier_picks_stats/tier_latest_picks支持 档位级 ic_filter(全局ic_filter=True仍强制全档,10 万回测路径不变)。 实测(全A · 相位平均 · 含全部费用):全期 +30.2%/-8.6%/9708 笔 → +73.5%/-19.5%/4180 笔(交易 -57%);样本外val+4.8%→+50.5%、 强势段bull+17.4%→+87.9%;主板 +49.7%/-22.5%、ETF +9.5%/-9.7%、 全A含ETF +69.6%/-16.6%。代价:IC 趋势确认层在 2023~2024 弱市更吃亏, 全期回撤由 -8.6% 扩至 -19.5%(val/bull与 2025~2026 显著占优)。 配对实验(全A · 全期):IC+Top10 无缓冲 +83.0%/4480 笔(100 万口径), 缓冲带10 = +73.5%/4180 笔(换手再 -7%、收益 -9.5pp);Top20 只加缓冲仅 -3% 交易(前 20 名排名变化极快,缓冲几乎不生效)、换手上限方案降换手 -35%~-50% 但全Aval明显受损,均未采用。生产端「稳健」目标持仓同步 走确认层 + Top10(即使调用方未开ic_filter)。 ② 买卖点风险档「稳健」更严格:CFG.RISK_PARAMS["稳健"]buy_th 2→3、cooldown 5→8(与保守档同为严进,区别在止盈更宽 +2%/回落6% vs +1%/回落4%);n=300 实测多维买点信号 -28%、中位年化 基本不变。设置页说明改「保守=严进紧出 稳健=严进缓出 激进=宽进宽出」。 ③ 引擎修正:tier_sim_phase实际成交的买入会加入当期目标集合, 避免「整手/涨停跳过后买入的标的次日被旧目标误卖」——该修正令均衡/激进档 旧批次数字小幅变化(全A 均衡 +56.2%→+61.6%、激进 +118.5%→+116.3%)。 ④ 全量产物重跑(2026-10-05):标准回测 full/val/bull 四口径三档 (research/backtest_v6.3.1_20261005_*)、10 万荐股组合 picks10 full/val/bull(稳健 +65.6%/-19.7%、val +43.5%、bull +78.7%)、dashboard.html重建。 ⑤APP_VERSION=6.3.1;stock_predict.py由build_cli.py重新生成; README/ARCHITECTURE 同步(3.6/3.7 节与第七节变更索引)。
v6.3.0:异动·全市场相似历史(激进/均衡专属,触发即改判)+ 分析页显示行业/换手率(2026-10-04): ① 异动触发(超出自身历史波动范围):近 20 个交易日内出现 「单日|涨跌| ≥ max(自身历史 99.5 分位, 5%)」或「5日累计|涨跌| ≥ max(自身历史 99.5 分位, 10%)」即视为异动状态(分位只用事件日以前数据, 无前视)。以龙版传媒(sh605577)为例:9/8 的 5 日累计 +59.85% 超过当时 历史 99.5 分位 47.38%,稳定触发。 ② 全市场相似异动匹配(
_analog_events/analog_scan):对全A股 (剔除 ETF)按同口径提取历史异动事件(全库约 7 万例,进程内只建一次), 按「K线形态(20日对数收益 z-normalize)+ 事件后路径 + 量比 + 换手率 (et_shares总股本换算)+ RSI14 + 20日波动 + 事件r5」加权距离取 Top50, 统计相似事件在「事件后第 k 日」(k=目标股距异动日交易日数)的次日/3日/ 5日表现。 ③ 触发即改判(激进/均衡档,默认开启):分析风险档非「保守」时,若 相似样本方向明确(次日上行≥55% 且 1/3 日均收正→BUY;≤45% 且均收负→SELL) 则覆盖最近买卖点(撤掉近 3 根反向信号后标注),band_algo改为 「异动·全市场相似」;样本分歧则维持原策略并在报告注明。激进档相似样本 次日封板率 ≥30% 时附「可打板」与涨停价提示。设置→预测参数可关 (ini[predict] analog_override=0)。 ④ 参与回测:新增因果信号生成器_sig_analog(rows, full)——按ANALOG_SIG_STEP(2 日)在事件后状态窗口逐日推进,仅方向变化出信号; ①历史信号并入单股图表与bt_stats回测统计;②进入消融候选池 (GUIrun_ablation与backtests/backtest_strategy_ablation.py的gens,ALGO_LABEL["analog"]="异动·全市场相似",候选池 12 算法 × 3 档
- 多维评分 = 39);③可被三档选型选中(
tier_picks_from_ablation/ GUI 策略缓存 /strategy_signals_full/ 逐股导出)成为正式买卖点策略。 候选事件表改为因果分位(每ANALOG_PCT_STEP=20日重算、块内沿用, 跨股向量化构建 ~24s),历史回放无未来函数。同时tier_load_panel由fetchall()改游标流式 + SQL 前缀过滤(全库 800 万行不再一次性构造 Python 元组;输出逐元素对拍一致),单进程建表峰值 3.6GB → 505MB—— 修复消融多 worker 各自建表导致的 OOM。 ⑤ 显示(需求2):报告标题行改为名称 (代码) [行业],现价后加换手 x.xx%;顶部信息栏同步;_fetch_quote_tencent解析 f38/f39/f46 (换手率/动态PE/PB)随快照返回;右侧栏加「异动相似」结论行。 ⑥APP_VERSION=6.3.0;stock_predict.py由build_cli.py重新生成; README/ARCHITECTURE 同步。专项自测:龙版传媒触发 2026-09-08(判定时为 第 12 日),相似 50 例:次日上行 56%、次日均 +0.63%、3日均 -0.87%、 封板率 4% → 分歧「观察」不改判(诚实边界,非必给方向);_sig_analog生成 12 条历史信号并入 bt_stats;研究消融--limit 40冒烟通过 (analog 候选已参评,样本小、IC 结论待全量重跑)。 ⑦ 全量产物重跑(2026-10-04 12:40~14:07,v6.3.0 首批):全市场消融 7236 对象/7183 有效、耗时 5123s(6 worker,含各 worker 首次建异动事件表 ~24s;峰值内存从 OOM 修至单进程 505MB);三档选型 26s 同步刷新perstock_tier_picks.json、ablation_gui_cache.json(7183 只)与 GUI 策略 缓存。analog 入选:保守 98 只 / 稳健 132 只(1.84%)/ 激进 91 只(1.27%); analog 候选描述性统计(5968 只、17813 候选):IC1 中位 +0.058(56.0% 为 正)、IC5 中位 +0.041(53.5% 为正)——优于 LGBM(IC5 -0.005)与 L2 (-0.000),低于筹码峰(+0.077)。逐股导出重跑(6901 只 tiers),其中 analog 321 行、覆盖 156 只(稳健档中位总收益 +41.1%/胜率 60%/回撤 -13.1%;系入选偏差样本,勿与全市场中位直接比较);dashboard.html重建。 标准回测 full/val/bull 三段一并重跑(backtest_v6.3.0_20261004_144*, 组合数字与昨日同口径批次逐项一致,仅激进档因数据修订 +0.5pp 内浮动); 仪表盘「消融汇总表」新增「异动相似入选」列(v61_dashboard.py), 可直接看到稳健 132 只(1.84%)/ 均衡 91 只(1.27%)。
v6.2.4:换手率/动态PE/PB 入库(腾讯行情备用通道)+ 生产端亏损股过滤 + 每只股回测加 IC 中位(2026-10-03): ① 估值/交易数据入库:
stocks表新增turnover(换手率%)/pe(动态PE)/pb列(启动自动迁移旧库);refresh_all_codes的东财 clist 字段由f12,f14,f20,f100扩为f12,f14,f8,f9,f20,f23,f100(f8 换手率/f9 动态PE/f23 PB); 新增refresh_valuation_tx(腾讯批量行情通道,q[38]/[39]/[46],60 只/批, ~1 分钟刷新全库)作为 push2 整域故障时的备用通道,并在代码表刷新尾部自动only_missing补缺。实测全库 7285 只全部入库(茅台 PE 12.58 类校验正常)。 ② 生产端过滤(选股用):tier_latest_picks默认剔除动态 PE≤0(亏损) 候选(新增picks_exclude_loss(),ini[picks] exclude_loss=0可关;PE 缺失 不过滤);picks 输出新增pe/turnover字段;实测 1765 只亏损股被剔除, 荐股列表页脚追加过滤说明;不参与历史回测(无历史时点估值数据,避免 生产/回测口径不一致)。基本面工具头部追加「估值/交易快照」行(PE/PB/换手率)。 ③ 每只股回测页新增「IC 中位(T+1 / T+5)」卡片:与收益中位分开独立统计 (收益中位/胜率中位/回撤中位已有),样本为当前筛选(含「去±20收益极值」勾选) 后的行;消融汇总表的 IC1/IC5 中位保持不变。 ④APP_VERSION=6.2.4,stock_predict.py由build_cli.py重新生成; README/ARCHITECTURE 同步。
v6.2.3:档位重定名(四档 → 三档,全库去除「高风险」名)+ 三工具性能优化(回测/回填/清洗):> v6.2.3:档位重定名(四档 → 三档,全库去除「高风险」名)+ 三工具性能优化(回测/回填/清洗): 0. 档位重定名(本次主线):原四档「稳健/均衡/激进/高风险」调整为三档 「稳健/均衡/激进」——原「稳健」(blend_mom 0.6/20日)策略淘汰; 原「均衡」→ 稳健(blend 等权 Top20/10日/上证MA20)、原「激进」→ 均衡 (全A=创业板60日β Top5/创指MA60;其余口径 blend_mom 0.7 Top20)、 原「高风险」→ 激进(板块轮动 rotate + 轮动闸门 + 打板,策略逐字段未改)。 自 v6.2.3 起不存在「高风险」这个名字:组合档位、GUI 每日荐股 MODES/设置偏好/ 消融弹窗/导出下拉/工具菜单、AI 引导与自动选档、CLI 帮助全部三档化;
CFG.RISK_PARAMS删除第四组「高风险」(ATR6.0/冷却2),个股买卖点/消融/逐股回测改保守/稳健/激进三档 (消融候选 = 12 算法 × 3 档 = 39);_ablation_weights/_pick_one_from_pool/ 推荐档与高波动回退同步;旧四档批次归档research/legacy_batches/。 全量产物重跑:消融(7183 只/1404s,稳健档 lgbm 入选 742 只 10.3%、IC5 中位 +0.079)、 tier_picks + GUI 策略缓存(7183 只)、逐股导出三档(20703 行/223s)、标准回测 full/val/bull 三档批次(research/backtest_v6.2.3_*)、10 万组合三档 (全期 稳健 +69.1%/均衡 +33.9%/激进 +15.1%;val +48.2%/+28.1%/+43.6%; bull +81.1%/+44.9%/+89.6%)。核对:新激进全期 +118.0% ≈ 旧高风险 +117.6%。 ① 回测 ·stock_backtest_export.py:删除「backtest_signals+_bt_segments」 双跑——原每档先把同一组信号回测两遍(先_bt_simulate全期+训练+验证,再_bt_events覆盖),现只跑 GUI 消融同引擎的_bt_segments,IC 由_signal_ic直接算;_signals_with_cache扩展为按算法缓存信号(指标型信号不依赖风险 参数,同算法多档免重复生成)。实测 约 2.4 倍(三档全量 6901 只 665s→223s); 400 行与优化前逐项对拍零差异。backtest_v61.py并行粒度升为口径×档位 (默认拉满 CPU,12 组合 + 12 荐股任务 / 8 worker)。 ② 回填 · 每股网络请求 5 → 3:_bf_fetch_one已抓到腾讯不复权全序列, 却仍调用_raw_last_price(+1 请求)且_sync_adjust再拉一次腾讯 raw (+1 请求);新增_BF_RAW_HINT(date→raw 收盘,取本批尾部 12 根)——_bf_fetch_one返回 raw 末价、_sync_adjust优先消费提示做同日期配对 (raw_map参数,缺失才回落网络),并带防泄漏上限与失败路径清理。 腾讯源在线时每股 3 请求,按 0.45s 全局节流约省 0.9s/只(全市场 ≈ 100 分钟); 实测 6 只 16s 全部成功,显示缩放 K 正常写入。 ③ 清洗 ·data_clean.scan流式化:旧实现fetchall()把全库 1271 万根 日K 一次性载入内存再按 code 分组(峰值数 GB),改为itertools.groupby游标流式(内存只留单只);与旧实现逐字节对拍:stats 全等、383 只问题 清单内容零差异(含「孤儿标注在其它问题之后」的顺序也保持一致)。 ④APP_VERSION=6.2.3,stock_predict.py由build_cli.py重新生成; py_compile / test_settings 通过;README/ARCHITECTURE 同步。
v6.2.2:GUI 打通研究消融——四档批量缓存 + 消融弹窗优先读研究结果(2026-10-03): 背景:GUI 此前不直接读研究消融 JSON,唯一通路是
tier_picks_from_ablation.py把推荐档经save_strategy写入 meta 缓存(5 日 TTL)——只跑研究消融不进 GUI、 缓存只带一只策略、过期后弹窗只能本地重跑(近1000日,3~5 分钟/只)。 ① 生成端:tier_picks_from_ablation.py在原有tier_picks.json(perstock 导出用) 与 推荐档 meta 缓存之外,新增research/ablation_gui_cache.json(四档全量, 与run_ablation返回同构:mode_candidates 四档 + recommend + bars/train_n/val_n + vol_ann/high_vol,train/val 精简为 ann/mdd/winrate/trades/pf;7184 只约 14.5MB)。 ② GUI 端:新增load_research_ablation(文件变更自动重载、5 日 TTL、缺失/过期/ 未覆盖返回 None);_ensure_strategy在无策略缓存时优先用它弹窗(状态栏提示 「已载入研究消融结果(批量缓存,免本地重算)」),读不到才后台本地消融—— 「策略消融」手动重选(清缓存后)同样秒开研究四档,不再等 3~5 分钟。 ③APP_VERSION=6.2.2,stock_predict.py由build_cli.py重新生成; 已重跑选型脚本刷新缓存(推荐档分布 保守2358/稳健4346/激进480)。 ARCHITECTURE 4.1 节与 README 同步。 热修①(同日):主图 BOLL 图例与右上角「现价 C:」标签/幽灵标签同排重叠 (截图里叠成乱码 “CRB.P(20,2)”)——图例从右上角移出,并入左上角 MA 图例行 依次排布(按实际字宽推进,不新增重叠)。
㊿ v6.2.1:工具页新增「基本面信息」(东财 F10 历史财报)+ 仪表盘可读性(IC 中位数/指标表格)+ 消融重跑(量比/LGBM 首次入研究池,2026-10-03): ① 工具→基本面信息:新增
fetch_f10_metrics(东财 datacenter F10 主要指标RPT_F10_FINANCE_MAINFINADATA,最多 12 期报告期倒序;复用_http_get限流退避 +em_f10熔断器 + 代理路由——eastmoney.com已在_DOMESTIC_SUFFIX,双 hostdatacenter/datacenter-web容灾;6h 内存缓存_F10_CACHE);fundamentals_summary纯本地规则分析(不联网不调 AI):成长性(营收/净利同比序列、增收不增利、扣非背离)、 盈利质量(ROE 分级/毛利率/净利率/每股现金流÷EPS)、财务风险(负债率,金融地产不评)、 综合结论(偏多/中性/偏空 评分制)。GUI:工具窗口新增「基本面」页签(代码框回车/按钮 线程抓取,表格 13 列 + 分析文本,已有代码自动抓取)、小屏工具菜单加「基本面信息」; 未分析股票时该页与数据工具页保持可用。 ② 仪表盘可读性(v61_dashboard.py):组合净值曲线下方新增两张表——「组合指标」 (每档:总收益/年化/回撤/Sharpe/超额/交易/相位区间/荐股笔数/均收益/胜率/基准年化)与 「消融汇总」(最新ablation_v*/summary.json:对象数/主算法 Top1/训练与验证年化中位/ 验证回撤与胜率中位/IC1 与 IC5 中位数/IC5 为正占比/牛市熊市年化中位);collect_ablation收集最新两份消融汇总。 ③ 消融重跑:研究脚本backtest_strategy_ablation.py的gens补齐 v6.1.10 只加了 GUI 的 量比_sig_vol_ratio/ LGBM_sig_lgbm(此前研究池 9 算法,GUI 11 算法); 每候选新增描述性ic1/ic5(_signal_ic全样本 Spearman,仅展示不参与选型),summary.modes[*].ic聚合 IC1/IC5 中位数与 IC5 为正占比。环境修复:安装lightgbm 4.7.0 + scikit-learn 1.9.1(requirements-client.txt 本就要求)——此前 sklearn 缺失导致LGBMRegressor.fit静默失败、lgbm 候选恒为空。重跑结果 (7236 对象、有效 7184、1382s):稳健档 lgbm 入选 784 只(10.9%)、量比 37 只, IC1 中位 +0.018 / IC5 中位 +0.081(75.3% 为正);均衡档 lgbm 711 只(9.9%),IC5 +0.078;tier_picks.json与 GUI 策略缓存已刷新(7184 只,5 日 TTL),dashboard.html重建。 ④APP_VERSION=6.2.1,stock_predict.py由build_cli.py重新生成; README 功能亮点与 ARCHITECTURE 数据层/工具页/4.1 节、变更索引同步。 热修①(同日):修复v61_dashboard.py模板 JS 注释中ablation_v*/summary.json的*/提前闭合块注释 → 整页脚本语法错误、仪表盘批次/图表全部空白(node--check校验模板脚本通过);_style_ttk补Treeview/Treeview.Heading深色样式 (clam 默认白底 + 全局.白字 → 基本面表格白底白字、除选中行外全部不可读), 随主题切换自动换色。 热修②(同日):标准回测重跑补最新批次——backtest_v61.py四口径 × 四档full/val/bull三段(research/backtest_v6.2.1_20261003_*,数据截至 2026-09-30; 稳健档与 v6.1.11 改动后数字一致,均衡/激进/高风险随数据窗口延伸微移 ±0.1~0.4pp),README 全期/分段表与权威产物路径同步;stock_backtest_export.py重跑每只股回测(6901 只 / 27604 行,事件股 192 只标注),仪表盘「每只股回测」页 换新批次。仪表盘现有 v6.2.1 全期/样本外/强势段批次 + v6.2.1 消融汇总(IC 中位)。 热修③(同日):仪表盘「每只股回测」排序修复——数值列空值(零交易股的年化/收益) 被替换为 1e18 后经降序翻转排到最前,首屏全被零交易行占据;改为空值恒沉底、 数值按所选方向排序(新旧批次零交易率均为 ~3%,数据本身正常)。 热修④(同日):每只股回测补「数据停更/退市」事件判据——用户核数据发现 高风险档首屏出现 2005~2008 年窗口的幽灵收益(包头铝业 +1443%、东方锅炉、新湖创业等): 322 只退市/停更代码残留在缓存,stock_backtest_export.py按「近1000根」截窗后 窗口内无跳变/长停,旧事件检测(|涨跌|>44% 或 停牌>90天)全部漏标。新增判据 「数据停更 >90 天 或 delisted 表登记」→ 事件列标「数据停更N天至YYYY-MM-DD (退市登记)」(_init_worker注入全库最新日+退市集合),事件股 192→364 只, 1288 行幽灵行情全部标注、仪表盘默认剔除;_init_worker加 gmax/delisted 参数、 事件股口径说明同步(导出 meta 与仪表盘注释)。 热修⑤(同日):荐股统计去极值口径——荐股逐笔收益右尾无上限(妖股连板, 全期单笔最好 +401.4%)、左尾受止损/闸门约束但退市情形仍可达 -50%,普通均值被 极端值拉偏;仪表盘「组合指标表」与「荐股逐笔指标表」新增/改为 去±20极值均值 (trimMean:去掉最大/最小各 20 笔后取平均,基于页面内含逐笔样本 ≤1500、 保留两端尾部),逐笔表同时保留原始均/中位列对照,「导出指标CSV」加 「荐股均收益(去±20极值)%」列。核实:当前全期数据各档最差单笔 -27%~-50% (用户提到的 -90.03% 不在现行批次中,疑为旧批次/单股回测口径)。 更正(同日,用户指正):去极值对象应为全样本(每只股回测页)而非荐股—— 荐股侧改动全部还原;「每只股回测」页新增「去±20收益极值」勾选(默认开): 统计卡片与列表按 总收益% 去掉最大/最小各 20 只(空值不参与),卡片「筛选后只数」 标注(已去±20收益极值),勾选可随时关闭;导出 CSV 保持全量数据不变。 追加(同日,用户要求):净值曲线页「组合指标表」的荐股均收益列同步改用 去±20极值均值(trimMean,基于逐笔样本 ≤1500 保留两端尾部;无样本时回退原始均值), 列名标注「荐股均收益(去±20极值)」。
㊾ v6.2.0:荐股确认层(历史IC+指标综合)+ 10 万元荐股组合回测项目(2026-10-03): ① 荐股逻辑改造——新增
tier_ic_confirm(_TIER_CACHE["ic"]):每只股滚动 120 日窗计算 「近5日收益(信号强度)→未来5日收益」Pearson IC(cumsum 向量化、行分块控峰值内存), 确认条件(全截至 T-1 防前视):IC>0 且 t≥2 且样本对≥60 且 T-1 日 MA20/60 多头趋势在场 ——历史 IC 高与指标确认综合考量(单一 IC 阈值易过拟合,120/5/60/2 全取自然数不做寻优); 当期确认覆盖约 100/6317 只,属高门槛宁缺毋滥。tier_sim_phase增ic_ok(调仓候选先过 确认层再按档位综合分取 TopN,确认不足时持仓可少于 TopN、余下持现金);tier_eval增ic_filter/capital参数;tier_latest_picks增ic_filter/top_n(picks 增ic字段)。 GUI 每日荐股四档模式改走 IC 确认 + Top10:资金按 top 均分(10 万 = 10 只 × 约1万, 组合口径,不是每只 10 万),列表新增 IC 列与确认口径说明。 ② 新回测项目backtests/backtest_picks10.py:10 万元组合总资金荐股回测——Top10、 每只约 1/10 仓、调仓频率按档位各自节奏(稳健 20 日 / 均衡 10 日 / 激进 10 日)、 T-1 决策 → T 收盘成交、滑点/佣金/印花税/过户费/整手/涨跌停/停牌/退市全约束、相位平均;--capital/--top/--tier/--universe/--yearly可调。关键行为(全A,相位平均含费用): 全期 稳健 +7.1%(回撤-21.6%)/ 均衡 +69.1%(年化+13.9%、超额+49pp、Sharpe 1.21)/ 激进 +33.9%;样本外 均衡 +48.2%(Sharpe 2.96、超额+49.1pp)/ 激进 +28.1% / 稳健 +9.1%;强势段 均衡 +81.1%(Sharpe 3.24)/ 激进 +44.9% / 稳健 +32.9%。 IC 层贡献对照(同本金 10 万、同 Top10、仅关确认层):均衡全期 +18.8%→+69.1%、 激进 +4.0%→+33.9%、样本外均衡 -3.3%→+48.2%;稳健全期 +14.6%→+7.1%(回撤 -10.4%→-21.6% 变差,但样本外 +0.1%→+9.1%、强势段 +11.4%→+32.9% 均更优)。 口径警示:本金规模影响结果(整手粒度 + 高价股预算买不进,如 10 万×Top20 时 >50 元股 无法建仓),10 万口径与既有 100 万相位平均数字不可直接互比;产物research/picks10_{full,val,bull}.json。 ③APP_VERSION=6.2.0,stock_predict.py由build_cli.py重新生成; README 荐股说明与回测摘要、ARCHITECTURE 3.7/4.1 节同步。
㊽ v6.1.11:稳健档偏动量重做——合成排名 动量0.5/低波0.5 → blend_mom 0.6/0.4(四口径,2026-10-03): 问题:等权低波把医药/科技等高波动成长股系统性挤出稳健档 Top20——高波动股动量分位 ~0.95 但低波分位仅 ~0.1,
0.5·rank(ret20)+0.5·(1−rank(vol20))恒输给青岛港/煤炭/银行/电力类 「动量尚可+波动极低」的防御股,荐股长期只见防御票。 改动:四口径TIER_CFG/TIER_CFG_MAIN/TIER_CFG_ETF/TIER_CFG_ALLETF的 稳健 档改score="blend_mom", mom_w=0.6(保留 0.4 低波作防守项;top/reb/闸门不变,blend评分保留给 均衡档与研究对照)。关键行为:四口径全期 +14.6→+18.4%、+18.8→+21.8%、+10.5→+14.8%、 +25.9→+26.7%;样本外 +0.8→+3.1%、+2.7→+4.9%、+1.6→+2.4%、+1.4→+1.5%;强势段 +11.4→+15.7%、+11.2→+15.1%、+24.2→+30.7%、+21.9→+21.3%;回撤基本不变(ETF -10.7→-12.3%),荐股均收益/胜率同步改善(全A 均收益 +0.55%→+0.68%)。 证伪记录(防后人重蹈):①动量短名单方案(先取 20 日动量 Top50/80/120 再在名单内低波精选, 意图放成长股进场)全期 -51.0%/-35.0%/-17.7%——A 股 20 日动量 Top 几乎全为妖股/ST, 低波项实为崩盘过滤器,不可绕开;②纯 60 日动量口径全期 +10.4%、样本外 -5.0%,同样证伪; ③故只做权重平移(0.5→0.6,邻域 0.6/0.65/0.7 均优于现行,取 0.6 保留稳健档防守性格)。 注意:当期(2026Q3)全市场动量龙头本就是防御股,改参数不会立刻让医药/科技进持仓—— 它们动量走强时才会被选入。tier_make_scoredocstring、GUI 荐股口径文案、backtests/backtest_tiers.py注释同步;APP_VERSION=6.1.11,stock_predict.py由build_cli.py重新生成;README 全期/分段表稳健行与策略原理、ARCHITECTURE 3.7 节同步 (research/v61_report*批次未重跑)。
㊼ v6.1.10:消融增「量比 / LGBM」+ BOLL 独立打勾 + 指标线颜色 / 粗细自定义(2026-10-02): ① 消融增 2 个候选——
ALGO_LABEL加vol_ratio="量比放量"、lgbm="LGBM预测"(新增_sig_vol_ratio用vol_ratio_at阈值 ±1.5/0.5; 新增_sig_lgbm用LGBMRegressor因果滚动训练:每 50 根重训一次, 仅用当日及以前数据预测次日收益,±0.5% 阈值 BUY/SELL,lightgbm 缺库静默 返回 []——当前环境未装亦能正常消融,仅这一个候选空集);gens池 11 算法 × 4 风险参数 + 4 多维评分 = 48 候选;strategy_signals_full、 主图策略信号重算两处同步;策略消融弹窗文案「9 算法」→「11 算法」。 ② BOLL 独立打勾——self.show_boll = BooleanVar(True),工具栏MA5/10/20/30/60旁加BOLL复选框(小屏top2/ 大屏top同位);_draw_main的show_boll改为self.show_boll.get(),三轨分别boll_on[up/mid/low];副图 combobox 移除 BOLL 选项, 同步移除_draw_bollpct分支(该函数已废弃删除)。 ③ 副图新增「量比」——combobox["MACD", "KDJ", "RSI", "ADX", "量比"], 新增_draw_vol_ratio(近5日均量/前15日均量 折线 + 0.8/1.0/1.2 三道 阈值 + 标题尾标vol_regime);analyze的res["ind"]加vr_arr,slice_view切片后写入 view;十字光标 hover 文本加「量比:X.XX」。 ④ 指标线:颜色 / 粗细自定义(设置页)——设置页新增分段 「指标线:颜色 / 粗细(自定义)」:① 线粗度 Spinbox1~3(默认 1);② MA5/10/20/30/60 + BOLL 上/中/下轨 共 8 个色块按钮, 点击调tkinter.colorchooser.askcolor选色;③ 「指标线颜色 恢复默认」按钮按当前主题刷回;底层新增ma_color(nn)/boll_color(key)/ind_w()三个模块级助手,apply_theme接受ma_colors/boll_colors覆盖参数;新增模块级常量IND_LINE_W=1与IND_BOLL_COLORS{up/mid/low};ini[ui]段新增ma_colors/boll_colors/ind_w三键,启动时自动加载。 ⑤ 指标线整体变细——_line(width=2)改为默认ind_w()(1), 旧固定width=2的支撑/压力线、5日均量线、ADX 线统一收窄。stock_predict.py由build_cli.py重新生成;本轮按用户要求不重跑 回测,README 回测摘要沿用 v6.1.9 批次。APP_VERSION=6.1.10; CHANGELOG / ARCHITECTURE 同步。
㊻ v6.1.9:高风险档重做为「新开发的高风险策略」(板块轮动 + 大盘降权 + 提高风险偏好,2026-10-01): ① 组合层(进攻性重做)——第四档由「复制激进的激进破甲版」改为新开发的板块轮动策略, 四口径统一
score="rotate"(`0.5·rank(行业20日动量) + 0.5·[0.7·rank(个股20日动量)
- 0.3·(1−rank(20日波动))]
,强势板块中的强势股优先)+Top5 / 10 日调仓+gate_mode=”rotation”板块轮动闸门(0.6·行业广度 + 0.4·上证MA20 ≥ 0.35,**大盘权重由 100% 降到 40%**、主参考板块广度;全期开闸 **1010/1636=62%**,明显长于旧闸门 全A 创业指 MA60=777、上证 MA20=857——阀门开得更久,只在板块间来回切换而非空仓)+ 保留allow_limit_up=True打板; ② **新增引擎件**——tier_sector_features(行业等权ret20→sector_ret20、动量为正行业 占比sec_breadth,缓存TIER_CACHE[“sec”];ETF/无行业退化为自身动量)、tier_make_score增rotate、新增tier_make_rotation_gate/tier_build_gate(cfg.gate_mode=”rotation”分派);ai_market_brief高风险档闸门改用真实板块轮动闸门状态; ③ **风险偏好提高(暂不管最大回撤)**——CFG.RISK_PARAMS[“高风险”] = (atr_mult 6.0, trail_trigger 1.15, trail_ratio 0.80, buy_th 1, cooldown 2):宽止损、浮盈 15% 后回落 20% 才移动止盈、冷却缩短到 2;**整体删除 v6.1.8 的 500 日历史最大回撤止损机制** (_mdd_stop_dist与_bt_events/_bt_simulate/tier_latest_picks的dd_window分支); ④ **命名与定义清理**——旧档位名统一重命名为「高风险」(GUI 下拉/弹窗/设置、CLI、AI 提示词与 自动选档、回测脚本/图表/仪表盘、README/ARCHITECTURE),删除已废弃的旧选型扫描脚本与留档产物, CLI 由build_cli.py重新生成,APP_VERSION=6.1.9; ⑤ **回测重跑**——全期/样本外/强势段/逐年/逐股全部重跑(research/backtest_v6.1.9、v61_report.md、dashboard.html、tiers_yearly.json`),全A 全期总收益 +117.5%(年化 +21.2%)vs 激进 +56.2%(+11.7%)、最大回撤 -16.8% 反而更低; README 报告/四档策略/风险参数表、ARCHITECTURE 3.6/3.7/3.8/4.1/4.4/七节同步。
㊺ 键盘精灵默认清空搜索栏 + 设置界面适配 dock/任务栏(v6.1.8 热修①,2026-09-30): ① 搜索栏行为(同花顺式键盘精灵)——按下可打印字符自动聚焦搜索框:新一次搜索先清空搜索栏再 从该字符开始(搜索框自身有焦点时同样生效,如启动预填/上次分析残留的
002241,此前会被拼成0022416);同一次搜索会话内连续输入正常追加,Backspace/粘贴等手动编辑视为会话内继续编辑; 回车与小键盘回车(<Return>/<KP_Enter>)均可选中候选或开始分析;Esc、焦点离开、开始分析 (run())结束会话,下次输入重新清空。实现:新增_wiz_active会话标记与_search_end()(关下拉+会话复位),_global_key不再对搜索框自身直接跳过,_search_key在文本非空 时维持会话,同时过滤不可打印键(顺带修复此前非输入控件下按 Backspace 会把\x08控制字符写进搜索框 的隐患)。9 场景实测通过(清空/追加/Esc/跨控件按新分析后重输/无匹配候选不中断会话/纯光标移动不激活/ 小键盘回车开始分析且不重开候选)。 ② 设置界面布局——open_settings的maxh从int(screenheight*0.88)改为基于winfo.vrootheight(已扣除任务栏/菜单栏的可用区)×0.88 再扣 40px 给标题栏/阴影;_center_win同步切换到vrootheight算 y,保证窗口底部不被 dock 栏/任务栏遮挡(小屏分支不受影响, 仍强制全屏)。其他对话框(信号胜率/工具/关于 等较小窗口)同步受益。APP_VERSION=6.1.8不变;stock_predict.py由build_cli.py重新生成。CHANGELOG/ARCHITECTURE 第七节同步。
㊹ v6.1.8:高风险 档改「激进破甲版」(配置复制激进 + 允许打板 + 按历史最大回撤止损,2026-09-28): ① 组合层——
TIER_CFG/_MAIN/_ETF/_ALLETF的高风险改为dict(同口径激进, allow_limit_up=True)(全A=创业板高β Top5/10日/创业板指 MA60; 主板/ETF/全A含ETF=blend_mom 0.7 Top20(ETF Top10)/10日/上证 MA20;仅额外解除 「涨停不买」);初版「blend_mom Top5/20日/科创50 MA60」高赔率低频实现废弃 (全A +31.3% 跑输激进 +56.2%),配套扫描脚本与留档产物已随 v6.1.9 档位重做删除。 ② 买卖点风险参数(按历史最大回撤止损)——CFG.RISK_PARAMS["高风险"]入场与 激进完全一致(买点门槛 1 / 冷却 3),止损改用入场前 500 日个股历史最大回撤 (新增_mdd_stop_dist,限幅 8%~50%;未盈利=入场价−MDD、盈利后=峰值−MDD),_bt_events/_bt_simulate双引擎支持,历史不足 60 根回退 ATR4.0/回落12%; 生产端tier_latest_picks的 高风险 参考止损同步为 MDD 口径。 ③ 消融选型——_ablation_weights/_pick_one_from_pool的 高风险 目标由「偏 PF 赔率」 改为与激进一致(偏年化+Calmar);GUI 消融弹窗/设置页按钮说明/菜单版本号/AI 提示词 (RISK_AI_GUIDE、ai_choose_tier)同步「激进破甲」口径;APP_VERSION=6.1.8,stock_predict.py重新生成。 ④ 回测口径——组合引擎不设止损(只按调仓/闸门进出),本次止损改动只影响 单股买卖点/消融/逐股回测;按用户要求本轮不重跑回测,README 回测摘要沿用 v6.1.7 批次(research/backtest_v6.1.7_20260928_220922_full/、v61_report*.md、tiers_yearly.json); README 四档策略/高风险 说明/风险参数表、ARCHITECTURE 3.6/3.7/3.8/4.4/七节与仪表盘文案同步。 ⑤ 性能与口径修复(P0/P1)——P0:_bt_simulate年化口径与_bt_events对齐 (用区间起点日期算年数、下限 0.25 年;首信号远晚于区间起点时年化不再虚高); P1:三大回测脚本多进程并行 + 跨档指标复用——①backtest_v61.py4 口径改 多进程并行(新增--workers,0=自动 min(4,CPU)/1=串行),父进程预热面板/特征后 fork 继承(初版每进程独立加载 1.6G 库争 IO,实测 175.9s 反比串行慢;修复后 75.6s → 74s,基线 127.9s、目标 ≤80s 达成),修复初版重构产生的计时 bug (t0移到口径回测之前)与主进程重复tier_load_panel(data_end改用库内 最大交易日);②stock_backtest_export.py逐股回测改map+chunksize=20批量提交(替代旧submit+as_completed逐只 IPC,默认 workers 4→8),且4 档 共用 1 次 ATR(14) 预计算 + composite 算法 4 档共用 1 次_composite_precompute(ATR/pre 不依赖 rp/sigs,原 4×重复计算),260s → 204s(-22%);③backtest_strategy_ablation.py改map+chunksize+ 默认 workers 8→16, 509s → 373s(-27%)。组合层 v61 数字与 v6.1.7 高风险 改激进破甲版完全一致 (浮点 <0.01pp)。基线协议见research/baseline/BASELINE.md。 ⑥ P0 数据正确性二轮修复(2026-09-30):深度审查发现并修复—— ① 高风险 档止损参数实际未生效(P0-12,v6.1.7 高风险 改激进破甲版起即存在):tier_picks_from_ablation/stock_backtest_export的 高风险 档直接取选型候选pk.get("params"),若选型选中mode='激进'候选则 高风险 档实际跑激进 ATR 止损 (ATR2.5x),500 日 MDD 止损形同虚设(perstock 高风险 与激进 total/ann/winrate/val 全部完全一致)。修复后 高风险 强制RISK_PARAMS["高风险"],选型只决定 algo/信号源; perstock 高风险 总收益中位 +63.22%→+37.24%(-25.98pp),胜率 50%→56%(+6pp), 盈亏比 2.21→1.48(-0.73),呈现「高胜率·低赔率」真实画像,验证段 -2.62% (样本外仍接近 0),其他档不受影响; ② 生产端 高风险 参考止损与回测口径差 1 根:tier_latest_picks用_mdd_stop_dist(C[k], d+1, ...)取 T 日之前 500 根,回测引擎用_mdd_stop_dist(c_a, i=执行日=T+1, ...)取 T+1 日之前;改d+2对齐; ③ 过拟合相关 docstring 误导修复:_ablation_recent/pick_ablation_consistent旧 docstring 误称「近窗 = 验证段」,实际 v6.1.5 热修⑥ 已改传split, 近窗严格只用训练段末尾 250 根;docstring 与实现同步,加 ⚠ 防回归注释。 ㊸ GUI 内置「一键全量回测」入口 + 打开仪表盘(2026-09-28):工具菜单新增 「一键全量回测(全期/分段/逐股,后台)」与「打开回测仪表盘(网站)」; 数据工具页顶部新增同名区块(含「含逐年分段」勾选),点击直接调仓库根run_backtest.sh,stdout 实时回流到数据工具窗口(沿用_ext_spawn子进程与 停止按钮)。链路:全期四口径 × 四档 → val → bull →(可选逐年)→ 全市场逐股,backtest_v61/逐股导出各自刷新dashboard.html,跑完脚本自动打开网站; 菜单入口会复用已打开的工具窗口,不重复开窗。无头实测:命令拼装 (bash run_backtest.sh [--yearly])、窗口直达数据页、仪表盘 file:// 打开均正常。
㊷ 桌面「一键回测」快捷方式 +
run_backtest.sh(2026-09-28):新增仓库根run_backtest.sh(--yearly可选、--dry-run预演)按顺序执行 ①全期四口径 × 四档 → ②样本外 val → ③强势段 bull → ④全市场逐股回测 (进程数=min(核数,8));每步终端与research/oneclick_backtest_<时间戳>.log双写,任一步失败即停并保留窗口;跑完自动打开research/dashboard.html。 桌面快捷方式~/桌面/stock_backtest.desktop(Name=一键回测,Terminal=true, 已设metadata::trusted)双击即可。实测:逐年 95s、全市场逐股 260s (6897 只 / 27588 行 / 四档工作表)均正常;快捷方式默认不含--yearly, 需要逐年数据时执行bash run_backtest.sh --yearly。
㊶ 仪表盘支持导出完整回测数据 + 全量回测命令(2026-09-28):
dashboard.html顶部新增导出按钮——导出全量数据(JSON):全部批次(全期/样本外/强势段/ 后续逐年批次)× 口径 × 档位的指标、净值曲线、每只股回测、单股(GUI)记录与 复现命令一次打包;导出指标 CSV:全部批次的组合 + 荐股逐笔指标(含批次区间/ 标签,可直接做分期对比);导出曲线 CSV:全部批次净值 + 主基准净值长表。 「每只股回测」页新增导出当前筛选 CSV(尊重搜索/档位/正收益/事件股筛选与排序), 「单股回测(GUI)」页新增导出本记录 JSON(含完整净值曲线与 T+1/T+5 统计), 「明细表 / 文件」页新增全量回测命令块(全期 + 样本外 + 强势段 + 逐年 + 全市场逐股,一键复制到仓库根目录执行)。导出全部为浏览器端 Blob 下载, 无需本地服务;gjs 对导出函数做了运行级验证(指标/曲线/JSON/筛选 CSV 均正确)。
㊵ 核验「净值曲线横线」= 闸门关闭空仓(非无交易/无数据)+ 仪表盘标注(2026-09-28): 针对「横线是不是没交易」的疑问逐档核验 v6.1.7 全期报告:4 口径 × 4 档共 195 处平段,全部满足区间内闸门开 0/N,且平段前闸门刚开过(如全A激进 2026-07-24~09-24 平段 28/28 关闭)。结论:水平段 = 趋势闸门关闭 → 各相位在 自己的调仓日依次清仓后持现金(相位平均下先分化后全平),非行情缺失或引擎 故障;曲线横线越长代表该档空仓避险越久(如 高风险 2023-06~11 科创50 MA60 长关 5 个月)。 为避免误读,
dashboard.html净值曲线页新增横线说明(各档闸门对照), 且悬浮读数对处于平段的档自动标注「(空仓·闸门关)」。
㊴ v6.1.7 热修②:AI 提示词按风险偏好 + 所有风险偏好入口补 高风险(2026-09-28): ① AI 提示词动态化——新增
RISK_AI_GUIDE(档次 保守 < 稳健 < 激进 < 高风险) 与ai_system_prompt():保守=等确认/轻仓,稳健=兼顾但必须可执行, 激进=突破即进攻、禁用「等企稳/等回踩/观望」搪塞,高风险(最高档,高于激进)= 高赔率敢下手、强势/涨停附近可直接给买入或打板(涨停价)建议、允许集中仓位、 禁止等企稳措辞;系统提示词与首条数据上下文都注入该约束,风险偏好变化后 上下文 hash 随之变化 → 自动重新提问,不复用旧口径缓存回答;ai_choose_tier改用基础系统提示词避免偏置。 ② 所有风险偏好入口补 高风险——逐股回测导出stock_backtest_export.py:--mode tiers分表加 高风险(xlsx 四工作表)、--mode 保守/稳健/激进/高风险单档 固定该档参数(修正单档此前实际落到稳健参数的问题);tier_picks_from_ablation.py选型/推荐/高波动回退加 高风险;GUI「数据工具→每只股回测」下拉改「四档(分表)」+ 高风险;图表「激进档多交易兜底」扩展至 高风险(保证买卖点可见)。 ③ 文档——README AI 功能/标签页、ARCHITECTURE 3.9/4.1/变更索引同步。
㊳ v6.1.7 热修①:买卖点风险偏好新增 高风险 档(高赔率·低频,2026-09-28): ① 参数——
CFG.RISK_PARAMS增高风险 = (atr_mult 3.5, trail_trigger 1.05, trail_ratio 0.90, buy_th 2, cooldown 8):比稳健(ATR1.5/冷却5)止损更宽、 止盈更慢(+5% 才启动移动止盈、回落 10% 才走)、交易更少;经 300 只 × 400 根 同源对照选出(_composite_signals+backtest_signals):高风险 赔率中位 1.73 / 年化中位 +2.0% / 均笔 11.7,对照保守 1.50/-1.2%/10.2 笔、 稳健 1.69/-1.0%/14.1 笔、激进 1.83/+1.5%/18.7 笔。 ② 消融集成——_ablation_weights新增 高风险 目标(PF 0.45 / Calmar 0.25 / 年化 0.20 / 胜率 0.10),_pick_one_from_pool按其映射;run_ablation候选 30→40(10 算法 × 4 参数),输出四档mode_candidates、日志与推荐, 高波动股回退范围加 高风险;策略弹窗order加 高风险(可单选应用), 设置页「风险偏好」下拉自动含 高风险。 ③ 文档——README「四档风险参数」表 + 高风险 对照段、ARCHITECTURE 3.6/3.8/变更索引、 消融脚本注释同步;build_cli.py重新生成stock_predict.py。 注:逐股多维评分的绝对收益整体偏弱(与既有「样本外归零」结论一致), 高风险 档定位为同族中「赔率优先、换手更低」的参数档,不代表组合层 高风险 策略。
㊲ v6.1.7:新增第四档 高风险(高赔率·低频·允许打板,四口径)(2026-09-27): ① 引擎支持——
tier_build_features新增beta60_star(对科创50 的 60 日 β),tier_make_score新增mom(纯动量)/beta_star(扫描用,后证伪),tier_sim_phase识别cfg.allow_limit_up(仅 高风险 档解除「涨停不买」,回测实测 1.3%~1.9% 的买入发生在涨停价,ETF 池约 0);四口径TIER_CFG*各加高风险(blend_mom/Top5/20 日调仓/MA60 闸门:全A 与主板 mw0.7、ETF mw0.6、全A含ETF mw0.5; 闸门全A/主板/全A含ETF 用科创50,ETF 用创业板指),TIER_BENCH四口径 高风险 均对标科创50。② 选型——新增backtests/sweep_高风险.py扫描(≥100 组合, 产物research/高风险_sweep_*/):β 类四口径训练段全负、纯动量次差、reb30/top3训练段最优但样本外转负;按「训练段为正 + 样本外为正」定版blend_mom Top5 reb20。③ 生产端——tier_latest_picks输出limit_up标记,CLI/GUI 目标持仓对信号日封板标的标[涨停]并提示打板成交口径;ai_market_brief增科创50 与四档闸门,ai_choose_tier提示词、GUI 每日荐股下拉、 设置「荐股偏好」均加入 高风险。④ 回测——全期/样本外/强势段四口径重跑 (research/backtest_v6.1.7_*):高风险 全期年化 +5.2%(主板)~+8.6%(全A含ETF)、 回撤 -8.4%~-13.4%、交易约 2100 笔(激进档的 1/5),荐股赔率 1.43~1.79; 样本外val/bull为正但明显低于激进档(牛市中低换手档跑不过高β,README 有声明)。 ⑤ 文档/产物——APP_VERSION=6.1.7、build_cli.py重新生成stock_predict.py、v61_charts/v61_dashboard档位列表加 高风险、README/ARCHITECTURE/CHANGELOG 同步。
㊱ 每只股回测加「事件股」检测 + 仪表盘默认剔除(2026-09-27):用户实测
sz000578盐湖集团(原数码网络)激进档全期 +2564%,核查为 2007-07-20 停牌 → 2008-03-11 借壳复牌:复权价单日 +603%(用新浪因子还原的不复权价约 4.8→30.2), 是策略被动持有穿越 235 天停牌的一次性事件收益,不可交易/不可复制。现stock_backtest_export.py逐股检测并入「事件」列:① 单日复权 |涨跌| > 44%; ② 相邻K线日历间隔 > 90 天(≈停牌 > 60 个交易日);run_meta新增event_codes(本次全库 180/6897)。仪表盘「每只股回测」页新增 「排除事件股」勾选(默认开),卡片/数据表统计剔除,页脚与说明页同步口径; 新批次perstock_backtest_v6.1.6_20260927_220255(8 进程 329s)已自动刷新仪表盘。 注:聚合中位数受事件股影响本就很小(稳健档总收益中位 +55.9%→+56.2%), 修复主要针对极端尾部与个股排名。
㉟ v6.1.6 标准回测批次补齐(2026-09-27):
python backtests/backtest_v61.py全期四口径重跑(125s),生成research/backtest_v6.1.6_20260927_213721_full/(10 图 / 6 表 / run_meta,adj=mul_qfq_sina),research/v61_report.*最新副本 与仪表盘「回测批次」默认批次同步切到 v6.1.6(此前只有 v6.1.5,段批/旧口径可下拉);all/main与 14:38 的 v6.1.5 全期批次逐项一致;etf/all_etf小幅漂移 (ETF 激进总收益 +28.8%→+28.2%、交易 4573→4577;稳健/均衡万分位级), 源于 20:40-20:42 GUI 后台预取对部分 ETF/LOF(sh512390、sz168101 等)复权数据 的修订(库内总根数不变)。README「回测报告」ETF / 全A含ETF 单元格与版本化目录 已同步;注意:后续数据层修订后,标准批次需重跑并同步 README。
㉞ GUI 每只股回测导出改多进程(2026-09-27):
backtests/stock_backtest_export.py的回测主体是逐根 K 线的纯 Python 循环(GIL 串行),原ThreadPoolExecutor下 「并发」开再大实际也只吃约 1 个核;现改为ProcessPoolExecutor——--workers/GUI「并发」即并行进程数(默认 4),任务按「每只股票」拆分 (每只独立只读库、进程间无共享状态),回测参数与库路径经 initializer 注入 (兼容forkserver(3.14 默认)/fork/spawn),进度统计改as_completed完成数;stock_gui.py算法链与生成的stock_predict.py均未改动。 实测 60 只三档导出 workers=1 5s → workers=4 2s(标的越多越明显), 两口径产物逐行一致。导出结束后自动刷新research/dashboard.html(「每只股回测」页,与backtest_v61同刷新链、失败不影响产物), 浏览器打开即可看本次批次;该页选择器由「数据」改名「导出批次」, 与「回测批次」(只列backtest_v61标准组合回测)区分,避免找不到批次。
㉝ v6.1.6 发布打包(2026-09-27):客户端包名恢复带版本号 (
stock-analyzer-client-v6.1.6-<日期>.zip,build_client_zip.app_version()从stock_gui.py读APP_VERSION,读取失败退化为纯日期);upload_research_release.py发布说明更新为 v6.1.6(18 策略综合 + 口径一致性 + 旧口径重跑产物),默认--tag改 v6.1.6;Release 资产=客户端包(GUI/CLI/插件 + 全量stock_cache.db、空 Key 模板,打包后 API Key 自检)+研究包research_v6.1.6.zip(回测报告/图表/仪表盘/消融选型与逐对象明细,排除legacy/与*.pkl/*.npz);ARCHITECTURE4.4 版本链、README 发布索引同步。
㉜ 仪表盘默认批次 + 信号胜率面板与消融口径统一(v6.1.6 第二步,2026-09-27): ① dashboard 与 README 不一致修复——此前仪表盘默认取「最新 ts 批次」, 而 2026-09-27 17:16/17:18 生成的是分段
val/bull批次,默认展示强势段数字 (全A 稳健 +11.4%)与 README 全期(+14.8%)不一致;现默认选 最新「全期 + 新复权口径」 批次(init先找!legacy && segment=="full"),分段批次仍可在下拉切换; ② 旧复权口径标注——2026-09-27 数据层切「真乘法后复权」前的批次/导出全部作废: 研究批次(3 个)、gui_backtests单股记录(3 条)、perstock_backtest导出(3 批) 现带legacy标记,下拉/页内醒目提示「旧复权口径」,且不参与默认选择;backtest_v61._write_meta/bt_common.write_run_meta/ GUI 导出 JSON 新增adj="mul_qfq_sina"标记,后续产物不再靠时间判断; ③ 消融 vs GUI 回测工具逐项一致——「工具→信号胜率」面板原用backtest_signals(_bt_simulate分段、trades 含浮仓、前 75/25 固定),与「策略消融」弹窗 (_bt_events、trades 只计平仓、val=max(200,n/4))引擎/切分不同:sz002241 实测 验证集 10 笔/-7.0% vs 弹窗 9 笔/-6.8%;现抽出_bt_segments(消融同引擎同切分) 供 信号胜率面板与每只股回测导出共用,并_bt_events补齐 closed/floating/ avg_win/avg_loss/盈亏比/trades_list 字段(向后兼容),实测弹窗/面板/导出 交易/胜率/年化/回撤逐项相等(sz002241 训练 89.69% / 验证 -6.95% 两口径一致); 面板文本/导出同步注明「同窗同引擎」,盘中假K不再计入(与消融一致)。 ④ 旧口径产物按新口径重跑——全库消融ablation_v6.1.6_20260927_181225(7179 只、509s)+ 三档选型(刷新 7179 条 GUI 策略缓存 +perstock_tier_picks.json)
- 每只股回测导出
perstock_backtest_v6.1.6_20260927_184701(对齐引擎,6 线程 689s,adj标记)全部完成;仪表盘 perstock 页已显示新批次。 注:gui_backtests的 3 条单股记录仍是 2026-09-26 旧口径(页内已标作废), 需在 GUI「工具→信号胜率」重新计算并导出才会刷新。
㉛ 荐股新增「综合(18策略)」(v6.1.6 第一步,2026-09-27):每日荐股下拉的 「综合(旧评分)」替换为 「综合(18策略)」——从隔壁
chaodi_strategies/et_engine移植 18 策略引擎(通达信口径:TDX EMA/递推、BOLL ddof=1、Wilder RSI、涨停/连板/ 60日新高低等信号)进stock_gui.py(自包含,build_cli.py自动同步 CLI): ① 单次全市场扫描(尾部 500 根、≥250 根;hfq×adjust 乘法前复权、et_shares 真实换手、 逐策略基础过滤(价格/市值/成交额/ST/次新,趋势突破门槛更高)、套用荐股权限与股票池); ② 多策略共振综合:各策略候选池内 min-max 归一化打分(与 chaodi 服务端口径一致), 综合分 = 命中策略数 ×100 + 命中策略均分,列表显示共振数/均分/命中策略,双击分析; ③ 对拍:500 只随机样本 × 18 策略与 chaodi 引擎命中集合全部一致; 实测全A约 35s(主板约 58s,后台线程不卡界面); ④ 旧daily_picks/daily_pick_score保留(backtests/backtest_picks.py历史回测仍用), GUI 不再调用;APP_VERSION=6.1.6。
㉚ 筹码峰柱改细横条(v6.1.5 热修⑬,2026-09-27,版本收尾):筹码柱高由
≈1.15×桶距、上限 8px(连片实心楔形,视觉过粗)改为0.5×桶距、上限 3.5px, 恢复同花顺式细横条 + 间隙,峰形/最厚带更清晰;支/压标签预留宽度不受影响。 至此 v6.1.5 收尾(tagv6.1.5)。
㉙ 筹码峰标签遮峰修复 + 文档规范化 + 新口径回测重跑(v6.1.5 热修⑫,2026-09-27): ① 筹码峰显示修复——K线图「支/压」标签(黑底框)原右对齐到价格条左侧, 会压住筹码峰最厚带/峰尖;现筹码柱先为标签预留宽度
lab_reserve(按「支/压 xx.xx」实测字宽 +12px),标签区与柱体完全错开、峰尖完整可见, 标签仍最后绘制不被柱体盖住(stock_gui._draw_main); ② 文档规范化——README 重构为用户向(功能亮点 / 快速开始 / 回测摘要 / 三档策略 / 运行与复现 / 数据 / 局限 / 文档索引),历史变更流水全部迁入本CHANGELOG.md;AGENTS.md约定同步改为「每次改动写 CHANGELOG」; ③ 新口径回测重跑——数据层切换新浪因子乘法口径后,四口径标准回测 全期(118s)+ 样本外 val + 强势段 bull 全部重跑,README「回测报告」同步 新数字(全A 稳健/均衡/激进 +14.8%/+29.4%/+56.2%);旧 hfq 仿射口径 下的历史回测数字全部作废;仪表盘research/dashboard.html已刷新。
v6.1.5(2026-09-26): ① 版本号 6.1.5:新增
APP_VERSION(关于页 / AI UA / 回测目录共用); ② 回测产物按「版本 + 时间」建文件夹:backtests/backtest_v61.py每次运行自动新建research/backtest_v6.1.5_YYYYMMDD_HHMMSS_<区间>[_tag]/,回测数据全在里面:report.json/md、run_meta.json(版本/时间/区间/口径/数据规模/耗时/Python/命令行)、tables/*.csv(tier_metrics组合指标、picks_metrics逐笔指标、phase_anns相位年化、picks_returns逐笔收益分布、benchmarks三基准、equity_curves相位平均净值),charts/*.svg(相位箱线图 / 逐笔箱线图 / 总收益柱状图 / 逐笔均值柱状图);research/根仍保留v61_report*.json/md最新副本,--compare/发布链不受影响; ③ 全样本回测已重跑(v6.1.5,四口径全期,数据截至 2026-09-24,109s,10 图 / 6 表): 全A/主板与 v6.1.4 权威口径逐项一致(全A 稳健/均衡 +15.0%/+25.1%、激进 +65.4%); ETF/全A含ETF 因当日新缓存 ETF 入池小幅变化(ETF +13.6%/+18.4%/+28.8%、 全A含ETF +25.3%/+39.1%/+36.1%,详见第三节 3.5/3.6); 产物目录research/backtest_v6.1.5_20260926_133912_full/; ④ 工具→信号胜率(回测面板):strategy_signals_full与消融同窗(近1000根)信号(训练前75%/验证后25%), IC(T+1/T+5) + 信号后 1/5 日收益 + 盈亏比/均盈均亏;收益曲线只画训练集净值(验证集仅指标), 支持「导出回测」(.txt 完整明细+净值数据 / .csv 逐日净值+回撤); ⑤ 幽灵K线显隐:视野在最新时显示 T+1/T+5/T+10 +「预测」分界线,翻看历史整体隐藏; ⑥ 缓存/拉取修复随版:节假日锚(1.7G 缓存不再周末全量空拉)+stock_fetch.log逐条拉取诊断 + 死源热修(web.ifzq 501 / 501 熔断 / hfq 探测)——详见 v6.1.4 ⑯⑰ 条目; ⑦ 本地网页仪表盘research/dashboard.html(python backtests/v61_dashboard.py生成,每次回测自动刷新;浏览器直接打开本地文件,零外部依赖):整合 研究回测收益曲线(相位平均净值 + 主基准,四口径 × 三档,支持对数轴/悬浮读数)、 指标对比(总收益/年化/回撤/Sharpe/超额柱状 + 跨批次表)、分布箱线 (相位年化 / 逐笔荐股收益)、单股回测(GUI)(导出的全期/训练/验证 + IC + 信号后收益 + 训练净值曲线)、明细表/文件(CSV 与 SVG 相对链接直接点开); GUI「导出回测」新增 JSON 并自动留档research/gui_backtests/,网页自动收录; ⑧ 工具→信号胜率面板热修(2026-09-26):收益曲线画布每次重绘前configure(bg=BG)跟随当前主题,切换主题后不再出现”黑底白块”;验证集底色改主题色 gray12 点纹 (浅色/深色/高对比下都能辨识且不刺眼);每次计算后结果文本自动回顶 (yview_moveto(0)),直接看到 全期/训练/验证 三段,不再停在末尾的「信号质量」; ⑨ 消融选型加”近端子窗一致性”(v6.1.5 热修②,2026-09-26):多指标 rank 选优之外, 最近 250 根的子窗也要排前 25%,全窗/近窗取交集后选最优;交集为空回退该档「多维评分」, 防”长期横盘/旧 regime 选出、风格切换后沉默”的策略(实测 688012 由 RSI·稳健 → 多维评分)。 近窗只用截至当前的可观测数据,验证集仍不参与 rank 打分;详见 2.7 节; ⑩ UI 优化(v6.1.5 热修③,2026-09-26,三主题统一,参照主流桌面软件): 主题调色板新增BORDER/HOVER_BG/SEL_BG/ACCENT/LOG_BG(dark/light/contrast 同步完善);_style_ttk全量升级——按钮/输入框/下拉/滚动条/标签页/分隔线/复选单选统一内边距、 边框、悬停与焦点色(clam 扁平风);「分析预测」等主按钮用加粗Tool.TButton; 主界面日志/自选池/侧栏/状态栏改用主题常量(去掉硬编码#12171d/#4da3ff等), 列表选中色与 Text 内边距统一;工具/设置/每日荐股/样本/报告/指数窗全部居中弹出 且尺寸自适应,工具窗曲线画布加主题色边框;dashboard.html新增明/暗主题切换 (右上角按钮,localStorage 记忆,图表配色读 CSS 变量随主题重绘)。详见 2.9 节; ⑪ 工具→信号胜率回测窗口与消融对齐(v6.1.5 热修④,2026-09-26):回测改用 近 1000 根(ABL_BARS,与run_ablation同窗、同 75/25 切分),导出/净值曲线/ 区间文本同步用该窗口日期。此前用全历史(可达 2400 根)切分,训练段可能落在策略数据 起点之前——L2 行业ETF 2024 才有数据时训练集恒空、曲线一条水平线(688012/002491 实测); 歌尔的”长横线”亦同因(多维评分只扫近 1000 根却拿全历史切分)。另修主图 MA 图例 按实际字宽推进,HiDPI 下不再重叠(详见 2.7/3.6 节); ⑫ K线图价格轴数字被裁一位修复(v6.1.5 热修⑤,2026-09-26):字体缩放(HiDPI, Tk 实测 scaling≈1.33)下轴标签实际宽度超过固定左边距L=58px,首位数字被画到画布外, 5 位数刻度显示成 4 位(如真实40.28显示0.28、与 K 线实际价格对不上)。现按 Tk 字体实测宽度动态让位(_text_px+_geom(lpad=),主图算、副图共用同一 L 保证 K线/成交量/指标列对齐,含 MACD 大值场景);右侧筹码「支/压」标签按实测宽度内收, 不再被画布右缘截断末位;十字光标价格标签在未勾选筹码峰(R=20)时也收回画布内; ⑬ 筹码峰修正 + 副图折叠(v6.1.5 热修⑤,2026-09-26): 筹码柱上下颠倒修复——原先按 bin 序号从上到下均匀排,与价格轴相反(低位厚筹码带 显示在顶部,峰位对不上 K 线价格),且用可见 250 根窗口另算一份,图上支/压与右栏 「筹码参考」不一致(实测 002241 图上 23.33/24.75 vs 右栏 23.69/27.33);现按ymap(价格)绘制、统一用全历史res["chips"];支/压口径从「最密集局部峰」改 「3bin 平滑后最厚筹码带」(现价切在主峰侧面时不再把远处 0.7% 小凸起选成压力, 002241 全历史压力 27.33→24.10);工具条新增「折叠副图」(紧凑小屏默认折叠, 勾选后成交量/指标画布收起、纵向空间全给主图,类同花顺),_geom改用实际高度 绘制(折叠/窗口拉伸后不再把图挤在顶部或留大片空白); ⑭ 折叠白带修复 + 分辨率自动折叠(v6.1.5 热修⑥,2026-09-26):折叠时只grid_remove会留下仍按 2:3 权重占高的空行,露出父容器浅灰底(截图白色横带)—— 现同时把两行grid_rowconfigure(weight=0)并在展开时恢复,body/left补主题底色; 分辨率检测:主图预估高度 <380px(或紧凑屏)默认折叠,窗口缩到主图 <320px 时 自动折叠(手动切换过则不再干预); ⑮ 数据工具 GUI(v6.1.5 热修⑥):工具窗新增「数据工具」页(未分析股票也可开)—— 清洗/复权迁移(data_clean.py:只扫描/修复/全库迁移、库路径、并发、限制只数、 force)与全库回填(backfill_full.py:目标根数/过期天数/单次根数/并发/节流/限制/force 全部可调,新增对应 CLI 参数)均为后台子进程 + 实时日志 + 停止按钮; ⑯ GUI 过拟合自检(v6.1.5 热修⑥,仔细检查):发现并修复唯一数据泄漏—— 消融「近端一致性门槛」原取截至最新 250 根(n=1000 时正是验证段),验证集参与了 候选筛选(top25% 否决),验证段指标偏乐观;现改为取训练段末尾(split 前 250 根), GUI 与研究脚本backtest_strategy_ablation.py同步(部分个股选型会变化,重跑消融生效)。 另核查 L1 形态/多维评分/事件回测均无前视;置信度=样本质量启发式(非命中率校准)、 全局权重与策略缓存 5 日属保留偏差。详见reports/GUI过拟合自检.md(3.8 节同步); ⑰ 每只股回测导出 Excel(v6.1.5 热修⑥):数据工具页可对全库逐只重算策略信号 + 事件回测,导出每只一行(收益/年化/回撤/胜率/盈亏比/训练段/验证段/IC/信号数) 的.xlsx(内置最小 xlsx 写入器,无 openpyxl 依赖,另存 UTF-8 CSV;参数:范围/ 近N根/策略档/并发/限制只数/输出路径),脚本backtests/stock_backtest_export.py; ⑱ 仪表盘收录每只股回测(v6.1.5 热修⑥):research/dashboard.html新增 「每只股回测」页——自动读取reports/每只股回测_*.csv(最新 3 份),支持 代码/名称搜索、档位筛选、只看正收益、23 列点击排序、分页(100/200/500/全部), 顶部卡片显示只数/收益中位与均值/正收益占比/胜率中位/回撤中位,附 xlsx/CSV 下载链接与样本内口径提示;当前全库导出 6897 只(稳健、近1000根,301s); ⑲ 修复后重跑消融 + 三档分表导出(v6.1.5 热修⑥续):按修复后的口径 (近端门槛只用训练段末尾)重跑全库消融——backtest_strategy_ablation.py7235 对象 / 371s;新增backtests/tier_picks_from_ablation.py:同 GUI 选型逻辑 逐只产出保守/稳健/激进三档 →research/perstock_tier_picks.json(7178 只,3.7MB), 并刷新 GUI 策略缓存(推荐档:保守 2846 / 稳健 3863 / 激进 469,5 日 TTL); 「每只股回测导出」新增 tiers 模式(默认):按三档选型逐只回测,xlsx 分 三个工作表(保守/稳健/激进)+ 说明,CSV 合并带档位列;仪表盘「每只股回测」 页默认筛「稳健」防卡片混档。全库实测(6897 只 × 3 档 = 20691 行 / 1319s): 全期中位 +43.6~55.2%、正收益 92~98%(含选型训练段,严重偏乐观);验证段 (选型之外)中位 -0.7~-0.8%、正收益仅 46~47% —— 三档逐股选型的”赢家诅咒” 实证,跨股比较务必看「验证段收益%」列(Excel 说明页与仪表盘均已标注); 另重跑标准组合回测research/backtest_v6.1.5_20260926_202114_full/(122s,四口径 × 三档 + 荐股,仪表盘自动收录为第 5 个批次)——组合引擎 (tier_eval,ret20/vol20/β + 闸门)不依赖逐股消融选型,故与 16:30 批次 逐项一致(全A 稳健/均衡/激进 +15.0%/+25.1%/+65.4% 等); ⑳ 回测程序统一规范(v6.1.5):新增backtests/bt_common.py(new_run_dir/write_run_meta/link_latest),所有研究程序一次运行 = 一个版本化目录research/<kind>_v<版本>_<时间戳>/+run_meta.json(版本/时间/argv/耗时/参数/ 数据规模)+ 根目录固定名「最新副本」(硬链接,旧路径兼容);已套用消融 (ablation_v*:per_stock/summary/tier_picks/run_meta)、每只股导出 (perstock_backtest_v*:xlsx/csv/run_meta,--out留空即自动建目录)、 三档选型(写进源消融目录并合并 run_meta);reports/只留人类报告。 已完成历史产物归档:ablation_v6.1.5_20260926_192853/、perstock_backtest_v6.1.5_20260926_195539/(三档)、perstock_backtest_v6.1.5_20260926_185600/(旧单档);仪表盘每只股回测页 自动识别新目录并显示运行信息(时间/只数/耗时); ㉑ 筹码柱变密 + 样本窗口不重叠 + 预测参数真正生效(v6.1.5 热修⑦): ①calc_chips默认桶数 120→360(全历史区间下可见窗口约 40→120+ 桶, 右侧筹码峰不再稀疏;信号引擎桶数不变,不影响回测); ② 单股预测最终样本挑选间隔由W//2改为首选 W(样本窗口互不重叠, 不足再逐级放宽),L2 池同股间隔同步——原来相邻样本窗口重叠一半、 同一段行情被重复计权; ③ 修复设置不生效:遗留行W_WINDOW, TOPK = 10, 10在导入时覆盖 ini, 界面显示W=20、实际跑W=10(「保存并应用」只在当次进程有效);现与CFG同步,设置即时且持久;④ 漏斗一致性:候选样本数 ≥ 最终样本数 (读写都自动抬高并提示),_pool_match改为调用时读全局 TOPK。 因 W 变更影响 L1 信号,已按新口径重跑消融 → 三档选型 → 每只股三档导出 (产物在对应ablation_v*/、perstock_backtest_v*/运行目录); ㉒ 修文档问题清单 + 过拟合二轮复检(v6.1.5 热修⑦续): ① 设置页重叠修复——预测参数 12 行占 grid 9~20,按钮行原也在 row=20, 「最大拉取样本量」被「保存并应用」盖住(截图里的 “2” 就是被遮的 2000); 按钮移到 row=30,并加 grid 单元占用自检(0 冲突); ②reports/代码审查.md处理(该清单 2026-09-12,ai-quant已于 09-25 拆出 独立仓库):本仓可修项已修——设置页 grid 重叠(本轮)、免责声明位置(已在早前修)、 Web 安全(bind 默认 127.0.0.1 + html.escape + 6 位代码校验 + 限流,已具备)、 死常数CFG.MAX_DAILY_CHANGE删除(涨跌停判定统一走板块口径_limit_pct)、build_cli.py锚点存在性检查 + 生成前语法校验;ai-quant 相关条目(P0-2~P0-4、 P1-6~P1-16、P2-23/24 等)随仓库拆分不在本仓;③ 过拟合二轮复检: 修正 W 口径与样本窗口重叠后重跑,结论稳健——全期中位 +43.4~55.2%、 验证段中位 -0.7~-0.8%(正收益 46%),详见reports/GUI过拟合自检.md二轮节; ㉓ 筹码峰同花顺式改版(v6.1.5 热修⑧):右列按画布 17% 加宽(上限 30%), 最右留 36px 价格条(十字光标价格标签固定于此、横线延伸过筹码列不压柱); 筹码柱由 2px 横线改实心矩形(柱高≈价格桶距,连成连续楔形,现价下方红 获利盘/上方绿套牢盘);BOLL 图例移到绘图区右缘;紧凑屏保持窄列。参数:CFG.CHIP_W_RATIO/CFG.CHIP_AXIS_STRIP; ㉔ 筹码分布算法对齐同花顺(v6.1.5 热修⑧续):①换手率改用真实换手 (量×100/总股本,总股本由stocks.mktcap/现价推得;缺市值退回启发式); ②新增CFG.CHIP_DECAY_SCALE=0.5(换手衰减系数)——实测 002241:scale=1.0 现价上方筹码仅 32%、老筹码消失过快,0.5 时 45%、均本 24.46、获利 55%, 与同花顺剖面(现价/均本上下≈50/50、峰在现价附近)一致; ③绘制方向改为基线在左、柱向右生长(同花顺同向);④桶数参数化CFG.CHIP_NBIN=360。信号引擎(chip_snapshots/_chip_feats_py)不随此处变化, 既有回测口径不变; ㉕ 支/压线不再被筹码压住 + 设置页按钮固定底栏(v6.1.5 热修⑨): ①支撑/压力虚线改为最后绘制(压在K线与筹码峰之上),标签加主题底色框 (红/绿描边)——此前先画在筹码层被筹码柱盖住(用户反馈”筹码峰挡住支撑位”); ②设置页按钮栏从滚动内容里移出,pack(side="bottom")固定在窗口底部 始终可见(原来在最底行 row=30 要滚到底);③滚轮事件递归绑定到全部子控件 ——Tk 的滚轮只发给指针下的控件、不冒泡到画布,之前鼠标放在参数区滚不动。 实测:设置页 86 个控件已绑滚轮、底栏 side=bottom、grid 冲突 0; ㉖ 代码审查二轮专项·过拟合与前视(v6.1.5 热修⑨续,2026-09-26,reports/代码审查.md文末):对热修⑥⑦ 之外的链路(数据层、factor_lab/、backtests/、Web 版、v4 研究缓存)逐条走查,GUI 主链未发现新前视,但记录 3 个 P0(backfill_full.py数据工具按钮写腾讯 qfq 覆盖 hfq 库;三档tier_load_panel用今天的复权系数缩放历史绝对价/成交额门槛,含未来分红信息、 回测不可复现;factor_lab用当前 industry 过滤,2018 年后 229 只退市股全被排除) 与 8 个 P1(Web 版 W=10 样本窗口可重叠/自匹配——热修⑦只修了 GUI;v4_preds.pkl/panel.npz仍是 W=10 时代缓存且签名不含 W;backtest_v5_cross_section涨跌停掩码用收盘信息约束开盘成交;backtest_v4_entry_exit_optS3 留出参与筛选;backtest_exit_roll重叠窗 WF;sweep_risk网格维度失效且脚本已坏;组合层缺chip_peak/l2_ind/sector_rot;backfill_etf.py新浪不复权写库),附修复顺序与 「复核通过」清单。本条目只更新报告,未改代码。 ㉗ 二轮审查 P0 处理(v6.1.5 热修⑩,2026-09-27): ① 全库回填口径修正——backfill_full.py主源由腾讯 qfq 改 hfq (_tx_fetch→hfqday);_store增加与库内重叠日的口径校验 (收盘偏差>1% 拒写,防接缝污染),写后调_sync_adjust刷新显示系数 k (与 GUI/CLI 一致)。实测 sh600000 腾讯 hfq 与库内重叠日偏差 0.0000%; ② 仙股过滤修复——daily_picks原用 hfq 原值比>=2(阈值形同虚设), 改为显示价 hfq×k;三档组合的绝对价/流动性门槛(_TIER_MIN_PRICE/AMOUNT) 加口径备案:以今天为锚、跨日期重跑历史池不可完全复现(收益率类指标不受影响), 彻底修复需库内历史复权因子(列后续); ③ factor_lab 幸存者偏差修复——list_codes不再要求行业非空(退市股纳入, 实测 2018–2026 退市的 229/232 只已进池),L2/L3 排除「行业/分层未知」组 (缺失按中性);全量重跑已启动research/factor_lab/full2000_nosurv/(8 workers,约 4 小时),跑完后更新 factor_lab 结论。 详见reports/代码审查.md第 6 节处理记录。 ㉘ 清洗程序防截断 + 降误报(v6.1.5 热修⑪,2026-09-27): ① 修复浅迁移截断——data_clean.py旧实现固定腾讯 2 页(≤1600 根), 热修⑩的force=True --fix让 664 只被判定代码整只重拉,其中约 370 只 长历史股被截断(全库日K 1268.6万→1240.4万根);现迁移深度=max(库内根数, --depth=2400)、按需翻页(最多 6 页),并禁止缩水 (新序列首根变晚且不更长 / 末根变旧 → 保留原数据keep_head/keep_tail, CLI--allow-shrink才可覆盖);_validate与扫描共用_anomaly_flags/_anomalous,与stock_gui._bars_anomalous完全同规则; ② 扫描降噪——涨跌幅越界 779→59 只(科创板 ETF 20% 涨跌、新股前 5 日、 现名回溯 ST 历史、指数/停牌复牌全豁免;北交所源停更 84 只单独忽略)、 末价<0.5「失真」误报 40→0、陈年停牌缺口 1316→41(只报近一年)、新增 孤立代码(有K线无代码表)与北交所停更统计;日期解析改date.fromisoformat,全库扫描 238s→40s; ③ 新增「截断修复」模式(--repair/ GUI 数据工具选项):只重拉 「根数<2400 且首根早于 2021」的 1972 只代码补齐 2016–2020 深历史 (实测 sz399006 1600→2400 根、起点回到 2016-11); ④stock_gui.clean_daily_db同步安全化:判定改走_bars_anomalous, 整只重拉target=max(库内,2400)+ 丢头/丢尾守卫(否则保留原数据); ⑤ 复权失真体检(--check-adj/ GUI 数据工具选项,只读):抽样对比 库内收盘与腾讯不复权日K的日收益,检出腾讯 hfq 实为分段仿射hfq≈a×不复权价+b、段内日收益被逐股缩放s=aP/(aP+b)(实测浦发 0.63、平安 0.72、茅台 0.82、京东方 0.87、申华/ST星源 1.75;抽样 8 只 5 只失真>2%)——热修⑩”重叠日偏差 0.0000%”属循环验证未检出; ⑥ 全链切换真乘法后复权(新浪复权因子,2026-09-27 确认后实施):stock_gui拉取链(_fetch_tencent_mul/_fetch_remote_rows)、深历史_bf_fetch_one/_bf_tx_pages、backfill_full.py、sync_adjust.py、data_clean.py迁移全部改为「腾讯不复权 × 新浪realstock/.../hfq.js累计因子」(ETF/LOF 无有效因子退腾讯 qfq;指数/无事件个股用不复权); 实测 sh600000/600653/600595 重建后收益比中位 1.0000、涨跌停越界 0 (同股腾讯 hfq 越界 70~167 处),抽样 30 只基金 qfq 越界 0;全库--all-adj --force重迁已完成(7103/7105,2 只防缩水保留原数据): 完工复检 300 只失真 0,全库扫描结构异常 0 / 涨跌幅越界仅 10 只 (退市老股真实事件)、条数 1271.5 万(截断丢失的深度全部补齐, sz399006 等恢复 2016-11 起 2400 根);旧口径下生成的 v6.1.5 回测/ factor_lab 面板结果需重跑,旧口径策略缓存(meta表strategy:*7178 条)已清空、按需重算;处置与证据见reports/数据异常报告_20260927.md。
v6.1.4(2026-09-25): ① AI 网关兼容:请求带自有 UA
stock-analyzer/<版本>与稳定会话头x-opencode-session(opencode zen 必需,缺失报 400),模型列表/多轮对话可用;修复「保存并应用」时 ini 被整体覆盖导致base_url/model、[predict]、[picks]、[data]丢失的问题; ② 单股买卖点修复与激进档增益:筹码峰/板块轮动信号可在图上回放;连续同向信号压缩 (不再成串重复 B/S);激进档信号密度兜底——所选策略近 250 日 <8 个信号时改用 多维评分·激进,震荡区间(如 5~6 元箱体)也能标出足够波段买卖点,面板/报告标注「信号口径」; ③ 后台主动预取未分析股K线:启动 60s 后首轮、此后每小时一轮,当前股/自选 → 样本池 → 全库滚动补齐(跳过北交所/退市),收盘 15:05 后自动回补当日K线;stock_gui.ini [predict] auto_prefetch = 0可关; ④ 因子实验室支持大样本:新增--db/--out-dir(独立库与产物目录,避免与 GUI 争用主库)、 筹码缺失因子按截面中性填充、修复--stage all漏组装面板;全A 分层抽样复核产物随研究包分发; ⑤ 数据源容灾热修(2026-09-25):行情快照改腾讯→新浪→东财多源,自选池/五大指数批量行情加新浪兜底; 国内行情域名直连优先、代理仅兜底且被拒后自动旁路 2 分钟(VPN 掉线不再拖垮数据层);RemoteDisconnected/连接重置纳入熔断快速降级;板块榜东财故障时自动走腾讯行业榜→akshare(可选), 板块上下文熔断期直接跳过;K线维持腾讯多域名→东财 4 host + 全域自愈(急救箱stock_firstaid.py); ⑥ ai-quant 状态页升级(2026-09-25):/quant/由单卡片页升级为股票模拟盘 + 回测看板, 新增 6 张内联 SVG 图表(净值对比 / 回撤 / 年化对比 / 年度收益 / 月度热力图 / 单笔收益分布) 与回测指标总表(区间/收益/年化/回撤/Sharpe/胜率/交易/基准/超额);「市值前300」标 ★实盘同口径, 顶栏显示休市/交易日;生成器入库ai-quant/scripts/gen_status.py,cron 入口改为 wrapper(详见 ARCHITECTURE 6.4); ⑦ 交易日历接入法定节假日(2026-09-25):新增ai-quant/config/holidays.json(上交所 2026 全年休市),TradingCalendar默认加载;python -m sim.run周末/节假日直接跳过(--force可强制), 避免休市日拿陈旧行情误成交。 ⑧ ai-quant 拆分独立仓库(2026-09-25):模拟盘/决策链/回测/状态页/休市日历整体迁至 https://github.com/Languangxun/ai-quant(公开;本地~/桌面/ai-quant); 主库只保留 CLI 同源接口(--push收件箱与build_cli.py部署物),⑥⑦ 能力随新仓库维护。 ⑨ 时间与选型修正(2026-09-25):非交易日/停牌时快照不再是”今日”——市场状态带日期 (如09-24 16:14 收盘(快照非今日)),预测锚点改用快照收盘(最近收盘(09-24)), 修复此前误用前一日收盘导致 P50/缺口整体锚错一天(缺口恒显示 +0.00%)的问题;节假日不再空拉当日K线; GUI 单股消融补上 L2 同行业+行业ETF(与 2.6/研究脚本同口径:9 算法 + 多维评分 × 3 风险参数 = 30 候选); 弹窗推荐口径改为「训练集 Calmar 最优档(验证集不参与选择)」,高波动股推荐与提示文案统一。 ⑩ 数据整理与拉取量设置(2026-09-25):研究快照库stock_cache_lab.db合并回主库 (236 只补回 19.3 万根深历史;36 只整段复权口径不同 + 2 只硬冲突按主库腾讯 hfq 保留, 避免接缝假跳变),合并后删除快照库,主库 816.6 万根(integrity_check=ok); 设置页新增「最大拉取样本量」([predict] max_fetch_bars,默认 1000,范围 100–3000): 只限制单只股票单次联网拉取根数,不是读取上限——库内已有历史全量参与分析, 深历史回填--backfill仍按 ≥950 根目标翻页。 ⑪ 标准回测重跑与拉取误删修复(2026-09-25):backtest_v61.py全期/样本外/强势段 按数据截至 2026-09-24 重跑并同步第三节(含科创50 基准恢复:此前sh000688缺失 会让激进档基准为 nan);修复get_daily误判——新股上市首段/ST旧规期/长期停牌复牌/ 退市整理不再触发异常检测,bad_cache全量替换须覆盖缓存 90%,避免 800 根短源清掉 1600 根深历史(此前两次误删已从dist客户端快照补回 69 只、4.5 万根); 因子实验室面板窗口EVAL_DAYS1000→2000(筹码寻优同步 2000)。 ⑫ ETF 宇宙恢复 + 图表可读性(2026-09-25):refresh_etf_codes()新增新浪兜底 (东财整域故障时走etf_hq_fund/lof_hq_fund),恢复 1796 只 ETF/LOF、1500 只有 K 线、 613 只 ≥1000 根(主库 924 万根);四口径回测随之重跑并再同步第三节 (all_etf稳健/均衡 +24.8%/+38.8%,ETF 口径均衡样本外超额 +12.3pp); 图表指标线统一加粗到 2px 并按主题提亮(RSI/均线/MACD/KDJ/ADX/BOLL,高对比主题用亮色)。 ⑬ 深历史回填修复与 2000 日目标(2026-09-25):修复_bf_tx_fetch「请求 hfq 却解析qfqday」的存量 bug(东财整域故障时深挖全灭,腾讯数据其实可用);--backfill/GUI 全市场 回填的目标改为max(950, 最大拉取样本量),设为 2000 时自动翻 3 页(≈2400 根上限); 新增后台进度看板progress.py(python3 progress.py -w 30)。 ⑭ 2000 日全库回归 + 因子实验室全库结论(2026-09-25 夜,版本仍 v6.1.4):全市场深拉 完成(6806/7277 只,库内 1266 万根、≥2000 根 3774 只,指数补到 2400 根);_pull2000四口径报告已提升为第三节权威口径:全A 稳健/均衡 +15.0%/+25.1%、 ETF 三档 +13.7%/+18.0%/+27.9%(回撤全面收敛)、全A含ETF 激进 +36.2%; 因子实验室全库面板(1431 只 × 2000 日)top 1 万组合全部通过 BH-FDR、 训练/验证相关 0.869、Walk-Forward 10 折平均 OOS IC +0.032(9 折为正), 稳定因子 量能/板块/布林带 —— 因子结论由早期「pass=0 负面证据」更新为 「稳定为正、因子集可解释」。 ⑮ 回测标准化 + 图表化版本对比(2026-09-25,版本仍 v6.1.4):tier_eval新增phase_anns(各相位年化收益)、tier_picks_stats新增rets(逐笔收益分布,抽样≤1500);backtest_v61.py跑完自动出图(--no-charts可关):各口径 相位箱线图 / 逐笔箱线图 / 总收益·逐笔均值柱状图;新增backtests/v61_charts.py(纯标准库 SVG,不依赖 matplotlib)、--charts-only(不跑回测只出图)、--compare all(扫描历史报告做跨版本对比), 报告新增label/db_stats元数据;产物research/charts/(已 gitignore,随研究包分发)。 ⑯ 缓存重复拉取修复 + 拉取诊断日志(2026-09-26,已并入 v6.1.5): ① 修复 1.7G 缓存仍全库联网:last_completed_td原用”自然日历上一工作日”, 中秋休市(09-25 周五)后的周末/周一盘前被判”应该已有 09-25 数据”,非北交所非退市 个股 6968 只恒”过期”而反复空拉;现以库内指数日K(sh000001/sz399001/sz399006) 最新日期为节假日锚下修。实测周六stale_codes:6968 → 275(222 无缓存 新股/ETF + 53 真过期,其中 3 只指数;另 317 退市、309 北交所跳过), 002241 等有缓存股 0.01s 直读、零联网; ② 新增stock_fetch.log(独立滚动 2MB×2,不混通用日志):逐条记录缓存判定 (直读/过期原因/异常/无缓存/负缓存)、联网拉取的源与尝试序列、入库根数/末日期/耗时, 每 200 次调用与退出时输出累计统计(命中/过期/异常/无缓存/成功/失败); ③ 数据源热修:曾观测web.ifzq.gtimg.cn对 hfq 返 501 而 qfq 探测可通过 (实测为时段性,2026-09-26 晚该域 hfq/qfq 均正常), 旧自愈正是这样把死域写进配置;_probe_kline_url改测 hfq + 连测2次, 501 纳入熔断(死源两次失败后冷却跳过),源列表补ifzq.gtimg.cn;stock_firstaid.py腾讯探测同步由 qfq 改 hfq(此前急救箱可能把 「qfq 活、hfq 死」的域写回 ini,绕过本次修复); 实测 2026-09-26 晚stock_firstaid --check: 腾讯 K线 5/5(含 web.ifzq)、新浪 1/1、网易163 0/1(163 早已不作为持久化源)、 东财 K线 0/5、东财列表 0/4(当日时段性 RemoteDisconnected,熔断后自动降级); ④ 三档同选备案:单股消融三档可能选中同一候选(如 002241 三档均为 「多维评分·稳健」——它在稳健/激进两套 rank 权重下都排第一,属训练集选型结果); 抽样 40 只:18 只三档同选、22 只有差异(其中 6 只保守=稳健、12 只稳健=激进)。 每次消融选型写入stock_gui.log,如需强制三档分化须以回测验证,当前保持现状。 ⑤ 同日复盘补强:指数改”收盘后才要求今日“口径(用行情快照判收盘), 盘中/周末get_daily(sh000001)由每次 1~2s 联网变为 6ms 直读(此前分析/市场简报/ 消融各拉一遍、一天重复多次);远端拉取成功但末日不前进(停牌/退市整理/新退市) 记负缓存源无更新(末日)(2 倍退避至 24h),后台预取不再每小时重拉; 全源”正常应答但无此代码数据”(新 ETF 未上市等)不再触发 K 线源自愈与 AI 找源弹窗 (只在确有网络/限流类失败时才自愈)。 ⑰ 单股回测面板升级 + 幽灵K线显隐(2026-09-26,已并入 v6.1.5): ① 工具→信号胜率新增收益曲线画布(净值曲线 + 训练/验证分界 + 回撤阴影 + B/S 买卖点, 打开即自动计算),工具窗口由 680×~560 加大到最高 1320×980(按屏幕自适应); 收益曲线只画训练集(前75%)净值,验证集仅以底色+指标文本呈现(不显示净值); ② 胜率明细:全期 / 训练集(前75%) / 验证集(后25%) 三段(交易数/胜率/区间收益/ 年化/最大回撤/盈亏比/均盈均亏)+ IC(T+1)/IC(T+5)(信号方向 vs 未来收益 Spearman)
- BUY/SELL 信号后 1/5 日均值收益/上涨占比;
backtest_signals新增train/val/ic1/ic5/fwd/curve/trades_list字段(旧字段不变,向后兼容); 回测改用策略全历史信号(strategy_signals_full;v6.1.5 热修④起改为与消融 同窗近1000根,见顶部⑪),主图仍只展示近 250 根, 修复指标型策略信号全落在验证段导致训练集恒显示”信号不足”的问题; 无信号段会说明原因(该段无信号 / 有信号但未形成交易); ③ 幽灵K线显隐:_build_ghosts抽为独立函数,样本池增量加载(_apply_progressive) 同步重算 T+5/T+10;视野到达最新K线时显示 T+1/T+5/T+10 + “预测”分界线, 翻看历史K线(pan>0)时整体自动隐藏,回到最新自动恢复,不再悬浮在历史区间中间; ④ 回测可导出(信号胜率页「导出回测」):.txt= 头部信息(股票/策略/参数/区间/ 切分/成交口径)+ 全期/训练/验证/IC/信号后收益明细 + 净值曲线数据;.csv= 逐日date,net_value,drawdown(UTF-8-BOM,Excel 直接打开)。v6.1.3(2026-09-19): ① 消融新增 L2 对象(同行业 + 行业ETF)——每个行业构造一条”行业指数”, 优先取同名行业ETF(可直接交易、无成分股停牌噪声),无匹配时用同行业个股等权收益累乘合成; 信号 = 行业指数站上 MA20 且行业 5 日动量为正(与
sector_rot的横截面强弱互补); 实测 L2 在消融选型中占 稳健 7.9% / 均衡 9.4%,明显高于板块轮动(2.7%/3.4%); ② 消融回测全面 numpy 化:OHLC 平行数组复用、ATRcumsum滑窗、 净值曲线/牛熊分段/形态距离向量化 —— 10 算法(含新增 L2)181 秒跑完 6924 个对象, 比 v6.1.2 的 9 算法 251 秒更快(单位算法约快 35%),且与纯 Python 实现逐笔等值; ③ README 补齐算法细则:新增 2.5 引擎实现细则、2.6 十类信号触发条件、 2.7 事件回测口径与选优权重、2.8 numpy 加速清单(见第二、三节)。v6.1.2(2026-09-19):新增 ETF 支持——从东财拉取 ETF/LOF 代码表 (1491 只,剔除货币/现金类)并回填历史(1202 只有 K 线、1145 只 ≥250 根、共 90.7 万根); 回测与荐股新增
etf(仅 ETF) 与all_etf(全A含ETF) 两个口径, 与原有all/main并列,共四口径;各口径在自己的基数池内做横截面排名, 保证既有全A/主板数字不被 ETF 污染(已复验逐一相符)。 消融覆盖所有对象:不再排除 ETF、门槛降至 200 根,全缓存 ~7000 个对象 逐个消融,并输出覆盖率清单(纳入/跳过/因 K 线不足排除,可核验)。个人研究项目,全部输出仅供历史统计参考,不构成投资建议。
附:v6.1.3 新增能力(历史详细存档)
1.1 标准回测(四口径 × 四类产品)
backtests/backtest_v61.py 把回测口径固定为四种标的池与四类产品的组合:
| 维度 | 取值 | 说明 |
|---|---|---|
| 口径 | full / main |
全A(沪深主板+创业板+科创板,剔北交所/ETF)/ 仅沪深主板(sh60/sz00) |
| 产品 | 稳健 / 均衡 / 激进 | 组合口径:相位平均、含全部费用,输出总收益/年化/最大回撤/Sharpe/交易数/主基准/超额/相位区间 |
| 产品 | 荐股 | 逐笔口径:笔数/平均/中位/胜率/盈亏比/PF/持有天数/最好最差/右尾/退出原因 |
| 基准 | 稳健/均衡=上证;激进=科创50 | 每档另附科创50 / 创业板指 / 上证三基准对照表(v6.1.1) |
四口径(v6.1.2):
| 口径 | 含义 | 排名基数池 |
|---|---|---|
all |
全A个股(不含 ETF,保持历史口径) | 全A个股 |
main |
沪深主板个股 | 全A个股(筛持仓时限定主板) |
etf |
仅 ETF/LOF | ETF 池 |
all_etf |
全A个股 + ETF 合并 | 个股 + ETF |
一键复现(产物 research/v61_report.json + research/v61_report.md):
python backtests/backtest_v61.py # 四口径 × 全期(跑完自动出图)
python backtests/backtest_v61.py --universe etf # 只看 ETF
python backtests/backtest_v61.py --universe all_etf # 全A含ETF
python backtests/backtest_v61.py --segment val --tag val # 样本外(另存,不覆盖)
python backtests/backtest_v61.py --charts-only --tag val # 不跑回测,只补画已有报告
python backtests/backtest_v61.py --compare all # 扫全部历史报告做跨版本对比
python backtests/backtest_v61.py --label v6.1.4-2000d # 给本次报告打版本标签
1.2 ETF 支持(v6.1.2)
| 能力 | 实现 |
|---|---|
| 代码表 | refresh_etf_codes():东财 ETF/LOF 四板块(b:MK0021..MK0024)分页拉取,写入 stocks 表(industry='ETF',含规模);东财整域故障时自动改走新浪(Market_Center.getHQNodeData 的 etf_hq_fund/lof_hq_fund,mktcap 万元→元);自动剔除货币/现金类(名称含货币/快线/快钱/添益/日利/现金/理财/短融,或代码 5116xx/5117xx/5118xx/5119xx 等)——否则近零波动会霸占低波因子 |
| 历史回填 | backfill_etf_history():复用主库 hfq 口径抓取入库并同步 adjust;断点续传(已 ≥1000 根且新鲜则跳过)、6 线程、全局节流 |
| 界面/命令 | GUI 工具菜单「ETF:刷新代码表 + 回填历史」;CLI --refresh-etf |
| 回测/荐股 | 新增 etf、all_etf 口径,工具菜单与 CLI 均可选;设置内荐股股票池四选一 |
| 权限 | 板块权限新增独立 ETF 项(pick_allowed 对 ETF 判定为 ETF 板块) |
| 排行口径 | 各口径在自己的基数池内做横截面排名(tier_rank_base),ETF 不参与个股池排名,既有数字不受污染 |
实测规模(2026-09-25 新浪兜底恢复后):代码表 1796 只 → 有 K 线 1500 只 (其中 613 只有 1000+ 根),合计 112 万根日K; 未达 200 根的 296 只(新上市/迷你/货币类)记为不足并保留在代码表中 (v6.1.2 东财源时代为 1491 只 / 1202 只有 K 线 / 90.7 万根)。
1.3 AI 分析升级(OpenAI 兼容 + 模型列表 + 果断提示词 + 会话缓存)
| 能力 | 实现 |
|---|---|
| 平台兼容 | 设置内可填接口地址(base_url),DeepSeek / 智谱 / opencode 等 OpenAI 格式平台通用;自动补 /chat/completions 与 /models |
| 模型列表 | 「获取模型列表」按钮 + 打开设置自动拉取 GET {base}/models,下拉直接选;失败不影响手填 |
| 提示词 | 系统提示要求「直接给买/卖/观望(或加仓/持有/减仓)+ 唯一首选方向 + 具体价位区间 + 建议仓位」,禁止模棱两可、禁止罗列所有可能性,结论先行、最多 3 条依据、末行风险提示 |
| 数据上下文 | 单股首轮消息内含:快照/缺口/量比/板块、近 5/20/60 日收益与 60 日位置、20 日均额与波动率、近 15 日 OHLCV、MA5/10/20/60、MACD、KDJ、RSI、布林带、ADX/DMI、形态匹配预测(P10/P50/P90、上行概率、相似样本统计)、近期买卖信号、市场环境简报(上证与创业板均线位置/近 20、60 日涨跌 + 三档闸门状态)、筹码分布(平均成本/获利盘/90% 区间/支撑压力)、多维综合评估 |
| 多轮缓存 | 同一股票 + 同一模型的多轮对话存 SQLite(meta 表)与内存;数据未变直接复用缓存对话,追问只追加新问题不重发数据;超长自动截断(保留首条数据上下文 + 最近 24 条);可一键清空 |
1.4 设置内荐股权限 / AI 自动选档(对应「荐股」按钮)
- 荐股权限:设置 →「允许行业」多选列表(128 个行业)+「主板/创业板/科创板/ETF」勾选;
空选 = 不限制(全选也视为不限制,避免锁死新行业)。权限存于
stock_gui.ini [picks], 同时作用于 GUI 每日荐股、三档目标持仓、CLI--tiers。 - AI 自动选档:勾选后,荐股窗口顶部多出「AI自动(按偏好)」选项——AI 依据市场环境简报 在三档之内选一档(不是把全部消融结果丢给 AI),并给出一句理由;未配 Key 或调用失败时 回退到下方配置的荐股偏好(稳健/均衡/激进)。
- 荐股股票池:
all全A /main主板 /etf仅ETF /all_etf全A含ETF(与回测口径一致)。
1.5 消融优化(覆盖所有对象逐个执行 + 10 类算法 + 多指标结合 + numpy 加速,AI 不参与)
backtests/backtest_strategy_ablation.py:
- 覆盖所有对象(v6.1.2):不再排除 ETF,门槛降至 200 根,缓存内每个对象
逐个独立消融;输出覆盖率清单(
summary.coverage:纳入 / 有效 / 跳过原因 / 因 K 线不足排除的完整名单),可核验「确实全部跑过」。 最近一次实测:缓存 7021(ETF 1202)→ 纳入 6924(ETF 1202)→ 有效 6881(ETF 1164), 跳过 43(样本/信号不足)、K 线<200 排除 97(多为北交所新股与迷你 ETF); - 对象扩充(v6.1.3 起 10 类):MACD / KDJ / RSI / 布林带 / MA 趋势 / L1 形态 / L2 同行业+行业ETF(新增) / 筹码峰 / 板块轮动 / 多维评分,× 3 档风险参数; 各信号的精确触发条件见 2.6 节;
- 多指标结合:训练集上把 Calmar、盈亏比(PF)、胜率、年化各自做横截面
rank后加权 (稳健档 0.45/0.25/0.20/0.10 偏 Calmar+PF;均衡与激进档 0.30/0.20/0.15/0.35 偏年化+Calmar), 避免单指标过拟合与量纲问题; - AI 不参与:信号生成、选型、打分全部本地计算,AI 只在生产端做「选档」这一件事;
- numpy 加速(v6.1.3):OHLC 平行数组复用、ATR
cumsum滑窗、净值曲线/牛熊分段/ 形态距离向量化,详见 2.8 节; - 训练集(前 75%)指标 rank 选型 + 最近 250 根近端一致性门槛(不一致回退多维评分,
见 2.7 节),验证集(后 25%)只展示;输出每个对象 + 全市场聚合两层结果;
每个对象结果额外带
is_etf标记,聚合层给出 ETF/个股数量。
全市场实测(6924 个对象,2026-09-19,8 进程 181s,10 类算法):稳健档算法分布 —— RSI 18.2%、布林带 15.9%、多维评分 14.9%、KDJ 12.5%、L1 形态 10.7%、MACD 10.1%、 L2 同行业+行业ETF 7.9%、筹码峰 4.6%、板块轮动 2.7%、MA 趋势 2.5%; 训练集年化中位 19.6%、验证集 -1.7%(如实呈现「训练选型好看、样本外弱」的固有特征)。
1.6 键盘搜索与自动补全
- 任意位置按键(非输入控件获得焦点时)自动聚焦搜索框并写入该字符,直接开始搜股票;
- 输入即弹出候选下拉(代码前缀优先,其次代码/名称包含匹配,最多 12 条,含行业);
↑/↓选择、Enter或双击选中并立即分析、Esc关闭;候选清单后台一次性从本地缓存stocks表加载(代码-名称-行业),不联网。