← 返回文档中心 · 来源:Languangxun/stock-analyzer · 同步于 2026-10-25

A 股短线统计研究工具:历史形态相似度匹配 + 多维融合 + 三档组合策略 + 全量回测。 本地桌面 GUI 与命令行两种用法,计算全部在本地完成,AI 分析为可选增强。

免责声明:所有输出仅为历史数据的统计推断与研究用途,不构成任何投资建议。 股市有风险,入市需谨慎。

功能亮点

  • 三档组合策略(稳健 / 均衡 / 激进)——v6.2.3 定版,稳健档 v6.3.1 收紧、v6.4.2 再收紧,v6.5.0 重构:信号只用 T-1 及以前数据、T 日收盘成交, 含滑点/佣金/印花税/涨跌停/整手/停牌/退市的完整交易约束;激进 = 板块轮动策略—— 以板块轮动为进攻主线(强势行业选股 + 行业广度闸门、大盘权重降至 40% 让阀门开得更久), Top5/10 日切换、允许打板;均衡 v6.5.0 起 = 老稳健算法(v6.4.2 口径:blend 等权 Top10 + IC 确认层(历史信号 IC 显著为正 + MA20/60 趋势在场)+ 换仓缓冲带10 + 8%回撤熔断, 10 日调仓、上证 MA20 闸门,中期持有档;原 beta-Top5 / blend_mom-Top20 均衡策略淘汰), 稳健 v6.5.0 起 = 老稳健拉长持有(Top10 + IC + 8%熔断 不变,调仓 10→20 日、 缓冲带 10→20,长期低换手档;reb/buffer 取自然数未寻优), 详见「三档策略」; (档位沿革:原四档「稳健/均衡/激进/高风险」,v6.2.3 起原稳健策略淘汰、 原均衡→稳健、原激进→均衡、原高风险→激进;v6.5.0 起原 beta/blend_mom 均衡淘汰、 均衡接管 v6.4.2 老稳健(10 日),新稳健=老稳健拉长至 20 日);
  • 标准回测:四口径(全A / 沪深主板 / ETF / 全A含ETF)× 四类产品(组合 / 荐股 / 参数敏感性 / 分段),自动生成版本化产物、SVG 图表与本地网页仪表盘;
  • 个股分析:形态相似度匹配、买卖点风险偏好(保守/稳健/激进;v6.4.1 起可选 test=sm701 模型直出、不消融)信号回放、筹码分布(同花顺口径)、 MA/BOLL/MACD/KDJ/RSI/ADX、T+1/T+5 预测与幽灵K线;预测匹配只参考自身 (v6.5.3:大盘指数项默认不再参与 L1 打分/样本筛选/池匹配,量能与板块照旧; 旧口径 ini [predict] match_idx_env=1 恢复);预测价位已按板块涨跌停钳制 (v6.5.2热修②);节假日锚新增死锁保险(v6.5.4:指数日K长期断更不再把 全库锁死在旧数据,自动退回自然日历强制回补);策略消融优先读全市场批量结果 (v6.2.2:tier_picks_from_ablation.py 产出的三档缓存,弹窗秒开),读不到才本地重跑; 分析报告显示 名称 (代码) [行业] 与现价后换手率(v6.3.0);
  • 外部策略导入(v6.6.0,股票策略工坊):设置→外部策略可导入桌面 stock_strategy_studio 的自定义策略 JSON(42 个技术指标、AND/OR、上穿/下穿、 区间、较前值升/降)。启用后单股买卖点直接按导入规则生成,不参与消融、 不使用风险偏好,交易层改用止损% / 止盈% / 最长持有天数显式参数; 信号胜率面板、交易明细与导出同步支持;
  • 异动·全市场相似历史(v6.3.0,激进/均衡档默认开启,可回测):个股近 20 个交易日 「单日或 5 日累计涨跌超出自身历史 99.5 分位(底线 5%/10%)」即触发;系统在 全市场历史异动中按 K线形态 + 事件后路径 + 量比 + 换手率 + RSI + 波动率匹配 最相似的 50 例,统计它们在「事件后第 k 日」的未来 1/3/5 日表现;方向明确 (次日上行≥55% 且均收正 / ≤45% 且均收负)时覆盖原策略买卖点,激进档 相似样本次日封板率 ≥30% 附打板价提示;样本分歧则维持原策略。历史信号由 因果信号生成器 _sig_analog 产出,并入图表与单股回测统计,并作为 「异动·全市场相似」算法进入消融候选池(13 算法,可被三档选型选中)。 示例:龙版传媒 2026-09-08 的 5 日 +59.8% 超历史分位触发,相似样本次日 上行 56%、3日均 -0.9%,结论为分歧「观察」(不改判)。设置→预测参数可关。 全市场首跑结论(v6.3.0,7183 只有效消融):analog 入选稳健档 132 只 (1.84%)、均衡档 91 只(1.27%);候选描述性 IC 中位 IC1 +0.058 / IC5 +0.041(53.5% 为正),优于 LGBM/L2、低于筹码峰;逐股导出 321 行覆盖 156 只(入选偏差样本,收益不可与全市场中位直接比);
  • 基本面信息(v6.2.1,工具页):东财 F10 历史财报关键数据(近 12 期:营收/净利及同比、 扣非、EPS、ROE、毛利率/净利率、负债率、每股经营现金流)表格展示 + 本地规则引擎分析 (成长性/增收不增利/扣非背离/盈利质量/财务风险/综合结论),多源容灾+熔断,6 小时缓存;
  • 数据层:腾讯/新浪/东财/网易多源容灾 + 熔断自愈 + 本地 SQLite 缓存 (全库 1271 万根日K,个股/指数深历史自 2016-11);代码表含 换手率 / 动态PE / PB 快照(v6.2.4,东财 clist 主源 + 腾讯行情备用通道);
  • 每日荐股:三档组合目标持仓(稳健/均衡/激进)或 18 策略共振综合 (v6.1.6,多策略命中数+均分排序);v6.2.0 起三档模式走「IC 确认层 + 综合分 Top10」—— 先过滤「历史信号 IC 显著为正(120 日窗 IC>0 且 t≥2)且趋势指标在场」的股票再按档位 评分取 Top10,资金按只均分(10 万 = 10 只 × 约 1 万,组合口径),确认不足宁缺毋滥; v6.5.0 起稳健/均衡同为 blend-Top10+IC+熔断8%(稳健 20 日调仓/缓冲20 长期持有, 均衡 10 日调仓/缓冲10 中期持有); 按设置中的行业/板块权限过滤,默认剔除动态 PE≤0(亏损)股 (v6.2.4,ini [picks] exclude_loss=0 可关;估值快照来自代码表刷新, 不参与历史回测),给出建议手数/金额/参考止损;
  • test 实验风险档(v6.4.0,手动选择;v6.6.3 切生产三周期模型):独立接入桌面 sm701 副本的 LightGBM 概率模型;日K、股票名/行业/PE 等从副本 stock_cache.db 只读读取, 评分优先取副本 production/prod_h1|h5|h10_tech.txt 三模型等权平均, 历史分数读 production/valid_predictions.csv.gz,已有预测之后的最新交易日实时复算 (v6.6.4:sm701 副本日K落后时自动改用主库最新行情复算,避免 test 荐股整页为空; production/ 缺失则回退旧 lgbm_output/lgbm_model.txt + valid_predictions.csv.gz)。 test 采用 Top10、每日重排、无指数闸门, 不参与 AI 自动选档和默认三档回测;默认路径为 ~/桌面/sm701 (副本), 可用 SM701_DIR / SM701_DB / SM701_MODEL / SM701_PRED 覆盖。 注意:sm701 是「次日开盘买→收盘卖」的日内口径,A 股 T+1 不可当日卖出, 本仓库 T 收盘口径回测为负(详见「三档策略」末 test 小节),仅作研究观察;
  • AI 分析(可选):OpenAI 兼容接口,多轮问答、数据上下文缓存、AI 自动选档; 提示词随风险偏好动态生成(v6.1.7 热修②):保守=等确认/轻仓、稳健=兼顾、 激进(最高档)=板块轮动进攻、接受大波动、可直接给打板(涨停价)建议、禁用「等企稳/观望」搪塞;
  • 设置窗口分区导航 + 指标参数可调(v6.3.2):设置改 PyCharm 式左侧分区 (外观 / 预测参数 / 指标参数 / 荐股 / AI 接口 / 关于),点选切页; 指标参数可在设置内调整并持久化(ini [inds]):MACD 快/慢/信号、 KDJ N/M1/M2、RSI 短/长、BOLL 周期/倍数、ADX 周期/平滑/趋势阈值, 带范围钳制与「恢复默认指标参数」;默认值与原硬编码一致,保存后重新分析生效; 分析页标签(RSI/BOLL/ADX)随参数动态显示;作者信息移至「关于」页最下方;
  • 信号胜率面板升级(v6.3.3):工具→信号胜率新增「交易明细」子页—— 全期/训练/验证三段逐笔列出「买入日@价 → 卖出日@价 / 收益 / 原因 (信号卖出 / ATR止损 / 移动止盈 / 持仓中)」,可按段筛选、点列头排序, 导出 txt/json 同步带逐笔明细;「重选策略」改为「全部组合」窗口—— 列出全部 算法×风险档 候选(优先流式读研究批量消融全量文件,秒开并标注数据日期), 支持按 推荐档位 / 算法 / 风险档 / 综合评分 / 年化 / 胜率 / Calmar / 回撤 / 交易数 等 14 种排列方式,选中任意组合即可应用,也可窗口内「本地重算」;

快速开始

环境

  • Python 3.10+(开发环境 3.14);
  • GUI / 回测依赖 numpy + scikit-learn + lightgbm(pip install -r requirements-client.txt); 数据层与基础 CLI 纯标准库即可运行。

GUI(推荐)

python stock_gui.py

首次使用:设置页填自己的 AI Key(可选);「工具 → 数据工具」页可做 全库回填 / 数据清洗 / 复权失真体检 / 全量策略消融(v6.5.5:全市场逐只 13算法×3档,可选跑完自动刷新 GUI 策略缓存,荐股/消融弹窗读表秒开; v6.5.6:进度查询按钮+自动刷新,python3 progress.py 也可查)/ 更新K线源(v6.5.6:体检全部候选源并把实测可用域写回 ini,重启生效), 日志实时输出、可随时停止(v6.5.7:回测/消融刷屏时主界面照常可操作, 工具页日志改为批量刷新;重开工具页不中断正在跑的任务;v6.5.8:工具窗 可最小化、与主界面自由切换)。

CLI

python stock_predict.py 600519            # 单股分析
python stock_predict.py --tiers           # 三档当前目标持仓
python stock_predict.py --tiers --tier 激进 --universe main
python stock_predict.py --tiers --tier test   # sm701 实验档(需桌面 sm701 副本)
python stock_predict.py --tiers-backtest  # 组合回测摘要
python stock_predict.py --picks-backtest  # 荐股逐笔回测

一键全量回测(GUI 内置 / 桌面快捷方式)

推荐在 GUI 内使用:工具 → 一键全量回测(全期/分段/逐股,后台)——自动打开 「数据工具」页并启动,日志实时回流、可随时停止;也可在 工具 → 数据工具 页顶部 「一键全量回测」区块勾选「含逐年分段」后运行。流程:全期四口径 × 三档 → 样本外 val → 强势段 bull(可选逐年)→ 全市场逐股回测,各步结束自动刷新 research/dashboard.html,跑完自动打开;工具 → 打开回测仪表盘(网站)可随时查看。 桌面快捷方式「一键回测」等价(约 15~20 分钟,日志 research/oneclick_backtest_*.log)。 命令行入口:

bash run_backtest.sh            # 四步全量
bash run_backtest.sh --yearly   # 追加逐年分段
bash run_backtest.sh --dry-run  # 只打印将执行的命令

数据准备(可选,首次/换机)

python data_clean.py --db stock_cache.db           # 只扫描体检(不改库)
python data_clean.py --check-adj --sample 300      # 复权收益率保真体检
python backfill_full.py --workers 6 --throttle 0.45  # 全市场深历史回填(断点续传)

回测报告(数据截至 2026-09-30)

2026-09-27 数据层切换为真乘法后复权(腾讯不复权 × 新浪复权因子,修复腾讯 hfq 的仿射收益失真,见 reports/数据异常报告_20260927.md)后全量重跑。 权威产物:research/v61_report.md;可视化:research/dashboard.html (浏览器直接打开,零依赖;默认展示最新「全期」批次,val/bull 分段批次 与旧复权口径批次在下拉中可切换且有醒目作废提示; 净值曲线中的水平段=闸门关闭→空仓持现金,悬浮读数会标注「空仓·闸门关」; 净值曲线下方直接给两张表(v6.2.1):组合指标表(每档总收益/年化/回撤/Sharpe/ 超额/交易/相位区间/荐股统计)与消融汇总表(全市场逐股选型的年化/胜率中位数 + IC1/IC5 中位数、IC5 为正占比、牛市熊市中位); 顶部可导出完整回测数据(全量 JSON / 指标 CSV / 曲线 CSV),「每只股回测」页可导出 当前筛选 CSV、「明细表/文件」页附全量回测命令,便于离线分析与复现); 版本化目录:research/backtest_v6.5.0_20261010_*_{full,val,bull}/ (v6.5.0 三档批次,数据截至 2026-09-30;报告/明细表/图表/元数据; v6.5.0 档位重构:均衡=老稳健中期口径(blend-Top10/reb10/buffer10/IC/熔断8%, 全A 全期 +69.3%/-16.4%,即 v6.4.2 老稳健数字);新稳健=拉长持有 (reb20/buffer20,全A 全期 +22.1%/-15.5%,动量信号过期代价大,见 CHANGELOG); 旧批次(v6.4.2 及更早)保留在 research/ 各时间戳目录, 旧四档批次已归档 research/legacy_batches/,不在仪表盘下拉展示)。 注意:稳健 reb20 相位平均天然 20 相位、区间起点晚 10 个交易日 (2022-09-29 起 vs 均衡/激进 2022-09-15 起),跨档区间不完全可比。

全期 · 四口径 × 三档(组合相位平均,含全部费用)

口径 档位 总收益 年化 最大回撤 Sharpe 主基准年化 超额(总) 荐股均收益 荐股胜率
全A 稳健 +22.1% +5.1% -15.5% +0.55 +6.0% -4.3pp +0.94% 43.5%
全A 均衡 +69.3% +13.9% -16.4% +1.14 +4.6% +49.3pp +1.32% 43.7%
全A 激进 +116.3% +21.0% -16.7% +1.22 +12.7% +54.1pp +1.09% 44.6%
沪深主板 稳健 +14.2% +3.4% -21.3% +0.39 +6.0% -12.1pp +0.66% 42.0%
沪深主板 均衡 +52.2% +10.9% -21.3% +0.94 +4.6% +32.1pp +1.10% 43.2%
沪深主板 激进 +40.6% +8.8% -21.5% +0.62 +12.7% -21.6pp +0.43% 42.7%
ETF 稳健 +0.7% +0.2% -6.6% +0.06 +6.0% -25.6pp +0.21% 44.0%
ETF 均衡 +5.7% +1.4% -9.5% +0.23 +4.6% -14.3pp +0.53% 43.5%
ETF 激进 +33.0% +7.3% -16.1% +0.46 +12.7% -29.1pp +0.56% 47.0%
全A含ETF 稳健 +20.5% +4.8% -13.2% +0.53 +6.0% -5.8pp +0.87% 44.3%
全A含ETF 均衡 +73.3% +14.6% -13.8% +1.20 +4.6% +53.3pp +1.40% 45.4%
全A含ETF 激进 +142.5% +24.5% -14.0% +1.36 +12.7% +80.3pp +1.05% 44.8%
  • 稳健/均衡主基准为上证(v6.5.0 起均衡由科创50切回上证,与其承接的老稳健策略同基准),激进档主基准为科创50; 报告同时给出创业板指/上证对照;
  • 档位沿革(v6.2.3/v6.5.0):原四档 → 三档——原「稳健」(偏动量 0.6)策略淘汰; 原「均衡」→ 稳健、原「激进」→ 均衡、原「高风险」→ 激进;v6.5.0 起原 beta-Top5 / blend_mom-Top20 均衡淘汰,均衡接管 v6.4.2 老稳健(10 日),新稳健=老稳健拉长至 20 日 + 缓冲20。稳健区间起点晚 10 个交易日(reb20 相位平均所致),跨档不完全可比;
  • 激进档(板块轮动,原高风险 v6.1.9):四口径以板块轮动选股(行业动量 + 个股动量/低波)Top5/10 日,板块轮动闸门(行业广度 60% + 上证 MA20 40%、 大盘权重由 100% 降到 40%,全期开闸 1010/1636=62%),允许打板;
  • 组合为相位平均期望(消除调仓起始日运气),荐股为逐笔口径(均含费用)。

分段(组合总收益:稳健 / 均衡 / 激进)

区间 全A 沪深主板
样本外 val(2025-09 ~ 2026-09) +16.1% / +48.9% / +30.9% +16.8% / +45.0% / +15.5%
强势段 bull(2025-03 ~ 2026-09) +45.5% / +88.7% / +66.9% +43.2% / +84.7% / +17.8%
区间 ETF 全A含ETF
样本外 val(2025-09 ~ 2026-09) -1.3% / +5.5% / +10.9% +12.1% / +50.2% / +19.6%
强势段 bull(2025-03 ~ 2026-09) +4.7% / +9.4% / +37.2% +37.3% / +81.8% / +59.5%

注:稳健 val/bull 起点晚约 10 个交易日(reb20 相位平均所致),跨档不完全可比。

完整分段/逐年/相位年化区间/三基准对照见 research/v61_report.md、 research/v61_report_val.md、research/v61_report_bull.md。

10 万元荐股组合回测(v6.2.0 新增,backtests/backtest_picks10.py)

组合总资金 10 万(不是每只 10 万):每档先过 IC 确认层(个股历史信号 IC: 120 日窗「近5日收益→未来5日收益」IC>0 且 t≥2 且样本≥60,且 T-1 日 MA20/60 多头趋势在场——IC 与指标综合考量、自然数阈值防过拟合),再按档位综合分取 Top10、每只约 1 万;稳健 20 日调仓、均衡/激进 10 日调仓;相位平均、含全部费用; 确认不足宁缺毋滥(可少于 10 只持现金)。

区间 稳健 均衡 激进
全期(2022-09 ~ 2026-09) +11.3%(回撤 -18.5%,Sharpe 0.34) +61.2%(-16.6%,Sharpe 1.10) +13.3%(-39.7%)
样本外 val(2025-09 ~ 2026-09) +12.4%(-7.4%,Sharpe 1.12) +40.1%(-5.4%,Sharpe 2.59) +43.9%
强势段 bull(2025-03 ~ 2026-09) +38.4%(-6.0%,Sharpe 2.04) +76.4%(-4.7%,Sharpe 3.06) +90.9%
  • v6.5.0 说明:均衡列 = 老稳健口径(reb10/buffer10,即 v6.4.2 稳健数字); 新稳健拉长至 reb20/buffer20 后 10 万口径同步回落(全期 +61.2%→+11.3%), 与 100 万口径结论一致(动量信号过期代价);
  • IC 层贡献对照(同本金同 Top10、仅关确认层,v6.4.2 批次):稳健 全期 +19.4%→+65.6% (v6.3.1 含换仓缓冲带10)、均衡 +9.7%→+33.5%、样本外稳健 -3.4%→+43.5%;
  • 本金规模影响结果(整手粒度 + 高价股预算买不进),与上表 100 万口径 不可直接互比;确认层当期覆盖约 100/6317 只,属高门槛。

口径警示:2026-09-27 之前(腾讯 hfq 仿射口径)产生的历史回测数字全部作废, 以本节与新报告为准;旧策略缓存已清空、按需重算。

三档策略(v6.2.3 定版;稳健档 v6.3.1 收紧;v6.5.0 重构;+ test 实验档 v6.4.0)

公共口径:信号只用 T-1 及以前的数据,T 日收盘成交; 时点过滤 = 价 >1 元、上市 ≥250 个交易日、20 日均成交额 ≥3000 万元。

全A 口径(full)

档位 基准 选股 调仓 择时闸门
稳健 上证指数 全A:20 日动量 + 20 日低波 等权合成排名 Top10 + IC 确认层(历史信号 IC>0 且 t≥2 且 MA20/60 趋势在场)+ 换仓缓冲带20(v6.5.0 由 10 放宽,长期持有)+ 8%回撤熔断(v6.4.2:本相位回撤超 8% 清仓至下个调仓日) 每 20 日 上证 MA20
均衡 上证指数 全A:20 日动量 + 20 日低波 等权 Top10 + IC 确认层 + 换仓缓冲带10 + 8%回撤熔断(= v6.4.2 老稳健,中期持有;原 beta-Top5 均衡 v6.5.0 淘汰) 每 10 日 上证 MA20
激进 科创50 全A:板块轮动(行业 20 日动量 0.5 + 个股动量/低波基准 0.5)Top5(原高风险档,策略未改) 每 10 日 板块轮动闸门(行业广度 60% + 上证 MA20 40%);允许打板

沪深主板 口径(main)

档位 基准 选股 调仓 择时闸门
稳健 上证指数 主板:20 日动量 + 20 日低波 等权 Top10 + IC 确认层 + 换仓缓冲带20(v6.5.0 长期持有)+ 8%回撤熔断(v6.4.2) 每 20 日 上证 MA20
均衡 上证指数 主板:20 日动量 + 20 日低波 等权 Top10 + IC 确认层 + 换仓缓冲带10 + 8%回撤熔断(= v6.4.2 老稳健;原 blend_mom-Top20 均衡 v6.5.0 淘汰) 每 10 日 上证 MA20
激进 科创50 主板:板块轮动(同全A结构)Top5(原高风险档) 每 10 日 板块轮动闸门;允许打板

基准(v6.1.1,v6.2.3 沿用,v6.5.0 调整):稳健/均衡档统一对标上证 (v6.5.0 起均衡由科创50切回上证,与其承接的老稳健策略同基准),激进档对标科创50 (不分账户是否具备科创板权限);报告中另附创业板指 / 上证对照, 避免单一强基准使超额恒负。 原 beta / blend_mom 均衡(v6.5.0 淘汰):全A 60 日 β-Top5 与主板/ETF/全A含ETF blend_mom(动量0.7/低波0.3)Top20/10 的历史沿革与证伪记录见 CHANGELOG (v6.1.1/v6.2.3)与 research/v61_report.md;blend_mom 评分保留仅研究对照。

  • 合成排名(稳健/均衡,blend 等权):rank(20日收益) + (1 − rank(20日波动)),横截面百分位,等权两项; 动量项捕捉资金持续流入(趋势),低波项压低高波动/高换手个股的崩盘概率。 注意:动量权重不能进一步加大——动量 Top 短名单方案回测全期 -51% (A 股 20 日动量 Top 全是妖股/ST,低波项是崩盘过滤器),60 日动量口径同样证伪。 两档均叠加 IC 确认层(tier_ic_confirm:120 日窗近5日收益→未来5日收益 IC>0 且 t≥2 且样本≥60,且 T-1 日 MA20/60 多头趋势在场)与换仓缓冲带 (稳健 buffer20:在位股排名 Top30 内即保留;均衡 buffer10:Top20 内保留, 只有跌出缓冲带才被替换)+ 8% 回撤熔断——候选须同时 「历史预测力为正 + 趋势在场 + 当期排名靠前」才入选,确认不足宁缺毋滥; 稳健 20 日调仓、均衡 10 日调仓(v6.5.0);
  • (v6.5.0 淘汰)旧均衡:全A 60 日 β-Top5;主板/ETF/全A含ETF blend_mom 0.7 × rank(20日收益) + 0.3 × (1 − rank(20日波动))。blend_mom 评分保留仅研究对照;
  • 闸门关闭(T-1 收盘 < MA)→ 调仓日清仓持现金,恢复后重新建仓;
  • 调仓相位:资金分成 reb 份、错开相位同时运行后平均(tranche averaging), 消除「起始日/调仓日恰好撞上行情」的运气;报告同时给出单相位年化区间。

参数选择协议:结构(因子、top、调仓、闸门)在训练段 2022-09 ~ 2024-12 内完成选型; val(2025-09 ~ 2026-09)与 bull(2025-03 ~ 2026-09)仅用于报告。 诚实声明:探索过程中确实看过后段数据(本项目历史遗留口径污染无法完全消除), 因此下面同时给出全期、样本外、逐年三张表与相位离散度,请以后两者为主要依据。 激进档(v6.2.3 定名,原高风险档 v6.1.9):结构(rotate 评分 sec_w=0.5、 闸门 40/35、Top5/10 日、打板)在训练段 2022-09 ~ 2024-12 内扫参选型, val/bull 仅复核(详见本节末「激进档 = 板块轮动策略」)。

ETF 口径(etf)与 全A含ETF(all_etf)(v6.1.2)

档位 基准 选股 调仓 择时闸门
稳健 上证指数 ETF 池:动量 + 低波 等权 Top10 + IC 确认层 + 换仓缓冲带20(v6.5.0 长期持有)+ 8%回撤熔断(v6.4.2) 每 20 日 上证 MA20
均衡 上证指数 ETF 池:动量 + 低波 等权 Top10 + IC 确认层 + 换仓缓冲带10 + 8%回撤熔断(= v6.4.2 老稳健;原 blend_mom-Top10 均衡 v6.5.0 淘汰) 每 10 日 上证 MA20
激进 科创50 ETF 池:板块轮动(无行业语义时板块动量退化为自身动量)Top5(原高风险档) 每 10 日 板块轮动闸门;允许打板
  • ETF 无创业板/行业语义,稳健/均衡均走「动量+低波」等权族(区别仅持有期: 稳健 20 日/缓冲20,均衡 10 日/缓冲10); 稳健/均衡闸门统一用上证 MA20(ETF 池跨沪深两市);激进档仍用板块轮动评分与 闸门——ETF 自身视作独立板块(行业动量退化为自身 20 日动量), 闸门的行业广度取自全 A 个股(市场环境);
  • ETF 持仓数取 Top10(池子小、且单只 ETF 内部已分散);
  • all_etf(全A含ETF):个股与 ETF 合并成同一池排序,稳健 Top10(IC+缓冲20+8%熔断、 20 日调仓)、均衡 Top10(IC+缓冲10+8%熔断、10 日调仓)、激进 rotate Top5; 该口径下 ETF 会因低波动特征进入稳健档持仓(实测确实如此),这正是「含ETF」的意义;
  • 排名基数隔离:tier_rank_base() 保证 all/main 仍在个股池内排名(历史数字不变), etf 在 ETF 池内排名,all_etf 在合并池内排名。

test 实验档 = sm701 LightGBM(v6.4.0,手动选择)

test 是与稳健/均衡/激进并列的独立实验档,评分不使用本仓库的动量/低波/板块轮动, 而是直接接入桌面 sm701 副本的 LightGBM 概率模型:

项目 口径
评分 sm701 生产定稿 production/prod_h1\|h5\|h10_tech.txt 三模型上涨概率等权平均
持仓 / 调仓 Top10 / 每日按分数重排
择时闸门 无(不空仓避险,始终持有当期 Top10)
参考止损 2 × 20 日波动(仅风险提示,回测未用)
行情与元数据 副本 stock_cache.db:日K / 股票名 / 行业 / 动态PE / 换手率
  • 只读接入:副本库用 SQLite 只读 URI 打开,不复制其 7GB 扩展库, 也不与副本训练进程争写锁;
  • 生产三周期模型(v6.6.3):优先接入副本 production/ (features_tech.json 的 tech 40 特征列序 + prod_h1|h5|h10_tech.txt), 实时复算对三模型分别打分、等权平均为 test 分数;若 production/ 缺失则回退旧单模型口径(lgbm_output/lgbm_model.txt),显式设置 SM701_MODEL 时也强制单模型;
  • 历史分数:2024-01 起读取副本 production/valid_predictions.csv.gz (date,code,prob_h1,prob_h5,prob_h10,prob,prob=三模型等权平均; 由副本 production/make_predictions.py 用生产三模型生成), 按 code × 交易日对齐本仓库面板;
  • 最新交易日:历史文件结束之后的新交易日,用副本 production/ 三模型 加副本 lgbm_train_backtest.py 的原特征工程 _compute_feats 实时复算; 已对拍末交易日 2026-09-30:实时复算值与落盘 prob 逐元素一致 (sh600000 = 0.42401537);
  • 路径:默认优先 ~/桌面/sm701 (副本),其次 ~/桌面/sm701; 可用 SM701_DIR / SM701_DB / SM701_MODEL / SM701_PRED 覆盖;
  • 手动边界:test 不参与 AI 自动选档(偏好选 test 时 AI 回退稳健), 默认研究/回测与「三档」入口仍只跑稳定三档;GUI 在每日荐股下拉、 设置→荐股偏好、工具→test(sm701) 当前目标持仓 提供显式入口;
  • 单股分析(设置→预测参数→风险偏好=test,v6.4.1):买卖点不做策略消融, 直接由 sm701 概率滞回映射——prob ≥ 0.55 触发 BUY、prob < 0.50 触发 SELL (同向不重复),ATR 止损/移动止盈沿用激进档宽松参数;历史段读副本落盘概率, 之后的新交易日实时复算。「信号胜率」页与导出共用这套信号;
  • 成交口径差异(重要):sm701 的标签是次日开盘买 → 次日收盘卖的日频截面 alpha(其落盘 next_ret = close[t+1]/open[t+1] − 1),而 A 股个股 T+1 不允许当日买当日卖;本工具组合引擎统一为「T-1 信号 → T 日收盘成交」,两者 天然错位。实测同一 Top10 日调仓(全A、含全部费用、2024-01-02 ~ 2026-09-30): 本引擎 test -96.0%(年化 -69.1%、回撤 -96.0%),而 sm701 自身报告 样本外 Top10 年化净 +49.0%/回撤 -32.0%——两组数字不可互推。荐股列表 仍是模型原始排序(供研究观察/自行按模型口径使用),不要把它当作已经过本仓库 回测验证的策略;
  • 实验声明:test 未在本仓库做标准回测与过拟合诊断,其数字不可与 下方三档回测表混用;生产端套用与三档相同的权限与亏损股过滤口径。

sm701 全库对照(v6.6.4,是否替换三档生产策略)

backtests/compare_tier_sm701.py 在同一全库面板、同一区间(sm701 历史预测 起点 2024-03-12 至 2026-10-19)对比「当前三档」与「仅把 score 换成 sm701、 其余闸门/调仓/IC/熔断完全保留」的三档;全A 与沪深主板分别统计(含全部费用、 相位平均)。结论:sm701 只在稳健档稳定占优,均衡/激进明显落后;未整体替换 三档生产策略,仅作为消融候选参与逐股选型。

口径 档位 当前 年化/回撤/Sharpe sm701 年化/回撤/Sharpe 判定
全A 稳健 +13.1% / -15.4% / 1.14 +15.9% / -10.9% / 1.32 sm701 胜
全A 均衡 +27.9% / -16.8% / 1.87 +20.4% / -19.2% / 1.40 当前胜
全A 激进 +26.5% / -16.8% / 1.34 +14.0% / -15.6% / 0.90 当前胜
沪深主板 稳健 +11.3% / -16.4% / 1.03 +12.2% / -12.0% / 1.07 sm701 胜
沪深主板 均衡 +22.8% / -20.2% / 1.63 +16.2% / -19.2% / 1.20 当前胜
沪深主板 激进 +8.3% / -21.4% / 0.55 +8.8% / -15.1% / 0.65 sm701 小幅胜
全A test(sm701 原生 Top10/日频/无闸门) — -36.2% / -72.7% / -1.57 不可用于本引擎
  • 稳健档 sm701 的改善在两个口径一致(年化 +2.8pp/+0.9pp,回撤与 Sharpe 同向改善), 但均衡档年化损失 7.5pp/6.6pp、全A 激进档损失 12.5pp,整体不满足“全三档更优”;
  • test 原生口径仍是次日 open→close alpha,与本仓库 T 收盘成交错位,不能直接作为 生产策略;若后续只想替换稳健档,可单独评估(本版未改生产配置);
  • 全库消融(7198 个有效对象,13 算法):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% 的股票上验证年化更高)。 即“预测信号精度”sm701 明显更好,但把三档 score 整体换掉只有稳健档获益, 因此本版只把 sm701 作为消融候选,不动三档生产配置;
  • 原始指标与完整 JSON:research/compare_tier_sm701.json。

策略原理

为什么是「动量 + 低波」而不是模型打分? 2026-09-13 的审计(reports/回测复核报告_20260913.md) 证明逐股选型/ML 横截面打分在样本外归零(选择偏差 + 训练 IC 0.6 vs 测试 0.016)。 价格/量能类有效信息主要来自两类稳健风格:趋势延续与低波动异象,因此各档都只做 「横截面排序 + 趋势闸门」,不做参数寻优式拟合。

  1. 合成排名(稳健/均衡,v6.5.0):score = rank(20日收益) + (1 − rank(20日波动)),等权两项。 动量项捕捉资金持续流入(趋势),低波项压低高波动/高换手个股的崩盘概率。 注意:动量权重不能进一步加大——动量 Top 短名单方案回测全期 -51% (A 股 20 日动量 Top 全是妖股/ST,低波项是崩盘过滤器),60 日动量口径同样证伪。 两档均叠加 IC 确认层(tier_ic_confirm:120 日窗近5日收益→未来5日收益 IC>0 且 t≥2 且样本≥60,且 T-1 日 MA20/60 多头趋势在场)与换仓缓冲带 (稳健 buffer20:Top30 内保留;均衡 buffer10:Top20 内保留)+ 8% 回撤熔断: 候选须同时过「历史信号 IC 显著为正 + MA20/60 趋势在场」确认,确认不足宁缺毋滥。 区别仅持有期:稳健 20 日调仓、均衡 10 日调仓(v6.5.0 实测拉长持有在动量策略上 全面跑输:全A全期 +69.3%→+22.1%、val +48.9%→+16.1%、bull +88.7%→+45.5%, 20 日动量信号配 20 日调仓=信号过期,详见 CHANGELOG)。
  2. (v6.5.0 淘汰)旧均衡:全A 60 日 β-Top5(创业板指 MA60 慢闸门); 主板/ETF/全A含ETF blend_mom(0.7 × rank(20日收益) + 0.3 × (1 − rank(20日波动)))。 沿革与证伪记录见 CHANGELOG(v6.1.1/v6.2.3/v6.5.0)与 research/v61_report.md。
  3. 趋势闸门(择时):T-1 收盘 > MA(N) 才允许持仓,否则调仓日清仓持现金。 稳健/均衡统一用上证 MA20; 激进档例外:用「板块轮动闸门」——0.6×行业广度 + 0.4×上证MA20 ≥ 0.35, 大盘权重从 100% 降到 40%,阀门打开更久(见下节)。
  4. 调仓相位平均(tranche):单一调仓日的结果对「起始日运气」极其敏感, 相位平均报告的是策略的期望表现而非某一次巧合。
  5. 成交与费用:T-1 收盘决策 → T 日收盘成交;滑点 0.1%/边、佣金万 2.5(最低 5 元)、 印花税千 1(卖出)、过户费;100 股整手、涨停不买、跌停次日再卖、停牌顺延、 退市/长停 20 日后按最后收盘价了结。激进档例外(v6.1.7 起):解除「涨停不买」 (cfg.allow_limit_up=True),涨停价视同可成交;历史回测中约 1.3%~1.9% 的 买入发生在涨停价(ETF 池因涨跌幅小几乎为 0)。
  6. 生产端口径差异:GUI/CLI 的「当前目标持仓」额外剔除当前 ST/退市风险名称, 并套用设置里的荐股权限(行业/板块);历史回测无时点 ST 数据,故回测不含该过滤。 激进档在持仓列表中用 [涨停] 标记信号日已封板的标的,并提示打板成交口径。

激进档 = 板块轮动策略(v6.2.3 定名,原高风险档 v6.1.9 开发)

定位:第三档「激进」= 板块轮动策略(策略本体与 v6.1.9 逐字段相同,仅重定名), 风险偏好最高,接受大幅波动(回撤由使用者自行承受)。 与另两档「大盘择时 + 动量/低波」不同,它以板块轮动为主参考:

  1. 选股 rotate:`0.5 × rank(行业20日动量) + 0.5 × [0.7 × rank(个股20日动量)
    • 0.3 × (1 − rank(20日波动))]`——强势板块中的强势股优先; ETF/无行业标的的行业动量退化为自身 20 日动量(各自视作独立板块);
  2. 闸门 rotation:0.6 × 行业广度 + 0.4 × 上证MA20 ≥ 0.35 才持仓。 行业广度 = 20 日动量为正的行业占比。大盘权重从旧口径的 100% 降到 40%: 大盘在均线上时阀门恒开,大盘走弱时约六成行业动量为正仍持仓—— 全期开闸 1010/1636(62%),明显长于旧闸门(全A 创业板指 MA60=777、 上证 MA20=857);策略靠板块间来回切换,而不是空仓避险;
  3. Top5 / 每 10 日调仓:高集中、高换手,各口径在其自己池内排序;
  4. 允许打板:解除「涨停不买」,信号日已封板的标的也按涨停价成交 (回测中约 1.3%~1.9% 的买入发生在涨停价;生产端 [涨停] 标记);
  5. 组合引擎不设止损:只按「调仓 / 闸门 / 退市」进出;单股买卖点参数为 保守/稳健/激进三组(v6.2.3 起原「高风险」参数组已删除,只作用于单股买卖点/ 消融/逐股回测,不影响组合引擎)。
口径 选股 调仓 闸门 全期总收益 全期年化 回撤
全A 板块轮动 rotate Top5 10 日 板块轮动(40/35) +116.3% +21.0% -16.7%
沪深主板 板块轮动 rotate Top5 10 日 板块轮动(40/35) +40.6% +8.8% -21.5%
ETF 板块轮动 rotate Top5 10 日 板块轮动(40/35) +33.0% +7.3% -16.1%
全A含ETF 板块轮动 rotate Top5 10 日 板块轮动(40/35) +142.5% +24.5% -14.0%

表中组合数字为 v6.3.1 三档批次(research/v61_report.md 为准):组合引擎不设 止损(只按调仓/闸门进出)。选型目标:激进档为「偏年化 + Calmar」权重 (_ablation_weights),组合层结构(板块轮动评分/闸门、Top5、打板)独立于均衡。

上面是原理层说明;实现层的精确公式(特征/评分/闸门/成交/指标)见下方 「三档引擎实现细则」,消融 13 类信号的触发条件见「消融算法细则」, 事件回测与选优权重见「消融的事件回测口径与选优」,numpy 加速见「性能与 numpy 加速」。

三档引擎实现细则

(1)特征构建(tier_build_features,全部为面板级 numpy,因果:第 t 列只用 ≤t 的数据)

特征 定义 用途
ret20 C[:, t] / C[:, t-20] − 1 动量项
vol20 近 20 日日收益标准差(cumsum 滑窗,O(N)) 低波项
amt20 近 20 日 成交量(手)×收盘价 均值 ÷100 → 成交额 流动性过滤(≥3000 万)
barcount 累计有效 K 线数(cumsum(isfinite(C))) 上市 ≥250 日过滤
beta60 / beta60_sh / beta60_star 近 60 日对创业板指 / 上证 / 科创50的 OLS 斜率(协方差÷方差,滚动 60 窗口,需 ≥48 个共同有效日) 均仅研究对照(v6.5.0 起无组合档用 β 选股)
sector_ret20(tier_sector_features) 所属行业成分股 ret20 的等权均值(行业来自 stocks.industry);ETF/无行业退化为自身 ret20 激进档板块轮动评分
sec_breadth(同上) ret20 > 0 的行业占比 激进档板块轮动闸门

(2)评分族(tier_make_score,横截面百分位 rank01 ∈ [0,1])

评分 公式 使用者
blend 0.5·rank(ret20) + 0.5·(1 − rank(vol20)) 稳健/均衡(各口径,v6.5.0)
blend_mom mw·rank(ret20) + (1−mw)·(1 − rank(vol20)) 仅研究对照(v6.5.0 起无组合档在用)
rotate secw·rank(sector_ret20) + (1−secw)·[mw·rank(ret20) + (1−mw)·(1 − rank(vol20))](secw=0.5、mw=0.7) 激进(四口径)
mom rank(ret20)(纯动量) 仅研究对照
beta beta60(对创业板指) 仅研究对照(v6.5.0 均衡淘汰,已证伪)
beta_sh beta60_sh(对上证) 仅研究对照(已证伪)
beta_star beta60_star(对科创50) 仅研究对照(已证伪)

排名在口径自己的基数池内做(tier_rank_base):all/main = 个股池、 etf = ETF 池、all_etf = 个股+ETF,池外置 NaN 不参与排名。

稳健/均衡档附加确认层(v6.3.1 稳健,v6.5.0 均衡同步):

  • tier_ic_confirm:120 日滚动窗「近5日收益(信号强度)→ 未来5日收益(结果)」 Pearson IC,要求 T-1 日 IC>0 且 t≥2 且样本≥60,且 T-1 日 MA20/60 多头趋势 在场(c>ma20>ma60 且 ma20 上行);T 日决策只用 T-1 确认(无前视);
  • 换仓缓冲带:调仓时在位股排名在 top+buffer 内即保留, 只有跌出缓冲带才被替换(稳健 hold_buffer=20→Top30,均衡 =10→Top20); 两档 ic_filter=True(TIER_CFG*), tier_eval/tier_picks_stats/tier_latest_picks 均按档位配置自动生效。

(3)闸门:

  • 趋势闸门(tier_make_gate):gate[t] = 收盘[t-1] > MA(N)[t-1], 即只用 T-1 及以前判断 T 日能否持仓;关闭时调仓日清仓持现金;
  • 板块轮动闸门(tier_make_rotation_gate,激进档): gate[t] = 0.6 × sec_breadth[t-1] + 0.4 × (收盘[t-1] > MA20[t-1]) ≥ 0.35, 大盘权重 40%(旧口径为 100%),行业广度为主;关闭时同样调仓日清仓。

(4)组合模拟(tier_sim_phase,逐日循环)

  • 调仓相位(tranche):资金分 reb 份、相位错开 0..reb-1 独立运行,各自以 top 只等权目标持仓,最后把各相位净值按起点对齐后平均,报告相位年化区间;
  • 成交:T-1 收盘决策 → T 日收盘成交;滑点 0.1%/边;佣金万 2.5(最低 5 元)、 印花税千 1(卖出)、过户费万 0.1;
  • 整手:按 100 股取整,买不起整手的标的跳过;
  • 涨跌停:涨跌停幅度按板块判定(创业板/科创板 20%,其余 10%), 涨停不买、跌停不卖(次日再试);激进档解除涨停不买 (cfg.allow_limit_up=True,涨停价照常成交,回测中约 1.3%~1.9% 买在涨停价);
  • 停牌/退市:停牌顺延;连续 20 日无 K 线按最后收盘价强制了结(delist);
  • 出局:跌出目标 TopN(target)/ 闸门关闭(gate)/ 退市(delist); 稳健档启用 hold_buffer=10 后在位股跌出 Top20 才出局(target), 且换入候选须先过 IC 确认层(确认不足留现金);
  • 新买入修正(v6.3.1):实际成交的买入会加入当期目标集合, 避免「限价/整手跳过后买入的标的次日被旧目标误卖」。`

(5)指标定义(_tier_metrics,numpy 计算)

  • 总收益 eq[-1]/eq[0] − 1;年化 (eq[-1]/eq[0])^(1/年数) − 1(年数按自然日/365.25,下限 0.05 年);
  • 最大回撤 min(eq / cummax(eq) − 1);Sharpe mean(日收益)/std(日收益) × √252;
  • 胜率 (单笔 > 0).mean();PF Σ盈利 / |Σ亏损|;相位区间 = 各相位年化的 min/max。

消融算法细则(13 类信号,全部本地计算、AI 不参与)

backtests/backtest_strategy_ablation.py 对每个对象逐个跑下表 13 类信号 × 3 档风险参数 (v6.2.1 起补入 量比 与 LGBM;v6.2.3 起三档参数;v6.3.0 补入 异动·全市场相似):

键 名称 BUY 触发 SELL 触发 备注
macd MACD 金叉/死叉 DIF 上穿 DEA(EMA12/26/9) DIF 下穿 DEA 经典趋势跟随
kdj KDJ 金叉/死叉 K 上穿 D 且 K<45 K 下穿 D 且 K>65 低位金叉/高位死叉,过滤钝化
rsi RSI 超卖回升 RSI6 上穿 20 RSI6 下穿 80 反转类
boll 布林带回归 前收 ≤ 下轨 且 现收 > 下轨 前收 ≥ 上轨 且 现收 < 上轨 (20, 2σ) 均值回归
ma_trend MA20/60 趋势 MA20 上穿 MA60(状态去重) MA20 下穿 MA60 只报一次状态切换
l1_pattern L1 形态上行概率 滑窗 z-norm 欧氏距离最近的 Top50 历史窗口中,次日上涨占比 ≥ 60% 同口径 ≤ 40% 窗口 W=10、步长 5;只用 i−W 之前的完整窗口(防前视)
l2_ind L2 同行业 + 行业ETF(v6.1.3 新增) 行业指数 > MA20 且 行业 5 日动量 > 0 行业指数 < MA20 且 5 日动量 < 0 行业指数优先取同名行业ETF收盘序列,无匹配则用同行业个股等权收益累乘合成;步长 3
chip_peak 筹码峰支撑 贴近筹码峰且 获利盘 < 35% 获利盘 > 90% 或跌破峰支撑 > 0.5% 逐日按换手衰减筹码分布,与 factor_lab 同口径
sector_rot 板块轮动 行业 5 日动量 > 全行业中位 且个股 5 日 > +1% 行业动量落后且个股 5 日 < 0 横截面行业强弱(与 L2 的时序行业趋势互补)
vol_ratio 量比放量(v6.2.1 新增) 近5/前15 量比首次上穿 1.2 且 ≥1.5、收阳 缩量 ≤0.5 或放量 ≥2.0 且收阴 复用 vol_ratio_at,因果序列
lgbm LGBM 预测(v6.2.1 新增) LGBMRegressor 因果滚动训练(每 50 根用当日及以前 8 维特征重训)预测次日收益 > +0.5% 预测 < −0.5% 缺 lightgbm 库时该候选空集跳过(安装后正常参与)
sm701 sm701 上涨概率(v6.6.4 新增) 只读桌面 sm701 副本,生产 h1/h5/h10 三模型概率等权 ≥0.55 <0.50(滞回,同向不重复) 历史分数读 production/valid_predictions.csv.gz;sm701 副本日K落后时用主库最新行情实时复算;副本缺失时该候选空集
analog 异动·全市场相似(v6.3.0 新增) 个股近 20 日出现「单日/5日累计超自身历史 99.5 分位(底线 5%/10%)」异动后,全市场相似异动样本次日上行 ≥55% 且 1/3 日均收正 同口径 ≤45% 且 1/3 日均收负 因果事件表 + K线形态/事件后路径/量比/换手率/RSI/波动率匹配 Top50;步长 2 日、仅方向变化报信号;激进档附打板价
composite 多维评分 加权总分 ≥ buy_th(弱市 +1 加严) 总分 ≤ 卖出阈值 8 维度加权见下

多维评分(composite)的 8 个维度与权重(CFG.IND_W,分数按权重取整):

维度 权重 打分规则
MACD 1.1 金叉 +2 / 死叉 −2 / 多头排列 +1 / 空头 −1
KDJ 0.9 低位金叉 +2 / 高位死叉 −2 / K>D +1 / 否则 −1
RSI 0.9 上穿 20 +2 / 下穿 80 −2 / <30 +1 / >70 −1
量价 1.0 量比 >1.5 且收涨 +1 / 放量收跌 −1
MA20 1.0 站上且 MA20 上行 +1 / 跌破且下行 −1
筹码 1.0 贴近支撑 +1 / 逼近压力 −1
布林带 1.0 跌破下轨 +1 / 突破上轨 −1
ADX/DMI 1.0 ADX≥20 时 +DI>−DI +1 / 反之 −1

分数 ≥ buy_th 且方向由空转多 → BUY;≤ 卖出阈值 且方向由多转空 → SELL; 每次触发后进入 cooldown 冷却期;弱市(指数当日跌幅超阈值)买入门槛 +1。

消融的事件回测口径与选优

(1)事件回测(_bt_events)

  • 信号在 T 日收盘产生,T+1 日收盘成交;
  • ATR(14) 止损:止损价 = 建仓价 − atr_mult × ATR[t-1](ATR 用 cumsum 滑窗 O(N) 预计算);
  • 移动止盈:最高价突破 entry × trail_trigger 后,止损上移到 最高价 × trail_ratio;
  • 盘中最低价触及即成交(若开盘已跌破则按开盘价成交);
  • 逐日记录净值曲线 → 总收益/年化/回撤/胜率/PF;
  • 牛熊分段收益:上证 MA120 以上为牛、以下为熊,分段年化(numpy 掩码 + log1p 求和)。

(2)三档风险参数(CFG.RISK_PARAMS,消融中每类信号都跑这三组;v6.2.3 起三档,原「高风险」参数组已删除)

档 atr_mult trail_trigger trail_ratio buy_th cooldown 定位
保守 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 宽进 + 宽出

三组参数均作用于单股买卖点/消融/逐股回测,组合引擎不设止损(稳健组合另有 8% 熔断,见三档引擎); 参数来源为 n=300/6000 回测网格(报告_买卖点收益回测.md); 稳健档 v6.3.1 买入评分门槛 2→3、冷却 5→8(n=300 实测买点信号 -28%、中位年化 基本不变),与保守档入场同样严格,区别在止盈(v6.4.2:+1.5%/回落 5% vs 保守 +1%/回落 4%, 仍保持 保守<稳健<激进 单调)。 原第四组「高风险」(ATR6.0 宽止损/冷却 2)随档位重定名于 v6.2.3 删除。

(3)训练/验证切分与选优

  • 每个对象取近 1000 根 K 线;训练集 = 前 75%(split = n − max(200, n/4)), 验证集 = 后 25%(不参与多指标 rank 打分;近端一致性门槛会用到最近 250 根, n=1000 时即该段,属时点可观测数据、防风格切换);
  • 候选池 = 13 算法 × 3 档风险参数(含”样本不足”回退);
  • 多指标结合选优(pick_ablation_multi):把候选的 Calmar、PF、胜率、年化 各自做横截面 rank01 后加权求最大 —— 稳健档权重 0.30/0.30/0.30/0.10 (v6.4.2 高胜率导向:胜率+PF 合计 0.60,Calmar 0.30 保回撤;原 0.45/0.25/0.20/0.10), 激进档 0.30/0.20/0.15/0.35(偏年化+Calmar); 稳健/保守档另设交易样本门槛 ≥8 笔(v6.4.2;防“1~2 笔 100% 胜率”假策略, 不足回退 ≥3 笔/全量),激进保持 0(允许低频高赔率)。
  • 近端子窗一致性(v6.1.5 热修②,pick_ablation_consistent):最近 250 根也按同一 权重 rank 取前 25%(下限 2 个),与全训练窗前 25%(下限 3 个)取交集,在交集中选 全窗得分最高者;交集为空 → 回退该档「多维评分」;近窗可评估候选 <3 个时按全窗选。 目的:防止长期横盘/旧 regime 选出的策略在风格切换后”沉默”(如 688012 于 2025-09 突破, RSI 策略近一年 0 交易——现已回退多维评分)。
  • GUI 单股消融(工具→重选策略)与本节同口径:13 算法 + 多维评分 × 3 风险参数 = 42 候选 (v6.1.4 补 L2;v6.2.1 加量比/LGBM;v6.2.3 起三档;v6.3.0 加异动·全市场相似; v6.3.3 起按钮直接打开「全部组合」窗口列出全部候选,可切换排列方式后任选其一应用, 优先流式读研究批量消融全量文件、秒开,无覆盖才本地重算); v6.5.1 起消融完成后弹三档窗还是全表可在设置→预测参数→消融策略选择(默认三档推荐); 档位名是选型目标(保守档限定保守/稳健参数候选),候选后缀是它自身的风险参数; 弹窗按训练集 Calmar 给出推荐档;验证集仅展示且不参与指标 rank 打分 (近端一致性门槛见上),高波动股(年化波动 >45%)推荐强制在 稳健/激进 中取较优。

性能与 numpy 加速(v6.1.3)

消融要在几分钟内跑完「约 7000 个对象 × 13 算法 × 3 档 × (训练+验证)」, 约 40 万次事件回测,故做了如下加速(结果与纯 Python 实现逐笔一致,有等值测试):

环节 加速手段
ATR(14) cumsum 滑窗一次算完(O(N)),替代双重循环
事件回测 每对象的 OHLC 平行数组只抽一次(13 算法 × 3 档复用),循环内不再做字典取值;rp 参数与信号映射提到循环外;净值曲线的累计峰值/回撤/胜率用 numpy 一次算完
牛熊分段 逐日收益、牛熊掩码、log1p 求和全部 numpy 掩码化
面板特征 动量/波动/均额/上市天数/β 全为面板级 numpy(cumsum 滑窗 + 广播)
形态距离 _px_distances 用 numpy 向量化欧氏距离(较纯 Python 快约 50 倍)
并行 ProcessPoolExecutor 多进程 + 进程初始化器注入已构建好的行业序列(板块轮动/L2),避免每个 worker 重复加载全A面板
缓存 指数 regime、板块动量序列、L2 行业序列按进程缓存(TTL 30 分钟)

实测对比(8 进程,6924 个对象逐个消融): v6.1.2 = 9 算法 251 秒;v6.1.3 = 10 算法(含新增 L2)+ numpy 加速 = 181 秒, 单位算法约快 35%,结果与纯 Python 实现逐笔等值(等值测试覆盖 5 只不同风格标的)。

L2 在消融选型中的占比(6881 个有效对象):稳健档 7.88%(542 个)、 均衡档 9.42%(648 个) —— 高于筹码峰(4.59%/4.67%)与板块轮动(2.7%/3.37%), 说明”同行业/行业ETF 时序趋势”是有效的选型维度。

界面与主题(v6.1.5 UI 优化)

  • 三主题(dark/light/contrast,设置内切换):THEMES 统一定义 25 个颜色键, v6.1.5 新增 BORDER/HOVER_BG/SEL_BG/ACCENT/LOG_BG;_style_ttk() 按当前主题 统一按钮/输入框/下拉/滚动条/标签页/分隔线/复选单选的边框、内边距、hover/focus 色; 主题切换走 _rebuild_ui()(重建控件→重跑样式→重设根窗口底色),三主题一致。
  • 主界面:日志/自选池/搜索建议/侧栏/状态栏全部用主题常量(无硬编码色); 主按钮「分析预测」用加粗 Tool.TButton;主图 MA 图例按实际字宽推进 (HiDPI/字体缩放下不再重叠)。
  • 弹窗:_center_win() 统一居中(工具/设置/每日荐股/相似样本/报告/五大指数), 尺寸按屏幕自适应;工具窗曲线画布加主题边框,结果区统一内边距与选中色。
  • 网页仪表盘:research/dashboard.html 右上角新增明/暗主题切换(localStorage 记忆,默认跟随系统),图表配色读 CSS 变量、切换后按当前页重绘。

外部策略(股票策略工坊导入,v6.6.0)

适用于单股买卖点与「工具→信号胜率」回测;三档组合/每日荐股仍走各自引擎。

  1. 导入:设置→外部策略→「扫描工坊目录」(默认 ~/桌面/stock_strategy_studio/strategies/custom)或「导入 JSON…」选择文件。 策略会复制到本项目 studio_strategies/,工坊原文件不受影响; STOCK_STUDIO_DIR 环境变量可改工坊目录。
  2. 启用:在列表中选择导入策略并保存。选择「自动消融(内置策略)」即恢复 原有消融流程。
  3. 参数:启用外部策略后风险偏好不生效(下拉自动禁用),交易层改用
    • 止损 %(默认 5,0=不启用,盘中触及按止损价/跳空开盘价成交)
    • 止盈 %(默认 0=不启用,盘中触及按止盈价/跳空开盘价成交)
    • 最长持有(天)(默认 0=不启用,到期按当日收盘退出)

    买卖点仍为 T 日收盘生成、T+1 成交;ATR 止损/移动止盈不叠加。

  4. 支持范围:工坊「自定义策略」JSON(指标+AND/OR+比较/上穿下穿/区间/升降); 代码插件(strategies/plugins/*.py)与依赖模型的工坊内置策略不导入, 请改用工坊条件编辑器保存为 JSON 后再导入。
  5. 口径:42 个指标与工坊 core/indicator_catalog.py 逐点一致;成交量单位为 「手」,工坊数据无成交额时按 成交量(手)×100×收盘价 估算成交额/VWAP; 指标参数在导入时已固化,当前版本不在本程序内编辑条件参数。

运行与复现

研究复现(脚本全在 backtests/)

# 0) (可选)刷新 adjust 现价系数;ETF 池首次使用需要先同步一次
python sync_adjust.py
python stock_predict.py --refresh-etf      # 拉东财 ETF 代码表 + 回填历史(约10~25分钟)

# 1) v6.1.8 标准回测:四口径 × 四类产品(本报告;默认 4 口径并行,全期约 76s)
python backtests/backtest_v61.py                 # all / main / etf / all_etf
python backtests/backtest_v61.py --workers 1     # 串行(对照基线,约 128s)
python backtests/backtest_v61.py --universe etf  # 只看 ETF
python backtests/backtest_v61.py --segment val --tag val     # 样本外,另存

# 2) 三档分段(全期/样本外/强势段/逐年)
python backtests/backtest_tiers.py --tier all --segment full
python backtests/backtest_tiers.py --tier all --segment val --universe main
python backtests/backtest_tiers.py --tier all --segment yearly

# 3) 参数敏感性
python backtests/backtest_tiers.py --tier 激进 --segment full --gate-ma 20

# 4) 荐股逐笔(按风险偏好/口径)
python backtests/backtest_picks_v6.py --segment full
python backtests/backtest_picks_v6.py --segment full --universe all_etf --yearly

# 5) 全对象多算法消融(9 类算法 × 3 档,逐对象覆盖;AI 不参与)
python backtests/backtest_strategy_ablation.py            # 产物 research/strategy_ablation_*.json
python backtests/backtest_strategy_ablation.py --limit 200 --workers 4   # 快速试跑

# 6) 因子实验室(全A 分层抽样;大样本实验建议独立快照库 + 独立产物目录,
#    不动正在被 GUI 使用的主库 stock_cache.db)
python -c "import sqlite3; s=sqlite3.connect('stock_cache.db'); d=sqlite3.connect('stock_cache_lab.db'); s.backup(d)"
python backtests/backtest_factor_ablation.py --stage all --sample 1500 --chip-sample 300 \
    --workers 8 --db stock_cache_lab.db --out-dir research/factor_lab/sample1500
# 其他脚本也可用 STOCK_DB=stock_cache_lab.db 指向快照库

backtests/*.py 顶部已带项目根路径引导,在仓库根目录直接运行即可, 产物仍写入 research/。引擎实现内嵌在 stock_gui.py(tier_*/_sig_* 函数), stock_predict.py 由 build_cli.py 从 stock_gui.py 自动抽取生成, 三端共用一套实现,不会出现研究/生产口径分叉。

生产端 · GUI(python stock_gui.py)

  • 搜索:任意位置按键即聚焦搜索框;输入代码/名称带候选下拉与自动补全(缓存加载);
  • 更新缓存范围弹窗(v6.6.1):工具栏/小屏工具菜单点「更新缓存」先选 全A(刷新代码表 + 全市场日K增量)/ 自选(仅自选池)/ 单股 (默认预填当前分析代码);只拉缺失或过期数据,已最新自动跳过,全A/自选 后台显示进度;
  • 后台主动预取(未分析股):启动后每小时一轮,优先「当前股 + 自选」及其样本池 (同行业 + ETF;L3 开启时含同市值层),再滚动补齐全库缺失K线(跳过北交所/退市); 收盘(15:05)后自动回补当日K线。已缓存只做新鲜度检查、批间限速; stock_gui.ini [predict] auto_prefetch = 0 可关闭;
  • 单股策略消融:分析后弹出三档候选(13 类算法 × 3 风险参数,训练选型 + 近端一致性 / 验证防过拟合); 图上买卖点按所选策略回放,激进档信号过少时自动兜底为多维波段信号 (面板「信号口径」与报告有标注,不改动消融缓存); 工具→信号胜率面板与消融同窗同引擎(_bt_events,val=max(200,n/4) 切分), 交易/胜率/年化/回撤与消融弹窗逐项一致(v6.1.6);「交易明细」子页逐笔列出 三段买卖点/收益/原因(v6.3.3,可按段筛选、点列头排序,导出同步); 同页「重选策略」打开「全部组合」窗口(v6.3.3,全部 算法×风险档 候选, 14 种排列方式,任选应用或本地重算);
  • 工具菜单:v6.2.3 三档组合(当前目标持仓)、 三档回测(全A / 主板 / ETF / 全A含ETF)、荐股收益回测(全A / 主板 / ETF / 全A含ETF)、 以及 ETF:刷新代码表 + 回填历史; 回测结果窗口对每档显示主基准 + 创业板指/科创50 对照(激进档主基准为科创50,稳健/均衡为上证);
  • 荐股按钮:风险偏好下拉(勾选 AI 自动选档时含「AI自动(按偏好)」), 三档列表来自组合引擎(含建议手数/金额/参考止损;闸门关闭显示「空仓等待」; 激进档对涨停标的标 [涨停] 并提示打板口径); 「综合(18策略)」(v6.1.6):全市场单次扫描 18 个短线策略(布林突破/断板反包/ 均线多头/连板/超跌反弹/回踩/量价齐升等),按「命中策略数 ×100 + 命中策略均分」 排序输出共振最强的股票(列显示共振数/均分/命中策略;约 1 分钟,纯本地缓存不联网); 两种口径都以设置里的行业/板块权限与荐股股票池过滤,双击任意推荐行切到该股分析;
  • 设置:AI Key / 接口地址(OpenAI 兼容)/ AI 模型(可自动获取列表)/ 代理 / 预测参数(含风险偏好:保守/稳健/激进/test——test 为 v6.4.1 新增的 sm701 模型直出档:单股买卖点不做策略消融,直接用模型概率(≥0.55 买入 / <0.50 卖出); 最大拉取样本量:单只股票单次联网拉取根数,默认 1000; 只限制拉取、不限制读库,库内历史全量参与分析)/ 外部策略(v6.6.0):导入股票策略工坊自定义策略,启用后风险偏好禁用、 改用止损/止盈/最长持有参数 / 荐股权限(行业多选 + 主板/创业板/科创板/ETF 勾选) / AI 自动选档 + 荐股偏好 / 荐股股票池(all/main/etf/all_etf);
  • AI 分析标签页:多轮问答,首轮发送完整数据上下文,追问复用缓存(数据未变不重复计费), 可清空对话;系统提示词与上下文都带当前风险偏好行为约束(保守/稳健/激进/test), 风险偏好变化后自动重新提问(不复用旧口径回答); AI结论中的买点/卖点/止损/支撑压力价位自动画到K线主图(ACCENT色虚线+AI标签, 工具栏“AI线”开关显隐,随平移/缩放保留);

生产端 · CLI(python stock_predict.py)

python stock_predict.py --refresh-etf                # 同步 ETF 代码表 + 回填历史
python stock_predict.py --tiers                      # 三档当前目标持仓(含参考止损/权限过滤)
python stock_predict.py --tiers --tier 激进           # 只看某一档
python stock_predict.py --tiers --universe main      # 主板口径
python stock_predict.py --tiers --universe etf       # ETF 口径
python stock_predict.py --tiers --universe all_etf   # 全A含ETF
python stock_predict.py --tiers --tier test          # test=sm701 实验档(显式指定)
python stock_predict.py --tiers --ai-tier            # 荐股前由 AI 在三档内选一档
python stock_predict.py --tiers-backtest             # 全期组合回测摘要
python stock_predict.py --picks-backtest             # 荐股收益回测(逐笔,全期)
python stock_predict.py --picks-backtest --picks-seg val   # 指定区间

依赖:numpy + scikit-learn + lightgbm(基础功能纯标准库可跑,组合引擎需要 numpy)。


旧结论与历史说明

旧结论 处理
v5 激进双引擎(创业板)「大资金 +48.6% 跑赢指数 / 小资金 +69.6%」 作废:backtests/backtest_aggr_lottery.py 存在「同日信号 + 同日收盘成交」前视 bug,已修复为 T-1 信号。修复后同区间(2025-03-18~2026-09-04):大资金 +40.5% vs 指数 +47.5%、小资金 +36.6% vs +47.5%,均跑输创业板指
每股自动消融组合三档(v4.0~v5.0) 降级为分析工具:审计发现验证集选型、同日成交等问题;修正后仅稳健档样本外微正,均衡/激进为负(详见 reports/回测复核报告_20260913.md)
每日荐股回测 旧多维评分口径修复未来股票池过滤后年化 -33.6%(原 +2.9% 系幸存者/未来信息),已退役;现荐股为三档组合目标持仓(逐笔回测见 research/v61_report.md)+ v6.1.6「18 策略共振综合」(短线口径、按命中策略数排序,未做逐笔回测)
v4 Walk-Forward 三档 同一预测下样本外为负(full:激进 -3.0% / 平衡 -43.2% / 保守 -7.2%),仅保留特征研究价值
v6.0 三档数字(全期 +3.1%/+5.7%/+13.7%) 已被 v6.1 标准回测取代(数据延至 2026-09-24、口径统一含回撤/Sharpe/基准超额),以「回测报告」为准
v6.1.0 主板激进档(β 对上证 / top5 / MA20,全期 -24.2%) 已证伪并重做:四项过拟合诊断(参数孤峰、随机安慰剂不劣于真实打分、换 blend 口径即转正、2025-2026 结构性崩坏)判定为口径设计缺陷;v6.1.1 改为 blend_mom(动量0.7)+ reb10/top20(最新口径数字见 research/v61_report.md)。诊断见 reports/回测复核报告_20260913.md
v6.1.0 激进档基准(创业板指 / 主板上证) 改为统一科创50(v6.1.1,不分是否具备科创板权限),并保留创业板指/上证作对照

历史完整记录:reports/回测复核报告_20260913.md;v2.x→v4.0.1 存档:research/legacy/。


数据与缓存

  • 行情源(多源容灾,细节见 ARCHITECTURE.md 2.1):
    • 快照:腾讯 → 新浪 → 东财;自选/指数批量走 fetch_batch_quotes;
    • 日K:腾讯不复权 × 新浪后复权因子 = 真乘法后复权(2026-09-27 全链切换; 腾讯 hfq 实测为分段仿射、日收益被逐股缩放,已弃用);ETF/LOF 无有效因子时用 腾讯 qfq,指数用不复权;v6.5.9 起多源扩为 8 条:腾讯 4 域(配置域/代理/ifzq/ ifzq-HTTP)→ 腾讯 web 2 域 → 新浪日K(不复权×同一因子,实测可取 3000 根) → 东财 fqt=2 兜底;v6.6.5 新增同花顺第三梯队源(d.10jqka.com.cn v6 line,无需 cookie,完整前复权口径原样入库,排在新浪之后东财之前)并支持 设置→数据源自定义:内置源可启用/停用/排序,可添加自定义源(腾讯/同花顺/ 东财/新浪/网易格式,添加前可实测),即时生效并存 ini [data]; 增量回补默认只拉 120 根小窗(载荷约 1/17),检出基期漂移自动升级全量重定基;
    • 板块:东财 clist → 腾讯行业榜 → akshare(可选依赖);
    • 代理:国内域名直连优先、代理兜底,被拒自动旁路 120s;
    • 急救箱:python3 stock_firstaid.py --check(全候选域体检)、--ai(AI 找源, 实测验证后采用)。
  • 复权口径:库内统一存真乘法后复权;adjust(code, k) 存显示缩放系数 (k = 同一交易日不复权收盘 / 库内收盘),读取层按 库内价 × k 还原 「乘法前复权(≈现价)」。sync_adjust.py 可批量刷新并修复末根毛刺。
  • 清洗:data_clean.py 默认只出报告(reports/清洗报告_*.md),--fix 才改库; 判定规则与 GUI _bars_anomalous 同源;含 --repair(截断修复)与 --check-adj(复权失真体检)。
  • 当前缓存(2026-09-27):stocks 7594 只(含 ETF/LOF 1796),日K 12,714,846 根 / 7624 只代码(≥2000 根 3805 只、≥2400 根 3127 只), 最新交易日 2026-09-24;指数/个股深历史自 2016-11。
  • ETF 数据:1785 只有 K 线、合计 181.4 万根;代码表由 refresh_etf_codes() 维护(剔除货币/现金类,东财故障时走新浪兜底)。
  • 客户端数据包与研究产物:见 https://github.com/Languangxun/stock-analyzer/releases(客户端/研究包以最新 Release 为准, 包名 stock-analyzer-client-v<版本>-<日期>.zip + research_v<版本>.zip)。

项目文件

| CHANGELOG.md | 版本摘要与历史变更(本 README 不再堆变更流水) |

文件 说明    
stock_gui.py 本地 GUI + 三档组合引擎/信号源权威实现(tier_*、_sig_*、pick_ablation_multi)+ AI 客户端    
stock_predict.py CLI 生成物(build_cli.py 从 GUI 自动抽取):--tiers / --tiers-backtest / --picks-backtest / --ai-tier / --universe    
studio_strategies/ 从股票策略工坊导入的自定义策略 JSON 副本(v6.6.0;设置→外部策略维护,启用后替代单股消融并改用止损/止盈/最长持有参数)    
backtests/backtest_v61.py 标准回测(四口径 × 四类产品,每次运行建 research/backtest_v<版本>_<时间戳>_<区间>/ 版本化产物目录,并在 research/ 根保留 v61_report.* 最新副本;跑完自动出图+刷新网页仪表盘,支持 --charts-only / --compare all 版本对比)    
backtests/v61_charts.py 回测图表模块(纯标准库 SVG,箱线图/分组柱状图;相位年化·逐笔收益·跨版本对比,写入回测目录 charts/)    
backtests/v61_dashboard.py 本地网页仪表盘生成器(自包含 HTML,Canvas 手绘、零 CDN):research/dashboard.html 整合研究净值曲线/指标对比/箱线 + GUI 单股回测留档 + 每只股回测(默认剔除事件股:单日复权 涨跌 >44% 或停牌 >90 天的重组/复牌股);backtest_v61.py 跑完自动刷新
backtests/backtest_tiers.py 三档分段回测封装(--segment full/val/bull/yearly、--universe、参数敏感性)    
backtests/backtest_picks_v6.py 荐股逐笔收益回测(按风险偏好/口径/逐年)    
backtests/backtest_strategy_ablation.py 全对象多算法消融(逐个对象覆盖,13 类算法含 L2 同行业+行业ETF/异动相似,× 3 档,多指标结合,numpy 加速,AI 不参与,输出覆盖率清单)    
backtests/(其余) 历史研究回测脚本(因子消融、退出消融、横截面实验、激进双引擎等),保留作研究记录    
build_cli.py GUI → CLI 打包器,保证算法同步    
build_client_zip.py 生成客户端发布包(空 Key 模板 + 打包后全包 Key 自检)    
sync_adjust.py 批量刷新 adjust 现价缩放系数 + 末根毛刺修复(乘法后复权 → 前复权)    
stock_firstaid.py 数据源急救箱(独立于 GUI):体检全部候选域 --check、把实测可用K线源写回 ini、--ai 向 DeepSeek 求救(只提议URL,程序实测验证后才采用)    
progress.py 后台长任务进度看板(纯标准库):显示深历史拉取/四口径回测/因子实验室阶段与产物,以及全量策略消融进度(④,读 research/ablation_progress.json,与 GUI「进度查询」同源);python3 progress.py -w 30 自动刷新    
stock_gui.py → refresh_etf_codes() 东财 ETF/LOF 代码表刷新(剔除货币类),写入 stocks(industry='ETF')    
stock_gui.py → backfill_etf_history() ETF 历史回填(hfq 口径、断点续传、6 线程、同步 adjust)    
stock_gui.py → sector_l2_series() / _sig_l2_industry() L2 行业参照序列(优先同名行业ETF,否则同行业等权合成)与 L2 信号(v6.1.3)    
data_clean.py 数据清洗:只扫描/修复/截断修复/全库复权迁移/复权失真体检,--fix 才改库    
factor_lab/ 因子穷举/验证框架(2000 日全库面板:top 1 万组合全过 BH-FDR、WF OOS IC +0.032、稳定因子 量能/板块/布林带)+ 筹码特征    
research/v61_report.json / .md 本次标准回测产物(权威,四口径 + 三基准对照)    
research/v61_report_{val,bull}.json / .md 样本外 / 强势段标准回测产物    
research/tiers_*.json 三档分段/逐年回测产物    
research/strategy_ablation_*.json 逐对象消融两层产物(逐对象 + 聚合,含覆盖率清单)    
ARCHITECTURE.md 架构与算法说明(随版本更新):目录职责、数据层、算法层(引擎/消融/AI)、研究与发布流程、已知不一致    
PLUGIN_API.md 插件 API 文档(插件开发者用,随客户端包分发)    
research/legacy/results/ 历史(v3/v4 时代)回测结果归档;对应脚本产出统一写入此处    
reports/ 生成类报告归档:数据清洗报告(data_clean.py 输出)、回测复核(审计)报告、代码审查    
plugins/trade_log.py 交易记录插件(账户联动)    
reports/回测复核报告_20260913.md 2026-09-13 夜间全面审计报告(含旧数字作废原因)    

已知局限

  1. 组合回测区间自 2022-09 起(约 4 年,受特征/训练段要求限制),库内个股/指数 深历史自 2016-11(2400 根);仍不能覆盖完整牛熊;
  2. 激进档(板块轮动 Top5 集中持仓,v6.1.9/v6.2.3 定型):年化波动大、单年可能大幅跑输; 允许打板,约 1.3%~1.9% 的买入发生在涨停价;回撤由使用者自行承受;
  3. 新稳健档(v6.5.0,reb20/buffer20):拉长持有在 20 日动量策略上全面跑输 (全A全期 +69.3%→+22.1%、val +48.9%→+16.1%、bull +88.7%→+45.5%,picks10 全期 +61.2%→+11.3%),如不能接受请用均衡档(=老稳健 10 日口径);
  4. 科创50 是很强的基准(全期年化 +12.8%、样本外 +21.5%、强势段 +35.4%): 激进档对科创50 的超额在多数区间为负,对创业板指/上证为正 —— 报告同时给出三基准, 请勿只看单一基准判断策略优劣;
  5. MA 闸门在单边强趋势中会滞后(2024-2025 跑输的直接原因之一);
  6. 整手约束下小资金(<10 万)无法完全复制 Top10 组合,实际需按资金量缩减股票数; 稳健档 v6.3.1 收紧后全期回撤由 -8.6% 扩至 -19.5%(IC 确认层在 2023~2024 弱市更吃亏、2025~2026 显著占优),请对照 val/bull 与逐年分段自行判断;
  7. 未建模冲击成本/一字板,停牌与退市按最后收盘价了结,可能高估极端情形下的可回收价值;
  8. 参数选型虽在训练段完成,但样本短、探索次数多,仍存在选择偏差 (主板激进档的动量权重/参数是在全期扫描后选定,诚实说明与过拟合诊断见 reports/回测复核报告_20260913.md 与 research/v61_report.md), 请以样本外、逐年表与相位区间为准;
  9. 荐股权限过滤在历史回测中未启用(无时点行业/ST 数据),实盘口径会略少于回测样本;
  10. AI 分析输出为模型生成文本,不构成任何投资建议,其选档仅在三档之间选择,不参与选股与消融;
  11. ETF 数据长度不均:1785 只有 K 线(884 只 ≥1000 根、其中 254 只 ≥2000 根, 合计 181.4 万根),仍有部分上市较晚/规模较小的基金K线较短, 故 ETF 口径组合在 2022~2023 年的样本偏薄,逐年口径不如个股口径可靠; 货币/现金类 ETF 已剔除(近零波动会霸占低波因子),债券 ETF 仍保留 —— 它们在低波项上 天然占优,all_etf/etf 的稳健档会明显偏向低波资产,这是特性也是局限;
  12. ETF 无 ST/退市语义,pick_allowed 把它们归入独立 ETF 板块;若在设置里只勾选了 主板/创业板/科创板而未勾 ETF,ETF 口径荐股会被权限过滤为空;
  13. 异动·全市场相似(v6.3.0):异动分位阈值与相似度权重是按可解释性 设定的先验(非样本外寻优);全市场消融/三档选型已重跑(7183 只有效), 但 analog 候选的验证段年化中位为负、IC 为正(描述性指标), 「入选样本的中位收益」属选择偏差、不可当策略期望;样本分歧时系统会明确 输出「观察」而不再给方向。目标股触发用精确逐日因果分位,全市场候选事件 按各股分块因果分位提取(每 20 日重算,均为无前视);换手率特征用当前 总股本(et_shares)近似历史换手,送转/增发会带来偏差;首次触发需构建 全市场事件表(约 24s,进程内缓存,后续瞬时)。
  14. 预测K线已按板块涨跌停钳制(v6.5.2热修②):预测价位不会超过 昨收±单日 涨跌停(主板10%/创业板·科创板20%/北交所30%,复牌与上市首日不设限日例外); 统计预测仍可能踩到板。AI 页各档闸门为后台预热缓存(最长10分钟), 刚打开时可能短暂显示”后台预热中”。
  15. 外部策略(v6.6.0)只覆盖单股分析/信号胜率回测:不进入三档组合、 每日荐股与全量消融;只导入工坊自定义 JSON,代码插件/模型策略不导入; 条件内指标参数在导入时固化(暂不支持在本程序编辑);百分比止损/止盈为 盘中触发口径(同日同时触发时按止损优先,保守处理),最长持有按到期日 收盘退出;策略表现仍取决于导入规则本身,请自行做样本外验证。

文档索引

文档 内容
ARCHITECTURE.md 架构与算法实现(数据层 / 算法层 / 研究发布流程 / 变更索引)
CHANGELOG.md 版本摘要与历史变更记录
PLUGIN_API.md 插件开发 API(随客户端包分发)
reports/ 数据清洗 / 复权体检 / 数据异常 / 回测复核 / 代码审查报告
backtests/ 研究回测脚本(在仓库根目录直接运行,产物写 research/)

许可证

MIT License — 详见 LICENSE。


免责声明:本系统所有输出仅为历史数据的统计推断与研究用途,不构成任何投资建议。股市有风险,入市需谨慎。