20 KiB
ETF 自适应网格策略回测报告(新配置)
- 配置来源:
py-client/etc/_etf.yaml(回测直接读取该文件,不再维护副本) - 回测区间:2025-12-22 ~ 2026-09-18(182 个交易日)
- 标的:
588000.SH、510300.SH、518880.SH;日线 242 根(2025-09-19 ~ 2026-09-18,未复权) - 账户:起始 50 万、
min_cash_ratio=0.10、佣金max(5, 金额×0.0003) - 复现:
py -3.14 -B labs/analysis/etf/run.py(结果落results.json/run_report.txt) - 对照脚本:
compare.py(旧 vs 新)、capital.py(资金需求)、sweep.py(参数)、drawdown.py(浮亏轨迹) - 本报告只做分析,未修改任何策略代码。
本次配置变化
| 标的 | 旧 buy_shares |
新 buy_shares |
新 max_shares |
|---|---|---|---|
| 588000.SH | 1,000 | 10,000 | 100,000 |
| 510300.SH | 1,000 | 4,000 | 20,000 |
| 518880.SH | 1,000 | 2,000 | 10,000 |
defaults 段(add_pct 3.0 / min_profit_pct 1.0 / channel_pct 15 / max_adds 9 等)未改。
一、结论摘要
| 指标 | 基准(触价成交) | 贴近实盘(反弹价) | 悲观(收盘价) |
|---|---|---|---|
| 账户权益变动 | +6,110.84(+1.22%) | +8,426.54(+1.69%) | −2,551.34(−0.51%) |
| 最大回撤(权益口径) | 0.48% | 0.56% | 1.68% |
| 完整轮次 / 胜率 | 32 / 32 胜 0 负 | 27 / 27 胜 | 13 / 13 胜 |
| 单轮平均已了结利润 | +195.81 | — | — |
| 平均持有 / 最大持有 | 3.7 天 / 23 天 | — | — |
| 平均档位 / 最大档位 | 1.16 / 4 | — | — |
| 佣金合计 | 401.79 | 343.75 | 197.34 |
| 平均资金占用 / 峰值 | 2.24% / 17.41% | 3.40% / 17.85% | 6.71% / 24.83% |
和旧配置比,收益放大了 4 倍,但收益率只从 0.31% 提到 1.22%(同一 50 万账户)——因为放大的是仓位,不是机会。
| 旧配置 | 新配置 | 倍数 | |
|---|---|---|---|
| 买入名义额 | 176,668 | 664,705 | 3.76× |
| 权益变动(50 万账户) | +1,534.14 | +6,110.84 | 3.98× |
| 收益率 | 0.31% | 1.22% | 3.98× |
| 最大回撤 | 0.25% | 0.48% | 1.9× |
| 平均资金占用 | 0.67% | 2.24% | 3.3× |
| 占用 ROI(权益/平均占用) | 45.68% | 54.48% | 1.19× |
| 完整轮次 | 28 | 32 | 1.14× |
| 单轮平均利润 | 55.98 | 195.81 | 3.5× |
四个关键读数
- 放大股数 ≈ 等比例放大盈亏:名义额 ×3.76、盈亏 ×3.98,几乎 1:1。这是"加杠杆", 不是"改进了策略";风险(回撤)同步从 0.25% 升到 0.48%。
- 入场机会没有变多:轮次 28 → 32(+14%)。机会频率仍由市场决定(一年 59 个信号,见 §四)。
- 资金利用率仍然极低:平均只投出 2.24% 的钱,峰值 17.41%。
绝对盈亏与账户规模无关——把资金从 20 万加到 120 万,盈亏始终是 +6,110.84,
收益率从 3.06% 被摊薄到 0.51%(
compare.py§C)。这说明50 万并没有被用满。 - 悲观成交假设下会亏钱(−2,551.34,−0.51%)。新配置把仓位放大 4 倍后,
结论对成交假设的敏感度也放大了:
touch+6,111 /bounce+8,427 /close−2,551。
二、逐标的归因(基准)
| 标的 | 完整轮次 | 已了结净额 | 了结时仍持有 | 按成本净额 | 未实现 | 按市价净额 |
|---|---|---|---|---|---|---|
| 588000.SH | 12 | +2,011.94 | 0 | +2,011.94 | 0 | +2,011.94 |
| 510300.SH | 13 | +2,521.97 | 4,000 股 | −15,961.17 | −155.14 | −16,116.31 |
| 518880.SH | 7 | +1,732.07 | 0 | +1,732.07 | 0 | +1,732.07 |
| 合计 | 32 | +6,265.98 | — | −12,217.16 | −155.14 | −12,372.31 |
对平关系(已用脚本验证):权益变动 +6,110.84 = 已了结净额(含未了结成本)−12,217.16 + 未了结成本 18,483.14 − 未实现 155.14。
已了结净额 是现金流口径(把还在手上的仓位当成已花掉的钱),不是亏损:32 个了结轮次合计 +6,265.98。
⚠️ 最大的问题在这里:510300.SH 的 13 个轮次全部盈利(合计 +2,521.97),但最终一笔未了结的
4,000 股(成本 18,483) 让它的净额变成 −15,961。一只标的的未了结仓位,吃掉了三只标的
全部已了结利润(+6,266)的两倍半。旧配置里这个数字是 −4,035,放大 4 倍仓位后变成 −15,961。
三、成交结构与资金
3.1 完整轮次
| 项 | 值 |
|---|---|
| 完整轮次 | 32(32 胜 0 负) |
| 单轮平均利润 | +195.81(最好 +684.48,最差 +139.36) |
| 平均持有 | 3.7 天(最长 23 天) |
| 持有 ≤1 天就了结 | 22 / 32(69%) |
| 平均档位 / 最大档位 | 1.16 / 4 |
| 底仓 / 补仓次数 | 33 / 5 |
69% 的轮次在 1 天内完成:新配置把单档金额放大到 1.814 万后,1% 的止盈目标对应的绝对金额
变成 18140 元/档,达到速度没变,但单轮利润的绝对值被放大。
同时 平均只用 1.16 档(补仓 5 次),阶梯依然远未铺开。
3.2 资金占用
| 项 | 值 |
|---|---|
| 有持仓天数 | 73 / 182(40.1%) |
| 平均占用 | 11,216 元 = 2.24% |
| 峰值占用 | 87,052 元 = 17.41% |
| 买入名义 / 换手 | 664,705 元 / 1.33 倍 |
| 资金需求(按各标的区间最低价估) | 三只各 1 档 ≈ 46,518;铺满 10 档 ≈ 465,180 |
- 配置现在的理论满载需求是 46.5 万(三只各铺满 10 档),50 万账户刚好能承载。
- 但实际峰值只用到 8.7 万(17.4%)、平均 1.1 万(2.24%)——账户有 80% 以上的钱全年闲置。
3.3 佣金(新配置下更不是瓶颈)
| 项 | 值 |
|---|---|
| 佣金合计 | 401.79 |
| 占买入名义 | 0.06%(旧配置 0.184%) |
| 佣金率 0 → 0.0003 → 0.001 | +6,149.52 → +6,110.84 → +5,643.61 |
单档金额变大后几乎全部按 0.0003 计费(不再吃 5 元最低佣金),佣金成本降到可忽略。
min_profit_pct=1% 的绝对余量非常大(每档毛利润 ≈ 18~140 元 vs 双边佣金 10 元)。
3.4 逐月权益
| 月份 | 权益变动 | 幅度 |
|---|---|---|
| 2025-12 | 0.00 | 0.000% |
| 2026-01 | +260.08 | +0.052% |
| 2026-02 | +105.42 | +0.021% |
| 2026-03 | −773.15 | −0.155% |
| 2026-04 | +2,234.72 | +0.447% |
| 2026-05 | +456.96 | +0.091% |
| 2026-06 | +925.85 | +0.184% |
| 2026-07 | +1,530.46 | +0.304% |
| 2026-08 | +767.21 | +0.152% |
| 2026-09 | +603.29 | +0.119% |
9 个月里 1 个月亏损、8 个月盈利,但全部落在 ±0.45% 以内——典型的"小仓位、稳定、无感"。
四、为什么收益率还是上不去(新配置下的定量结论)
4.1 根因没变:机会数量由市场决定
| 标的 | 可回放日 | 最低价跌破门槛 | 入场信号 | 跌破门槛天数占比 |
|---|---|---|---|---|
| 588000.SH | 182 | 44 | 20 | 24.2% |
| 510300.SH | 182 | 47 | 29 | 25.8% |
| 518880.SH | 182 | 30 | 10 | 16.5% |
| 合计 | 546 | 121 | 59 | — |
一年 59 个信号(≈ 每天 0.32 次),本次实际建网 33 次、了结 32 轮。机会已被用尽。 33 次建网里,现价在过去 60 日收盘的分位中位数 6.7%,19/33 落在 10% 分位以下——入场门槛执行到位。
4.2 单档股数放大后,绝对盈亏与账户无关
| 起始资金 | 权益变动 | 收益率 | 平均占用 | 峰值占用 |
|---|---|---|---|---|
| 200,000 | +6,110.84 | 3.06% | 5.61% | 43.53% |
| 300,000 | +6,110.84 | 2.04% | 3.74% | 29.02% |
| 500,000 | +6,110.84 | 1.22% | 2.24% | 17.41% |
| 800,000 | +6,110.84 | 0.76% | 1.40% | 10.88% |
| 1,200,000 | +6,110.84 | 0.51% | 0.93% | 7.25% |
同一份交易、同一个盈亏,只因为分母变大,收益率就摊薄 6 倍。 所以"收益率低"要拆成两件事:①策略绝对赚钱能力(这 9 个月 +6,111 元); ②账户里有多少钱在真正干活(平均 2.24%)。
4.3 继续放大股数:收益线性涨、风险同步涨
| 场景(50 万账户) | 权益变动 | 收益率 | 最大回撤 | 平均占用 | 占用 ROI | 收益/回撤 |
|---|---|---|---|---|---|---|
buy_shares×0.25 |
+1,418.64 | 0.28% | 0.12% | 0.58% | 48.8% | 2.30 |
buy_shares×0.5 |
+3,077.19 | 0.62% | 0.24% | 1.11% | 55.4% | 2.54 |
| 现配置 | +6,110.84 | 1.22% | 0.48% | 2.24% | 54.5% | 2.56 |
buy_shares×2 |
+12,226.40 | 2.45% | 0.95% | 4.49% | 54.5% | 2.57 |
buy_shares×4 |
+24,452.81 | 4.89% | 1.89% | 8.97% | 54.5% | 2.59 |
占用 ROI 恒定在 48.8%54.5%,收益/回撤恒定在 2.32.6 —— 说明在这段样本里,
放大股数既不改善也不恶化风险调整后收益,只是等比放大。
既然风险调整后收益不变,放大到多大就取决于账户能承受的回撤:若接受 1.9% 回撤,
×4 可把 9 个月收益做到 +2.4 万(4.89%)。
五、参数敏感性(28 组,基准=当前 _etf.yaml)
| 场景 | 权益变动 | 收益率 | 最大回撤 | 底仓 | 补仓 | 主出口 | 副出口 | 佣金 | 平均占用 |
|---|---|---|---|---|---|---|---|---|---|
| 基准(当前配置) | +6,110.84 | 1.222% | 0.478% | 33 | 5 | 32 | 0 | 401.79 | 2.24% |
| add_pct=2.0 | +5,856.05 | 1.171% | 0.362% | 32 | 4 | 31 | 0 | 378.00 | 2.78% |
| add_pct=4.0 | +5,794.31 | 1.159% | 0.356% | 33 | 3 | 32 | 0 | 382.15 | 2.37% |
| add_pct=5.0 | +5,104.25 | 1.021% | 0.412% | 31 | 1 | 30 | 0 | 339.29 | 2.71% |
| min_profit_pct=0.5 | +3,475.39 | 0.695% | 0.498% | 41 | 4 | 40 | 0 | 477.22 | 1.56% |
| min_profit_pct=0.8 | +5,220.81 | 1.044% | 0.486% | 37 | 4 | 36 | 0 | 432.96 | 1.80% |
| min_profit_pct=1.5 | +6,560.59 | 1.312% | 0.438% | 23 | 4 | 22 | 0 | 284.56 | 3.21% |
| min_profit_pct=2.0 | +5,680.19 | 1.136% | 0.448% | 19 | 5 | 17 | 2 | 246.20 | 3.96% |
| channel_pct=1 | +3,287.51 | 0.658% | 0.677% | 23 | 4 | 22 | 0 | 283.33 | 3.07% |
| channel_pct=10 | +5,350.72 | 1.070% | 1.289% | 27 | 6 | 26 | 0 | 349.58 | 5.46% |
| channel_pct=20 | +5,579.94 | 1.116% | 0.480% | 28 | 6 | 27 | 0 | 352.61 | 3.25% |
| channel_pct=30 | +4,779.74 | 0.956% | 0.381% | 23 | 4 | 22 | 0 | 295.36 | 2.53% |
| max_adds=3 / 5 / 15 | +6,110.84 | 1.222% | 0.478% | 33 | 5 | 32 | 0 | 401.79 | 2.24% |
| inner_step=0.2 | +5,848.68 | 1.170% | 0.478% | 35 | 5 | 34 | 1 | 423.10 | 2.01% |
| inner_step=0.4 | +6,110.84 | 1.222% | 0.478% | 33 | 5 | 32 | 0 | 401.79 | 2.24% |
| 无副出口 | +6,110.84 | 1.222% | 0.478% | 33 | 5 | 32 | 0 | 401.79 | 2.24% |
| atr_multiplier×0.5 / ×2.0 | +6,110.84 | 1.222% | 0.478% | 33 | 5 | 32 | 0 | 401.79 | 2.24% |
| 无 T+1(min_hold_days=0) | +6,110.84 | 1.222% | 0.478% | 33 | 5 | 32 | 0 | 401.79 | 2.24% |
| 佣金率=0 / 0.001 | +6,149.52 / +5,643.61 | 1.230% / 1.129% | 0.478% / 0.491% | 33 | 5 | 32 | 0 | 350 / 1,317 | 2.24% |
| 成交=反弹确认价 | +8,426.54 | 1.685% | 0.558% | 28 | 5 | 27 | 0 | 343.75 | 3.40% |
| 成交=收盘价 | −2,551.34 | −0.510% | 1.676% | 15 | 6 | 13 | 0 | 197.34 | 6.71% |
与旧配置一致的三个"零影响参数"依然零影响(新配置下同样验证):
atr_multiplier×0.5 / ×2.0 → 结果一模一样:格距不参与任何触发价(docs/etf.md§3.3 的设计后果)。 逐标的 ATR 倍数标定(0.5/1.0/1.0)对成交没有任何影响。max_adds=3 / 5 / 15 → 结果一模一样:一年只补仓 5 次、最多 4 档,9 档闸门从未生效。inner_step=0.4 / 无副出口 → 结果一模一样:inner_grids×inner_step(1.4%~1.8%) 仍大于min_profit_pct(1.0%),副出口在基准下 0 次成交;只有压到 0.2 才触发 1 次。min_profit_pct=1.5%是本批唯一略优于基准的参数(+6,560.59 vs +6,110.84), 但差异仅 7%,在 32 个轮次的样本上不足以判定(旧配置同参数反而略差)。
六、风险:无止损 + 未了结仓位
6.1 未了结仓位的浮亏轨迹(均价法)
| 标的 | 持仓天数 | 最长连续浮亏天数 | 最深浮亏 | 最深浮亏% | 期末浮亏 |
|---|---|---|---|---|---|
| 588000.SH | 27 | 13 | −1,191 | −8.25% | +2 |
| 510300.SH | 47 | 7 | −651 | −3.54% | −150 |
| 518880.SH | 22 | 5 | −2,518 | −3.57% | +135 |
- 这三个标的的浮亏都不深(最深 −8.25%),且最后都回正(期末浮亏仅 −150 / +2 / +135)。 样本期(含 MA60 向下的 3~7 月)没有出现真正的单边下跌,尾部风险未被覆盖。
- 510300 的期末浮亏只有 −150 元(−0.8%),不是因为"亏得多",而是因为 4,000 股 × 4.62 的成本额(18,483)被算成了现金流出,所以在现金流口径里显得很吓人。
6.2 时间止损反事实(分析用)
| 规则 | 权益变动 | 收益率 | 占用 ROI | 强平次数 |
|---|---|---|---|---|
| 不止损(现配置) | +6,110.84 | 1.222% | 54.48% | 0 |
| 持有 >5 天且浮亏即平 | +5,914.84 | 1.183% | 52.73% | 3 |
| 持有 >10 天且浮亏即平 | +5,474.84 | 1.095% | 48.81% | 3 |
| 持有 >20 天且浮亏即平 | +4,838.84 | 0.968% | 43.14% | 3 |
时间止损在这段样本里是负收益(越早平仓越差),因为浮亏最终都修复了。 这说明:在均值回归有效的样本里,无止损是特征不是缺陷;它真正的风险只在单边下跌时才暴露, 而那部分样本这里没有。要不要加闸门,取决于你能否承受"一次单边下跌把 32 轮利润全部回吐" (旧配置里 510300 已经演示过一次:13 轮盈利被一笔未了结仓位反超)。
七、与旧配置的结论对比
| 项 | 旧配置(1,000 股/档) | 新配置(10,000/4,000/2,000) | 结论变化 |
|---|---|---|---|
| 50 万账户 9 个月收益 | +1,534(0.31%) | +6,111(1.22%) | 放大 4 倍(等比于仓位) |
| 最大回撤 | 0.25% | 0.48% | 同步放大 |
| 轮次 / 胜率 | 28 / 28 胜 | 32 / 32 胜 | 机会未变多 |
| 单轮平均利润 | 55.98 | 195.81 | 3.5 倍(仓位放大) |
| 平均资金占用 | 0.67% | 2.24% | 仍极低 |
| 占用 ROI | 45.68% | 54.48% | 略优(大单摊薄佣金) |
| 佣金/名义 | 0.184% | 0.06% | 降到可忽略 |
| 最大单一拖累 | 510300 −4,035 | 510300 −15,961 | 同比例放大 |
| 悲观成交 | +0.16% | −0.51%(转负) | 敏感度放大到会亏钱 |
新配置解决了"钱太少"的一部分(单轮利润从 56 元到 196 元),但没解决三件结构性问题: ①机会频率(由市场决定);②资金利用率(平均 2.24%);③无止损下单一标的拖累(同比例放大)。
八、和"买入持有"比:收益率更低,但资金效率与回撤好得多
同一区间(2025-12-22 ~ 2026-09-18,182 个交易日)、同一份日线、同一 50 万账户
(vs_hold.py,买入持有=首日等权买入三只 ETF 持到期末,忽略整手限制):
| 策略 | 期末权益 | 总收益 | 年化 | 最大回撤 | 日波动 | 夏普 | 卡玛 |
|---|---|---|---|---|---|---|---|
| ETF 网格(现配置) | 506,110.84 | +1.22% | 1.70% | 0.48% | 0.080% | 1.34 | 2.56 |
| 等权买入持有 | 526,201.75 | +5.24% | 7.33% | 16.75% | 1.747% | 0.40 | 0.31 |
逐标的区间涨跌:588000.SH +24.13%(期间最大回撤 31.19%)、510300.SH −3.13%、
518880.SH −5.28%(最大回撤 30.52%)。
分三种口径回答"哪个更好":
| 口径 | 胜者 | 差距 |
|---|---|---|
| 绝对收益(同样 50 万) | 买入持有 | +5.24% vs +1.22%(多赚 2 万,是网格的 4.3 倍) |
| 风险调整后(夏普/卡玛) | 网格 | 夏普 1.34 vs 0.40;卡玛 2.56 vs 0.31 |
| 资金效率 | 网格 | 平均只占用 2.24% 的钱就赚了 1.22%(占用部分 ROI 54.48%);买入持有 100% 占用 |
但是"同风险"才是公平的比法。 网格只投 2.24% 的钱、回撤 0.48%;买入持有投 100%、回撤 16.75%。 把网格单档股数放大到接近买入持有的回撤:
| 放大倍数 | 权益变动 | 总收益 | 最大回撤 | 平均占用 | 夏普 | 卡玛 |
|---|---|---|---|---|---|---|
| 1×(现配置) | +6,110.84 | 1.22% | 0.48% | 2.24% | 1.34 | 2.56 |
| 4× | +24,452.81 | 4.89% | 1.89% | 8.97% | 1.35 | 2.59 |
| 10× | +31,729.14 | 6.35% | 6.42% | 33.63% | 0.87 | 0.99 |
| 20× | +40,473.94 | 8.09% | 7.40% | 40.16% | 0.97 | 1.09 |
| 35× | 放大过头,被资金/10 档上限挡住,回测归零 | — | — | — | — | — |
结论:把仓位放大到 4~20 倍(回撤仍在买入持有的一半以内),网格的绝对收益
(4.89% ~ 8.09%)就能超过买入持有的 5.24%。也就是说——
现在配置下"买入持有更好"只是因为网格几乎没下注;同风险下网格的效明显更高。
但要注意这是同一段历史的外推,且样本期 588000.SH 涨 24%,是偏向"持有"的行情。
九、建议(按证据强度排序)
| # | 措施 | 量化依据 | 代价 | 需要改代码 |
|---|---|---|---|---|
| 1 | 把 buy_shares 提到风险预算允许的上限(或改成"每档 = 现金的 x%") |
占用 ROI 恒定 48×2 得 +12,226(2.45%)、×4 得 +24,453(4.89%) |
回撤同步到 0.95% / 1.89% | 只改 _etf.yaml |
| 2 | 扩充标的白名单(目标 6~10 只) | 收益率随标的数近似线性(1→3 只:0.20%→0.77%,见旧报告 §10.3);当前峰值占用仅 17.4%,容量充足 | 需逐标的标定筛选 | 只改 _etf.yaml |
| 3 | 接受或修掉 510300.SH 的未了结拖累 |
它的 13 轮盈利 +2,534 被一笔未了结仓位变成 −15,961,是三只里唯一的净负项 | 加闸门会引入已实现亏损(§6.2 显示样本内为负收益) | 需改 positions.py |
| 4 | 让副出口可达或删除 | inner_step 0.4 与"无副出口"结果完全一致;0.2 才有 1 次成交 |
改 _etf.yaml 一行 |
只改 _etf.yaml |
| 5 | 不要动 add_pct / channel_pct / atr_multiplier |
现值均不劣于邻域;atr_multiplier 完全无效 |
— | — |
| 6 | 验证成交假设 | touch +6,111 / bounce +8,427 / close −2,551;新配置下悲观模型已经转负 |
需 tick/分钟级数据 | — |
一句话:新配置把"每轮赚多少"放大了 3.5 倍,但收益率仍受限于"一年 59 个机会 × 平均只用 2.24% 的钱"。
下一步要提收益,只有两条路:扩标的(更多并行机会) 和 在可承受回撤内继续放大单档股数;
调参已被数据否决(唯一例外是 min_profit_pct=1.5%,但样本量不足以定论)。
十、复现
labs/analysis/etf/
├── backtest.py 回测内核(日线近似、三种成交模型、共享资金、T+1、sizer)
│ —— 配置直接读 py-client/etc/_etf.yaml
├── run.py 总报告生成器 → results.json / run_report.txt
├── compare.py 旧 vs 新配置对照 + 资金需求 + 规模敏感性
├── capital.py 资金需求与账户规模扫描
├── analysis.py 轮次统计 / 资金占用 / 逐月 / 28 组敏感性
├── sweep.py 改进方案扫描(参数 / 规模 / 组合)
├── universe.py 标的数量 × 资金规模
├── entries.py 入场机会频率
├── drawdown.py 未了结仓位浮亏轨迹 + 时间止损反事实
├── vs_hold.py 网格 vs 等权买入持有(同区间、同账户)
└── cache/*.json 日线缓存
cd D:\work\quant\big-qmt
py -3.14 -B labs/analysis/etf/run.py # 当前 _etf.yaml 的基准回测与报告
py -3.14 -B labs/analysis/etf/compare.py # 旧 vs 新对照
py -3.14 -B labs/analysis/etf/capital.py # 资金需求
py -3.14 -B labs/analysis/etf/drawdown.py # 浮亏轨迹
py -3.14 -B labs/analysis/etf/vs_hold.py # 网格 vs 买入持有