沪深300×LightGBM选股复盘验证期20.86%测试期-2.13%排序信号是真的但很弱。按模型预测分位分档预测越靠前、未来 5 日平均收益越高两期都单调验证期前 3% 档 0.441% vs 池内 0.081%测试期 0.371% vs 池内 0.099%。分年度 RankIC 全部为正但 2021 与 2026 已弱到 t1.5。但只买 10 只集中持有这套组合在测试期不成立。测试期年化 -2.13%跑输沪深3000.65%更跑输300 只等权不动2.74%交易成本每年再吃掉约 2 个百分点零成本对照-0.02%。把成本全额退回仍然不赚钱——所以主因是集中度不是手续费。同一个模型换个组合结构能救回来一点。top20 2 倍缓冲带验证期 13.12%IR 1.19测试期 6.11%IR 0.40跑赢两条基线代价是每月约 28 笔委托、2.03%/年的交易成本。没有能直接买的 ETF。宽基 ETF 只能给你指数测试期 0.65%/年指数增强 ETF 是别人家的模型。这套东西要么自己每月下单要么别做。本文还推翻了我自己上一版的建议。上一版写更长的持有期季度调仓实测下来全线不合格这批信号只活 5 天持有 60 天是拿一个失效的判断扛 60 天。数据截至 2026-10-30最新完整交易日· 股票池 300 只时点成分股 · 切分训练 2016-2019 / 验证 2020-2022 / 测试 2023-2026 · 模型 LightGBM30 个价量特征· 全部数字可复现文末有命令。一、这次到底做了什么环节做法关键约束数据源本地 qlibcn_data_2026chenditc 日更版 手工追加 最新到 2026-10-30股票维度的最新完整横截面是 10-30见下方数据陷阱股票池沪深300 时点成分股用成分文件的 start/end 区间逐日还原 不拿今天的 300 只倒推历史避免幸存者偏差637 只曾在池内特征30 个价量特征动量/反转/波动/均线/RSI/量比/Amihud/Beta/52周位置…数据源没有基本面字段特征全部无量纲标签未来 5 日收益close(t5)/close(t)-1对齐月度调仓训练样本必须满足标签期末早于预测日切分训练 2016-2019 / 验证 2020-2022 / 测试 2023-2026超参、topK、调仓频率只在验证期选测试期只跑一次模型LightGBMleaves 63 / lr 0.03 / min_leaf 100 / ff 0.8年度 walk-forward 重训每折只用折前标签已知的样本训练组合等权 top10每 20 个交易日调仓 信号 T 日收盘 → T1 日收盘成交涨停买不进、停牌不可交易成本买入 0.05% / 卖出 0.15% / 单笔最低 5 元账户 100 万与本仓库历史项目同口径可比基线沪深300买入持有、池内等权 300 只、MA20 趋势过滤、零成本对照必须保留干脆别择时的退路⚠️ 数据陷阱本次实际踩到 qlib 的日历到 2026-10-30但 300 只成分股里 298 只的行情只到 2026-10-27—— 之前的日更脚本默认只补 2 只标的。直接用会得到最后 3 天全 NaN、特征失效、模型输出乱码。 本次用tools/append_latest_bars.py --symbols-file … --until 2026-10-30把这 300 只补到 10-30腾讯不复权价 × 既有 factor与原始价逐只核对偏差 0.000%并排除了当天未收盘的 bar。二、信号强度RankIC 与分档分年度样本外 RankICwalk-forward 每折只用折前数据训练。20210.0070与 20260.0089已弱到 t1.5。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D7IlORR6-1793842490204)(img/fig3_buckets.png)]预测分位越靠前未来 5 日平均收益越高——两期都单调说明排序信号本身成立。三、回测结果[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rljFEdBS-1793842490205)(img/fig1_nav.png)]左验证期选型只用这段右测试期冻结后一次性评估。组合年化年化波动夏普IR超额年化最大回撤策略 top10 月调含成本20.86%29.94%0.70122.39%24.29%-28.31%策略零成本对照23.60%29.97%0.79136.45%27.12%-27.10%池内等权 300 只0.52%19.51%0.0349.02%2.58%-28.36%MA20 趋势过滤-5.15%20.81%-0.25-36.30%-3.19%-38.02%沪深300 买入持有-2.31%20.34%-0.110.00%0.00%-39.59%测试期 2023-01-01 ~ 2026-10-30一次性评估策略 top10 月调含成本-2.13%32.01%-0.07-7.17%-1.59%-50.74%策略零成本对照-0.02%32.00%-0.002.42%0.54%-50.01%池内等权 300 只2.74%17.28%0.1636.99%1.96%-25.13%MA20 趋势过滤0.52%18.27%0.03-3.22%-0.26%-26.89%沪深300 买入持有0.65%17.14%0.040.00%0.00%-24.80%⛔ 测试期结论不好听但是真的 策略年化 -2.13%、最大回撤 -50.74% 三个基线里没有一个被跑赢——连300 只等权不动都拿到 2.74%。 拆解①零成本也只有 -0.02% 说明信号在组合层面就没有把择时优势变成收益②成本每年再扣约 2.1 个点 ③集中到 10 只后年化波动 32.01%波动拖累把算术平均超额吃掉了。同一套模型换配置验证期挑中的橙在测试期反而最差——排序完全反转说明差异都在噪声里。测试期累计交易成本周度调仓的换手是月度调仓的 3.5 倍。四、诚实结论排序信号可用组合信号不可用。分档结果说明模型确实能把未来涨得好的排在前面 但把这个排序压缩成10 只、月度调仓、等权之后算术超额被波动拖累与成本吃掉。 如果要继续做方向是更宽的持仓池——这一点在第六节被实测证实但同一句话里的“更长的持有期季度调仓”在第六节被我自己推翻。 2. 单一切分不足以定论。本次额外试了一个指数跌破 MA60 空仓的过滤变体 验证期它更差IR 0.21 vs 1.22 按协议只在验证期选型不采用但它在测试期反而更好年化 8.76%。 这既说明一刀切会错过东西也说明单次切分的结论不该被当成定论——本次两边都如实写出来。 3. 不要把模型输出当目标价。表里的预测 5 日收益是回归输出横截面可比、绝对值不可信 也不是任何意义上的收益承诺。五、模型当前的 Top 102026-10-30观察名单[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-US0oHM2J-1793842490205)(img/fig5_picks.png)]左模型预测的未来 5 日收益右近 20 日实际涨跌。预测值全部为正但幅度普遍很小。排名名称预测5日预测分位近20日距60日高点日波动(20日)模型主要依据SHAP 贡献风险标签1天孚通信SZ3003944.74%100%-44.76%-49.12%6.7%20日振幅0.1正向贡献20日均线斜率-0.2正向贡献60日Beta3.5正向贡献20日已跌 45% · 日波动 7% · 创业板±20% · 距60日高点 -49%2芯原股份SH6885213.61%100%-52.67%-57.40%4.5%20日均线斜率-0.3正向贡献60日波动率0.1正向贡献120日动量-0.6正向贡献20日已跌 53% · 日波动 5% · 科创板±20% · 距60日高点 -57%3国电电力SH6007951.80%99%2.10%-1.83%1.7%20日超额收益-0.026正向贡献距60日高点-0.018正向贡献量能比(5/20)0.3正向贡献—4中信银行SH6019981.33%99%4.99%0.00%1.4%距60日高点0正向贡献60日均线斜率0.2正向贡献20日超额收益-0.005正向贡献—5工业富联SH6011381.22%99%-26.22%-34.94%3.5%20日均线斜率-0.2正向贡献250日价格位置0负向贡献20日振幅0.049正向贡献20日已跌 26% · 距60日高点 -35%6锐捷网络SZ3011651.18%98%-42.88%-56.89%3.4%60日均线斜率0.3正向贡献波动率变化(20/60)-0.3负向贡献60日Beta3.0负向贡献20日已跌 43% · 创业板±20% · 距60日高点 -57%7英维克SZ0028371.06%98%-33.94%-44.81%3.2%波动率变化(20/60)-0.1负向贡献20日振幅0.1正向贡献120日动量-0.5正向贡献20日已跌 34% · 距60日高点 -45%8川投能源SH6006741.05%98%9.90%-0.67%1.0%20日振幅0.021正向贡献RSI(14)69.7正向贡献距60日高点-0.007正向贡献—9平安银行SZ0000011.00%97%3.01%-1.19%1.3%距60日高点-0.012正向贡献20日超额收益-0.002正向贡献20日振幅0.021正向贡献—10华工科技SZ0009881.00%97%-39.60%-45.32%3.6%60日均线斜率-0.4负向贡献20日均线斜率-0.2正向贡献250日价格位置0负向贡献20日已跌 40% · 距60日高点 -45%⚠️ 名单要这么读 ① 前 2 位天孚通信、芯原股份近 20 日分别跌了 45% 和 53%模型给它们最高分是因为 超跌 高振幅 高 Beta的反转特征——这是赌反弹不是赌基本面反弹失败就是继续跌 ② 10 只里有 3 只是创业板/科创板±20% 涨跌幅、单日波动更大 ③ 名单里没有基本面信息数据源没有财务字段任何公司变好了的说法都是我自己加的不是数据说的。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oSnycMFo-1793842490205)(img/fig8_price.png)]Top 10 近 6 个月走势qlib 前复权价起点100。六、先认错我上一版提的拉长持有期是错的上一版的结论里我写过一句“如果要继续做方向是更宽的持仓池、更长的持有期例如 top 10% ≈ 30 只、季度调仓”。这半句是对的另外半半是错的。下面是把它拆开实测的结果。左图验证期、右图测试期。三条线分别是月度、季度、半年调仓。持仓调仓验证期年化验证IR测试期年化测试IR测试期MDDtop10月度原方案20.86%1.22-2.13%-0.07-50.74%top10季度0.26%0.17-4.10%-0.18-52.40%top10半年-2.93%-0.013.10%0.19-55.66%top20月度11.66%1.072.96%0.20-41.98%top20季度-2.12%0.05-1.55%-0.09-47.48%top20半年-4.65%-0.180.78%0.07-52.46%top30月度8.54%1.023.47%0.28-38.79%top30季度-2.03%0.052.56%0.22-40.89%top30半年-5.61%-0.34-0.44%-0.03-45.94%top50月度2.89%0.653.34%0.34-37.05%top50季度0.57%0.364.63%0.52-41.36%top50半年-4.05%-0.23-2.09%-0.24-44.57%top100月度3.13%0.972.23%0.27-32.19%top100季度2.40%0.844.92%0.75-33.65%top100半年-1.64%0.07-0.83%-0.18-35.57%放宽有效同样是月度调仓把持仓从 10 只放到 20 只测试期年化从 -2.13% 变成 2.96%MDD 从 -50.74% 收窄到 -41.98%放到 30 只是 3.47%。原因很直白——10 只票的年化波动冲到 32%波动拖累把算术超额吃干净了。拉长无效而且相当糟糕所有 K 在改成 60 日、120 日调仓后验证期年化普遍掉到 0 以下top20 从 11.66% 掉到 -2.12%。这不是成本问题成本确实降到 3 万是信号寿命问题——模型预测的是未来 5 日收益拿 60 天去持有等于用 55 天去赌一个已经失效的判断。所以我上一版的建议要改成更宽的池子更短的持有期。七、真正管用的修正top20 缓冲带既然换手是成本的主要来源就该在换手上下手。规则很简单老仓位只要还在 top40 就不动只有跌出前 40 名才换掉空出的名额用新名字补。持仓缓冲带验证期年化验证IR测试期年化测试IR测试期MDD每月替换测试期成本top20无11.66%1.072.96%0.20-41.98%78%8.1万top20×2跌出 top40 才换13.12%1.196.11%0.40-45.10%70%7.7万top20×3跌出 top60 才换11.01%1.045.33%0.35-45.52%63%7.2万top30无8.54%1.023.47%0.28-38.79%76%8.6万top30×2跌出 top60 才换7.63%0.923.42%0.28-42.51%64%7.2万top30×3跌出 top90 才换5.44%0.746.15%0.50-40.35%56%6.7万选定 top20 2 倍缓冲带验证期 13.12%IR 1.19原方案 20.86% / 1.22几乎打平测试期 6.11%IR 0.40、MDD -45.10%跑赢沪深3000.65%和300 只等权不动2.74%两条基线。代价也写在表里测试期总成本 7.7 万元约 2.03%/年每月约 14 只被替换也就是约 28 笔委托。缓冲带只把换手从 78% 压到 70%——这个模型的排名本身就不稳再懒的规则也压不住。纪律提示测试期被近 30 个配置看过属于多重比较。可信的是方向放宽 缓冲带能降低单票依赖不可信的是top20/×2 恰好最优。反面例子就在同一张表里top30 5 倍缓冲的验证期 IR 1.44 是全网格最高测试期却只有 1.73%。选型越精细样本外越难看——这是这个模型的老毛病。八、调整后的 20 只[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLGoiJNh-1793842490205)(img/fig11_basket.png)]#代码名称板块现价元一手金额权重1SZ300394天孚通信创业板148.0014,8005.00%2SH688521芯原股份科创板98.199,8195.00%3SH600795国电电力主板5.355355.00%4SH601998中信银行主板9.469465.00%5SH601138工业富联主板45.004,5005.00%6SZ301165锐捷网络创业板63.806,3805.00%7SZ002837英维克主板37.803,7805.00%8SH600674川投能源主板17.881,7885.00%9SZ000001平安银行主板11.641,1645.00%10SZ000988华工科技主板62.156,2155.00%11SH603501豪威集团主板82.458,2455.00%12SH600522中天科技主板23.172,3175.00%13SH601229上海银行主板9.319315.00%14SZ002142宁波银行主板35.173,5175.00%15SZ300433蓝思科技创业板25.582,5585.00%16SZ002049紫光国微主板47.394,7395.00%17SZ002384东山精密主板86.068,6065.00%18SZ300408三环集团创业板79.237,9235.00%19SH601728中国电信主板7.017015.00%20SH601169北京银行主板5.665665.00%等权 5%每 20 个交易日调仓一次老仓位跌出 top40 才换。最小可执行资金20 只各买一手合计 90,030 元。这里有个坑值得记一笔qlib 的$close是原始价 × 复权因子之后的连续序列不能直接当成交价用芯原股份在那里显示 0.66 元实际 98 元。表里的现价是按$close / $factor还原的真实市场价。还要看清楚这 20 只是什么东西其中 11 只近 20 日跌幅超过 20%模型给它们高分的理由是超跌 高振幅 高 Beta的反转特征——这是赌反弹不是赌基本面。反弹失败就继续跌。九、有没有现成 ETF 可以直接买没有这套组合是模型每天重排出来的 top20。ETF 只能复制指数复制不了某个模型的当期名单。所以只有三条路方案你能拿到什么年成本操作量沪深300ETF510300 / 510310 / 510330指数收益测试期 0.65%/年0.20%管理费 0.15% 托管费 0.05%1 笔沪深300指数增强 ETF561990、159238 等别人家的增强模型和这个模型无关159238 规模只有 5406 万以公告为准1 笔自建 20 只 缓冲带回测那套测试期 6.11%/年约 2.03%每月约 28 笔关键在这笔账自建的年化成本约 2.0 个点几乎等于模型相对300 只等权的全部超额6.11% vs 2.74%约 3.4 个点。也就是说这套策略的钱不是省 ETF 管理费省出来的是扣完交易成本还剩多少决定的。如果你不能接受每月 28 笔委托实质上就只剩买沪深300ETF 这一条路——那就等于承认放弃选股。十、怎么用这份名单这一节是改过的把它当研究起点不是买入清单。先看这 20 只各自的公告、财报、订单和估值本文的任何数据里都没有财务字段。要上组合先做减法。上一版写的是扩到 20-30 只、把调仓拉长到一个季度——前半句保留实测有效后半句删掉实测无效见第六节。正确做法是20 只 月度调仓 2 倍缓冲带每月只换掉跌出 top40 的那几只。把成本算进去。周度调仓的换手是月度的 3.5 倍自建 20 只的方案测试期成本 2.0%/年是策略超额的主要消耗项。数据要跟到最新。本次就因为成分股行情停在 10-27 而返工了一轮见第一节数据陷阱。复盘这一轮最值钱的不是哪个数字是那句被自己推翻的话。附录A. 6 组配置的验证期 / 测试期对照选型只依据左半边配置验证期 IR验证期年化测试期 IR测试期年化测试期 MDD测试期成本K5 · 周度0.7517.24%0.204.94%-46.58%31.7 万K5 · 月度0.6113.47%0.163.92%-63.30%7.4 万K10 · 周度0.333.31%0.183.15%-46.76%33.8 万K10 · 月度1.2220.86%-0.07-2.13%-50.74%7.8 万K20 · 周度0.392.58%-0.13-2.36%-39.32%29.6 万K20 · 月度1.0711.66%0.202.96%-41.98%8.1 万B. 最终模型特征重要性分裂次数top12 / 共 30特征字段分裂次数60日Betabeta_603240流动性变化liq_change312860日均线斜率ma_slope_60296860日波动率vol_60278320日振幅hl_range_202683250日价格位置price_pos_250255920日均线斜率ma_slope_202463120日动量mom_1202449波动率变化(20/60)vol_ratio241520日波动率vol_202132距60日高点dd_60201660日动量mom_601937生成时间2026-10-30 数据截面 · 风险提示本文是回测复盘不构成投资建议模型输出与历史回测均不预示未来收益。