Files
big-qmt/labs/analysis/etf/REPORT-new-config.md
2026-09-19 19:45:43 +08:00

20 KiB
Raw Blame History

ETF 自适应网格策略回测报告(新配置)

  • 配置来源:py-client/etc/_etf.yaml回测直接读取该文件,不再维护副本
  • 回测区间:2025-12-22 ~ 2026-09-18182 个交易日)
  • 标的:588000.SH510300.SH518880.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

defaultsadd_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.340.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×

四个关键读数

  1. 放大股数 ≈ 等比例放大盈亏:名义额 ×3.76、盈亏 ×3.98,几乎 1:1。这是"加杠杆" 不是"改进了策略";风险(回撤)同步从 0.25% 升到 0.48%。
  2. 入场机会没有变多:轮次 28 → 32+14%)。机会频率仍由市场决定(一年 59 个信号,见 §四)。
  3. 资金利用率仍然极低:平均只投出 2.24% 的钱,峰值 17.41%。 绝对盈亏与账户规模无关——把资金从 20 万加到 120 万,盈亏始终是 +6,110.84 收益率从 3.06% 被摊薄到 0.51%compare.py §C。这说明50 万并没有被用满
  4. 悲观成交假设下会亏钱2,551.340.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 完整轮次

完整轮次 3232 胜 0 负)
单轮平均利润 +195.81(最好 +684.48,最差 +139.36
平均持有 3.7 天(最长 23 天)
持有 ≤1 天就了结 22 / 3269%
平均档位 / 最大档位 1.16 / 4
底仓 / 补仓次数 33 / 5

69% 的轮次在 1 天内完成:新配置把单档金额放大到 1.814 万后1% 的止盈目标对应的绝对金额 变成 18140 元/档,达到速度没变,但单轮利润的绝对值被放大。 同时 平均只用 1.16 档(补仓 5 次),阶梯依然远未铺开。

3.2 资金占用

有持仓天数 73 / 18240.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+1min_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,5340.31% +6,1111.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-18182 个交易日)、同一份日线、同一 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 恒定 4855%、收益/回撤恒定 2.32.6×2 得 +12,2262.45%)、×4 得 +24,4534.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 买入持有