This commit is contained in:
2026-09-19 19:45:43 +08:00
parent 7183cb45f8
commit 8131b158b4
60 changed files with 7669 additions and 909 deletions

View File

@@ -0,0 +1,354 @@
# ETF 自适应网格策略回测报告(新配置)
- 配置来源:`py-client/etc/_etf.yaml`**回测直接读取该文件,不再维护副本**
- 回测区间:**2025-12-22 ~ 2026-09-18182 个交易日)**
- 标的:`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.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.8~14 万后1% 的止盈目标对应的绝对金额
变成 18~140 元/档,达到速度没变,但**单轮利润的绝对值被放大**。
同时 **平均只用 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.3~2.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** | 同比例放大 || 死参数 | atr_multiplier / max_adds / 副出口 | **完全相同** | 结构性问题未解决 |
| 悲观成交 | +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 恒定 48~55%、收益/回撤恒定 2.3~2.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 日线缓存
```
```powershell
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 买入持有
```