DOCS
stock-analyzer · 架构设计
← 返回文档中心 · 来源:Languangxun/stock-analyzer · 同步于 2026-10-25
版本 v6.6.5 更新于 2026-10-24 配套:《README.md》(用户向:功能/快速开始/回测摘要/数据)、
CHANGELOG.md(版本变更史)、reports/回测复核报告_20260913.md(审计报告)。 本文只讲两件事:这套东西的架构、每个环节用的什么算法。历史版本(v3.2/v3.3)的架构描述已被本文取代。 2026-09-25:ai-quant 拆分独立仓库(https://github.com/Languangxun/ai-quant,公开)—— 模拟盘/决策链/状态页(6 图 + 休市日历)/备份均移出本仓库;第六节改写为对接接口 + CLI 同源回测口径。 2026-09-25 数据源容灾热修:2.1 节重写为通道策略 / 快照多源 / 日K多源 / 板块多源 / 熔断口径, 覆盖「VPN 一挂全源 Connection refused」与「东财整域连接重置」两类故障(变更索引见第七节)。
一、总体架构
Windows 开发机(主战场) 可选:香橙派 / 下游系统
┌───────────────────────────────────────────────┐ ┌────────────────────────────┐
│ stock_gui.py = 唯一算法源(单体) │ │ ~/stock_predict.py │
│ 缓存层 │ 数据获取 │ 指标 │ 分析 │ 三档引擎 │GUI│ ──────▶│ CLI 单文件(含缓存层) │
│ │ build_ │ 分析 / 回测 / --push │
│ stock_predict.py (由 build_cli.py 生成) │ cli.py │ │ │
├───────────────────────────────────────────────┤ │ ▼ │
│ backtests/ 研究脚本(回测/消融,33 个) │ │ ~/ai-quant/memory/inbox/ │
│ factor_lab/ 因子穷举与验证框架 │ │ (JSON 报告收件箱) │
│ plugins/ 插件(交易记录/账户联动) │ ├────────────────────────────┤
│ research/ 回测产物(+ legacy/results 归档) │ │ ~/webapp/stock_web.py │
│ reports/ 生成类报告(清洗/审计/审查) │ ──────▶│ systemd :8010 │
│ dist/ 发布包(gitignore) │ 部署 │ 完整版 / 轻量 /text /lite │
└───────────────────────────────────────────────┘ └────────────────────────────┘
│
▼ SQLite stock_cache.db(行情缓存 + 代码表 + adjust + 元数据)
1.1 目录职责(v6.1.3 已整理)
| 路径 | 职责 |
|---|---|
stock_gui.py |
唯一算法源:内嵌缓存层 + 数据获取 + 指标 + 分析 + 三档组合引擎 + 13 类消融信号 + AI 客户端 + Tkinter GUI |
stock_predict.py |
CLI 生成物(build_cli.py 抽取拼装),勿手改 |
studio_strategies/ |
从「股票策略工坊」导入的自定义策略 JSON 副本(v6.6.0;规则引擎读取,设置→外部策略维护) |
build_cli.py |
GUI → CLI 打包器;按锚点注释抽取「缓存块」「算法块」,并做 tkinter 残留 / 语法校验 |
run_backtest.sh |
一键全量回测(GUI 工具菜单/数据工具页与桌面快捷方式共用入口):全期/样本外/强势段 → 全市场逐股,--yearly 加逐年;日志 research/oneclick_backtest_*.log,结束自动打开仪表盘;GUI 侧由 _ext_spawn 子进程承载、日志回流 |
stock_firstaid.py |
数据源急救箱(独立于 GUI):候选域体检 --check / 把实测可用K线源写回 ini / --ai 求救(AI 只提议 URL,实测验证后才采用) |
backtests/ |
研究脚本:标准回测、三档分段、荐股逐笔、10 万组合回测、策略消融,以及历史实验(因子/退出/横截面/激进双引擎)。全部带项目根路径引导,根目录直接运行 |
factor_lab/ |
因子级消融框架(21 原子因子、面板窗口 2000 交易日(2026-09-25 由 1000 提升)、2^21 穷举、BH-FDR 过拟合治理)+ 筹码特征;2000 日全库面板(1431 只)结论:top 1 万组合全过 BH-FDR、训练/验证相关 0.869、WF 10 折 OOS IC +0.032(9 折正),稳定因子 量能/板块/布林带 |
plugins/ |
插件体系(plugins/api.py 暴露受控 API,trade_log.py 做交易记录与账户联动) |
research/ |
回测 JSON/MD 产物;research/legacy/ 为 v2.x→v4.0.1 归档,research/legacy/results/ 收纳历史脚本输出 |
reports/ |
生成类报告:数据清洗(清洗报告_*.md)、复权体检(复权体检_*.md)、数据异常(数据异常报告_*.md)、回测复核审计、代码审查 |
dist/ |
发布包产物(stock-analyzer-client-*.zip / research_v*.zip),不入库 |
stock_web.py / pi_stock_web.py |
Web 端两个变体(弱化独立实现,见第五节) |
1.2 关键架构约束(为什么这么设计)
- 单文件算法源:算法只改
stock_gui.py一处,GUI/CLI/研究脚本天然同源,杜绝口径分叉;代价是不能拆模块,靠区块注释(内嵌缓存层 / 数据获取 / 指标 / 分析 / 三档引擎 / GUI)分层弥补。 - 生成物不可手改:
stock_predict.py由脚本生成;改算法后必须python build_cli.py。 - 口径隔离(v6.1.2):标的池有 4 个口径(
all/main/etf/all_etf), 横截面排名在各自基数池内做(tier_rank_base),加入 ETF 后既有全A/主板数字仍逐项可比。 - 发布安全(v6.1.1 起):
build_client_zip.py绝不打包本地stock_gui.ini(内含 API Key), 改为空 Key 模板,且打包后全包扫描sk-模式,命中即删除产物并中止发布。 - 研究产物不入仓的边界:单文件 >100MB 的逐对象消融明细(
strategy_ablation_per_stock.json) 加入.gitignore,随 Release 研究包分发。
1.3 组件职责
| 组件 | 角色 | 说明 |
|---|---|---|
stock_gui.py |
唯一算法源 | Tkinter GUI + 全部算法;同时是研究脚本的引擎来源 |
build_cli.py |
打包器 | 保证 GUI/CLI 同源;有 assert 校验禁止 tkinter 混入算法块 |
stock_predict.py |
CLI 生成物 | 纯标准库单文件:分析、--tiers/--tiers-backtest/--picks-backtest、--refresh-cache、--refresh-etf、--backfill、--clean、--research、--push |
backtests/backtest_v61.py |
标准回测 | 4 口径 × 4 类产品(稳健/均衡/激进 + 荐股),产物 research/v61_report*.json/md;跑完自动出图,--charts-only/--compare all 做跨版本对比(backtests/v61_charts.py,纯标准库 SVG) |
backtests/backtest_strategy_ablation.py |
策略消融 | 全对象逐个消融(13 类信号 × 3 档风险),覆盖率清单 + 聚合统计 |
backtests/backtest_tiers.py / backtest_picks_v6.py |
分段/荐股回测 | --segment full/val/bull/yearly、--universe、参数敏感性 |
backtests/backtest_picks10.py |
10 万元荐股组合回测(v6.2.0) | IC 确认层 + 综合分 Top10、组合总资金 10 万(每只约 1/10 仓)、--capital/--top 可调 |
plugins/trade_log.py |
插件 | 交易记录、账户资金联动(荐股按可用资金算手数) |
~/ai-quant/ |
下游系统(独立仓库) | 常驻模拟盘,2026-09-25 起拆分至 Languangxun/ai-quant;接收 --push 推送的 stock_<code>_<date>.json(见第六节) |
二、数据层
2.1 数据源容灾:通道策略 + 快照/日K/板块多源(2026-09-25 热修)
通道策略 _open_url():_PROXY_OPENER(ini [proxy],通常指向本地 VPN)不再是默认前置通道。
按域名选路:国内行情域名直连优先(失败再走代理),国外(AI 接口)代理优先(失败再直连);
代理端口被拒(VPN 未开/重启中)自动旁路 120s,避免每次请求双倍超时。国内域名集合见
_DOMESTIC_SUFFIX(eastmoney/gtimg/qq/sina/163/sse/szse/cninfo/csindex)。
这修复了「VPN 一挂全部源报 [Errno 111] Connection refused」的全局故障。
估值/交易快照(v6.2.4):stocks 表 turnover(换手率%)/pe(动态PE)/pb ——
东财 clist 主源(refresh_all_codes 字段 f8/f9/f23)+ 腾讯批量行情备用通道
(refresh_valuation_tx,q[38]/[39]/[46],60 只/批,push2 整域故障时可独立刷新)。
行情快照 fetch_quote_cached(v6.6.2):全代码统一走 内存缓存 → SQLite quote_cache → 网络多源;
网络源为 腾讯 qt.gtimg.cn → 新浪 hq.sinajs.cn(带 Referer、GBK)→ 东财 ulist.np,
任一成功即返回并回写缓存;无网络时降级返回库内旧缓存,避免界面空白。自选池名称与
五大指数走 fetch_batch_quotes(同样缓存优先,仅缺失/过期代码才联网)。
基本面财报(v6.2.1 fetch_f10_metrics,v6.6.2 加持久缓存):东财 datacenter F10
主要指标 RPT_F10_FINANCE_MAINFINADATA(报告期倒序最多 12 期),双 host 容灾
(datacenter.eastmoney.com → datacenter-web.eastmoney.com),走 _http_get
限流退避 + 熔断器(源名 em_f10);域名属 eastmoney.com 已在 _DOMESTIC_SUFFIX
(直连优先)。6 小时内存缓存 _F10_CACHE,并新增 SQLite f10_cache 持久缓存,
网络失败时优雅降级到旧财报数据。
日K _fetch_remote_rows(v6.5.9 扩为 8 源;v6.6.5 改为可配置源链 + 同花顺第三梯队):
腾讯(配置域 KLINE_URL,默认 proxy.finance.qq.com)→ proxy → ifzq.gtimg.cn(HTTPS)
→ ifzq.gtimg.cn(HTTP) → web.ifzq.gtimg.cn(HTTPS/HTTP,v6.5.9) → 新浪
CN_MarketData.getKLineData(v6.5.9,与腾讯空 fq 位同口径 × _sina_hfq_factors
乘法后复权,volume 股/100=手,实测单次可取 3000 根;v6.6.5 对拍澄清:×因子后与库内
2000 日重叠偏差 0.000%,无存量口径问题)→ 同花顺 d.10jqka.com.cn/v6/line
(v6.6.5,JSONP 无需 cookie;个股/ETF/科创板/深证系列指数可用,上证指数无映射交回
其他源;完整前复权口径原样入库、绝不乘新浪因子——除权日收益≈复权真实收益,
但绝对水平与库内差时变因子(复权表黑盒),与库内不同时由 rebase 机制整段自洽替换)
→ 东财 4 host 轮询(push2his / 92 / 93 / 97)。
源链可配置(v6.6.5,设置→数据源):_kline_sources() 返回运行时链,内置 9 源
可启用/停用/排序(ini [data] kline_srcs),自定义源(custom_kline JSON,类型
腾讯格式/同花顺/东财/新浪/网易,最多 10 个)追加链尾、熔断键 自定义:名称;
「腾讯」源域与固定变体 URL 相同时自动去重;全停用且无自定义保存时回默认链;
急救箱切换 kline_url 后联动重建(_reload_kline_srcs)。
2026-09-26 观测:web.ifzq.gtimg.cn 曾对 hfq 请求返 501(腾讯反爬)而 qfq
探测可通过(该域此后实测又恢复,属时段性),旧 _probe_kline_url 用 qfq 探测会把
死域写进 ini;现探测改 hfq + 连测2次,且 501 纳入熔断(死源连续2次失败冷却
60s 起,不再每只股票重试一次);stock_firstaid.py 腾讯探测同步由 qfq 改 hfq。
v6.5.9 链路只用腾讯不复权,故 web.ifzq 的 hfq 501 不再影响它;新浪源同样先取
不复权再乘因子,落库口径与腾讯源一致(不做减法前复权持久化)。
全域失败时 _auto_heal_kline() 10 分钟限频探测候选域并写入内存+ini;仍无解才触发
AI 找源(AI 只提议 URL,_probe_kline_url 实测有数据才采用)。
增量拉取瘦身(v6.6.5):get_daily 过期回补时本地 ≥120 根且非异常只拉 120 根
小窗(载荷约 1/17;首拉/异常拉满);小窗检出基期漂移但不足以整段重定基
(cover=min(400, 库内/2))时自动升级拉满全量重试一次,绝不新旧基期混写接缝。
同轮修复基期漂移检测存量缺陷:旧「命中偏差即 break 再验 checked≥5」在口径级
差异(重叠第一天就分叉)下 checked 恒=1 → 误判”重叠不足”直接混写(实测可留
+95.7% 人为跳变);get_daily 与 backfill_full_market 均改为扫完重叠区再判。
板块:排行 = 东财 clist(HTTPS/HTTP × 主域/延迟域 4 host 轮换)→ 腾讯行业榜
ifzq.gtimg.cn/appstock/app/mktHs/rank → akshare(可选依赖 stock_sector_spot,未装自动跳过),
并缓存上次成功结果兜底;个股板块上下文(行业名 + 板块日K)走东财,
东财板块 熔断期内直接返回空(板块上下文非必需,不影响主预测)。
- 熔断器:每源维护
[连续失败数, 熔断截止];限流/封禁类连续 ≥2 次 → 冷却60s × 2^(n−2),上限 600s。封禁类除 HTTP 429/502/503/504 外,新增连接被重置特征:RemoteDisconnected/Remote end closed/Connection reset/Connection aborted(东财反爬/整域故障的典型表现,此前不触发冷却导致每源反复撞墙); - 节流:全局
_MIN_INTERVAL=0.16s;指数退避带 ±25% 抖动;限流/重置错误只重试 1 次就切源; - 负缓存:拉取失败记
failed(ts, reason),1 小时内不再重试,反复失败按 2 倍退避(上限 24h); - 2026-09-25 实测:东财
push2/push2his对部分 IP 整域连接重置(体检 0/5), 新股/停牌股腾讯返回空 K 线属数据缺失而非网络故障;腾讯/新浪链路正常时主流程不受影响。 - 快照时间语义(2026-09-25 热修):行情快照时间统一保留完整
YYYYMMDDHHMMSS(东财 ulist 用f124时间戳);market_phase_text对非今日快照标注日期 (MM-DD HH:MM 收盘(快照非今日)),不再把上一交易日 16:14 显示成”今天已收盘”。 单股分析按快照日期区分post_close / pre_open / live / stale_snap: 非今日快照(休市/停牌)时预测锚点取快照收盘并标注最近收盘(MM-DD), 不能用prev_close(会整体锚错一天、缺口恒 0);_LAST_INDEX_SNAP_DATE(上证快照日期) 作为交易日锚,配合_allow_today_bar()避免节假日空拉”当日K线”。
2.2 SQLite 缓存(stock_cache.db)
| 表 | 内容 |
|---|---|
daily_bars(code,date) |
日K(统一存后复权 hfq),主键 (code,date) |
stocks(code,name,industry,mktcap,tier,updated) |
代码表:A 股 + ETF(industry='ETF') |
adjust(code,k,ts) |
复权缩放系数:k = 同一交易日不复权收盘 / 库内收盘 |
meta |
键值元数据(代码表时间、AI 对话缓存 ai:<code>:<model>、策略缓存等) |
adj_done(code,ts,bars,last_date) |
复权迁移进度(data_clean.py --all-adj 断点续传用) |
failed / delisted |
负缓存 / 退市登记 |
quote_cache(code,data,ts) |
行情快照持久缓存(fetch_quote_cached/fetch_batch_quotes),网络失败时降级 |
f10_cache(code,data,ts) |
财报指标持久缓存(fetch_f10_metrics),财报低频、旧数据仍可读 |
- WAL + NORMAL 同步;连接统一走
db_conn()上下文管理器; - 读取口径:
库内价 × adjust.k= 乘法前复权(≈现价),展示与回测都用它; - 增量回填:本地最新一根落后才拉远端,
INSERT OR REPLACE合并;重叠日偏差 >0.5% 判定基期漂移 → 全量重定基。 - 手动更新缓存范围(v6.6.1):GUI「更新缓存」先弹窗选 全A / 自选 / 单股
(默认按 当前代码→自选→全A 智能预选)。全A=
refresh_all_codes刷代码表后 用stale_codes()取待回补代码、剔除 ETF/北交所,再prefetch增量拉取; 自选=仅self.watchlist;单股=输入代码(默认当前分析代码),完成回报 最新日K日期/根数。已最新标的由get_daily快速跳过;_cache_busy与 后台_prefetch_tick互斥,避免同一批代码并发重复拉取。 - 节假日锚
last_completed_td(2026-09-26 热修):_index_last_td()取库内指数 (sh000001/sz399001/sz399006)最新日K日期,对”自然日历上一工作日”做下修—— 休市日(中秋 09-25/国庆等)不再把全库判成”缺最后一根”而反复联网空拉(此前 1.7G 缓存 仍有 6968 只被判过期、周末全量重拉;热修后stale_codes= 275:222 无缓存 + 53 真过期含 3 指数);指数自身用_index_expected_td():只有收盘后(行情快照 确认交易日)才要求当日K线并推进锚,盘中/休市一律回到锚(5 分钟防重拉)—— 修复周末每条用到指数K线的调用(分析/市场简报/消融 regime)都联网重拉一次的问题 (实测指数读取由 1~2s 变 6ms);_index_last_td锚值 60s 缓存。 锚死锁保险(v6.5.4):锚只允许落后自然日历 ≤5 天(覆盖长假);超过 (如指数K线长期断更停在 09-30)视为锚失真,last_completed_td/_index_expected_td均退回自然日历口径强制全库重拉(指数自身也被判 过期而补拉,锚自我修复)——否则指数会把全库判「新鲜」,形成整个市场 停在旧日期、永不爬新数据的死锁。 - 负缓存补强(2026-09-26):拉取成功但末日不前进(停牌/退市整理/源侧无更新)
记
failed负缓存源无更新(末日),后台预取按 TTL 跳过(反复失败 2 倍退避,上限 24h), 长停牌股不再每小时重拉数百根;K线源自愈/AI 找源只在网络/限流类失败时触发, 全源正常应答但该代码无数据(新 ETF 未上市等)不再改写kline_url配置。 - 拉取诊断日志
stock_fetch.log(2026-09-26):flog = stock.fetch,独立文件滚动 2MB×2、不向stock_gui.log冒泡;每次get_daily记录缓存判定与原因 (直读/过期(本地末日<应有)/异常/无缓存/负缓存)、_fetch_remote_rows命中源与尝试序列、 入库根数/合并末日/耗时;_fstat计数器每 200 次调用及进程退出输出累计统计;stale_codes输出全库新鲜度扫描汇总(无缓存/过期/退市跳过/待回补)。 - 拉取深度可调(v6.1.4 热修③):
CFG.MAX_FETCH_BARS(ini[predict] max_fetch_bars, 默认 1000,范围 100–3000)只限制联网拉取(get_daily增量/首拉、ETF 回填); 读库路径(_db_rows/_display_rows/样本池)不限深度,库内已有历史永远全量参与分析;--backfill深历史回填目标同样取max(950, MAX_FETCH_BARS),按 800/页翻到目标 (2000 → 3 页 ≈2400 根,_bf_fetch_one(target=...);2026-09-25 起生效)。 - 快照库合并(2026-09-25):研究用
stock_cache_lab.db合并回主库(236 只、19.3 万根深历史, 合并后删除快照库),再从dist客户端发布包快照二次补回 69 只、4.5 万根;整段复权口径不同者 (36 只)与硬冲突 2 只(sh600734/sz000826)一律保留主库腾讯 hfq 序列,避免接缝假跳变; 主库 816.6 万根,integrity_check=ok。
回填口径(v6.1.5 热修⑩):
backfill_full.py一律拉后复权 hfq (腾讯hfqday/东财fqt=2),写入前与库内重叠日比对(收盘偏差>1% 拒写), 写后_sync_adjust刷新显示缩放 k;此前该脚本用腾讯 qfq 直写,会与 hfq 段 形成接缝/重定基(二轮审查 P0-1,已修)。
2.3 复权与数据修复(v6.0,重要)
- 口径统一:此前约九成代码实际存的是不复权/前复权价 → 全库迁移为腾讯后复权(
data_clean.py --all-adj); adjust.k配对:改为同一交易日 raw/库内收盘配对,k取多日比值中位数;末根与中位明显不一致(腾讯偶发毛刺)自动重拉,拉不到则删除该根;- 收盘后当日K入库:
last_completed_td以 ≥15:05 为界,今日定型日K可直接入库; 2026-09-26 起叠加指数日K节假日锚(见 2.2),休市日不再误判全库过期。 - 异常校验误报修复(2026-09-25):
_bars_anomalous对指数(sh000*/sz399*)、 新股上市首段(前 10 根)、长期停牌复牌(相邻 K 线日历间隔 >30 天)、退市整理(名称含「退」)、 主板 ST 旧规 5%(按现名回溯历史会误伤,放宽到 10%)不再判异常;同时get_daily的bad_cache全量替换须覆盖原缓存 90%(rebase 维持 ≥缓存一半)——否则 800 根短源会把 1600 根 深历史整只清掉(当日两次误删已从快照补回);长序列的真异常改由data_clean --fix/--backfill全量重建,不再被日常get_daily清空。
2.4 标的池:个股 + ETF(v6.1.2)
- A 股:东财分页(每 7 天刷新),按市值三分位切 大盘/中盘/小盘(
tier); - ETF/LOF:
refresh_etf_codes()主源东财四板块(b:MK0021..MK0024), 东财整域故障时自动改走新浪(Market_Center.getHQNodeData的etf_hq_fund/lof_hq_fund, mktcap 万元→元),写入stocks(industry='ETF',含规模); 剔除货币/现金类(名称含 货币/快线/快钱/添益/日利/现金/理财/短融, 或代码 5116xx/5117xx/5118xx/5119xx)——否则近零波动会霸占低波因子; - ETF 历史回填:
backfill_etf_history()走主库 hfq 路径 +_sync_adjust,断点续传(≥1000 根且新鲜则跳过)、6 线程、全局节流; 实测(2026-09-25 新浪兜底恢复 + 深拉):代码表 1796 只 → 有 K 线 1500 (882 只 1000+ 根、253 只 2000+ 根),合计 178.5 万根; - 指数:
sh000001(上证)、sz399001、sz399006(创业板指)、sh000688(科创50)、bj899050;指数不进标的池; - 代码表刷新保护:
refresh_all_codes只删 A 股行(substr(code,3,2) NOT IN ('51','56','58','15','16','18')),不会抹掉 ETF。
2.5 回填与清洗
- 后台主动预取(GUI,v6.1.3+):
App._prefetch_work启动 60s 后首轮、此后每 60 分钟一轮; 目标顺序 =「当前股 + 自选」→ 它们的样本池(L2 同行业+ETF,ENABLE_L3时含 L3)→stale_codes()全库未更新代码(跳过北交所与最后K线早于 180 天的退市股; 指数按”收盘后才有今日”判断(_index_expected_td)、个股按节假日锚,2026-09-26 起休市日候选从 6968 收敛到实际缺数据者); 分批 20 只、批间 sleep 1s,get_daily已缓存只做新鲜度检查(收盘 15:05 后自动回补当日K); 状态栏显示进度;ini[predict] auto_prefetch = 0关闭; - 深历史回填:GUI 设置【全市场回填】/ CLI
--backfill;腾讯按max(950, CFG.MAX_FETCH_BARS)目标翻页(主源=不复权,v6.1.5 热修⑪ 起;× 新浪复权因子入库;2000 根 → 3 页)- 东财兜底;v6.6.5 扩为三级兜底:腾讯 → 同花顺深历史(last.js 近140根 +
按年文件回拼,完整前复权口径原样使用,与库内口径不同时由重叠偏差检测整只
替换绝不逐条混写)→ 东财,腾讯整域 501/断连时回填不再中断;
501 全局暂停自愈 + 断点续传 + 6 线程;
_bf_tx_fetch支持 hfq/qfq/不复权三种口径(不存在复权位时不复权翻页需带 end,2026-09-27 修); v6.2.3:每股网络请求 5→3——_bf_fetch_one直接把已抓到的腾讯不复权末价 作为第二条返回值(不再调_raw_last_price),并把 raw 尾部date→close存入_BF_RAW_HINT;_sync_adjust新增raw_map参数优先消费提示做同日期配对 (缺失才回落网络,_raw_last_price保留兜底),全市场约省 100 分钟;
- 东财兜底;v6.6.5 扩为三级兜底:腾讯 → 同花顺深历史(last.js 近140根 +
按年文件回拼,完整前复权口径原样使用,与库内口径不同时由重叠偏差检测整只
替换绝不逐条混写)→ 东财,腾讯整域 501/断连时回填不再中断;
501 全局暂停自愈 + 断点续传 + 6 线程;
- 清洗(
data_clean.py,默认只出报告,--fix才改库;报告写入reports/): ① 结构异常删除;② 除权残留整只重拉——判定与stock_gui._bars_anomalous完全同规则(新股前 10 根、相邻间隔>30 天、指数/退市整理、ST 现名回溯放宽到 10%、ETF 折算孤立跳变放行,避免”越清理越误报”);③ 停牌缺口只报近一年 (不造数);④ 退市登记(最后 bar 距今>180 天);⑤ 价格粘性(连续 ≥20 日 收盘不变 → 整只重拉);⑥ 孤立代码(有 K 线、无代码表)与北交所源停更统计。 v6.2.3:scan改itertools.groupby游标流式(旧版 fetchall 把全库 1200+ 万根一次性载入内存、峰值数 GB;流式只留单只,与旧实现逐字节对拍 stats/问题清单零差异)。 修复写入统一走migrate_one:深度 =max(库内根数, --depth=2400)、按需翻页 (≤6 页/4800 根);新序列首根变晚且不更长、或末根变旧时保留库内原数据 (keep_head/keep_tail,防浅迁移截断,v6.1.5 热修⑪);--repair只重拉 「根数<2400 且首根早于 2021-01-01」的代码补齐 2016–2020 深历史;adjust(code→K)存显示缩放系数(hfq×K=乘法前复权)。 - 复权口径(v6.1.5 热修⑪,全链):库内统一存真乘法后复权 =
腾讯不复权日K × 新浪累计复权因子(
finance.sina.com.cn/realstock/company/ <code>/hfq.js);ETF/LOF 新浪无有效因子 → 腾讯 qfq(日收益保真), 指数/无事件个股 → 不复权。落地于data_clean._hfq_mul(迁移主源)、stock_gui._fetch_tencent_mul(在线拉取)、_bf_fetch_one/_bf_tx_pages(深历史)、backfill_full.py、sync_adjust.py。此前腾讯 hfq 实为分段 仿射hfq≈a×raw+b,段内日收益被逐股缩放(浦发 0.63/茅台 0.82/申华 1.75),已弃用;体检--check-adj抽样复核(收益比中位 1.0000、越界 0)。 全库--all-adj --force重迁(7105 只)后生效;旧口径回测/因子/策略 缓存需重跑,证据见reports/数据异常报告_20260927.md。 - 复权失真体检(
data_clean.py --check-adj/ GUI「复权失真体检」,只读): 抽样对比库内收盘与腾讯不复权日K的日收益,末段 120 根拟合hfq≈a×raw+b并取收益比中位s,|s-1|>2%记为失真,报告reports/复权体检_*.md。
三、算法层
3.1 形态相似度匹配(L1)
- 特征:最近
W日对数收益率序列做 z-score 标准化(W见 3.12 的说明); - 距离 = 欧氏距离(
_px_distances,numpy 向量化,较纯 Python 快约 50 倍)+ 多维权重项: K线结构0.50/ 波动率0.80/ RSI0.50/ 量变0.40/ 周线环境0.60; - 环境惩罚:量能
|ln(今日量比/历史量比)|(缺失 0.30)、板块点差(上限 1.2); 大盘指数项默认关闭(v6.5.3,CFG.MATCH_IDX_ENV)——预测只参考自身形态/量能/板块, 旧口径(大盘涨跌点差惩罚 + 样本分层「大盘±0.8pp」筛选 + 池匹配指数项)可用 ini[predict] match_idx_env=1恢复;上证/创业板指行情仍用于展示与 AI 市场简报; - 取 Top-K=10 个最相似历史窗口;样本加权:时间衰减(>90 天权重 ×0.3)+ 动态三级权重;
- ETF 收益率序列先做 MAD 截断平滑(±5×MAD)消除除权跳变假形态。
3.2 三级样本池融合(L1/L2/L3)
| 层 | 含义 | 取样 | 权重 |
|—|—|—|—|
| L1 | 自身历史 | Top-K 形态匹配 | 0.6 |
| L2 | 同行业 | 行业内市值对数距离最近 N=50 | 0.3 |
| L3 | 同市值层 | 同层随机抽样 N=100(排除 L2 已覆盖行业) | 0.1 |
输出 T 日(盘中锚今开)与 T+1 的 P10/P25/P50/P75/P90 区间(加权分位数)+ 上行概率(样本次日收涨占比加权);
多日预测 T+1..T+10 叠加均值回归衰减 decay = max(0.6, 1 − 0.04(d−1))。
OHLC 一致性钳制(v6.5.1 热修①):收/高/低三组分位数独立校准+INTERVAL_K 放大会致尾部分位交叉
(如 P10 收<低),_fusion_prediction/_multi_day_prediction 现逐分位强制 lo<=cl<=hi
且预测高≥开/收、低≤开/收(区间只向外扩,P50/上行概率/信号与回测口径不变)。
涨跌停钳制(v6.5.2 热修②):样本池跨板块(20%/30%板样本次日可达 ±19%),照搬到主板股
会出现”跌停都不够跌”的预测价。现 _analyze 按当日 _limit_pct 板块口径算出
lim(主板10%/创业板·科创板20%/北交所30%;复牌、上市首日等不设限日为 None 跳过)传入两级:
_fusion_prediction 把预测价位钳到 昨收±lim(live 真实高低扩展后再钳价不破坏只拉宽语义),
_multi_day_prediction 把单日收益逐日钳 ±lim(幽灵 K 线为一日 bar,累计路径自然合法)。
P50/上行概率/回测口径零改动——仅砍掉物理上不可能的尾部。
3.3 打分体系(两个打分器,别混淆)
(a)事件信号打分(_composite_signals,用于买卖点与消融的 composite 候选)——8 个维度
(v6.6.5 动态权重:下表权重为基础值 IND_W,实际权重 = 基础 × 该维度
「信号对错」在线训练的质量系数——看多/看空贡献的次日方向命中率(EWMA α=0.02)
50% 保持基础、最高 ×3 / 最低 ×0.3,样本 <60 线性收缩;结算严格因果(第 i 日
只结算 i−1 日),截断等价性实测无前视;冷却日也参与训练;ini
[predict] dyn_weights=0 回静态口径):
| 维度 | 权重 | 加分 | 减分 |
|---|---|---|---|
| MACD | 1.1 | 金叉 +2 / DIF>DEA +1 | 死叉 −2 / DIF<DEA −1 |
| KDJ | 0.9 | 低位金叉(K<45) +2 / K>D +1 | 高位死叉(K>65) −2 / K<D −1 |
| RSI6 | 0.9 | 上穿 20 +2 / <30 +1 | 下穿 80 −2 / >70 −1 |
| 量价 | 1.0 | 量比>1.5 且收涨 +1 | 量比>1.5 且收跌 −1 |
| MA20 | 1.0 | 站上且 MA20 上行 +1 | 跌破且下行 −1 |
| 筹码 | 0.8 | 贴近支撑峰 +1 | 逼近压力峰 −1 |
| 布林带 | 0.8 | 跌破下轨 +1 | 突破上轨 −1 |
| ADX/DMI | 0.8 | ADX≥20 且 +DI>−DI +1 |
−DI>+DI −1 |
触发(全部只用当日及以前数据,无前视):得分 ≥ buy_th 且方向由空转多 → BUY;
≤ SIGNAL_SCORE_SELL(−2) 且由多转空 → SELL;方向必须交替,BUY后冷却 cooldown 天、
SELL后冷却 sell_cooldown 天(v6.5.1 热修③:不再写死跟随买入冷却;
默认值=买入冷却即保守/稳健8、激进3,设置→预测参数可按档调,ini 落盘,
旧策略缓存缺键自动回退买入冷却);
弱市加严:当日大盘 < WEAK_IDX_TH(−1.5%) 时买入门槛 +1(稳健档 2→3)。
单源(v6.5.1 热修②):analyze() 展示侧不再手搓打分循环,直接调
_composite_signals 全量生成再截后120根——此前分叉(BOLL回升/回落、SELL冷却写死5、
展示侧弱势加严)已消除,图上信号与消融评估同一套;弱势加严只在传入 idx 图时生效,
消融/展示均不传(与历史回测口径一致)。
(b)多维综合评估(_score_action,给 GUI 面板与 AI 的「合计分 / verdict」)——13 个维度(同一张 CFG.IND_W 权重表):
MACD 1.1、MA趋势 1.2(MA20/60 多头状态,v3.3 全A实证 IC 0.228)、形态 1.2
(L1 形态上行概率,IC 0.265,最强)、KDJ 0.9、RSI 0.9、量价 1.0、MA20 1.0、
爆发力 1.0(20 日动量:10%~35% 加 2 分、5%~10% 加 1 分、>35% 过热 −2 分、≤−15% 弱势 −1 分)、
量能 0.9(5 日均量/20 日均量 >1.5 且收涨)、板块 1.0(行业 5 日收益强于中位 / 前 20% 领先)、
筹码 0.8、布林带 0.8、ADX 0.8。该评估不直接产生买卖点,只作展示与 AI 上下文。
3.4 波段适合度路由与策略信号展示
波动率适中(25) + 趋势斜率/乖离(30) + 量能活跃(25) + 站上 MA60(20),≥60 用多维信号,否则整段换成 MA20/60 趋势跟踪。
单股消融选中的算法(MACD/KDJ/RSI/布林/MA/形态/筹码峰/板块轮动/多维)在图上按同规则回放近 250 根信号;
连续同向信号压缩为同向首条(回测开平仓语义不变,避免图上成串重复 B/S);
激进档信号密度兜底:所选策略近 250 日信号 < 8 个时改用多维评分(沿用该档参数:激进=买点门槛 1/冷却 3),
保证震荡区间(如 5~6 元箱体)也能标出足够波段买卖点;兜底在面板「信号口径」与报告中标注,不改动消融缓存与选型。
v6.4.1 风险偏好 test(sm701 模型直出、不消融):设置→预测参数选 test 时,
analyze() 不读 5 日消融策略缓存、_ensure_strategy() 不再自动跑消融弹窗,
而是把 strat 置为 {"algo":"sm701","mode":"test",...};图表信号由
_sig_sm701() 产出——sm701 概率 ≥0.55 BUY、<0.50 SELL(滞回、同向不重复),
随后仍走同一条 _bt_events 风控(ATR/移动止盈取 RISK_PARAMS["test"]=激进档宽松参数);
test 下关闭「近250日信号过少→多维评分兜底」与「异动相似覆盖」,保证不混入其他算法;
「重选策略(全部组合)」在 test 下给出提示并拒绝(ablation_risk_params() 从消融
任务与全量候选过滤中排除 test)。
3.5 筹码分布
逐日按换手衰减历史筹码(换手率 ≈ 量/中位量 ×2%,限幅),当日筹码在 [low, high] 均匀摊到价格桶;
支撑/压力取现价上/下方3bin 平滑后最厚的筹码带(v6.1.5 热修⑤:原「最密集局部峰」
在现价切在主峰侧面时会把远处 0.7% 的小凸起选成压力,如 002241 全历史口径压力 27.33,
而 24~25 元厚带被判非峰);获利盘 = P(成本 ≤ 现价)。
图表右侧筹码柱与右栏「筹码参考」统一用全历史口径 res["chips"](此前主图按可见
250 根窗口另算,支/压与右栏不一致),筹码柱按 ymap(价格) 绘制(修复与价格轴上下颠倒)。
同花顺式筹码峰(v6.1.5 热修⑧):
- 换手率:有总股本时用真实换手
量(手)×100/总股本(总股本 =stocks.mktcap/现价), 否则退回 量/中位量×2% 启发式;两者再乘CFG.CHIP_DECAY_SCALE=0.5(换手衰减系数, 与同花顺 002241 剖面校准:1.0 时老筹码消失过快、现价上方仅 ~32%,0.5 时 ~45%、 均本/获利比例与同花顺一致)。 - 布局:非紧凑屏右列按
CFG.CHIP_W_RATIO=0.17加宽(上限 30%),基线在左 (K线区右缘)、柱向右生长(同花顺同向),最右留CHIP_AXIS_STRIP=36px价格条 (十字光标价格标签固定在此、横线延伸过筹码列);细横条(柱高≈0.5×桶距、 上限 3.5px,同花顺式留间隙;热修⑬ 由连片实心矩形改回), 现价下方红/上方绿;BOLL 图例移到绘图区右缘;紧凑屏窄列(strip=6)。 - 桶数
CFG.CHIP_NBIN=360;信号引擎(chip_snapshots/_chip_feats_py)不随此处变化。 - 支/压叠加层级(v6.1.5 热修⑨):支撑/压力虚线移到 K线/信号之后绘制(压在最上层,
不再被筹码柱盖住),标签加
PANEL_BG底色框 + 线色描边(密集筹码上也可读)。 - 标签不遮峰(v6.1.5 热修⑫):筹码柱宽度先减去标签占位
lab_reserve(按「支/压 xx.xx」实测字宽 + 12px,右侧才排标签),标签区与筹码柱完全错开, 峰尖/最厚带完整可见(此前柱体一直画到价格条左侧、被黑底标签压住)。
3.6 事件回测引擎(单股,_bt_events / backtest_signals)
T 日收盘信号 → T+1 收盘成交;ATR(14) 止损 + 移动止盈(最高价突破 entry×trail_trigger 后止损上移到 最高价×trail_ratio);
盘中 low 触发即离场(开盘已破则按开盘价);输出 交易数/胜率/区间收益/年化/最大回撤/盈亏比/净值曲线。
年化口径(v6.1.8 P0):_bt_simulate/_bt_events 均用回测区间起点日期计算年数(下限 0.25 年),
首信号远晚于区间起点时不再虚高。
三档风险参数:保守 (1.5, 1.01, 0.96, 3, 8)、稳健 (1.5, 1.015, 0.95, 3, 8)(v6.3.1 由 2, 5 收紧入场;v6.4.2 由 1.02, 0.94 收紧止盈为早止盈:+1.5%启动、回落5%即走,只做高胜率)、激进 (2.5, 1.05, 0.90, 1, 3)
(v6.2.3 起三档,原第四组「高风险」(6.0, 1.15, 0.80, 1, 2) 随档位重定名删除;
才移动止盈、买点门槛 1/冷却 2;不设最大回撤止损,v6.1.8 的 500 日 MDD 机制已删除)
(顺序:atr_mult / trail_trigger / trail_ratio / buy_th / cooldown)。
GUI 单股回测面板(工具→信号胜率,2026-09-26 升级;v6.1.6 与消融统一):
backtest_signals 内部为 _bt_simulate(单段)+ 组合全期/分段,用于 IC/信号后收益等
信号质量统计;面板的全期/训练/验证指标自 v6.1.6 起改用消融同引擎 _bt_events
与同切分(val=max(200, n/4)、预计算 ATR、盘中假K不计入,统一封装为 _bt_segments,
GUI 面板与 stock_backtest_export.py 共用),
保证与「策略消融」弹窗及每只股导出逐项一致(此前两个引擎:trades 含浮仓、
固定前 75/25、分段 ATR 重算,sz002241 验证集 10 笔/-7.0% vs 弹窗 9 笔/-6.8%);
_bt_events 同步补齐 closed/floating/avg_win/avg_loss/profit_loss/trades_list
(向后兼容,trades 只计已平仓)。另算 IC(T+1)/IC(T+5)(信号方向 +1买/-1卖 vs
未来收益的 Spearman 秩相关)与 信号后 1/5 日收益/上涨占比。面板回测与消融同窗
(strategy_signals_full 在近 ABL_BARS=1000 根上重算;主图仍只展示近 250 根),
否则指标型策略信号会落在切分之外、或训练段落在策略数据起点之前(如 L2 行业ETF 2024
才有数据 → 训练集恒空、曲线水平线)。面板上:收益曲线
只画训练集净值(验证集底纹+指标文本,不显示净值)、训练回撤子图、B/S 信号点;
工具窗口按屏幕自适应(最高 1320×980)。
面板热修(2026-09-26):_draw_curve 每次重绘先 cv.configure(bg=BG)(主题切换后
不重建窗口也不会”黑底白块”),验证集底纹改 AXIS_TXT + stipple="gray12"(浅色/深色/
高对比通用);run_bt 结束 yview_moveto(0),结果文本回到顶部直接展示全期/训练/验证;
主图 MA 图例按 cv.bbox 实际字宽推进(HiDPI 不再重叠)。
交易明细子页(v6.3.3):_bt_events 新增可选 detail_out——逐笔记录
{entry_i/entry_date/entry_px, exit_i/exit_date/exit_px, ret, reason},
reason ∈ 信号卖出 / ATR止损 / 移动止盈 / 持仓中(末笔未平仓:exit_* 为 None、
exit_px=期末收盘);_bt_segments(..., detail=True) 为全期/训练/验证三段结果附
detail(默认 False,批量研究/逐股导出口径与性能不变);面板「交易明细」子页
Treeview 展示 段/序号/买入日价/卖出日价/收益/原因,可按段筛选、点列头排序,
盈利绿/亏损红/浮仓金色;导出 txt 追加「交易明细」CSV 段,JSON 新增
trades_detail(full/train/val)。
图表预测显隐(2026-09-26):slice_view 只在视野到达最新K线(end >= n_total)时
追加 T+1 pred 与幽灵K线,翻看历史(pan>0)时整体隐藏,”预测”分界线与 T+5 标注同步隐藏;
_build_ghosts 独立成函数,_apply_progressive 增量更新时重算 T+5/T+10。
回测导出(2026-09-26;v6.3.3 加逐笔明细):信号胜率页「导出回测」——.txt 写头部(股票/策略/参数/区间/
切分/成交口径)+ 面板明细 + 交易明细(段,买入日价,卖出日价,收益,原因) +
净值曲线数据 + 免责声明;.csv 写逐日 date,net_value,drawdown
(UTF-8-BOM);.json 新增 trades_detail(full/train/val),full 不再携带
_rows 原始K线与 detail(控制体积)。导出取当前面板结果(_bt_last),未计算时提示先计算。
3.7 三档组合引擎(v6.2.3 权威实现、v6.3.1 稳健档收紧、v6.4.0 增 test 实验档、v6.4.2 稳健加熔断、v6.5.0 档位重构,tier_*;激进=板块轮动策略)
绝对价/流动性门槛口径备案(v6.1.5 热修⑩,二轮审查 P0-2):
tier_load_panel用adjust.k把 hfq 缩放成「以今天为锚」的乘法前复权价,_TIER_MIN_PRICE=1.0、_TIER_MIN_AMOUNT=3e5(3000万)作用其上;k 含历史日之后的分红/送转信息, 因此历史可交易池带当前锚、跨日期重跑不完全可复现。收益率类指标(ret20/vol20/ beta/闸门)为比值,k 可约掉;仅可交易池/绝对阈值受损。彻底修复需库内保存 历史复权因子(point-in-time),列为后续项;daily_picks仙股过滤已改为显示价 (hfq×k≥2,原比 hfq 原值形同虚设)。
标的口径 4 个 × 稳定档位 3 个,另有 test 实验档(v6.4.0,sm701 桥接;仅显式运行):
| 口径 | 池 | 排名基数池 |
|---|---|---|
all |
全A个股(不含 ETF) | 个股池 |
main |
沪深主板个股 | 个股池 |
etf |
仅 ETF/LOF | ETF 池 |
all_etf |
个股 + ETF | 合并池 |
| 档位 | 评分 | 持仓/调仓 | 闸门 |
|---|---|---|---|
| 稳健(长期持有,v6.5.0) | 四口径:blend = 0.5·rank(ret20) + 0.5·(1−rank(vol20));IC 确认层 + 换仓缓冲带20 + mdd_guard=0.08 回撤熔断 |
Top10 / 20 日 | 上证 MA20 |
| 均衡(中期持有,v6.5.0=老稳健) | 四口径:blend 等权 Top10;IC 确认层 + 换仓缓冲带10 + mdd_guard=0.08(= v6.4.2 老稳健口径;原 beta-Top5 / blend_mom-Top20 均衡策略淘汰) |
Top10 / 10 日 | 上证 MA20 |
| 激进 | 四口径均为 rotate = 0.5·rank(sector_ret20) + 0.5·[0.7·rank(ret20) + 0.3·(1−rank(vol20))](板块轮动为主;原高风险档,v6.2.3 定名) |
Top5 / 10 日 | 板块轮动闸门:0.6·sec_breadth + 0.4·(上证MA20) ≥ 0.35(大盘权重 40%);允许涨停价买入(打板) |
| test(v6.4.0) | 四口径均用 sm701 score="sm701":副本 LightGBM 概率 |
Top10 / 每日 | 无闸门(不空仓避险) |
- 相位平均(tranche):资金分
reb份、相位错开独立运行后取净值平均,并报告相位年化区间; - 成交与费用:T-1 决策 → T 日收盘成交;滑点 0.1%/边、佣金万 2.5(最低 5 元)、印花税千 1(卖出)、过户费万 0.1;
100 股整手、涨停不买、跌停不卖、停牌顺延、连续 20 日无 K 线按最后收盘价了结;
激进 档例外:
cfg.allow_limit_up=True跳过涨停不买判定(回测约 1.3%~1.9% 买在涨停价, 生产端tier_latest_picks输出limit_up标记供提示; v6.2.4 起生产端默认剔除动态 PE≤0(亏损)候选(picks_exclude_loss, ini[picks] exclude_loss=0可关;PE 缺失不过滤;不参与历史回测)); - 荐股确认层(v6.2.0,
tier_ic_confirm;v6.3.1 支持档位级开关):个股历史信号 IC——滚动 120 日窗计算 「近5日收益(信号强度)→ 未来5日收益」Pearson IC(cumsum 向量化、行分块控内存, 缓存_TIER_CACHE["ic"]);确认条件(全截至 T-1,防前视):IC>0 且 t≥2 且样本对≥60 且 T-1 日 MA20/60 多头趋势在场(IC 与指标综合考量;120/5/60/2 全为自然数、不做寻优, 防过拟合)。tier_sim_phase(ic_ok=)、tier_eval(ic_filter=)、tier_latest_picks(ic_filter=, top_n=)三个入口共用;确认不足时宁缺毋滥(持仓可少于 TopN、余下持现金)。当期确认覆盖约 100/6317 只——IC 显著本身是高门槛。v6.3.1:稳健档TIER_CFG*["稳健"].ic_filter=True为档位默认(tier_eval/tier_picks_stats/tier_latest_picks均按 cfg 生效), 全局ic_filter=True仍强制全档开启(picks10 回测); - 稳健档降换手(v6.3.1,
hold_buffer):调仓时在位股排名仍在top+buffer(稳健档 10+10=Top20)内即保留,只有跌出缓冲带才被替换;配合 Top10+IC 确认后 全A 组合交易数 9708→4180 笔(-57%),val/bull 显著增强;tier_sim_phase同时修正「实际买入加入当期 target」——避免整手/涨停跳过后 买入的标的次日被旧目标误卖(该修正令均衡/激进档旧批次数字小幅变化); - 稳健/均衡档回撤熔断(v6.4.2 稳健,v6.5.0 均衡同步,
mdd_guard=0.08):tier_sim_phase跟踪本相位净值峰值, 从峰值回撤超 8% 即按收盘清仓(reason=mdd_guard,跌停/停牌顺延),清空目标、 峰值重置为熔断后净值,下个调仓日才可重建;单段回撤被机械限制在 guard+跳空量级, 连续下跌会多次触发、全期总回撤仍可能超 guard,但显著小于无熔断。 实测(v6.4.2,全A全期)+73.5%/-19.5%/4180 笔 → +69.4%/-16.4%/4281 笔(-3.1pp 回撤, 代价 -4.1pp),val +50.5%→+48.9%、bull +87.9%→+88.7%; 10 万 picks10 口径同步 +65.6%/-19.7% → +61.2%/-16.6%。 阈值取 8% 自然数、未做寻优;激进不设,保持进攻弹性; 生产端“当前目标持仓”仍走 IC+Top10(熔断只作用回测引擎,实盘请手动同口径执行; v6.5.0 起稳健 reb20,长期持有请按 20 日节奏手动执行); - 10 万元荐股组合回测(v6.2.0,
backtests/backtest_picks10.py):组合总资金 10 万 (非每只 10 万)——每档 IC 确认后按综合分取 Top10、每只约 1/10 仓(约 1 万), 稳健 20 日 / 均衡 10 日 / 激进 10 日调仓(v6.5.0;此前三档均 10 日),其余约束同组合引擎; 本金规模影响结果(整手粒度 + 高价股预算买不进:10 万×Top20 时 >50 元股无法建仓), 与 100 万相位平均口径数字不可直接互比。全期/样本外/强势段三档结果见research/picks10_{full,val,bull}.json;IC 层贡献对照(同本金同 Top10 无 IC): 稳健 +19.4%→+61.2%(v6.3.1 含缓冲带10;v6.4.2 含 8% 熔断,原 +65.6%)、 均衡 +9.7%→+33.5%、样本外稳健 -3.4%→+40.1%(原 +43.5%); - 评分族:
rotate(板块轮动,v6.1.9 新增)供激进档使用——行业 20 日动量(sector_ret20, 取自stocks.industry成分股等权)排名 + 个股动量/低波基准;ETF/无行业退化为自身动量。blend_mom/mom/beta/beta_sh/beta_starv6.5.0 起保留仅作研究对照(无组合档在用; beta 在主板池已证伪,blend_mom 旧均衡已淘汰); - 稳健档偏动量(v6.1.11 历史,v6.2.3 淘汰):该档(原「稳健」,blend_mom 0.6)
已随 v6.2.3 档位重定名删除;现「稳健」= 原「均衡」(
blend等权)。历史结论: 等权blend会因低波分位差恒定而系统性挤出高波动成长股(当时证据), v6.3.1 以 IC 确认层(趋势在场)弥补该缺陷; - 稳健档收紧(v6.3.1):
TIER_CFG*["稳健"]由 Top20 改 **Top10 +hold_buffer=10ic_filter=True;全A 组合全期 +30.2%/-8.6%/9708 笔 → **+73.5%/-19.5%/4180 笔, val +4.8%→+50.5%、bull +17.4%→+87.9%;代价是全期回撤扩大(IC 趋势确认在 2023~2024 弱市更吃亏)。配对实验(全A/全期,含数据同批):IC+Top10 无缓冲 +83.0%/4480 笔(1M 口径),缓冲带10 换手再 -6.7%、收益 -9.5pp;Top20+缓冲仅 -3% 交易(前 20 名换手极快,缓冲几乎不生效);换手上限(每次最多换 N 只)可降 换手 -35%~-50% 但全A val 收益明显受损,未采用;
- 闸门族(v6.1.9):
tier_make_gate(指数 MA)用于前三档;tier_make_rotation_gate(板块轮动,大盘权重 40%)用于激进档,cfg.gate_mode="rotation"时由tier_build_gate分派; 全期开闸 1010/1636(62%)> 旧闸门(全A 创指 MA60=777、上证 MA20=857); - 基准(v6.2.3,v6.5.0 调整):稳健 / 均衡 = 上证(v6.5.0 起均衡由科创50切回上证, 与其承接的老稳健策略同基准);激进 = 科创50(不分科创板权限),报告另附创业板指/上证三基准对照;
test实验档(v6.4.0,sm701 只读桥接):TIER_CFG*["test"]为score="sm701"(_SM701_TEST:Top10、reb=1 每日重排、无闸门、参考止损 2×20日波动、experimental=True),四口径共用universe掩码;tier_default_names()只返回稳定三档,故默认研究/回测与 AI 自动选档不跑 test:- 路径解析
sm701_paths():优先~/桌面/sm701 (副本),其次~/桌面/sm701,再查仓库同级目录;SM701_DIR/SM701_DB/SM701_MODEL/SM701_PRED可覆盖;要求副本内有stock_cache.db+lgbm_train_backtest.py(外加任一模型口径,见下); - 模型口径(v6.6.3):
_sm701_production_set()探测副本production/(features_tech.json+prod_h1|h5|h10_tech.txt三模型齐全)——命中即以 生产定稿三周期 tech 模型为准,历史分数读production/valid_predictions.csv.gz; 否则回退旧单模型lgbm_output/lgbm_model.txt+valid_predictions.csv.gz。SM701_MODEL显式指定时强制单模型口径、跳过production/; - 历史预测生成(副本侧,v6.6.3):副本
production/make_predictions.py用生产三模型对--out-start(默认 2024-01-01)起全市场样本外打分,写production/valid_predictions.csv.gz(date,code,prob_h1,prob_h5,prob_h10,prob;prob=三模型等权平均),供本仓库历史段流式读取; - 数据读取:
_sm701_conn()用 SQLite 只读 URI(mode=ro)打开副本库, 不复制 7GB 扩展库、不与副本训练进程争写锁;_sm701_stock_info()从副本stocks+stock_industry补股票名/行业/PE/换手率(主库缺失时兜底); - 评分矩阵
sm701_score_matrix():以tier_load_panel()的 code × 交易日 面板对齐;历史段用标准库 csv+gzip 流式读副本production/valid_predictions.csv.gz(prob列=三模型等权平均; 回退口径为lgbm_output/valid_predictions.csv.gz,prob/prob_lgbm/prob_fuse 依次取列),历史文件结束后的新交易日用_sm701_live_predict()/_sm701_live_fill()——取数据较新的行情库(sm701 副本或主库;v6.6.4: 副本日K落后时自动改用主库,两库重叠段逐值一致)读_SM701_WARMUP_BARS=180预热根 → 调用副本lgbm_train_backtest._compute_feats(_sm701_module()按脚本路径缓存模块) →_sm701_predict_feats()打分:生产档按features_tech.json列序(tech 40 特征)对 h1/h5/h10 三模型分别预测、等权平均,单模型档按feature_name()对齐预测;已对拍末交易日 2026-09-30:实时复算值与落盘 prob 逐元素一致(sh600000 0.42401537);实时结果按 (预热起点+目标日期+库/模型 mtime)缓存,组合矩阵与单股信号共用; - 缓存失效:
_SM701_CACHE["scores"]的 key 含代码数/首末交易日/库·模型·预测 文件 mtime(_sm701_model_mtimes()三模型逐个 mtime),副本数据更新后自动重算;_SM701_LOCK防并发重复复算; - 单股信号(v6.4.1,预测参数·风险偏好
test):sm701_prob_map(full, dates)先流式取该股历史概率(按预测文件 mtime 缓存),再对历史末日之后的新交易日 用_sm701_live_predict()实时复算;_sig_sm701()做概率滞回信号 (≥0.55BUY /<0.50SELL,同向不重复),供主图、「信号胜率」面板与导出共用 (strategy_signals_full同分支);RISK_PARAMS["test"]仅提供 ATR 止损/ 移动止盈参数(沿用激进档宽松风控)。该路径不读消融缓存、不触发消融, 且关闭多维兜底与异动覆盖,保证买卖点纯模型直出; - 生产端:
tier_latest_picks(tiers=["test"])用 sm701 数据日期 + 名称/行业/PE, 不启用 IC 过滤,持仓页标注数据源与日K日期;GUI 手动入口=每日荐股下拉、 设置→荐股偏好、工具→test(sm701) 当前目标持仓,CLI=--tiers --tier test; - 口径冲突(重要,v6.4.0 实测备案):sm701 标签为
next_ret = close[t+1]/open[t+1] − 1(特征日 t 信号 → t+1 开盘买 → t+1 收盘卖),是 A 股 T+1 下不可实现的当日回转口径;本引擎统一「T-1 信号 → T 日收盘成交」,买入发生在预测会话收盘之后,天然错开一个交易日。 实测tier_eval(test、Top10 日调仓、全 A、含费用、2024-01-02~2026-09-30): 总收益 -96.0%、年化 -69.1%、回撤 -96.0%、6434 笔;同区间 sm701 自身 报告样本外 Top10 年化净 +49.0%/回撤 -32.0%,两组数字不可互推。 因此test的荐股输出只作为模型原始排序的研究观察口径,生产端与 GUI 报告已附显著提示;如需复现 sm701 口径需另加「次日开盘买入」执行模式 (且个股受 T+1 限制,不可当日卖出); - 实验边界:test 未做标准回测/过拟合诊断,不参与 AI 自动选档 (偏好为 test 时回退稳健)。
- 路径解析
- 指标(
_tier_metrics):总收益 / 年化 / 最大回撤 / Sharpe(√252) / 胜率 / PF,全部 numpy。
3.8 策略消融引擎(backtest_strategy_ablation.py,AI 不参与)
- 覆盖所有对象:个股 + ETF 逐个独立消融(≥200 根),输出覆盖率清单(纳入/有效/跳过原因/K线不足名单)
写入
summary.coverage,可核验「确实全部跑过」; - 13 类信号:MACD 金叉死叉 / KDJ 低位金叉高位死叉 / RSI 超买超卖 / 布林带回归 / MA20-60 趋势 /
L1 形态上行概率 / L2 同行业+行业ETF / 筹码峰支撑 / 板块轮动 /
量比放量(v6.1.10 新增) / LGBM 预测(v6.1.10 新增,缺库静默回退) /
异动·全市场相似(v6.3.0 新增,见 3.15) /
多维评分;
- 量比(v6.1.10):复用
vol_ratio_at(近5/前15),BUY=首次放量 (prev<1.2, vr≥1.5, 收阳)/ SELL=缩量≤0.5 或放量≥2.0 收阴; - LGBM(v6.1.10):
LGBMRegressor滚动训练,每 50 根用「当日及 以前」8 维特征(ret5/10/20 + rsi6 + boll_pct + macd_diff + kdj_diff + vr) 重训一次预测次日收益;±0.5% 阈值 BUY/SELL,3 根冷却;lightgbm包 缺时静默返回[]——回退到其他候选,不让缺库打断消融; - sm701(v6.6.4 新增):只读桌面 sm701 副本的生产 h1/h5/h10 三模型
等权概率,≥0.55 BUY / <0.50 SELL(滞回,同向不重复);历史读
production/valid_predictions.csv.gz,副本日K落后时用主库最新行情实时 复算。研究批量消融由父进程一次性构建sm701_score_matrix并注入各 worker,worker 只按代码×日期取值,避免每只股重复扫描 70MB+ 预测文件;
- 量比(v6.1.10):复用
- L2(v6.1.3 新增):每个行业构造「行业指数」——优先同名行业ETF收盘序列,无匹配则同行业个股等权收益累乘; 行业指数 > MA20 且 5 日动量 > 0 → BUY,反向 SELL(时序行业趋势,与板块轮动的横截面强弱互补);
- 防过拟合:前 ~75% 训练集选型,后 ~25% 验证集只报告;训练集上把 Calmar/PF/胜率/年化
横截面 rank 后加权选优(保守/稳健 v6.4.2 起 0.30/0.30/0.30/0.10 高胜率导向,原 0.45/0.25/0.20/0.10;
激进 0.30/0.20/0.15/0.35),并设交易活跃度下限(稳健/保守 ≥8 笔,v6.4.2 起;
不足回退 ≥3 笔/全量;激进保持 0);
近端子窗一致性(v6.1.5 热修②):最近 250 根按同权重 rank 取前 25%(下限 2)与全窗前 25%
(下限 3)取交集,交集内取全窗得分最高;交集为空回退该档「多维评分」(防长期横盘/旧 regime
选出、风格切换后沉默的策略,如 688012 于 2025-09 突破后 RSI 近一年 0 交易 → 回退多维评分)。
近窗只取训练段末尾(split 前 250 根;v6.1.5 热修⑥ 修正——此前取”截至最新 250 根”,
n=1000 时正是验证段,验证集参与了门槛筛选,验证指标偏乐观,详见
reports/GUI过拟合自检.md),只做 top 门槛否决、不参与权重打分; 单股逐笔输出中「激进」与「均衡」选型相同("激进": _bal,二者只在组合层弱市覆盖上分化, 见 3.7;所以 per-stock JSON 里后两档逐股相等是设计行为,不是选型故障); - 牛熊评分:上证 MA120 上下分牛/熊段,分段年化;
- numpy 加速(v6.1.3):ATR
cumsum滑窗、每对象 OHLC 平行数组复用(10 算法 × 各档共享)、 净值曲线/牛熊分段向量化;实测 10 算法 6924 对象 181 秒(8 进程),较 v6.1.2 的 9 算法 251 秒更快; - 加速等值性:加速路径与纯 Python 实现逐笔等值(有等值测试);
- GUI 单股消融(
run_ablation,工具→重选策略):与本研究脚本同口径—— 13 算法 + 多维评分 × 3 风险参数 = 42 候选(v6.6.4 增 sm701; 研究脚本仍跑CFG.RISK_PARAMS全量,选型时过滤 test 参数), 训练集多指标 rank 选优 + 近端子窗一致性(pick_ablation_consistent,不一致回退多维评分)、 验证集只展示;选型结论写入pick_notes与日志(消融选型 ... [全窗+近窗一致/回退…]); 档位名=选型目标(保守档限定保守/稳健参数候选;激进=年化+Calmar 目标), 推荐档按训练集 Calmar 取最优(验证集不参与),年化波动 >45% 时强制在稳健/激进中取较优; 策略缓存 5 日。返回新增candidates(全部候选,v6.3.3)。 - 全部组合策略窗口(v6.3.3,工具→重选策略/三档弹窗「全部组合…」):
打开时优先
load_full_ablation——流式读研究批量产物research/strategy_ablation_per_stock.json(约 600MB;按行扫描建code→顶层对象字节偏移索引,进程内按 mtime 缓存,按需seek + raw_decode单只,首次约 4s、之后秒开,不做 TTL 但标注文件日期);无覆盖/读取失败才_start_local_ablation后台本地消融。窗口列出全部 算法×风险档(12+1 × 3) 候选,顶部「排列方式」14 选一:推荐/档位优先、按算法/风险档分组、 训练/验证 综合评分(_ablation_ranks)、年化、胜率、Calmar、回撤、交易数 (缺验证样本排末尾);选行/双击应用save_strategy并重分析,另有 「用推荐档」「本地重算(当前参数)」。研究缓存里的三档标记(★推荐/·档)沿用mode_candidates;缓存过期时用_pick_one_from_pool按当前口径现算标记。 - 多档同选说明(2026-09-26 备案):选型按指标 rank 而非档位名匹配参数,当同一候选
在稳健(偏 Calmar/PF)与激进(偏年化)两套权重下都排第一时,各档会选到同一策略,
属训练集选型结果(如 sz002241 各档均为「多维评分·稳健」);抽样 40 只中 18 只同选、
22 只有差异。每次选型写入
stock_gui.log(消融选型 ...),便于核对;若需强制分化 须先回测验证,当前不引入。
3.9 AI 分析(可选,OpenAI 兼容)
- 任意 OpenAI 格式平台:设置内填
base_url(DeepSeek/智谱/opencode 等),自动补/chat/completions与/models; - 网关兼容:请求带自有 UA
stock-analyzer/<版本>(Cloudflare 会以 1010 拦截通用库 UA), 并带稳定会话头x-opencode-session(opencode zen 必需,缺失报 400 MissingSessionID;同股同模型复用, 换股/换模型/换用途区分);其他平台忽略该头; - 模型列表自动获取:打开设置自动拉
GET {base}/models,可手动刷新,失败可手填; - 提示词(v6.1.8 按风险偏好动态生成;v6.4.1 增 test):通用要求「直接给买/卖/观望 + 唯一首选方向 + 价位区间 + 建议仓位,禁止模棱两可,结论先行、≤3 条依据、末行风险提示」+
RISK_AI_GUIDE行为约束——保守=等确认/轻仓,稳健=兼顾但须可执行,激进=突破即进攻、禁用「等企稳/观望」搪塞,激进(最高档)=板块轮动进攻、接受大波动、可直接给打板(涨停价)与集中仓位建议、禁止等企稳措辞;test=sm701 模型直出(围绕模型概率给结论,并明确提示「次日开盘→收盘」日内口径、A股 T+1 不可当日卖出、样本外 AUC≈0.53);系统提示词(ai_system_prompt)与首条用户上下文都带该约束(风险偏好变化 → 上下文 hash 变化 → 自动重新提问,不复用旧风险口径的缓存回答); - 数据上下文:快照/缺口/量比/板块、5/20/60 日收益与 60 日位置、20 日均额与波动、近 15 日 OHLCV、 MA/MACD/KDJ/RSI/布林/ADX、形态预测分位与上行概率、近期信号、市场简报(含三档闸门+科创50)、筹码分布、多维评估;
- 市场简报主线程安全(v6.5.2 热修②):
ai_market_brief()曾在 GUI 主线程直接构建激进档 板块轮动闸门(tier_load_panel冷缓存 18~170s +tier_build_features~20s),AI 页点 【开始分析】即无响应。现拆三层:ai_market_brief()(主线程安全)只做轻量指数简报, 闸门读后台缓存(10 分钟 TTL);冷缓存返回「后台预热中」并自动派 daemon 线程_ai_market_brief_full()预热(打开 AI 页即触发,幂等防重复派线程);ai_choose_tier(AI 自动选档)本就在后台线程,改用全量版。 - 多轮缓存:同股同模型对话存 SQLite(
meta的ai:<code>:<model>)与内存,数据未变直接复用, 追问只追加新问题;超长截断(保留首条上下文 + 最近 24 条);可一键清空。 - AI画线(v6.5.2):prompt 追加机器可读画线块(```ai-lines JSON:最多6条水平价位
buy/sell/stop/support/resistance/target + 最多2段趋势起止日期价格,价位须在近60日
区间±30%内);
parse_ai_lines()校验(非法/越界静默丢弃)后存res["ai_lines"], 主图以 ACCENT 虚线 + 左侧“AI·标签 价格”绘制(趋势段按日期映射当前视野,越界不画); AI完成(首轮/追问/缓存复用)即解析并_rerender(),工具栏“AI线”开关显隐, 清空对话/新一轮提问/切换股票同步清线;当前为完成后即画,token流式未做。
3.10 荐股权限 / AI 自动选档(v6.1)
- 权限(存
stock_gui.ini [picks]):行业多选(128 行业)+ 板块勾选(主板/创业板/科创板/ETF),空选=不限制; 作用于 GUI 荐股、三档目标持仓、CLI--tiers(pick_allowed); - AI 自动选档:按市场环境简报在稳定三档内选一档并给理由,失败/无 Key 回退到配置的荐股偏好;
v6.4.0 起
test实验档不参与自动选档——偏好为test时直接回退稳健并在荐股页注明; - 荐股股票池:
all/main/etf/all_etf四选一。
3.11 键盘搜索与自动补全(v6.1)
任意位置按键(非输入控件聚焦时)→ 聚焦搜索框并写入字符;候选下拉(代码前缀优先,最多 12 条,含行业);
清单后台从 stocks 表一次加载(不联网);↑/↓ 选择、Enter/双击分析、Esc 关闭。
3.12 预测参数生效与样本去重(v6.1.5 热修⑦,原「已知不一致」已修复)
- 原问题:模块后段遗留
W_WINDOW, TOPK = 10, 10在导入时覆盖_load_predict_cfg()读入的 ini 值 → 设置界面显示W=20、实际跑W=10,「保存并应用」只当次进程生效。 现该行改为W_WINDOW, TOPK = CFG.W_WINDOW, CFG.TOPK(与 CFG 同步,设置即时且持久)。 - 影响面:L1 形态信号(
_sig_l1_pattern/_l1_up_prob_last);不影响三档组合引擎 (它只用ret20/vol20/β)。修复后按新口径(W=20)重跑消融/三档选型/每只股导出。 - 样本窗口去重(防重叠):单股预测的最终样本挑选间隔由
W//2改为首选W(窗口互不重叠),不足才逐级放宽(W//2 → 3 → 1);L2 池匹配同股间隔同样改为W。 此前 W//2 会让相邻样本窗口重叠一半,同一段行情被重复计入融合权重。 - 漏斗一致性:读取/保存设置时强制
候选样本数 ≥ 最终样本数(不足自动抬高并提示);_pool_match(topk=)改为调用时读全局(原定义期默认值在「保存并应用」后会过期)。 - 筹码桶数:
calc_chips默认nbin=120→360(全历史价格区间下可见窗口约 120+ 桶, 修复右侧筹码柱稀疏;信号引擎chip_snapshots/_chip_feats_py各用 80/200 桶,不受影响)。
3.13 界面主题与样式(v6.1.5 UI 优化)
- 三主题:
THEMES(dark/light/contrast),apply_theme()把主题键重写到模块级常量; v6.1.5 新增BORDER/HOVER_BG/SEL_BG/ACCENT/LOG_BG,ttk / 列表 / 选中 / 日志统一取色。 - ttk 样式:
App._style_ttk()(clam)统一按钮/输入框/下拉/滚动条/标签页/分隔线/ 复选单选的 padding、边框、hover/focus 色;主操作按钮用加粗Tool.TButton。 主题切换经_rebuild_ui():重建控件 →_style_ttk()→root.configure(bg=DARK_BG), 三主题(含高对比)配色一致;原生tk.Text/Listbox/Label全部改为主题常量。 - 窗口:
App._center_win()统一居中(工具/设置/每日荐股/样本/报告/五大指数), 尺寸按屏幕自适应;工具窗曲线画布加主题色边框、结果区统一内边距与选中色。 - 网页仪表盘:
v61_dashboard.py的dashboard.html新增明/暗主题切换(右上角按钮, localStorage 记忆;Canvas 配色由readTheme()从 CSS 变量读取,切换后按当前页重绘)。 - 图表轴标签让位(v6.1.5 热修⑤):主图
_draw_main按_text_px(Tk 字体实测宽度) 计算价格轴标签所需左边距,经_geom(lpad=)扩大L,副图(量/指标)复用同一self._axis_lpad保证三面板 x 对齐;修复字体缩放(HiDPI)下 5 位数刻度首字符被画出 画布(40.28→0.28);筹码「支/压」标签与十字光标价格标签同样按实测宽度收回画布内。 - 设置页排版(v6.1.5 热修⑦/⑨):预测参数 12 行占
grid9~20,而按钮行原先也在 row=20 → 「最大拉取样本量」与「保存并应用」重叠(入口被按钮盖住);⑦ 移到 row=30,并加 grid 单元占用自检(同 master 下同 cell 多控件即报错);⑨ 按钮栏移出滚动内容,pack(side="bottom")固定窗口底部;滚轮事件递归绑定到全部子控件 (Tk 滚轮只发给指针下控件、不冒泡到画布,之前参数区滚不动)。 - 折叠副图(v6.1.5 热修⑤/⑥):工具条「折叠副图」勾选后
grid_remove成交量/指标画布, 并把两行grid_rowconfigure(weight=0)(只 remove 会留按权重占高的空行、露出浅灰底), 纵向空间全给主图(紧凑小屏/主图预估<380px 默认折叠,类同花顺);_geom改用winfo_height()实际高度(折叠/网格拉伸后cv["height"]不再是真实高度); 窗口缩到主图 <320px 自动折叠(手动切换过则不再干预)。 - 数据工具页(v6.1.5 热修⑥):工具窗第三页(未分析股票也可开)——清洗/复权迁移
(
data_clean.py)与全库回填(backfill_full.py)参数表单 + 后台子进程 + 实时日志 + 停止;回填新增--min-bars/--fresh-days/--bar-countCLI 参数;「每只股回测导出 Excel」 调用backtests/stock_backtest_export.py(详见 4.1); 日志回流不卡主界面(v6.5.7):_ext_poll每轮最多抽 400 行/占用 ≤30ms, 积压 1ms 续批、空闲 150ms 轮询,_ext_log_many单次 insert 且控件只留末尾 约 4000 行;重开工具页时保留运行中子进程句柄与队列并自动续轮询; 全量策略消融(v6.5.5/v6.5.6):表单(并发 0=自动/限制只数 0=全部)启动backtests/backtest_strategy_ablation.py全市场逐只消融,勾选「跑完刷新 GUI 策略缓存」串联backtests/tier_picks_from_ablation.py(bash&&链 + 独立进程组, 【停止】按进程组 kill 避免孤儿写库);进度查询:脚本每 ≤2s 原子写research/ablation_progress.json(pid/阶段/done/total/有效/跳过/ETA), GUI「进度查询」按钮 + 窗口存活期每 3s 自动刷新,progress.py④ 同源展示 (进程消失未标完成显示「已中断」);同页「更新K线源」子进程运行stock_firstaid.py体检+自救(实测可用域写回 ini[data] kline_url,重启生效); 产物research/ablation_v*/+ 根目录strategy_ablation_*.json最新副本, 刷新后逐股「策略消融/推荐」读表秒开。 - 基本面信息页(v6.2.1):工具窗「基本面」页签(小屏工具菜单「基本面信息」独立窗口,
未分析股票也可用)——
fetch_f10_metrics抓东财 F10 主要指标(datacenter.eastmoney.comRPT_F10_FINANCE_MAINFINADATA,报告期倒序最多 12 期,双 host 容灾 +em_f10熔断 +_DOMESTIC_SUFFIX直连优先,6h 缓存_F10_CACHE), 13 列表格(营收/净利及同比、扣非同比、EPS、ROE、毛利率/净利率、负债率…)+fundamentals_summary本地规则分析(成长性同比序列/增收不增利/扣非背离、ROE 分级、 每股现金流÷EPS、负债率(金融地产不评)、评分制综合结论,不联网不调 AI); 代码框回车/按钮线程抓取,已有代码进页自动抓取。 - 指标线颜色 / 粗细自定义(v6.1.10):设置→指标线分段——
线粗度 Spinbox
1~3(默认 1,比旧版width=2细一档)+ 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/IND_BOLL_COLORS两个模块级常量;ini[ui]段加ma_colors / boll_colors / ind_w三键, 启动加载;BOLL 改独立show_boll打勾(与 MA 同位),不再占用副图—— 副图 combobox 改为["MACD", "KDJ", "RSI", "ADX", "量比"](新增量比__draw_VOL_ratio:近5/前15 量比 + 0.8/1.0/1.2 三道阈值 +vol_regime标题尾标)。 - 设置分区导航(v6.3.2):设置窗口改 PyCharm 式左分区 + 右内容页——
左侧
ttk.Treeview(SettingsNav.Treeview无表头、行高 30)分区 「外观 / 预测参数 / 指标参数 / 荐股 / AI 接口 / 关于」,右侧单 Canvas 内 六个ttk.Frame同 cellgrid_remove切页;窗口高宽随当前页自适应 (上限vrootheight×0.88),底部按钮栏固定;滚轮仍递归绑定全部子控件。 「关于」页作者信息按用户要求移到最下方(版本 → 免责声明 → 作者/邮箱/QQ)。 - 指标参数可调(v6.3.2):
CFG新增 13 个指标参数(MACD 快/慢/信号、 KDJ N/M1/M2、RSI 短/长、BOLL 周期/倍数、ADX 周期/平滑/趋势阈值), ini[inds]持久化(_load_ind_cfg+set_ind_param范围钳制,IND_RANGES/IND_DEFAULTS单一事实源;MACD 自动保证慢线>快线);calc_macd/calc_kdj/calc_rsi/calc_boll/calc_adx参数缺省改读CFG(calc_adx新增smooth参数分离 DX 平均/ADX 平滑周期,默认=ADX_N), 分析页/买卖点打分/消融/逐股回测/研究脚本共用;图表与右栏标签 (RSI{短}/{长}、BOLL({N},{K})、ADX/DMI({N})、ADX≥{阈值}) 随参数动态显示;默认值与原硬编码一致,未改动任何历史结果。 - 非模态工具窗(v6.5.2 热修① / v6.5.8):工具/基本面/策略消融推荐/全部组合四窗拆除
grab_set,与主窗口可同时操作(此前工具窗一开主窗口即锁死); 各窗以实例属性持有(_tools_win/_fund_win/_strat_pop_win/_allstrat_win), 打开前先销毁旧实例防堆叠;v6.5.8 起工具窗去掉transient——多数窗口管理器 不给 transient 子窗最小化按钮,现为独立顶层窗(可最小化、任务栏独立、可切回主界面), 其余三窗保持 transient 置顶与居中/聚焦。
3.14 18 策略共振综合荐股(v6.1.6)
- 来源:移植
chaodi_strategies/et_engine(通达信口径)进stock_gui.py算法区, 自包含单文件(build_cli.py自动并入 CLI),命名前缀chd_/CHD_; - 指标/信号:TDX 语义 EMA/递推、BOLL(ddof=1)、Wilder RSI14、5/20/60 日动量、
20 日年化波动、成交额≈量×100×价、涨停价
round(prev×(1+limit_pct),2)与连板、 60 日新高低、MA/MACD/MA20 突破信号;未用指标(KDJ/ATR/DMI 等)不移植; - 数据口径:hfq×adjust.k 乘法前复权;688/689 成交量「股→手」折算;
换手率优先
et_shares总股本(缺失退回 成交额/总市值);北交所不入池; 最后K线晚于市场最新日 3 天以上(停牌/退市边缘)跳过; - 逐策略基础过滤:默认价 3~300 / 市值≥10亿 / 成交额≥2000万 / 剔除 ST·退市 /
次新 30 日;趋势突破更严(价 5~200 / 市值≥20亿 / 成交额≥1亿 / 次新 60 日);
套用
pick_allowed权限与tier_universe_mask同口径股票池(all/main/etf/all_etf); - 打分合成:每个策略候选池内
score=100×Σw×(x-min)/(max-min)(单候选 0.5, 与 chaodi 服务端一致),再合成综合分 = 命中策略数×100 + 命中策略均分;chd_comprehensive_picks()返回signal_date/scanned/pool/by_strategy/picks/elapsed, GUI_picks_fill_chd渲染(共振数/均分/命中策略,双击分析); - 对拍与耗时:500 只随机样本 × 18 策略与 chaodi 引擎命中集合逐策略一致;
全A约 35s(主板约 58s),纯本地缓存不联网;旧
daily_picks仅留backtests/backtest_picks.py使用,GUI 不再调用。
3.15 异动·全市场相似历史(v6.3.0,激进/均衡专属)
- 定位:单股决策层 + 可回测信号源。个股「超出自身历史波动范围」时,
用全市场历史异动样本类比出买卖方向;风险档为「保守」时不自动叠加,
ini
[predict] analog_override=0可关,默认开启。信号生成器_sig_analog已进入消融候选池(GUIrun_ablation、研究脚本gens)、strategy_signals_full(信号胜率工具/逐股导出)与单股bt_stats, 可被三档选型选中成为正式策略。 - 触发(
analog_scan,因果分位):近CFG.ANALOG_LOOKBACK(20)个交易日内 出现「单日|涨跌| ≥ max(自身历史 99.5 分位, 5%)」或「5日累计|涨跌| ≥ max(自身历史 99.5 分位, 10%)」即视为异动状态;分位只用事件日以前数据 (最少ANALOG_MIN_HIST=120根),事件日取窗口内最近一次。 - 事件表(
_analog_events,进程内缓存 + 锁):由tier_load_panel全A日K 面板筛出 A 股(sh60/sh68/sz00/sz30,剔除 ETF),每股按全期 99.5 分位同口径 取事件(全库约 7 万例);事件特征 = 20 日对数收益 z-normalize 形态(ANALOG_SHAPE_W)、量比、换手率(et_shares总股本,缺失记 NaN)、简单 RSI14、20 日收益波动、事件 r5。构建首次数秒(面板加载 13s 已另缓存)。 - 匹配与统计(
analog_scan):目标事件与候选事件距离 = 形态 + 3×事件后路径(目标实际 k 日轨迹与候选同段轨迹平均绝对差)+ 0.8×量比 对数差 + 0.8×换手对数差 + 1.5×RSI差/100 + 4×波动差 + 1.5×r5差;取最近ANALOG_TOPK=50例(要求事件后第 k 日 +5 日前瞻可得、非自身),统计 次日/3日/5日均值与次日上行概率、次日封板率(按板块涨跌停口径)。 - 改判规则:样本数 ≥
ANALOG_MIN_SAMPLES=12且「次日上行≥55% 且 1/3 日均 收正」→ BUY;「≤45% 且 1/3 日均收负」→ SELL;方向明确则撤掉近 3 根反向 信号并在最新 bar 标注,band_algo改为「异动·全市场相似」;否则维持原 策略。激进档 + BUY + 封板率 ≥ANALOG_LIMIT_P=0.30时附打板提示与涨停价 (_limit_pct),信号文案带「打板」。 - 回测口径(
_sig_analog):对每个异动事件日 e,在状态窗口[e, e+ANALOG_LOOKBACK)内按ANALOG_SIG_STEP=2日全局逐日推进(重叠窗口 不重复、时间有序),用_analog_match同口径评估,仅方向变化时产出 BUY/SELL;候选前瞻以目标当日面板索引ti限制(ej+k+5<=ti),事件表 分位为因果块状(见下),历史回放无未来函数。既可并入analyze的信号流 (图表 +bt_stats),也作为独立算法进消融/选型(ALGO_LABEL["analog"], 候选池 13 算法 × 3 档 + 多维评分 = 42)。 - 因果事件表:
tier_load_panel全A面板 →_analog_flag_panel按列分块 (每ANALOG_PCT_STEP=20列用此前历史算 99.5 分位,块内沿用)跨股 向量化出异动 mask(只保留 mask,不落 th1/th5 全局面板)(全库约 8.6 万例, 构建约 24s:面板 19s + 特征抽取),再逐股抽事件特征(形态/量比/RSI/波动 按需现算、事件表不存 V/codes);_analog_events进程内缓存 + 锁。 目标股触发改用_analog_triggers精确逐日因果分位(只看事件日以前), 比候选块的近似更严格。 - 内存回归修复(v6.3.0):
tier_load_panel由fetchall()(全库 800 万行 一次性构造 Python 元组,单进程峰值 3.6GB,消融多 worker 各自建表触发 OOM) 改游标流式 + SQL 前缀过滤,逐元素输出一致,单进程建事件表峰值 3.6GB → 505MB(/usr/bin/time实测)。 - 全量首跑结论(v6.3.0,2026-10-04):全市场消融 7236 对象/7183 有效、
5123s(6 worker),analog 入选 保守 98 / 稳健 132(1.84%)/ 激进 91(1.27%);
候选描述性统计(5968 只、17813 候选):IC1 中位 +0.058(56.0% 正)、IC5 中位
+0.041(53.5% 正),优于 LGBM(IC5 -0.005)/L2(-0.000)、低于筹码峰
(+0.077);逐股导出 321 行/156 只(入选偏差样本)。三档选型与 GUI 策略
缓存同步刷新,
dashboard.html重建。 - 展示:报告「异动·全市场相似历史」专区(触发日/分位/相似样本统计/
前 5 参考案例/结论)、右侧栏结论行、K线主图买卖点;
analyze返回res["analog"];历史信号并入signals后由backtest_signals统计 (报告「回测统计」与信号胜率工具均含异动信号)。 - 显示需求(v6.3.0 同步):报告标题
名称 (代码) [行业](行业优先fetch_sector_context的东财 f127,其次stocks.industry),现价后换手 x.xx%;顶栏信息行同步;_fetch_quote_tencent解析 f38/f39/f46 供快照携带换手率/动态PE/PB(新浪/东财兜底无该字段,退回stocks快照)。
3.16 外部策略导入:股票策略工坊(v6.6.0)
- 目标:把
stock_strategy_studio的「自定义策略」JSON 作为单股买卖点 的一等信号源;启用后不参与消融、不使用风险偏好,风险控制改为显式参数。 - 目录与持久化:工坊目录
STUDIO_HOME默认~/桌面/stock_strategy_studio(STOCK_STUDIO_DIR可覆盖),导入源strategies/custom/*.json;导入时复制到 仓库studio_strategies/<slug>.json(studio_import_files原子写,同 slug 覆盖)。 启用项与交易参数存 ini[studio]:active/stop_loss_pct/take_profit_pct/max_hold_days,_load_studio_cfg()启动时钳制读取。 列表读取失败只记日志跳过,不影响内置策略。 - 规则引擎(
_st_*/studio_signals):纯标准库移植工坊core/indicator_catalog.py的 42 个指标(价格/趋势/动量/波动/量能/通道)、AND/OR、gt/ge/lt/le/cross_above/cross_below/between/rising/falling、 右侧数值或指标比较。计算口径逐项对齐 pandas 实现(含 SMA 的min_periods=n、EMAadjust=False、BOLL 样本标准差 ddof=1、KDJalpha=1/m、 DMI Wilder 平滑、CCI 平均绝对偏差);成交量单位=手,无amount时 按vol×100×close估算成交额/VWAP。导入时_st_normalize_definition校验并钳制参数(最多各 20 条条件);studio_signals按持仓状态过滤重复 BUY/SELL,reason 写命中条件描述。 - 分析接入(
analyze):studio_active_strategy()返回{"algo":"studio","mode":"外部策略","params":{...,"use_atr_stop":False}, "definition":...},优先于test与消融缓存;_sig_studio截近 250 根展示,strategy_signals_full支持algo="studio"(信号胜率工具近 1000 根重算); 跳过「信号过少→多维兜底」「波段适合度替换」「异动覆盖」「消融弹窗/重选策略」, 报告/侧栏标注外部策略。RISK_AI_GUIDE["外部策略"]同步 AI 提示词。 - 交易层:
_bt_simulate/_bt_events识别use_atr_stop=False: 不再计算 ATR/移动止盈,改为止损%(跌破entry×(1-p),跳空按开盘价)、止盈%(突破entry×(1+p),跳空按开盘价)、最长持有(到期当日收盘退出),0=不启用; 同日止损/止盈同时触发按止损优先(保守口径)。交易明细 reason 为止损 x%/止盈 x%/最长持有 N 天;信号胜率面板/导出按 rp 生成退出说明。 - 范围边界:仅工坊自定义 JSON(代码插件与模型类内置策略不导入); 外部策略不进入三档组合、每日荐股、消融候选池;条件内指标参数导入时固化。
- CLI 同步:规则引擎与
analyze接入位于算法块,stock_predict.py由build_cli.py生成后同样读取[studio]与studio_strategies/; 本次同时给 CLI 生成头补import datetime(last_completed_td曾 NameError)。
四、研究与发布流程
4.1 研究脚本与产物
| 脚本 | 作用 | 产物 |
|—|—|—|
| backtests/backtest_v61.py | 标准回测(4 口径 × 3 档 × 组合/荐股;test 实验档仅显式选择;v6.1.8 P1:多进程并行,--workers 0=自动 min(4,CPU)/1=串行,父进程预热面板+特征后 fork 继承,实测全期 127.9s→75.6s) | 每次运行建版本化目录 research/backtest_v6.1.8_<时间戳>_<区间>[_tag]/:report.json/md、run_meta.json(elapsed_s 含全部口径回测)、tables/*.csv(组合/逐笔/相位/逐笔分布/基准/净值曲线)、charts/*.svg;另在 research/ 根保留 v61_report*.json/md 最新副本 |
| backtests/v61_charts.py | 图表模块(纯标准库 SVG) | 单报告:相位/逐笔箱线 + 收益柱状(写入回测目录 charts/);--compare:跨版本对比图 |
| backtests/v61_dashboard.py | 本地网页仪表盘生成器(自包含 HTML,零外部依赖;v6.1.7 热修④ 起支持导出完整回测数据:全量 JSON / 指标 CSV / 曲线 CSV / 当前筛选逐股 CSV / 单股记录 JSON + 全量回测命令复制;v6.2.1 组合净值曲线下方新增两张表——组合指标表(每档总收益/年化/回撤/Sharpe/超额/交易/相位区间/荐股统计)与消融汇总表(最新 ablation_v*/summary.json:年化/胜率中位 + IC1/IC5 中位数、IC5 为正占比、牛熊中位,collect_ablation 收集;v6.3.0 消融表新增「异动相似入选」列)) | research/dashboard.html:研究净值曲线/指标对比/分布箱线 + GUI 单股回测(读 research/gui_backtests/*.json,旧口径记录标注作废)+ 每只股回测(读 research/perstock_backtest_v*/ 及旧 reports/ CSV,搜索/筛选/排序/分页 + xlsx/CSV 链接 + 运行元数据;默认勾选「排除事件股」,卡片/表格剔除重组复牌/长停牌等不可交易收益)+ 明细文件链接;默认展示最新「全期 + 新复权口径」批次,legacy(2026-09-27 切换前)批次醒目提示;backtest_v61.py 跑完自动刷新 |
| backtests/backtest_strategy_ablation.py | 全对象消融(12 信号 × 3 档——v6.2.1 起研究池补齐 量比/LGBM、v6.3.0 补 异动·全市场相似 与 GUI 一致;每候选新增描述性 ic1/ic5(全样本 Spearman,仅展示不参与选型),summary.modes[*].ic 聚合 IC1/IC5 中位数与 IC5 为正占比;v6.1.8 P1:map+chunksize 批量提交 + --workers 默认 8→16,实测 7181 只 509s → 373s(-27%);v6.3.0 起各 worker 首次调用需构建异动事件表 ~24s) | 版本化目录 research/ablation_v<版本>_<时间戳>[_tag]/:per_stock.json、summary.json、run_meta.json;根目录保留 strategy_ablation_*.json 最新副本(硬链接,兼容下游) |
| backtests/stock_backtest_export.py | 每只股回测导出(信号+事件回测逐只汇总;--mode tiers 默认按三档选型分表,另有 保守/稳健/激进(单档固定风险参数)/cached;v6.2.3:删除 backtest_signals+_bt_segments 双跑、非 composite 信号按算法缓存,实测 2.4 倍(6901 只 665s→223s);v6.1.6 起与消融同引擎 _bt_segments;回测主体为纯 Python 循环,v6.1.6 ③ 起 --workers=多进程 ProcessPoolExecutor 并行进程数,任务按股票拆分、参数/库路径 initializer 注入;v6.1.8 P1:map+chunksize=20 批量提交 + 默认 workers 4→8 + 4 档共用 1 次 ATR(14) 预计算 + composite 算法 4 档共用 1 次 _composite_precompute,实测 6898 只 4 档 260s → 204s(-22%);v6.2.3:三档参数(原高风险强制逻辑随参数组删除);v6.1.6 ⑤ 起事件股检测——单日复权|涨跌|>44% 或相邻K线间隔>90天(≈停牌>60交易日)记入「事件」列并计入 run_meta.event_codes;跑完自动刷新 dashboard.html) | 版本化目录 research/perstock_backtest_v<版本>_<时间戳>/:每只股回测.xlsx(三档=3 个工作表 + 说明)、同名 UTF-8 CSV、run_meta.json(含 adj 口径标记);--out 可指定;GUI「工具→数据工具」页同入口(留空=自动目录) |
| backtests/tier_picks_from_ablation.py | 从消融 per-stock JSON 逐只选三档(与 GUI _pick_one_from_pool 同口径;v6.2.3 过滤已删除档位的旧候选);v6.2.2 起另写 GUI 消融批量缓存 research/ablation_gui_cache.json(三档全量,与 run_ablation 同构),GUI 弹窗优先读它、读不到才本地重算 | 写进源消融运行目录 tier_picks.json(并合并 run_meta.json),根目录挂 research/perstock_tier_picks.json 与 research/ablation_gui_cache.json 最新副本;同时刷新 GUI 策略缓存(推荐档,meta strategy:*,5 日 TTL) |
| backtests/bt_common.py | 回测统一规范工具:new_run_dir / write_run_meta / link_latest | 所有回测程序共用:research/<kind>_v<版本>_<时间戳>[_<extra>][_<tag>]/ + run_meta.json(版本/时间/命令行/耗时/数据规模)+ 根目录最新副本(硬链接,跨盘回退复制) |
| backtests/backtest_tiers.py | 三档分段/逐年/参数敏感性 | research/tiers_*.json |
| backtests/backtest_picks_v6.py | 荐股逐笔(口径/区间/逐年) | research/picks_v6_*.json |
| backtests/backtest_picks10.py | 10 万元荐股组合回测(v6.2.0):IC 确认层 + 综合分 Top10、每只约 1/top 仓、调仓按档位节奏(稳健20/均衡10/激进10 日)、相位平均;--capital/--top/--tier/--universe/--yearly | research/picks10_*.json |
| backtests/(历史) | 因子/退出/横截面/激进双引擎等 | research/legacy/results/*.json |
4.2 报告流水线(单一权威链)
stock_gui.py(引擎:APP_VERSION / tier_eval.phase_anns / tier_picks_stats.rets)
└─ backtests/backtest_v61.py ──▶ research/backtest_v<版本>_<时间戳>_<区间>/
├─ report.json / report.md / run_meta.json(版本/时间/区间/数据规模/耗时)
├─ tables/*.csv(tier_metrics / picks_metrics / phase_anns /
│ picks_returns / benchmarks / equity_curves
│ —— 箱线图与表格的数据源)
└─ charts/*.svg(相位箱线 / 逐笔箱线 / 总收益柱状 / 逐笔均值柱状)
└─ 同时写 research/v61_report*.{json,md} 最新副本 ──▶ README「回测报告」摘要表
└─ 数字核验脚本(README/报告 ↔ JSON 逐项比对,须 0 不一致)
- README「回测报告」摘要表的每个数字都来自回测目录(详表在
research/v61_report.md); - 数据口径变动(如
adjust重定基)会让同配置数字小幅漂移 → 重跑报告并同步 README; - 产物版本化(2026-09-26):每次回测自动建
backtest_v{APP_VERSION}_{YYYYMMDD_HHMMSS}_{segment}[_tag]/文件夹,报告/明细表/图表/元数据全在里面;--run-dir可指定目录、--out指定 research 根; - 生成物防漂移(v6.1.5 热修⑦):
build_cli.py增加锚点存在性检查 (缓存块/算法块/CLI 尾部锚点缺失时给出明确 SystemExit 而不是substring not found)- 生成前
compile()语法校验(原已有)+ tkinter 残留检查;锚点改动必须同步该脚本。
- 生成前
- 回测程序统一规范(v6.1.5,
backtests/bt_common.py):所有研究/回测程序一次运行 = 一个版本化目录research/<kind>_v<APP_VERSION>_<YYYYMMDD_HHMMSS>[_<extra>][_<tag>]/, 必写run_meta.json(版本/时间/argv/耗时/参数/数据规模),根目录固定名挂「最新副本」 (默认硬链接,跨盘回退复制)供下游脚本兼容读取;已套用:backtest_v61(既有)、backtest_strategy_ablation(ablation_v)、stock_backtest_export(perstock_backtest_v)、tier_picks_from_ablation(写进源消融目录);reports/只保留人类报告(清洗报告等); - 本地网页仪表盘(2026-09-26;v6.1.6 默认批次/口径标注;v6.1.7 横线说明):
v61_dashboard.py把回测目录的report.json(含tier_eval新增的curve/curve_dates降采样净值曲线(≤600点/档)+ 主基准曲线bench_curve)与 GUI 单股回测留档内联进单个research/dashboard.html(Canvas 原生绘图:折线/柱状/箱线,支持对数轴与 hover),file:// 直接打开,无 CDN/服务器; v6.1.6 起默认选最新「全期 + 新复权口径」批次(避免默认落到val/bull分段而与 README 不一致),legacy(2026-09-27 复权切换前)批次/单股记录/每只股导出在下拉与页内 标注「旧复权口径」且不参与默认选择;新产物run_meta/导出带adj="mul_qfq_sina"标记(backtest_v61._write_meta、bt_common.write_run_meta、GUI 导出 JSON), 不再依赖时间判断;backtest_v61.py/stock_backtest_export.py结束自动调用 (失败不影响产物);GUI「导出回测」自动留档research/gui_backtests/gui_<代码>_<时间戳>.json(_slim_gui降采样后内嵌); -
图表与版本对比(2026-09-25):报告带
label/db_stats元数据;跑完自动出图到回测目录charts/;--charts-only只补图不跑回测,--compare all扫描同 segment 的历史报告做 跨版本箱线/柱状对比(纯 SVG,无 matplotlib)。 - 净值曲线横线语义(v6.1.7 热修③):水平段 = 趋势闸门关闭 → 空仓持现金(相位平均下各相位按各自调仓日依次清仓),非无数据;曲线页已加横线说明,悬浮读数自动标注「空仓·闸门关」。核验:4 口径 × 4 档 195 处平段全部闸门关 0/N。
4.3 发布流程
python build_client_zip.py—— 生成dist/stock-analyzer-client-v<版本>-<日期>.zip(GUI+CLI+插件+全量stock_cache.db;空 Key 模板 + 打包后 Key 自检);python upload_research_release.py --pack --tag v<版本>—— 打包dist/research_v<版本>.zip(自动排除legacy/与*.pkl);python upload_research_release.py --upload --tag v<版本> --asset ...—— 创建/更新 Release 并上传 (同名资产先删后传,幂等;Token 从git credential读取,不落盘);- 标签对应 Release 资产:客户端包 + 研究包;>100MB 的逐对象明细随研究包分发,不入仓。
4.4 版本链
v6.1.9(高风险档重做为新开发的高风险策略:板块轮动选股/闸门、大盘降权、宽止损暂不控制回撤)→ v6.1.8(高风险档=激进复制 + 打板 + MDD 止损)→ v6.1.7(新增高风险档)→ v6.1.6(18 策略综合荐股 + 仪表盘/回测口径统一 + 旧口径重跑)→ v6.1.5(回测产物版本化 + 复权口径切换 + 仪表盘)→ v6.1.4(热修:容灾/缓存/回测面板)→ v6.1.3(L2 消融对象 + numpy 加速)→ v6.1.2(ETF 四口径)→ v6.1.1(激进档对标科创50 / 主板激进重做)→ v6.2.0(荐股 IC 确认层 + 10 万组合回测)→ v6.2.1(基本面工具 + 仪表盘 IC/表格 + 消融重跑)→ v6.2.2(研究消融打通 GUI)→ v6.2.3(三档重定名:稳健/均衡/激进,去「高风险」名;三工具性能优化)
→ v6.1(标准回测 + AI/设置/搜索)→ v6.0(三档生产化 + 全库数据修复)→ v5.0 → v4.0.x。
五、Web 端(弱化独立实现)
Pi 网站 /(浏览器 JS 自算)与 /text(服务端算):
- 匹配:同样是 logret z-score + 欧氏距离 Top-K,但只有 L1 自身历史(无三级池)、无熔断;
- 预测:同样的加权分位区间法,锚今开;预测价位按板块涨跌停钳制(v6.5.2 热修②: T 日锚昨收、T+1 锚 T 日 P50 收;主板 10% / 创业板·科创板 20% / 北交所 30%, Web 端为精简口径,不处理上市首日等不设限场景);
- 信号:MACD/KDJ/RSI 三维事件打点 + 方向交替与冷却过滤器(与 GUI 一致,修复了历史上”只会买”的问题);
/lite为老设备 ES5 降级版,同样应用交替过滤。- 设计取舍:Web 端不引用 GUI 代码,是「同一思想的弱化独立实现」——为免安装、抗手机低算力。
六、下游 ai-quant 常驻模拟盘(独立仓库)
ai-quant 已于 2026-09-25 拆分至独立仓库(公开):
https://github.com/Languangxun/ai-quant(本地 ~/桌面/ai-quant)。
账户与交易规则、实盘决策链、/quant/ 状态页、休市日历、备份与运维等
细节均随该仓库维护(见其 README.md);本仓库只保留对接接口与
CLI 同源回测口径。
6.1 对接接口
stock_predict.py(本仓库唯一算法源生成物,部署在 Pi ~/ai-quant/scripts/cli/)
│ ① 缓存 scripts/cli/stock_cache.db(全市场日K·后复权,约 813 万根)
│ ② 选股 daily_pick_score 多维评分 + 空头趋势闸门 + ST/退市过滤
│ ③ 信号 _composite_signals(因果多维评分 + 冷却 + 风险参数)
├─▶ --push → ~/ai-quant/memory/inbox/stock_<code>_<date>.json
└─▶ build_cli.py 生成物 → 部署 ai-quant/scripts/cli/(选股/回测同源)
--push链路(stock_predict.py内 SSH 推送)不变,收件箱仍在 Pi 的~/ai-quant/memory/inbox/;- ai-quant 的选股/信号算法与本仓库 CLI 同源,CLI 升级后需同步部署到
Pi 的
~/ai-quant/scripts/cli/。
6.2 同源回测口径(实测留档)
- 信号:T 日收盘生成,T+1 成交(默认收盘价,
--exec-px open可换开盘价); - 退出:ATR(14) 跟踪止损 —— 止损位
entry − atr_mult×ATR,浮盈超过trail_trigger后按最高价 × trail_ratio移动;跳空低开按开盘价成交; CLI 的 SELL 信号同样 T+1 执行; - 组合:同日多个 BUY 按评分降序择优,SELL 先执行释放资金与名额; 逐日按收盘价估值(停牌/数据截止沿用最近收盘);
- 基准:等权全市场(逐日截面平均收益),区间与回测对齐;
- 数据:
stock_cache.db全量(约 4860 只),默认区间 = 最早信号日 ~ 多数股票仍有数据的最后一日,避免个别股票更新导致尾部样本稀疏。
实测(2020-02 ~ 2026-09,稳健档、5 只、收盘成交):
| 股票池 | 总收益 | 年化 | 回撤 | Sharpe | 相对上证 |
|---|---|---|---|---|---|
| 市值前 300 | +82.5% | +16.1% | -26.8% | 1.01 | +63.9pp |
| 市值前 1000 | +9.5% | +2.2% | -15.9% | 0.22 | -14.8pp |
| 沪深主板 | +17.2% | +2.5% | -31.3% | 0.25 | -13.1pp |
| 全市场 | +6.9% | +1.0% | -34.6% | 0.14 | -23.5pp |
结论:信号边际集中在高流动性大市值股;小市值噪声/涨跌停/费用拖累显著。
ai-quant 实盘候选默认按市值前 120 只扫描,与该结论一致;
--limit/--boards 可复现上表(详见 ai-quant 仓库 backtest/results/)。
七、变更索引
| 版本 | 主要变更 |
|---|---|
| v6.6.5 (2026-10-24) |
日K 同花顺第三梯队源 + 源链可配置 + 回填多源兜底 + 增量瘦身 + 基期检测缺陷修复:①_fetch_ths(d.10jqka.com.cn/v6/line JSONP,last.js 近140根 + 按年文件回拼~20年,_ths_symbol 映射个股/ETF/科创板/深指、上证指数无映射)——完整前复权口径原样入库不乘因子,排新浪后东财前;同轮对拍澄清新浪源口径与库内一致(0.000%);②源链注册层 _kline_builtin_defs/_kline_sources/_reload_kline_srcs/_load_kline_src_cfg/_apply_kline_src_cfg/_probe_kline_src(ini [data] kline_srcs/custom_kline),设置新增「数据源」分区(内置源启停/排序/测试 + 自定义源增删测,类型 tx/ths/em/sina/163),同 URL 去重、全停用回默认、急救箱联动;③_bf_fetch_one 腾讯→同花顺→东财三级兜底(_bf_hint_set 复用);④get_daily 增量只拉 120 根小窗、漂移时自动升级全量重定基;⑤修复 P0:基期漂移检测 break-early 缺陷(口径级差异 checked 恒=1 误判重叠不足→混写接缝,实测 +95.7% 跳变),get_daily/backfill_full_market 均改扫完再判;⑥_DOMESTIC_SUFFIX+10jqka.com.cn,firstaid 增同花顺套件;⑦修复「分析后 K 线长时间不显示」:_SM701_CACHE 三个缓存 key 由库文件 mtime 改为数据内容指纹(_db_latest_date() + 当日 30 分钟桶 _sm701_cache_epoch)——mtime 随每轮预取写库必变,致 sm701 选型股(全库 ~4200 只)每次分析都触发 ~110s 全市场实时复算、主图空白(实测首算 115s→二次 5.3s→模拟写库后 2.4s);⑧买卖点懒加载:analyze(defer_signals=) + analyze_finish_signals()——GUI 五入口先渲染K线(实测首屏 1.2s)、sm701/lgbm 信号后台补算后 _signals_done 重绘叠画,CLI 默认不 defer 口径零变化;APP_VERSION=6.6.5,stock_predict.py 重新生成;2.1/2.5 节与 README/CHANGELOG 同步 |
| v6.6.4 (2026-10-20) |
荐股 sm701 数据源修复 + 代码表防截断 + sm701 并入消融 + 全库三档对照:①_sm701_live_predict() 新增取数库选择(sm701 副本日K落后时用主库,_db_latest_date();缓存 key 加取数库/主库 mtime),修复 test 荐股最新信号日全 NaN、列表 0 只;荐股空结果提示与数据源日期同步;②refresh_all_codes() 仅在 ≥5000 只且 ≥现有 A 股 90% 时全量替换,部分拉取改为合并保留旧表(修复 5799→3396 截断);③run_ablation/backtest_strategy_ablation.py 新增 sm701 候选(13 算法;GUI 42 候选),新增 _sig_sm701_from_probs(),研究父进程一次性构建概率矩阵注入 worker;④backtests/compare_tier_sm701.py 全库对照(2024-03-12~2026-10-19):稳健 sm701 胜、均衡/激进当前胜、test 原生负 → 不整体替换;全库消融 7198 有效对象中 sm701 入选稳健 2326(32.3%)/均衡 1911(26.6%),候选层 IC5 +0.105 vs LGBM -0.002;research/compare_tier_sm701.json;⑤APP_VERSION=6.6.4,stock_predict.py 重新生成;3.7/3.8 节与 README/CHANGELOG 同步 |
| v6.6.3 (2026-10-18) |
test 档 sm701 切换生产定稿三周期模型:_sm701_production_set() 探测副本 production/(features_tech.json + prod_h1\|h5\|h10_tech.txt),命中即用生产三周期 tech 模型、历史改读 production/valid_predictions.csv.gz,否则回退旧单模型(SM701_MODEL 显式指定强制单模型);_sm701_predict_feats() 按 features_tech.json 列序对三模型打分、等权平均(sm701_score_matrix/_sm701_live_predict/sm701_prob_map 共用);缓存 key 改 _sm701_model_mtimes()(三模型逐个 mtime),sm701_status() 增 prod_*;副本侧新增 production/make_predictions.py 生成历史预测;对拍末交易日 2026-09-30 逐元素一致(sh600000 0.42401537),生产 h1 模型 2024+ AUC 0.5446;APP_VERSION=6.6.3,stock_predict.py 重新生成;3.7 节与 README/CHANGELOG 同步 |
| v6.6.2 (2026-10-18) |
数据层缓存优先 + 无网络优雅降级:fetch_daily 改走 get_daily,禁止绕过本地库;fetch_quote_cached 扩展为通用入口(内存 → SQLite quote_cache → 网络,失败降级旧缓存);fetch_batch_quotes 缓存优先、仅缺失/过期代码联网、失败返回缓存;fetch_f10_metrics 新增 SQLite f10_cache 持久缓存;GUI 实时行情与未上市判定切到缓存入口;APP_VERSION=6.6.2,stock_predict.py 重新生成;2.1/2.2 节与 CHANGELOG 同步 |
| v6.6.1 (2026-10-17) |
更新缓存范围弹窗:refresh_cache 先弹窗选 全A/自选/单股(默认 当前代码→自选→全A);全A=refresh_all_codes+stale_codes 剔除 ETF/北交后 prefetch 增量,自选=仅 watchlist,单股=默认当前代码并回报最新日K;_cache_busy 与后台主动预取互斥;纯缓存调度,信号/回测零改动;APP_VERSION=6.6.1,stock_predict.py 重新生成;2.2 节与 README/CHANGELOG 同步 |
| v6.6.0 (2026-10-17) |
导入股票策略工坊自定义策略:新增 studio_strategies/ 与 ini [studio];纯标准库移植工坊 42 指标/AND-OR/9 类操作符(与 pandas 实现逐点对拍一致),导入 JSON 后单股 analyze 走 algo="studio",跳过消融与风险偏好,交易层改用止损%/止盈%/最长持有(_bt_simulate/_bt_events 新增 use_atr_stop=False 路径,交易明细同步);设置新增「外部策略」分区(扫描工坊目录/导入 JSON/删除/刷新/参数),RISK_AI_GUIDE 与报告标注;信号胜率工具支持 strategy_signals_full 外部分支;同时修复 CLI 生成头缺 import datetime;APP_VERSION=6.6.0,stock_predict.py 重新生成;1.1 目录、3.16 节与 README/CHANGELOG 同步 |
| v6.5.9 (2026-10-17) |
日K多源扩容(8 源):_fetch_remote_rows 腾讯 4 域后新增 web.ifzq.gtimg.cn(HTTPS/HTTP,本链路只用不复权)与新浪日K CN_MarketData.getKLineData(不复权 × _sina_hfq_factors,volume 股/100=手,单次取 3000 根),再接东财 4 host 兜底;熔断/代理/负缓存机制复用;验证腾讯全域熔断时新浪接管(info["src"]="新浪");APP_VERSION=6.5.9,stock_predict.py 重新生成;2.1 节与 README/CHANGELOG 同步 |
| v6.5.8 (2026-10-17) |
工具窗可最小化:open_tools 去掉 transient(self.root)——多数窗口管理器不给 transient 子窗最小化按钮;现为独立顶层窗,可最小化/任务栏切换,同时保持非模态不锁主界面(基本面/消融推荐/全部组合三窗不动);纯 GUI 行为,回测/信号零改动;APP_VERSION=6.5.8,stock_predict.py 重新生成;3.13 节与 CHANGELOG/README 同步 |
| v6.5.7 (2026-10-17) |
回测运行中主界面保持可用:_ext_poll 日志回流由「每 120ms 无上限逐行 insert」改为限量限时批量(每轮 ≤400 行/≤30ms,积压 1ms 续批、空闲 150ms 轮询),_ext_log_many 单次 insert + 日志控件保留末尾约 4000 行;重开工具页时有任务在跑则保留子进程句柄/日志队列并自动续轮询(旧实现会重置 _ext_proc 丢句柄);APP_VERSION=6.5.7,stock_predict.py 重新生成;3.13 节与 README/CHANGELOG 同步 |
| v6.5.6 (2026-10-17) |
全量消融进度查询 + 更新K线源:消融脚本每 ≤2s 原子写 research/ablation_progress.json(pid/阶段/done/total/ok/skipped/ETA/完成标记);GUI 数据工具「进度查询」按钮 + 每 3s 自动刷新标签(进程消失提示已中断),progress.py 新增 ④ 同源展示;同页新增「更新K线源」按钮调 stock_firstaid.py 体检+自救(实测可用域写回 ini [data] kline_url;本次实测东财/网易挂、腾讯 5/5、新浪 1/1,kline_url 已切 https://ifzq.gtimg.cn/appstock/app/fqkline/get);APP_VERSION=6.5.6,stock_predict.py 重新生成;3.13 节与 README/CHANGELOG 同步 |
| v6.5.5 (2026-10-17) |
数据工具新增「全量策略消融」:表单(并发 0=自动取 min(16,cpu)、限制只数 0=全部、可选刷新 GUI 策略缓存)一键运行 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 重新生成;3.13 数据工具页小节与 CHANGELOG/README 同步 |
| v6.5.4 (2026-10-17) |
修复「不爬新数据」死锁:节假日锚(库内指数最新日K)若落后自然日历 >5 天(本库实测指数停在 09-30,全库被判「新鲜」两周不更新、指数自身也永不重拉)判为锚失真,last_completed_td/_index_expected_td(新增 _anchor_dead)退回自然日历口径,强制回补 10 月缺根并自我修复锚;≤5 天窗口保留(长假不误判);定位单元验证各边界;APP_VERSION=6.5.4,stock_predict.py 重新生成;2.2 节更新 |
| v6.5.3 (2026-10-17) |
预测匹配只参考自身:CFG.MATCH_IDX_ENV(ini [predict] match_idx_env,默认关)——关闭时 L1 打分去掉大盘涨跌点差项、样本分层筛选去掉「大盘±0.8pp」(量能/板块/缺口照旧)、L2/L3 池匹配去掉指数权重(distance_idx=0);上证/创业板指行情继续用于展示与 AI 简报不参与预测;match_idx_env=1 恢复旧口径;APP_VERSION=6.5.3,stock_predict.py 重新生成;3.1/3.2 节、README 与 CHANGELOG 同步 |
| v6.5.2 热修② (2026-10-17) |
预测K线涨跌停钳制 + AI市场简报后台预热:①样本池跨板块使主板股预测出”跌停都不够跌”的非法价位——_fusion_prediction/_multi_day_prediction 新增 lim(当日 _limit_pct 板块口径;复牌/上市首日 None 跳过)与 prev_close:t_pred/pred 价位钳到昨收±lim、幽灵K线单日收益钳 ±lim,analyze/load_pools_progressive(ctx 增 limit)与 stock_web.py 均传入;②AI页点【开始分析】主线程卡死——ai_market_brief 曾在 UI 线程构建激进档轮动闸门(tier_load_panel 18~170s+tier_build_features),拆分:主线程只算轻量指数简报,闸门读后台缓存(10min TTL)+ 冷缓存自动派 _ai_market_brief_full(daemon)预热(AI 页打开即触发);ai_choose_tier 改全量版;回测/信号口径零改动;stock_predict.py 重新生成;3.2/3.9 节、README 局限与 CHANGELOG 同步 |
| v6.5.2 热修① (2026-10-11) |
工具窗非模态化:工具/基本面/策略消融推荐/全部组合四窗拆除 grab_set,与主窗口可同时操作;打开前先销毁旧实例防堆叠;纯GUI行为,回测/信号零改动;stock_predict.py 重新生成;3.13 节与 CHANGELOG 同步 |
| v6.5.2 (2026-10-11) |
AI画线落图:prompt 追加 ```ai-lines JSON 画线块(6水平价位+2趋势段),parse_ai_lines() 校验后存 res["ai_lines"],主图 ACCENT 虚线+AI标签绘制;AI完成即解析重绘,工具栏“AI线”开关,清空/换股同步清线;APP_VERSION=6.5.2,stock_predict.py 重新生成;3.9 节与 README/CHANGELOG 同步 |
| v6.5.1 热修③ (2026-10-11) |
SELL冷却独立可配:RISK_PARAMS 每档新增 sell_cooldown(默认=买入冷却8/8/3,行为零变化),_composite_signals·SELL分支经 _sell_cd() 取值(旧缓存缺键回退);设置→预测参数三档可调(0-30天)、ini 落盘;回测/消融/研究同传 rp 自动一致;stock_predict.py 重新生成;3.3 节与 CHANGELOG 同步 |
| v6.5.1 热修② (2026-10-11) |
多维评分展示与回测单源化:analyze() 展示侧手搓120根循环与 _composite_signals 分叉(BOLL回升/回落±1、SELL冷却写死5、展示侧弱势BUY+1),现展示侧直调 _composite_signals 全量生成再截后120根;回测/消融零改动,旧缓存与历史数字不变;stock_predict.py 重新生成;3.3 节与 CHANGELOG 同步 |
| v6.5.1 热修① (2026-10-11) |
预测分位数 OHLC 一致性钳制:收/高/低独立分位+INTERVAL_K 放大致尾部交叉(如 P10 收<低),_fusion_prediction 逐分位强制 lo<=cl<=hi 且高≥开/收、低≤开/收,_multi_day_prediction 逐分位+累计价格双钳制,live 钳制后显式再钳;区间只向外扩,P50/上行概率/信号与回测口径不变;stock_predict.py 重新生成;3.2 节与 CHANGELOG 同步 |
| v6.5.0 (2026-10-10) |
档位重构(均衡接管老稳健,新稳健拉长持有):①原 beta-Top5 / blend_mom-Top20 均衡策略淘汰(blend_mom/beta* 评分保留仅研究对照);均衡接管 v6.4.2 老稳健口径(四口径 blend Top10/reb10/buffer10/IC/熔断8%/上证MA20,中期档);新稳健=老稳健拉长持有(reb10→20、buffer10→20,Top10/IC/熔断8%/上证MA20 不变,长期档;reb/buffer 取自然数未寻优)。②TIER_BENCH 四口径均衡切上证(与老稳健同基准;激进仍科创50);ai_choose_tier 提示词 + RISK_AI_GUIDE 新增均衡条、稳健条追加 20 日/缓冲20 说明;backtests/backtest_v61.py 报告脚注同步(删主板 blend_mom 旧注)。③全量重跑(数据截至 2026-09-30):标准回测 full/val/bull(research/backtest_v6.5.0_20261010_*)+ picks10 full/val/bull。全A全期稳健 +22.1%/-15.5%、均衡 +69.3%/-16.4%(=老稳健);val +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 日调仓=信号过期;reb20 相位平均 20 相位、区间起点晚 10 交易日致跨档不完全可比)。④APP_VERSION=6.5.0,stock_predict.py 重新生成;3.7 节与 README/CHANGELOG 同步 |
| v6.4.2 (2026-10-07) |
稳健档只做高胜率 + 严格控制回撤:①_ablation_weights("稳健") 0.45/0.25/0.20/0.10→0.30/0.30/0.30/0.10(胜率+PF 0.60 主导,Calmar 0.30 保回撤;保守档映射同步,激进不变);_pick_one_from_pool 对保守/稳健强制训练段 ≥8 笔参选(防 1~2 笔 100% 胜率假策略,回退 ≥3 笔/全量),并兜底过滤 test 候选。②CFG.RISK_PARAMS["稳健"] (1.5/1.02/0.94/3/8)→(1.5/1.015/0.95/3/8)(+1.5%启动、回落5%即走;仍宽于保守 1%/4%、严于激进 5%/10%)。③四口径 TIER_CFG*["稳健"] 新增 mdd_guard=0.08;tier_sim_phase 跟踪相位净值峰值、回撤超 8% 按收盘清仓(mdd_guard,跌停/停牌顺延)、清空目标、峰值重置,下个调仓日重建。④全量重跑:标准回测 full/val/bull(全A稳健全期 +69.4%/-16.4%/4281 笔,原 +73.5%/-19.5%/4180 笔;val +48.9%、bull +88.7%)、picks10 full/val/bull(稳健 +61.2%/-16.6%、val +40.1%、bull +76.4%)。⑤APP_VERSION=6.4.2,stock_predict.py 重新生成;RISK_AI_GUIDE["稳健"] 同步;3.6/3.7/3.8 节与 README/CHANGELOG 同步 |
| v6.4.1 (2026-10-07) |
预测参数·风险偏好新增 test(sm701 模型直出、不消融)+ sm701 新版本代码同步:①CFG.RISK_PARAMS["test"](ATR 2.5/触发1.05/回落0.90,仅作风控;买卖点不消融),设置页风险偏好下拉自动含 test;analyze() 在 test 下跳过消融策略缓存与自动消融弹窗,strat={"algo":"sm701","mode":"test"},信号由 _sig_sm701() 概率滞回产出(≥0.55 BUY/<0.50 SELL),并关闭「信号过少→多维兜底」与异动覆盖;新增 ABLATION_MODES/ablation_risk_params(),消融任务、全量候选过滤、「重选策略」入口显式排除 test;RISK_AI_GUIDE["test"]、报告/信息栏、设置页说明同步。②新增 sm701_prob_map()(单股历史概率流式读取+mtime 缓存;尾部交易日 _sm701_live_predict() 实时复算)与 _sm701_live_predict()(_sm701_live_fill() 重构为写入包装,实时结果跨单股/组合共用缓存);strategy_signals_full 加 sm701 分支。③同步 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 重新生成;3.4/3.7/3.9 节与 README/CHANGELOG 同步 |
| v6.4.0 (2026-10-07) |
新增独立实验风险档 test(接入桌面 sm701 副本与模型数据):①TIER_CFG* 四口径新增 test(score="sm701"、Top10、reb=1 每日重排、无闸门、参考止损 2×20日波动、experimental=True);新增 tier_default_names(),默认研究/回测与 AI 自动选档仍只跑稳定三档,test 仅显式选择(偏好为 test 时 AI 回退稳健)。②sm701 只读桥接:sm701_paths()(默认 ~/桌面/sm701 (副本),SM701_DIR/SM701_DB/SM701_MODEL/SM701_PRED 可覆盖)、_sm701_conn()(SQLite mode=ro,不复制 7GB 扩展库)、_sm701_stock_info()(副本 stocks+stock_industry 补名称/行业/PE/换手率)、sm701_score_matrix()(历史流式读 lgbm_output/valid_predictions.csv.gz;新交易日按副本 lgbm_model.txt + _compute_feats 实时复算,已对拍 2026-09-29 误差 5.55e-17/相关 1.0;缓存 key 含库/模型/预测 mtime)。③GUI 每日荐股下拉、设置→荐股偏好、工具→test(sm701) 当前目标持仓提供手动入口,持仓页标注 sm701 数据源与日K日期;CLI --tiers --tier test。④口径冲突备案:sm701 标签为次日 open→close 截面 alpha(A股 T+1 不可当日卖出),与本引擎 T 收盘成交错位;实测 test(Top10 日调仓、全A、含费用、2024-01-02~2026-09-30)总收益 -96.0%/年化 -69.1%/回撤 -96.0%,同区间 sm701 自报样本外 Top10 年化净 +49.0%,两组数字不可互推,GUI 报告/荐股页与 README 已加显著提示。⑤APP_VERSION=6.4.0,stock_predict.py 由 build_cli.py 重新生成;3.7/3.10 节与 README/CHANGELOG 同步 |
| v6.3.3 (2026-10-06) |
信号胜率加「交易明细」子页 + 重选策略改「全部组合」窗口:①_bt_events 新增可选 detail_out(逐笔记 买入/卖出日期·价格·收益·原因:信号卖出/ATR止损/移动止盈/持仓中),_bt_segments(detail=True) 为全期/训练/验证附 detail(默认 False 口径/性能不变);工具→信号胜率新增「交易明细」子页 Treeview(按段筛选、点列头排序、盈亏着色),导出 txt 追加明细段、JSON 新增 trades_detail(full/train/val,full 不再带 _rows)。②run_ablation 返回新增 candidates;新增 load_full_ablation 流式读 strategy_ablation_per_stock.json(约600MB:行扫 code→偏移索引 + 按需 raw_decode,首次~4s、随后秒开);「重选策略」改开「全部策略组合」窗口——全部算法×风险档候选 + 14 种排列方式(推荐/算法/风险档分组、训练/验证综合评分/年化/胜率/Calmar/回撤/交易数),任选应用或窗口内本地重算,无研究覆盖自动回退本地消融;三档弹窗加「全部组合…」入口。③APP_VERSION=6.3.3,stock_predict.py 重新生成;3.6/3.8 节与 README/CHANGELOG 同步 |
| v6.3.2 (2026-10-05) |
设置窗口 PyCharm 式分区导航 + 指标参数可调:①设置由单页滚动改「左分区 Treeview + 右内容页」,分区=外观/预测参数/指标参数/荐股/AI 接口/关于,窗口随页自适应、底栏固定、滚轮递归绑定;作者信息移至关于页最下方。②CFG 新增 13 个指标参数(MACD 快/慢/信号 12/26/9、KDJ 9/3/3、RSI 6/12、BOLL 20/2.0、ADX 周期/平滑/阈值 14/14/20),ini [inds] 持久化(_load_ind_cfg/set_ind_param/IND_RANGES/IND_DEFAULTS,MACD 自动慢线>快线);calc_macd/kdj/rsi/boll/adx 缺省读 CFG,calc_adx 新增 smooth 分离 DX 平均与 Wilder 周期;分析/打分/消融/逐股回测/研究脚本共用,标签动态显示;默认值与旧硬编码逐元素一致(回归对照通过),历史结果不变、未重跑。③APP_VERSION=6.3.2,stock_predict.py 重新生成;3.13 节与 README/CHANGELOG 同步 |
| v6.3.1 (2026-10-05) |
稳健档收紧(IC 确认层 + Top10 + 换仓缓冲带)+ 买卖点稳健档更严格:①TIER_CFG*["稳健"] 四口径由 blend Top20 改 Top10 + hold_buffer=10 + ic_filter=True;tier_eval/tier_picks_stats/tier_latest_picks 支持档位级 ic_filter(全局 ic_filter=True 仍强制全档),tier_sim_phase 新增 hold_buffer(在位股排名 top+buf 内保留);②tier_sim_phase 修正「实际买入加入 target」——原实现下整手/涨停跳过后买入的标的次日被旧目标误卖(该修正令均衡/激进旧数字小幅变化,全A 均衡 +56.2→+61.6%);③CFG.RISK_PARAMS["稳健"] buy_th 2→3、cooldown 5→8(与保守档同入场门槛、止盈更宽,n=300 实测买点信号 -28%、中位年化基本不变);④全量重跑:标准回测 full/val/bull 四口径(全A 稳健全期 +73.5%/-19.5%/4180 笔,原 +30.2%/-8.6%/9708 笔;val +50.5%、bull +87.9%;主板 +49.7%/-22.5%、ETF +9.5%、全A含ETF +69.6%)、picks10 full/val/bull(10 万口径稳健 +65.6%/-19.7%、val +43.5%、bull +78.7%)、dashboard.html 重建;配对实验备案:IC+Top10 无缓冲 +83.0%/4480 笔(1M),缓冲带10 = +73.5%/4180 笔;Top20 加缓冲仅 -3% 交易(前 20 名换手极快);换手上限方案降换手 -35%~-50% 但全A val 受损未采用;⑤APP_VERSION=6.3.1,stock_predict.py 由 build_cli.py 重新生成;3.6/3.7 节、README/CHANGELOG 同步 |
| v6.3.0 (2026-10-04) |
异动·全市场相似历史(可回测)+ 分析页行业/换手率显示:①新增 3.15 节——analog_scan 检测近 20 日「单日/5日累计超自身历史 99.5 分位(底线 5%/10%)」的异动(精确逐日因果分位,无前视);_analog_events 全A(剔 ETF)因果异动事件表(_analog_flag_panel 每 20 日重算、跨股向量化,约 8.6 万例,构建 ~24s,进程内缓存 + 锁),按 K线形态/事件后路径/量比/换手率(et_shares)/RSI14/波动率/r5 加权距离取 Top50,统计「事件后第 k 日」未来 1/3/5 日与封板率;激进/均衡档方向明确(≥55% 且均收正 / ≤45% 且均收负)时覆盖近端买卖点并改 band_algo,激进档封板率≥30% 附打板价,样本分歧维持原策略;设置页可关(ini [predict] analog_override)。②参与回测:_sig_analog 因果生成历史信号(状态窗口步长 2 日、仅方向变化),并入图表/单股 bt_stats,并进消融候选池(GUI + 研究 gens、strategy_signals_full、逐股导出、三档选型),候选池 12 算法 × 3 档 + 多维评分 = 39;研究消融 --limit 40 冒烟通过。③报告标题 名称(代码)[行业] + 现价后换手率,顶栏/侧栏同步;_fetch_quote_tencent 解析 f38/f39/f46。④tier_load_panel 改游标流式 + SQL 前缀过滤(全库 800 万行不再 fetchall),输出逐元素一致、单进程峰值 3.6GB→505MB(消融多 worker OOM 回归修复)。⑤全量产物重跑:消融 7236 对象/7183 有效 5123s(analog 入选 保守 98/稳健 132=1.84%/激进 91=1.27%;候选 IC1 中位 +0.058、IC5 +0.041)、三档选型刷新 GUI 缓存与 ablation_gui_cache.json、逐股导出 6901 只(analog 321 行/156 只)、标准回测 full/val/bull 三段(数字与昨日一致)、dashboard.html 重建且消融表加「异动相似入选」列。⑥APP_VERSION=6.3.0,stock_predict.py 重新生成;CHANGELOG/README 同步 |
| v6.2.4 (2026-10-03) |
换手率/动态PE/PB 入库 + 生产端亏损过滤 + IC 中位卡片:①stocks 表加 turnover/pe/pb(启动迁移),东财 clist 扩字段 f8/f9/f23,新增腾讯行情备用通道 refresh_valuation_tx(60只/批,7285 只实测全部入库),代码表刷新尾部自动 only_missing 补缺;②tier_latest_picks 默认剔除动态 PE≤0(picks_exclude_loss,ini [picks] exclude_loss=0 可关;缺失不过滤),picks 增 pe/turnover,实测剔除 1765 只亏损股;不参与历史回测(无时点估值数据);基本面工具加估值快照行;③仪表盘每只股回测页新增「IC 中位(T+1/T+5)」卡片(与收益中位分开);APP_VERSION=6.2.4,stock_predict.py 重新生成;README/CHANGELOG 同步 |
| v6.2.3 (2026-10-03) |
档位重定名(四档 → 三档,全库去除「高风险」名)+ 三工具性能优化:①组合档 TIER_CFG* 四键改三键——原「稳健」(blend_mom 0.6)策略淘汰;原「均衡」→ 稳健(blend 等权/10 日)、原「激进」→ 均衡(全A β / 其余 blend_mom0.7)、原「高风险」→ 激进(rotate + 轮动闸门 + 打板,策略逐字段未改);TIER_BENCH/GUI 每日荐股 MODES/设置偏好/AI 引导与选档提示/弹窗/导出下拉/菜单标签全部三档化;CFG.RISK_PARAMS 删第四组「高风险」(6.0,1.15,0.80,1,2),买卖点/消融/逐股回测改三档(保守/稳健/激进),消融候选 12 算法 × 3 档 = 39;_ablation_weights/_pick_one_from_pool/推荐档/高波动回退同步;研究脚本与仪表盘档位列表三档化,旧四档批次归档 research/legacy_batches/;全量产物重跑(消融 7183 只/1404s、tier_picks+GUI 缓存 7183 只、逐股导出 3 档 20703 行/223s、标准回测 full/val/bull 三档批次、10 万组合三档);②三工具性能——stock_backtest_export.py 删双跑+信号缓存(2.4 倍,400 行对拍零差异)、回填每股请求 5→3(_BF_RAW_HINT,约省 100 分钟)、data_clean.scan 游标流式(stats/问题清单与旧实现逐字节一致)、backtest_v61.py 并行粒度升为口径×档位(默认拉满 CPU);APP_VERSION=6.2.3,stock_predict.py 重新生成;CHANGELOG/README 同步 |
| v6.2.2 (2026-10-03) |
GUI 打通研究消融(四档批量缓存 + 弹窗优先读研究结果):tier_picks_from_ablation.py 新增写 research/ablation_gui_cache.json(四档全量,与 run_ablation 返回同构:mode_candidates/recommend/bars/train_n/val_n/vol_ann,train/val 精简 ann/mdd/winrate/trades/pf;7184 只 14.5MB);stock_gui.py 新增 load_research_ablation(mtime 自动重载、5 日 TTL、缺失回退),_ensure_strategy 无策略缓存时优先读它弹窗免本地重算(读不到才本地消融 3~5 分钟/只),「策略消融」手动重选同样秒开研究四档;APP_VERSION=6.2.2,stock_predict.py 重新生成;ARCHITECTURE 4.1 与 README 同步 |
| v6.2.1 (2026-10-03) |
基本面信息工具 + 仪表盘 IC 中位数/指标表格 + 消融重跑(量比/LGBM 入研究池):①工具窗新增「基本面」页签——fetch_f10_metrics(东财 datacenter F10 主要指标 RPT_F10_FINANCE_MAINFINADATA,12 期报告期倒序,双 host 容灾 + em_f10 熔断 + 6h 缓存)+ fundamentals_summary 本地规则分析(成长/增收不增利/扣非背离/ROE 分级/现金流覆盖/负债率、评分制结论),GUI 表格 + 分析文本 + 小屏菜单入口;②v61_dashboard.py 组合净值曲线下方新增组合指标表与消融汇总表(collect_ablation 读最新 ablation_v*/summary.json,含 IC1/IC5 中位数、IC5 为正占比、训练/验证年化中位、牛熊中位);③backtest_strategy_ablation.py 研究池 gens 补齐 v6.1.10 只加了 GUI 的 量比/LGBM(9→12 信号),每候选新增描述性 ic1/ic5(不参与选型),summary 聚合 IC 中位数;安装 lightgbm 4.7.0 + scikit-learn 1.9.1(此前 sklearn 缺失致 LGBM fit 静默失败、lgbm 候选恒空);全量消融重跑(7236 对象、有效 7184、1382s):稳健档 lgbm 入选 784 只(10.9%)、IC1 中位 +0.018 / IC5 中位 +0.081(75.3% 为正),tier_picks.json 与 GUI 策略缓存刷新、dashboard 重建;④APP_VERSION=6.2.1,stock_predict.py 由 build_cli.py 重新生成。2.1/3.13/4.1 节与 README/CHANGELOG 同步。热修①:v61_dashboard 模板 JS 注释内 v*/ 提前闭合块注释致整页语法错误(批次/图表全空,node –check 把关);_style_ttk 补 Treeview/Heading 深色样式(修复基本面表格白底白字不可读) |
| v6.2.0 (2026-10-03) |
荐股确认层 + 10 万元荐股组合回测:①荐股逻辑改造——新增 tier_ic_confirm(个股历史信号 IC 确认层:滚动 120 日窗「近5日收益→未来5日收益」Pearson IC,cumsum 向量化 + 行分块控内存,缓存 _TIER_CACHE["ic"];确认 = IC>0 且 t≥2 且样本对≥60 且 T-1 日 MA20/60 多头趋势在场——IC 与指标综合考量、自然数阈值防过拟合,当期覆盖约 100/6317 只);tier_sim_phase 增 ic_ok 参数(调仓候选先过确认再按评分取 TopN,不足宁缺毋滥)、tier_eval 增 ic_filter/capital、tier_latest_picks 增 ic_filter/top_n(picks 输出 ic 字段);GUI 每日荐股四档模式改走 IC 确认 + Top10(资金按 top 均分,10 万=10 只×约1万,组合口径而非每只 10 万);②新回测项目 backtests/backtest_picks10.py——10 万元组合总资金荐股回测(Top10、每档各自调仓节奏 稳健20/均衡10/激进10 日、相位平均、全部费用约束);本金规模影响结果(整手粒度+高价股预算约束,与 100 万口径不可直接互比);全期三档:稳健 +7.1%/均衡 +69.1%(超额+49pp)/激进 +33.9%,样本外 均衡 +48.2%(Sharpe 2.96)/激进 +28.1%/稳健 +9.1%,强势段 均衡 +81.1%/激进 +44.9%/稳健 +32.9%;IC 层贡献对照(同本金同 Top10 无 IC):均衡 +18.8%→+69.1%、激进 +4.0%→+33.9%、稳健 full +14.6%→+7.1%(回撤变差但 val/bull 更优);③APP_VERSION=6.2.0,stock_predict.py 由 build_cli.py 重新生成。3.7/4.1 节与 README/CHANGELOG 同步 |
| v6.1.11 (2026-10-03) |
稳健档偏动量重做(四口径 blend 等权 → blend_mom 0.6/0.4):等权低波会系统性挤出医药/科技等高波动成长股(低波分位差恒定,动量再强也进不了 Top20,当期 Top20 长期被青岛港/煤炭/银行/电力类霸占);四口径 TIER_CFG*["稳健"] 改 score="blend_mom", mom_w=0.6(top/reb/闸门不变)。回测依据(全A/主板/ETF/全A含ETF,相位平均含费用):全期 +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%);动量短名单(Top50/80/120 内低波精选,全期 -51%~-17.7%)与 60 日动量口径(全期 +10.4%、样本外为负)经回测证伪——A 股 20 日动量 Top 全为妖股/ST,低波项是崩盘过滤器,故仅做权重平移不做结构改动;tier_make_score docstring 与 GUI 荐股文案、backtests/backtest_tiers.py 注释同步,blend 评分保留(均衡档/研究对照用)。APP_VERSION=6.1.11,stock_predict.py 由 build_cli.py 重新生成;README 全期/分段表稳健行与策略原理同步(research/v61_report* 批次未重跑)。3.7 节与 README/CHANGELOG 同步 |
| v6.1.10 (2026-10-02) |
消融增「量比 / LGBM」 + BOLL 独立打勾 + 指标线颜色 / 粗细自定义:①ALGO_LABEL 加 vol_ratio="量比放量" 与 lgbm="LGBM预测"(新增 _sig_vol_ratio 复用 vol_ratio_at 阈值 ±1.5/0.5;新增 _sig_lgbm 用 LGBMRegressor 因果滚动训练,每 50 根用「当日及以前」8 维特征 ret5/10/20+rsi6+boll_pct+macd_diff+kdj_diff+vr 重训一次预测次日收益,±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 复选框,不再占用副图),三轨分别 boll_on[up/mid/low];副图 combobox 移除 BOLL,新增「量比」__draw_vol_ratio(近5/前15 量比折线 + 0.8/1.0/1.2 三道阈值 + vol_regime 标题尾标),analyze.res["ind"] 加 vr_arr 并切片入 view,十字光标 hover 加「量比:X.XX」;废弃的 _draw_bollpct 删除;③设置页新增「指标线:颜色 / 粗细(自定义)」——线粗度 Spinbox 1~3(默认 1,比旧版 width=2 细一档)+ 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(),旧固定 width=2 的支撑/压力线、5日均量线、ADX 线统一收窄;APP_VERSION=6.1.10,stock_predict.py 由 build_cli.py 重新生成,本轮按用户要求不重跑回测(沿用 v6.1.9 批次)。3.8/3.13 节与 README/CHANGELOG 同步 |
| v6.1.9 (2026-10-01) |
高风险档重做为「新开发的高风险策略」(板块轮动 + 大盘降权 + 高风险偏好):①组合层四口径 TIER_CFG*["高风险"] 改为 rotate 评分(0.5·rank(sector_ret20)+0.5·[0.7·rank(ret20)+0.3·(1−rank(vol20))])+ 板块轮动闸门(tier_make_rotation_gate:0.6·行业广度+0.4·上证MA20 ≥ 0.35,大盘权重由 100% 降至 40%,全期开闸 1010/1636=62% > 旧闸门 777/857)+ Top5/10 日 + 打板;新增 tier_sector_features(行业等权 ret20、行业广度,缓存 _TIER_CACHE["sec"])、tier_build_gate 分派、cfg.gate_mode="rotation";②CFG.RISK_PARAMS["高风险"] = (6.0, 1.15, 0.80, 1, 2)——宽止损/慢止盈/快再入场,删除 500 日 MDD 止损机制(_mdd_stop_dist 及 dd_window 分支)与旧档位实现;③旧档位名统一重命名为「高风险」(GUI/CLI/AI 文案/回测脚本/仪表盘/文档),删除废弃的旧选型扫描脚本与留档产物,stock_predict.py 由 build_cli.py 重新生成,APP_VERSION=6.1.9;④全期/样本外/强势段/逐年/逐股回测重跑。3.6/3.7/3.8/4.1/4.4 节与 README/CHANGELOG 同步 |
| v6.1.8 热修① (2026-09-30) |
键盘精灵默认清空搜索栏 + 设置界面适配 dock/任务栏:①同花顺式键盘精灵——按下可打印字符自动聚焦搜索框时,新一次搜索先清空搜索栏再从该字符开始(搜索框自身有焦点时同样生效,如启动预填/上次分析残留的 002241,此前会被拼成 0022416);同一次会话内连续输入正常追加,Backspace/粘贴等手动编辑视为会话内继续;回车与小键盘回车(<Return>/<KP_Enter>)均可选中候选或开始分析;Esc/焦点离开/开始分析(run())结束会话,下次输入重新清空。实现:新增 _wiz_active 会话标记与 _search_end()(关下拉+会话复位),_global_key 不再对搜索框自身直接跳过,_search_key 在文本非空时维持会话并排除 KP_Enter,同时过滤不可打印键(顺带修复非输入控件下 Backspace 会把 \x08 写进搜索框的隐患);②设置界面布局——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 顶部新增 ㊺条 |
| v6.1.8 (2026-09-28/29/30) |
高风险 档改激进破甲版(配置复制激进 + 打板 + 按历史最大回撤止损)+ P0/P1 性能口径 + P0 二轮修复:①组合层四口径 TIER_CFG*["高风险"] = dict(TIER_CFG*["激进"], allow_limit_up=True)(该实现于 v6.1.9 重做并删除);②CFG.RISK_PARAMS["高风险"] 入场同激进(买点门槛1/冷却3),止损改入场前 500 日个股历史最大回撤(新增 _mdd_stop_dist,限幅 8%~50%;未盈利=入场价−MDD、盈利后=峰值−MDD;历史不足 60 根回退 ATR4.0/回落12%),_bt_events/_bt_simulate 双引擎支持,生产端 tier_latest_picks 的 高风险 参考止损同步为 MDD 口径;③_ablation_weights/_pick_one_from_pool 的 高风险 目标改与激进一致(偏年化+Calmar);GUI/AI 文案(RISK_AI_GUIDE、ai_choose_tier、设置页/消融弹窗/菜单版本号)同步「激进破甲」并升 APP_VERSION=6.1.8;④P0:_bt_simulate 年化口径与 _bt_events 对齐(区间起点、下限 0.25 年);⑤P1:三大回测脚本并行 + 跨档指标复用——backtest_v61.py 4 口径多进程并行(父进程预热面板+特征后 fork 继承,全期 127.9s→74s)+ stock_backtest_export.py 逐股 map+chunksize=20 + 默认 workers 4→8 + 4 档共用 ATR(14) + composite 4 档共用 _composite_precompute(260s→204s)+ backtest_strategy_ablation.py map+chunksize + 默认 workers 8→16(509s→373s);⑥P0 二轮修复(2026-09-30):高风险 档强制 RISK_PARAMS["高风险"](v6.1.7 高风险 改激进破甲版起 高风险 档实际可能跑激进 ATR 止损、500 日 MDD 形同虚设,perstock 高风险 与激进数字完全相等)+ 生产端 高风险 MDD 改用 d+2 与回测引擎口径对齐 + 过拟合相关 docstring 修复。组合引擎无止损,组合层数字与 v6.1.7 高风险 改激进破甲版完全一致(浮点 <0.01pp);perstock 高风险 修复后总收益中位 +63.22%→+37.24%(-25.98pp),胜率 50%→56%(+6pp),盈亏比 2.21→1.48(-0.73),验证段 -1.87%→-2.62%,其他档不受影响。3.6/3.7/3.8/4.1/4.4 节与 README/CHANGELOG 同步 |
| v6.1.7 热修④ (2026-09-28) |
仪表盘导出完整回测数据 + 全量回测命令:顶部「导出全量数据(JSON) / 导出指标CSV / 导出曲线CSV / 全量回测命令」;每只股页「导出当前筛选CSV」(尊重筛选排序)、单股页「导出本记录JSON」(含曲线与 T+1/T+5);文件页命令块(全期+val+bull+yearly+逐股);浏览器端 Blob 下载,gjs 运行级验证。4.1/4.2 节与 README/CHANGELOG 同步 |
| v6.1.7 热修② (2026-09-28) |
AI 提示词按风险偏好 + 风险偏好入口补 高风险:RISK_AI_GUIDE/ai_system_prompt()(保守<稳健<激进<高风险;激进/高风险 禁用「等企稳/观望」搪塞,高风险 允许打板与集中仓位),系统提示词与首轮上下文均注入且随风险偏好变化使 hash 变化(自动重问、不复用旧答案),ai_choose_tier 用基础提示词;逐股导出 tiers 加 高风险(4 工作表)、单档模式修正为固定该档参数并支持 高风险,tier_picks_from_ablation 四档选型/推荐、GUI 导出下拉「四档(分表)+高风险」、激进档多交易兜底扩至 高风险。3.9/3.6/4.1 节与 README/CHANGELOG 同步 |
| v6.1.7 热修① (2026-09-28) |
买卖点风险偏好新增 高风险 档(高赔率·低频):CFG.RISK_PARAMS["高风险"] = (atr3.5 / 触发+5% / 回落10% / buy_th2 / cd8)——宽止损 + 慢止盈、比稳健更少交易;_ablation_weights 增 高风险 目标(PF 0.45 / Calmar 0.25 / 年化 0.20 / 胜率 0.10,偏赔率),_pick_one_from_pool 按档映射目标,run_ablation 输出四档 mode_candidates + 日志 + 推荐,弹窗 order 与高波动回退加入 高风险,设置页风险偏好下拉自动含 高风险;参数由 300 只 × 400 根同源对照选出(赔率中位 1.73 / 年化 +2.0% / 均笔 11.7,对照稳健 1.69/-1.0%/14.1 笔)。3.6/3.8 节与 README/CHANGELOG 同步 |
| v6.1.7 (2026-09-27) |
新增第四档 高风险(高赔率·低频·允许打板,四口径):TIER_CFG/_MAIN/_ETF/_ALLETF 各加 高风险,统一 blend_mom/Top5/20 日调仓/MA60 闸门(全A/主板/全A含ETF=科创50门,ETF=创业板指门),主基准科创50、allow_limit_up=True 解除「涨停不买」(回测 1.3%~1.9% 买在涨停价);tier_sim_phase 辨识 cfg.allow_limit_up,tier_build_features 增 beta60_star(对科创50 β)、tier_make_score 增 mom/beta_star(扫描后证伪/弃用);ai_market_brief 增科创50 与四档闸门、ai_choose_tier/GUI 荐股 MODES/设置偏好加 高风险;生产端 tier_latest_picks 输出 limit_up 标记并在报告/列表提示打板口径;新增初版高风险档选型扫描脚本(100+ 组合扫描 + 闸门/邻域复核;已随 v6.1.9 档位重做删除);APP_VERSION=6.1.7,全期/样本外/强势段四口径重跑(research/backtest_v6.1.7_*),v61_charts/v61_dashboard 档位列表加 高风险。3.7/4.1/4.2 节与 README/CHANGELOG 同步 |
| v6.1.6 ⑤ (2026-09-27) |
每只股回测事件股检测 + 仪表盘默认剔除:sz000578 全期 +2564% 核查为 2007-07-20→2008-03-11 借壳复牌(复权 +603%,不复权约 4.8→30.2)的停牌穿越收益;stock_backtest_export.py 加「事件」列(单日复权|涨跌|>44% 或相邻K线间隔>90天,run_meta.event_codes=180/6897),v61_dashboard.py 每只股页加「排除事件股」勾选(默认开)并从卡片/表格统计剔除;新批次 perstock_backtest_v6.1.6_20260927_220255(8 进程 329s)。4.1 节更新 |
| v6.1.6 ④ (2026-09-27) |
标准回测批次补齐 + README 同步:backtest_v61.py 全期四口径重跑生成 research/backtest_v6.1.6_20260927_213721_full/(125s,adj=mul_qfq_sina),仪表盘「回测批次」默认与 v61_report.* 最新副本切到 v6.1.6;all/main 与 v6.1.5 全期批次逐项一致,etf/all_etf 因 20:40-20:42 GUI 预取修订部分 ETF/LOF 复权数据而小幅漂移(ETF 激进 +28.8%→+28.2%);README 第四节 ETF/全A含ETF 单元格与版本化目录同步。4.1/4.2 节流程不变 |
| v6.1.6 ③ (2026-09-27) |
每只股回测导出改多进程 + 自动刷新仪表盘:backtests/stock_backtest_export.py 回测主体是纯 Python 逐根循环(GIL 串行),原 ThreadPoolExecutor 下 GUI「并发」开再大也只用约 1 核;改 ProcessPoolExecutor,--workers=并行进程数(默认 4),任务按股票拆分(每只只读库、无共享状态),mode/bars/db 经 initializer 注入(兼容 forkserver/fork/spawn),进度改 as_completed;60 只三档实测 5s→2s,workers=1/4 产物逐行一致;跑完自动刷新 dashboard.html「每只股回测」页(同 backtest_v61 刷新链,失败不影响产物;页内选择器标注「导出批次」,与「回测批次」区分);GUI/CLI 算法链未动。4.1/4.2 节更新 |
| v6.1.6 ② (2026-09-27) |
仪表盘默认批次 + 面板/消融口径统一:dashboard.html 默认改选最新「全期+新复权口径」批次(原默认最新 ts=分段 val/bull,与 README 不一致),2026-09-27 切换前的批次/gui_backtests/perstock 导出打 legacy 标并标注作废;产物新增 adj="mul_qfq_sina" 口径标记(backtest_v61/bt_common/GUI 导出 JSON)。抽出 _bt_segments(_bt_events 同引擎,val=max(200,n/4))供「信号胜率」面板与每只股导出共用,_bt_events 补 closed/floating/avg/盈亏比/逐笔字段(向后兼容),弹窗/面板/导出逐项一致(sz002241 验证集由 10 笔/-7.0% 对齐为 9 笔/-6.95%)。旧口径产物已重跑:消融 ablation_v6.1.6_* + 选型(7179 条策略缓存)+ perstock_backtest_v6.1.6_*。3.6/4.1/4.2 节更新 |
| v6.1.6 ① (2026-09-27) |
荐股新增 18 策略共振综合:GUI 荐股下拉「综合(旧评分)」→「综合(18策略)」,移植 chaodi 通达信口径 18 策略引擎进 stock_gui.py(自包含、CLI 同步):全市场单次扫描(500 根、乘法前复权、真实换手、逐策略基础过滤、权限/股票池)→ 各策略候选池 min-max 打分 → 综合分=命中策略数×100+均分;500 只×18 策略与源引擎对拍一致;旧 daily_picks 保留供 backtest_picks.py 历史回测;APP_VERSION=6.1.6。3.14 节新增 |
| v6.1.5 热修⑬ (2026-09-27,版本收尾) |
筹码峰柱改细横条:柱高由 ≈1.15×桶距、上限 8px(连片实心楔形,视觉过粗)改为 0.5×桶距、上限 3.5px(同花顺式细条+间隙),峰形更清晰;支/压标签预留宽度保持不变。3.5 节更新;版本收尾 tag v6.1.5 |
| v6.1.5 热修⑫ (2026-09-27) |
筹码峰标签遮峰修复 + 文档规范化 + 新口径回测重跑:①K线图「支/压」标签(黑底框)原右对齐到价格条左侧,会压住筹码峰最厚带/峰尖——现筹码柱先为标签预留宽度(lab_reserve,标签区与柱体完全错开,仍是最后绘制不被柱体盖住);②README 重构为用户向(功能/快速开始/回测摘要/数据/局限 + 文档索引),历史变更流水迁入新增 CHANGELOG.md(AGENTS.md 约定同步改为写 CHANGELOG);③数据层切换新浪因子乘法口径后全量重跑标准回测(全期 118s / 样本外 / 强势段,四口径×三档),README「回测报告」同步新数字,旧 hfq 仿射口径数字全部作废。3.5/4.2 节更新 |
| v6.1.5 热修⑪ (2026-09-27) |
清洗程序防截断 + 降误报 + 截断修复 + 复权口径全链切换:data_clean.py 迁移深度改 max(库内根数, --depth=2400) 按需翻页(旧版固定 2 页 ≤1600 根,热修⑩ force 修复把约 370 只长历史股截断、全库少 28.2 万根),新增 keep_head/keep_tail 防缩水守卫(--allow-shrink 才可覆盖);扫描判定与 stock_gui._bars_anomalous 完全同规则(新股前10根/停牌复牌/现名回溯ST/ETF折算/指数豁免),越界 779→59 只、low_price 40→0、停牌 1316→41,新增孤立代码与北交所停更统计,扫描 238s→40s;新增 --repair(GUI 数据工具「截断修复」)重拉浅历史;新增 --check-adj「复权失真体检」检出腾讯 hfq 为分段仿射(浦发 0.63/茅台 0.82/申华 1.75),随后全链切换为「腾讯不复权 × 新浪累计复权因子」真乘法后复权(stock_gui._fetch_tencent_mul/_bf_fetch_one、backfill_full.py、sync_adjust.py、data_clean._hfq_mul;ETF/LOF 退 qfq,指数用不复权),全库 --all-adj --force 重迁完成 7103/7105(2 只防缩水保留),完工 --check-adj 300 只失真 0、全库扫描结构异常 0/越界 10 只;旧口径回测/因子/策略缓存需重跑。2.5 节与 reports/数据异常报告_20260927.md 更新 |
| v6.1.5 (2026-09-26) |
版本 6.1.5 + 回测产物版本化 + 全样本重跑 + 本地网页仪表盘:新增 APP_VERSION=6.1.5(关于页/AI UA/回测目录共用);backtest_v61.py 每次运行自动建 research/backtest_v<版本>_<时间戳>_<区间>/(report/run_meta/tables CSV 含 equity_curves.csv/charts SVG),并在 research 根保留最新副本;tier_eval 新增相位平均净值曲线;新增 v61_dashboard.py → 自包含 research/dashboard.html(研究收益曲线/指标对比/箱线 + GUI 单股回测,file:// 直开);GUI 导出新增 JSON 并留档 research/gui_backtests/;全样本四口径重跑(数据截至 2026-09-24,109s,10 图/6 表)。4.1/4.2/4.4 节更新 |
| v6.1.5 热修① (2026-09-26) |
工具→信号胜率面板显示修复:_draw_curve 重绘前 cv.configure(bg=BG) 跟随主题(修复切主题后画布保持旧底色、验证区变”白块”/黑底的问题),验证集底纹改 AXIS_TXT+stipple="gray12"(三种主题通用);run_bt 结束 yview_moveto(0) 结果文本回顶,直接展示全期/训练/验证三段。3.6 节更新 |
| v6.1.5 热修② (2026-09-26) |
消融选型加”近端子窗一致性”:_ablation_ranks 抽出打分(train/recent 两窗口),_ablation_recent 取最近 250 根回测,pick_ablation_consistent 要求全窗前 25%(下限3)∩近窗前 25%(下限2),交集内取全窗最优;交集为空回退该档「多维评分」(防旧 regime 选型在风格切换后沉默,实测 688012 由 RSI·稳健回退为多维评分);run_ablation 输出 pick_notes + 日志;全库研究脚本 backtest_strategy_ablation.py 同步;策略缓存 5 日不变。2.7/3.8 节更新 |
| v6.1.5 热修③ (2026-09-26) |
UI 优化(三主题统一,参照主流桌面软件):主题新增 BORDER/HOVER_BG/SEL_BG/ACCENT/LOG_BG;_style_ttk 全量升级(按钮/输入/下拉/滚动条/标签页/分隔线/复选单选 的内边距·边框·hover/focus 色,主按钮 Tool.TButton);主界面日志/自选池/侧栏/状态栏去硬编码色,列表选中与 Text 内边距统一;_center_win 统一弹窗居中;工具窗画布加主题边框;dashboard.html 增明/暗切换(CSS 变量+localStorage,Canvas 随主题重绘)。3.13 节新增 |
| v6.1.5 热修⑥ (2026-09-26) |
折叠白带 + 分辨率自动折叠 + 数据工具GUI + 过拟合自检 + 每只股回测Excel:①折叠副图时两行 grid_rowconfigure(weight=0)(只 grid_remove 会留浅灰空带),body/left 补底色;主图预估<380px 默认折叠、缩窗<320px 自动折叠(手动后不干预);②工具窗新增「数据工具」页:清洗/复权迁移 + 回填 参数表单(并发/目标根数/过期天数/单次根数/节流/limit/force)后台子进程 + 实时日志 + 停止,backfill_full.py 补 --min-bars/--fresh-days/--bar-count;③过拟合自检发现验证段参与消融近端门槛(_ablation_recent 原取截至最新250根=验证段),改为训练段末尾(split 前),GUI+研究脚本同步,报告 reports/GUI过拟合自检.md;④backtests/stock_backtest_export.py 每只股回测导出 xlsx(内置最小 xlsx 写入,无 openpyxl 依赖)+ CSV,GUI 同入口,并新增 dashboard.html「每只股回测」页(自动收录 reports CSV:搜索/档位/正收益筛选、列排序、分页、卡片统计、下载链接);⑤修复后重跑全库消融(7235 对象 371s)+ 新增 backtests/tier_picks_from_ablation.py(三档选型 research/perstock_tier_picks.json 7178 只 + 刷新 GUI 策略缓存,推荐档 保守2846/稳健3863/激进469);导出默认 tiers 三档分表(xlsx 三工作表 + 合并 CSV 带档位列),仪表盘三档默认筛稳健;⑥标准组合回测重跑 research/backtest_v6.1.5_20260926_202114_full/(122s,四口径与 16:30 批次逐项一致——组合引擎不依赖逐股消融选型),仪表盘第 5 批次;⑦回测程序统一规范 backtests/bt_common.py:版本化运行目录 + run_meta.json + 根目录最新副本(硬链接),套用消融(ablation_v*)/每只股导出(perstock_backtest_v*)/三档选型(写入源消融目录),历史产物已归档三目录,仪表盘识别新路径并显示运行元数据;⑧热修⑦:筹码桶 120→360(右侧不再稀疏);预测样本窗口去重间隔 W//2→W(不再重叠);修复遗留行 W_WINDOW, TOPK = 10, 10 覆盖 ini(界面 W=20 实际跑 10、保存只当次生效)→ 与 CFG 同步;漏斗一致性(候选≥最终自动抬高);_pool_match 调用时读全局 TOPK;因 W 变更按新口径重跑消融/选型/三档导出;⑨设置页 grid 重叠修复(按钮行 row20→30,新增单元占用自检);⑩reports/代码审查.md 处理:本仓可修项——pi_stock_web 补限流//api 失败改 400、死常数 MAX_DAILY_CHANGE 删除(涨跌停统一板块口径)、build_cli.py 锚点存在性检查、设置页免责声明确认在位(ai-quant 条目随拆仓转独立仓库);⑪过拟合二轮复检(reports/GUI过拟合自检.md 第二~八节):样本窗口重叠属伪重复(已修)、W 口径修正后重跑结论稳健(验证段中位 -0.7~-0.8%/正 46%);⑫热修⑧ 筹码峰同花顺式:右列按画布 17% 加宽(上限 30%)+ 最右 36px 价格条(光标价格标签固定于此、横线延伸过筹码列),筹码柱改实心矩形(柱高≈桶距连成楔形),BOLL 图例移绘图区右缘,紧凑屏保持窄列;参数 CFG.CHIP_W_RATIO/CHIP_AXIS_STRIP;⑬筹码算法对齐同花顺:换手率改真实换手(量×100/总股本,mktcap/现价推得),新增 CFG.CHIP_DECAY_SCALE=0.5(002241 实测现价上方筹码 32%→45%、均本 24.46、获利 55%,与同花顺剖面一致),绘制改基线在左/柱向右,桶数参数化 CHIP_NBIN;信号引擎不变、既有回测口径不变;⑭热修⑨:支/压虚线移到 K线/信号之后绘制(不再被筹码峰盖住)+ 标签加底色框;设置页按钮栏 pack(side=bottom) 固定窗口底部(不再需要滚到底)+ 滚轮递归绑定全部子控件(Tk 滚轮不冒泡问题);⑮热修⑩ 二轮审查 P0 处理:backfill_full 主源 qfq→hfq + 重叠日口径校验(偏差>1% 拒写)+ 写后 _sync_adjust;daily_picks 仙股过滤改显示价 hfq×k;_TIER_MIN_* 门槛加「今天为锚」口径备案;factor_lab.list_codes 不再要求行业非空(退市股纳入,229/232 实测)+ L2/L3 排除未知分组 + 全量重跑 research/factor_lab/full2000_nosurv/。2.2/3.7 节与 reports/代码审查.md 第 6 节更新 |
| v6.1.5 热修⑤ (2026-09-26) |
K线价格轴数字裁位修复 + 筹码峰修正 + 副图折叠:①HiDPI 下固定 L=58px 装不下 5 位刻度,首位数字被画出画布(40.28→0.28)——_text_px 实测 + _geom(lpad=) 动态让位,副图共用 _axis_lpad 保 x 对齐,支/压与光标价格标签收回画布内;②主图筹码柱原先按 bin 序号均匀排列,与价格轴上下颠倒且用可见 250 根窗口另算(图上 23.33/24.75 vs 右栏 23.69/27.33)——改按 ymap(价格) 绘制、统一全历史 res["chips"];calc_chips 支/压从「最密集局部峰」改「3bin 平滑最厚带」(修复 002241 压力 27.33 仅 0.7% 筹码的错峰);③工具条「折叠副图」(紧凑小屏默认折叠)+ _geom 改用实际高度,小屏纵向空间全给主图。3.5/3.13 节更新 |
| v6.1.5 热修④ (2026-09-26) |
工具→信号胜率回测窗口与消融对齐:run_bt 改用近 ABL_BARS=1000 根(与 run_ablation 同窗、同 75/25 切分),曲线/分段文本/导出日期随 bt["_rows"];修复全历史切分导致训练段落在策略数据起点之前(L2 行业ETF 2024 才有数据 → 训练集恒空、水平线,688012/002491 实测;歌尔”长横线”同因);主图 MA 图例改按 cv.bbox 字宽推进(HiDPI 不重叠)。3.6/2.9 节更新 |
| v6.1.4 热修⑩ (2026-09-26) |
单股回测面板升级 + 幽灵K线显隐:backtest_signals 扩展训练/验证分段、IC(T+1/T+5)、信号后收益、净值曲线(旧字段兼容);面板回测改用 strategy_signals_full 全历史信号(修复指标型策略信号全在验证段、训练集恒”信号不足”);收益曲线只画训练集净值(验证集仅指标文本),工具窗口放大到最高 1320×980;信号胜率页新增「导出回测」(.txt 完整明细+净值数据 / .csv 逐日净值+回撤);slice_view 翻看历史(pan>0)时整体隐藏 T+1/幽灵K线与”预测”分界线,回到最新自动恢复;_build_ghosts 独立并在增量加载时重算。3.6 节更新 |
| v6.1.4 热修⑨ (2026-09-26) |
缓存重复拉取修复 + 拉取诊断日志 + 数据源热修:last_completed_td 以库内指数日K为节假日锚(中秋休市后 stale_codes 6968→275,1.7G 缓存 0.01s 直读);指数改”收盘后才要今日”(_index_expected_td,周末重复拉取 1~2s→6ms);拉取成功末日不前进记 源无更新 负缓存(停牌股不再每小时重拉);新 ETF 空数据不再触发 K 线源自愈;新增 stock_fetch.log 逐条记录缓存判定/命中源/入库根数/耗时 + 每 200 次累计统计;_probe_kline_url 改测 hfq + 连测2次(web.ifzq 501 死域不再被自愈写入)、501 纳入熔断、源列表补 ifzq.gtimg.cn;单股消融三档同选备案(40 只抽样 18 同选)。2.1/2.2/2.3/2.5/3.8 节更新 |
| v6.1.4 热修⑧ (2026-09-25 夜) |
回测标准化 + 图表化版本对比:tier_eval 输出 phase_anns、tier_picks_stats 输出 rets;新增 backtests/v61_charts.py(纯标准库 SVG:相位/逐笔箱线 + 收益柱状);backtest_v61.py 自动出图 + --charts-only/--compare all/--label/--no-charts,报告带 label/db_stats;产物 research/charts/(gitignore);4.1/4.2 节更新 |
| v6.1.4 热修⑦ (2026-09-25 夜) |
2000 日全库回归 + 因子实验室结论:深拉 6806/7277(库内 1266 万根、≥2000 根 3774 只,指数 2400 根);_pull2000 四口径报告提升为第三节权威;全库面板(1431 只 × 2000 日)top 1 万组合全过 BH-FDR、WF OOS IC +0.032(9/10 折正),稳定因子 量能/板块/布林带;新增 progress.py 进度看板;版本号保持 v6.1.4 |
| v6.1.4 热修⑥ (2026-09-25) |
深挖修复 + 2000 日回填:_bf_tx_fetch 改解析 hfqday(存量 bug);回填目标 = max(950, 最大拉取样本量),2000 → 3 页/≈2400 根;后台「全市场拉取 → 四口径回测」产物另存 research/v61_report*_pull2000.*;2.5 节更新 |
| v6.1.4 热修⑤ (2026-09-25) |
ETF 宇宙恢复 + 图表可读性:refresh_etf_codes 新增新浪兜底(东财故障时);恢复 1796 只 ETF/LOF、1500 只有 K 线(主库 924 万根);四口径回测重跑再同步 README 第三节;图表指标线 2px + 主题化提亮(RSI/均线/MACD/KDJ/ADX/BOLL);2.4 节更新 |
| v6.1.4 热修④ (2026-09-25) |
异常校验误报修复 + 2000 日面板 + 回测重跑:_bars_anomalous 豁免新股首段/停牌复牌/退市整理/ST旧规,get_daily 短源不得清空长缓存;主库从 dist 快照补回 69 只 4.5 万根(816.6 万根);指数补齐科创50/深证成指/创业板指;backtest_v61 全期/样本外/强势段重跑同步 README 第三节;factor_lab EVAL_DAYS=2000;2.3 节更新 |
| v6.1.4 热修③ (2026-09-25) |
数据整理 + 拉取量设置:stock_cache_lab.db 快照库合并回主库(236 只补 19.3 万根;口径冲突保留主库)后删除;新增 [predict] max_fetch_bars(设置页「最大拉取样本量」,默认 1000)限制单只联网拉取根数、不影响读库;2.2 节更新 |
| v6.1.4 热修② (2026-09-25) |
时间与选型修正:快照时间语义(非今日快照标注日期 + stale_snap 锚改用快照收盘,修复锚错一天/缺口恒 0);_LAST_INDEX_SNAP_DATE 交易日锚避免节假日空拉当日K线;GUI 单股消融补 l2_ind(30 候选);推荐口径文案改训练集 Calmar + 高波动股推荐与提示统一;2.1/3.8 节更新 |
| 拆分 ai-quant (2026-09-25) |
ai-quant 移出本仓库,独立为 Languangxun/ai-quant(公开);主库只保留 --push 对接与 build_cli.py 同源部署;第六节改写。迁出前最后一版能力:/quant/ 看板(6 图 + 指标总表 + ★实盘同口径 + 休市顶栏)、config/holidays.json 休市日历与 sim.run 交易日闸门 |
| ai-quant 看板/日历 (2026-09-25) |
(已随仓库拆分)新增 scripts/gen_status.py:/quant/ 升级为股票模拟盘 + 回测看板(6 张内联 SVG)+ 指标总表;新增 config/holidays.json(2026 交易所休市),TradingCalendar 默认加载,sim.run 非交易日跳过(--force 强制) |
| v6.1.4 热修 (2026-09-25) |
数据源容灾:fetch_quote 改腾讯→新浪→东财多源、批量行情加新浪兜底;国内域名直连优先 / 代理被拒自动旁路 120s;RemoteDisconnected/连接重置纳入熔断;板块榜腾讯→akshare 兜底、板块上下文熔断期跳过;2.1 节重写 |
| v6.1.4 | AI 网关兼容(自有 UA + x-opencode-session);修复保存设置覆盖 ini(base_url/model/predict/picks/data 丢失);单股买卖点支持筹码峰/板块轮动 + 连续同向压缩 + 激进档信号密度兜底;后台主动预取未分析股K线;factor_lab 大样本支持(--db/--out-dir、筹码缺失中性填充、--stage all 补 panel) |
| v6.1.3 | 消融新增 L2(同行业+行业ETF) 对象;消融回测 numpy 加速(181s vs 251s,结果逐笔等值);README 补齐算法细则(2.5–2.8 节) |
| v6.1.2 | ETF 全量接入:东财代码表 1491 只 + 历史回填 1202 只;新增 etf/all_etf 口径(共四口径)与 tier_rank_base 排名隔离;消融覆盖所有对象(含 ETF,门槛 200 根)+ 覆盖率清单 |
| v6.1.1 | 激进档统一对标科创50 + 三基准对照;主板激进档重做(β 口径经四项过拟合诊断证伪 → blend_mom,全期 −24.2% → +29.2%,交易 ×5.5) |
| v6.1 | 标准回测(两口径 × 四类产品);AI 分析升级为 OpenAI 兼容(模型列表/果断提示词/更多数据/多轮缓存);设置内荐股权限 + AI 自动选档;消融多指标结合 + 筹码峰/板块轮动;键盘搜索自动补全;仓库整理 backtests/ |
| v6.0 | 三档组合策略(稳健/均衡/激进)生产化(GUI/CLI);全库复权口径迁移(不复权 → hfq)+ adjust.k 同日配对 + 收盘后当日K入库;修复 v5 激进双引擎前视 bug |
| v5.0 | 新三档(稳健/均衡/激进)+ 激进双引擎(核心+低价彩票)+ 小资金 ETF 方案 + 基准对标 + 插件账户联动 |
| v4.0.2 | 行业动量离散度择时、板块轮动门槛、T10only 变体、审计修正(组合模拟 highest 未逐日更新 bug) |
| v4.0.1 | 回测去佣金/印花税、hybrid 混合退出、退出消融、荐股优化、预测缓存签名化 |
| v4.0 | 自适应 ML 系统(Walk-Forward)+ 全A 回测框架 |
| v3.3 | 全市场 1000 交易日缓存 + 数据清洗 + 多算法消融选策略(训练/验证切分)+ 幽灵K线 + numpy 向量化 + 全A实证报告 |
| v3.2.x | 线程锁/连接管理/日志/前视偏差/熔断统一/自适应布局;网站信号交替修复;CLI 部署与 SSH 推送链路 |
免责声明:本系统所有输出仅为历史数据的统计推断与研究用途,不构成任何投资建议。