222 lines
7.8 KiB
Markdown
222 lines
7.8 KiB
Markdown
# 实验 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` 仅存储买入,卖出立即执行,等待期间资金闲置
|