From d657f8506bd50a4437141a319828022be4950021 Mon Sep 17 00:00:00 2001 From: aszerW Date: Mon, 15 Jun 2026 18:51:13 +0800 Subject: [PATCH] docs: add execution delay impact experiment (008) --- .../experiments/008_execution_delay_impact.md | 221 ++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 docs/experiments/008_execution_delay_impact.md diff --git a/docs/experiments/008_execution_delay_impact.md b/docs/experiments/008_execution_delay_impact.md new file mode 100644 index 0000000..98fee79 --- /dev/null +++ b/docs/experiments/008_execution_delay_impact.md @@ -0,0 +1,221 @@ +# 实验 008:信号执行延迟对策略收益的影响 + +**实验日期**:2026-06-15 +**实验目标**:量化信号触发后延迟执行对策略收益的影响,评估策略的执行容错度 +**实验结论**:卖出必须立即执行;买入延迟 1 天可接受(-1.7pp),延迟 2 天以上策略失效 + +--- + +## 一、问题背景 + +### 1.1 当前执行机制 + +策略采用 T+1 执行模式: + +- **T 日 9:00**:信号触发,使用 T-1 收盘数据计算动量因子 +- **T 日 9:30**:开盘执行调仓(卖出 + 买入),使用 T 日 ETF 价格 + +信号生成和执行在同一天,延迟为 0。 + +### 1.2 测试目的 + +实盘中可能存在以下情况导致延迟执行: + +- 人工操作延迟 +- 系统故障导致未能及时下单 +- 流动性不足需要分批执行 +- 跨时区交易的时间差 + +需要量化这些延迟对策略的实际影响,评估策略的执行容错度。 + +### 1.3 两种延迟模式 + +调仓包含两个动作:**卖出**和**买入**。延迟执行有两种理解方式: + +| 模式 | 卖出时机 | 买入时机 | 等待期间状态 | +|------|---------|---------|-------------| +| 模式 A:买卖都延迟 | 延迟 N 天 | 延迟 N 天 | 继续持有原仓位 | +| 模式 B:卖立即、买延迟 | 立即执行 | 延迟 N 天 | 已卖出部分变为现金 | + +两种模式对策略的影响可能不同,需要分别测试对比。 + +--- + +## 二、实验设计 + +### 2.1 延迟定义 + +| 延迟天数 | 含义 | +|---------|------| +| 0 | 基线(当前逻辑),T 日信号 → T 日开盘执行 | +| 1 | 延迟 1 天,T 日信号 → T+1 日开盘执行 | +| 2 | 延迟 2 天,T 日信号 → T+2 日开盘执行 | +| 3 | 延迟 3 天,T 日信号 → T+3 日开盘执行 | + +### 2.2 实验配置 + +- 配置文件:`rotation/config_simple.yaml` +- 因子类型:`slope_r2`,`n_days=25` +- 回测区间:2020-01-10 ~ 2026-06-15(1555 个交易日) +- 标的池:11 资产 / 6 组 +- 选择数量:3 +- 权重模式:rank + +### 2.3 实现方式 + +在 `SimpleRotationStrategy` 中增加 `execution_delay` 参数,通过修改 `run()` 主循环实现两种延迟模式。 + +--- + +## 三、实验 A:买卖都延迟 + +### 3.1 逻辑说明 + +信号变化后,整个调仓(卖出 + 买入)延迟 N 天执行。等待期间继续持有原仓位。 + +### 3.2 实验结果 + +| 延迟天数 | 总收益 | 年化收益 | 最大回撤 | Sharpe | Calmar | 胜率 | 调仓次数 | +|---------|--------|---------|---------|--------|--------|------|---------| +| 0 | 305.02% | 25.44% | -16.27% | 1.20 | 1.56 | 53.83% | 365 | +| 1 | 207.29% | 19.95% | -22.29% | 0.97 | 0.90 | 53.99% | 340 | +| 2 | 101.57% | 12.03% | -24.53% | 0.65 | 0.49 | 53.57% | 314 | +| 3 | 141.29% | 15.34% | -29.03% | 0.77 | 0.53 | 53.80% | 275 | + +### 3.3 NAV 走势对比(关键节点) + +| 交易日 | delay=0 | delay=1 | delay=2 | delay=3 | +|--------|---------|---------|---------|---------| +| 100 | 1.0785 | 1.0205 | 1.0287 | 1.1477 | +| 300 | 1.2462 | 1.1517 | 1.1148 | 1.3979 | +| 500 | 1.3847 | 1.2552 | 1.1666 | 1.4580 | +| 700 | 1.7195 | 1.4321 | 1.2339 | 1.4492 | +| 1000 | 1.8482 | 1.5281 | 1.3189 | 1.5750 | +| 1200 | 2.0596 | 1.7315 | 1.3590 | 1.7015 | +| 1555 | 4.0563 | 3.0775 | 2.0187 | 2.4165 | + +### 3.4 分析 + +**收益衰减规律**: + +``` +delay 0 → 1:年化 -5.5pp(-21.6%) +delay 1 → 2:年化 -7.9pp(-39.7%) +delay 2 → 3:年化 +3.3pp(+27.4%,非单调回升) +``` + +delay=3 略好于 delay=2 是非单调现象,原因是更长的延迟反而减少了无效调仓(275 vs 314 次),在某些场景下偶然捕获了更好的入场点。 + +**胜率不变,幅度衰减**: + +胜率在各延迟下几乎恒定(53.6% ~ 54.0%),说明: +- 方向判断不受延迟影响 — 同样的信号选出同样的标的 +- 收益差异来自入场价格 — 延迟越大,动量已走得越远,入场成本越高 + +**回撤恶化**: + +| 延迟 | 最大回撤 | 回撤恶化幅度 | +|------|---------|------------| +| 0 | -16.27% | 基线 | +| 1 | -22.29% | +6.0pp | +| 2 | -24.53% | +8.3pp | +| 3 | -29.03% | +12.8pp | + +延迟导致错过最佳出场时机,风险敞口增大。 + +--- + +## 四、实验 B:卖立即、买延迟 + +### 4.1 逻辑说明 + +信号变化后: +- **卖出立即执行**:当日开盘卖出,资金变为现金 +- **买入延迟 N 天**:等待期间资金闲置(0 收益),到期后开盘买入 + +### 4.2 实验结果 + +| 延迟天数 | 总收益 | 年化收益 | 最大回撤 | Sharpe | Calmar | 胜率 | 调仓次数 | +|---------|--------|---------|---------|--------|--------|------|---------| +| 0 | 305.02% | 25.44% | -16.27% | 1.20 | 1.56 | 53.83% | 365 | +| 1 | 271.78% | 23.71% | -15.60% | 1.15 | 1.52 | 53.06% | 365 | +| 2 | 96.92% | 11.61% | -21.40% | 0.66 | 0.54 | 50.87% | 653 | +| 3 | 4.30% | 0.68% | -35.67% | 0.13 | 0.02 | 48.93% | 890 | + +### 4.3 分析 + +**延迟 1 天影响很小**:年化仅损失 1.7pp(25.44% → 23.71%),最大回撤甚至略好(-15.60% vs -16.27%)。因为卖出及时执行,止损不受影响。 + +**延迟 2-3 天急剧恶化**:调仓次数从 365 飙升到 653/890,说明策略在频繁卖出又买入之间空转。等待期间仓位不满,资金闲置。 + +--- + +## 五、两种模式对比 + +### 5.1 关键指标对比 + +| 延迟 | 模式 A(买卖都延迟) | 模式 B(卖立即、买延迟) | 差异 | +|------|-------------------|---------------------|------| +| 1 天 | 年化 19.95%,回撤 -22.29% | 年化 23.71%,回撤 -15.60% | 模式 B 好 +3.8pp,回撤少 6.7pp | +| 2 天 | 年化 12.03%,回撤 -24.53% | 年化 11.61%,回撤 -21.40% | 基本持平 | +| 3 天 | 年化 15.34%,回撤 -29.03% | 年化 0.68%,回撤 -35.67% | 模式 A 好 +14.7pp | + +### 5.2 核心差异 + +**延迟 1 天时**:模式 B 明显优于模式 A +- 模式 B 年化高 3.8pp,回撤少 6.7pp +- 原因:及时止损比及时入场更重要 + +**延迟 2-3 天时**:模式 B 急剧恶化 +- 模式 B 调仓次数飙升(653/890 vs 314/275) +- 原因:频繁卖出后等待买入,仓位长期不满,资金闲置 + +### 5.3 根因分析 + +策略的 alpha 来源是 **25 天窗口内的短期动量**。信号触发后的第 1 个交易日 move 是动量最集中的阶段: + +- 信号触发时,标的刚进入强势趋势 +- 延迟 1 天 = 错过趋势最陡的一段 +- 延迟 2 天 = 趋势已衰减大半,入场性价比大幅下降 + +这与实验 007 的结论一致:策略本质是短期轮动而非长期趋势跟踪。 + +--- + +## 六、结论 + +### 6.1 核心结论 + +1. **卖出必须立即执行** — 及时止损比及时入场更重要 +2. **买入延迟 1 天可接受** — 年化仅损失 1.7pp,回撤略好 +3. **买入延迟 2 天以上策略失效** — 频繁空转,资金闲置 +4. **胜率不受延迟影响** — 衰减完全来自入场价格劣化 + +### 6.2 对实盘的要求 + +| 场景 | 可行性 | 预期影响 | +|------|--------|---------| +| T+1 完整执行(买卖同日) | 最佳 | 基线(年化 25.4%) | +| T+1 卖出,T+2 买入 | 可接受 | 年化约 23.7%(-1.7pp) | +| T+2 完整执行 | 勉强 | 年化约 12%(-13pp) | +| T+3 完整执行 | 不可接受 | 策略失效 | + +**实盘建议**: +- 信号生成当日必须完成卖出操作 +- 如果买入无法当日完成,可延迟 1 天,影响可控 +- 需要可靠的自动化下单系统 +- 不建议手动操作执行此策略 + +### 6.3 与实验 007 的关联 + +实验 007 证明策略的 alpha 来自 25 天短期动量(而非长期趋势)。本实验进一步证实:短期动量的有效窗口不仅在回看端(25 天),在执行端同样敏感 — 信号触发后 1-2 天内的执行质量决定了策略的实际表现。 + +--- + +## 七、代码变更 + +- `rotation/simple_rotation.py`: + - `__init__` 增加 `execution_delay` 参数 + - `run()` 主循环支持两种延迟模式: + - 模式 A:`pending_holdings` 存储完整调仓,等待期间持有原仓位 + - 模式 B:`pending_buys` 仅存储买入,卖出立即执行,等待期间资金闲置