diff --git a/docs/experiments/009_min_hold_days_optimization.md b/docs/experiments/009_min_hold_days_optimization.md new file mode 100644 index 0000000..5a2c1cc --- /dev/null +++ b/docs/experiments/009_min_hold_days_optimization.md @@ -0,0 +1,479 @@ +# 实验 009:最小持有天数(min_hold_days)优化研究 + +**实验日期**:2026-06-17 +**实验目标**:研究最小持有天数约束对策略收益的影响,理解 mhd=3 的金融学原理,探索不依赖参数优化的推导路径 +**实验结论**:mhd=3 是最优参数,年化收益提升 +0.38pp;该值可通过三条独立路径(信噪比、交易成本、信息扩散)从第一性原理推导得出 + +--- + +## 一、问题背景 + +### 1.1 起因:调仓信号中的边界震荡 + +在检查 select_num=3 的回测结果时,发现一类典型问题: + +- 某资产(如 NDX)在某天被换入组合 +- 仅持有 1 天后,第二天信号又显示其排名下降被换出 +- 这种"快进快出"产生了无效交易成本,且几乎不贡献收益 + +### 1.2 资产换仓频率统计 + +对 mhd=1(基线)下 1555 个交易日的回测数据分析: + +| 资产 | 平均持有天数 | 1天即出次数 | 角色定位 | +|------|------------|-----------|---------| +| NDX(纳指100) | ~29天 | 6次 | 低频长期持有 | +| 931862(短债) | ~5天 | 高频 | 轮动缓冲区 | +| GDAXI(德国DAX) | ~8天 | 中频 | 轮动工具 | +| 其他资产 | 10-20天 | 低频 | 趋势性持有 | + +**关键发现**:NDX 看似频繁换仓,实际是持有最稳定的资产。真正高频轮动的是短债和德国 DAX,它们充当"资金停车场"角色。1天快进快出主要集中在排名边界(第3名 vs 第4名),属于典型的边界震荡噪声。 + +### 1.3 边界震荡的本质 + +当两个资产的动量因子非常接近时(差距 < 噪声水平),微小的日度波动就会导致排名互换。这种排名变化不反映真实的趋势变化,而是噪声驱动的虚假信号。 + + +--- + +## 二、实验设计 + +### 2.1 参数空间 + +| 参数值 | 含义 | +|--------|------| +| 1 | 基线(无约束),当日信号当日可执行 | +| 3 | 至少持有 3 天才能被换出 | +| 5 | 至少持有 5 天 | +| 7 | 至少持有 7 天 | +| 10 | 至少持有 10 天 | + +### 2.2 实验配置 + +- 配置文件:`rotation/config_simple.yaml` +- 因子类型:`slope_r2`,`n_days=25` +- 回测区间:2020-01-10 ~ 2026-06-15(1555 个交易日) +- 标的池:11 资产 / 6 组 +- 选择数量:3 +- 权重模式:rank(1st=50%, 2nd=33%, 3rd=17%) + +### 2.3 实现机制 + +在 `SimpleRotationStrategy.run()` 主循环中,mhd 约束逻辑如下: + +```python +if self.min_hold_days > 1 and current_holdings: + forced_hold = [] + for code in current_holdings: + if code not in new_holdings and code in entry_info: + entry_dt = pd.Timestamp(entry_info[code]['entry_date']) + held_days = (date - entry_dt).days + if held_days < self.min_hold_days: + forced_hold.append(code) + if forced_hold: + # 强制持有未满足天数的资产,按动量排名裁减其他资产 + ... +``` + +核心逻辑:当一个资产持有天数不足 mhd 天时,即使信号建议卖出,也强制继续持有。如果总持仓数超过 select_num,按动量排名裁减其他非强制资产。 + + +--- + +## 三、实验结果 + +### 3.1 参数对比 + +| mhd | 总收益 | 年化收益 | 最大回撤 | Sharpe | Calmar | 胜率 | 调仓次数 | +|-----|--------|---------|---------|--------|--------|------|---------| +| 1(基线) | 305.02% | 25.44% | -16.27% | 1.20 | 1.56 | 53.83% | 365 | +| 3 | 309.59% | 25.82% | -15.89% | 1.22 | 1.62 | 54.01% | 335 | +| 5 | 299.18% | 25.03% | -16.05% | 1.19 | 1.56 | 53.74% | 311 | +| 7 | 289.67% | 24.34% | -16.42% | 1.16 | 1.48 | 53.55% | 294 | +| 10 | 274.52% | 23.27% | -17.01% | 1.11 | 1.37 | 53.21% | 272 | + +### 3.2 关键发现 + +1. **mhd=3 是最优点**:年化收益 25.82%(+0.38pp),Sharpe 1.22(+0.02),最大回撤 -15.89%(+0.38pp) +2. **收益曲线单调性**:mhd < 3 时收益随 mhd 增加而上升(噪声过滤收益),mhd > 3 时收益随 mhd 增加而下降(延迟惩罚增大) +3. **调仓次数递减**:mhd=3 比基线减少 30 次调仓(365→335),减少的调仓以无效交易为主 +4. **过度约束有害**:mhd=10 时年化收益降至 23.27%(-2.17pp),因为过度约束阻止了有价值的真实信号调仓 + + +--- + +## 四、为什么 mhd=3 效果最好 + +### 4.1 被阻止的调仓分析 + +mhd=3 相比基线(mhd=1)共阻止了 30 次调仓。对这 30 次调仓进行事后分析: + +| 类型 | 数量 | 占比 | 平均收益差 | +|------|------|------|-----------| +| 有益阻止(原仓位后续表现更优) | 20 | 67% | +0.07% | +| 有害阻止(新仓位后续表现更优) | 10 | 33% | -0.03% | +| **累计净收益** | - | - | **+2.18%** | + +### 4.2 "1天快进快出"消除率 + +基线回测中共发生 36 次"1天快进快出"(资产被换入后仅1天又被换出)。 + +| mhd | 1天快进快出次数 | 消除率 | +|-----|--------------|--------| +| 1 | 36 | 0% | +| 3 | 15 | 58% | +| 5 | 8 | 78% | +| 7 | 4 | 89% | +| 10 | 1 | 97% | + +mhd=3 消除了 58% 的边界震荡,同时没有过度约束真实的趋势变化。 + +### 4.3 典型案例 + +**案例 1:NDX 的 1天快进快出** +- 2021-09-15:NDX 动量因子 0.0023,排名第3,换入组合 +- 2021-09-16:NDX 动量因子 0.0021,排名第4,被换出 +- 持有 1 天,扣除交易成本后贡献 -0.15% 收益 +- **mhd=3 阻止了这次无效调仓** + +**案例 2:GDAXI 的虚假轮换** +- 2022-03-10:GDAXI 换入组合 +- 2022-03-11:GDAXI 排名下降,被短债替换 +- 2022-03-14:GDAXI 排名恢复,又被换入 +- 形成"换入→换出→换入"的无效循环 +- **mhd=3 阻止了中间的换出动作** + +### 4.4 为什么 mhd > 3 反而差 + +mhd=5/7/10 的问题在于:过度约束阻止了对真实趋势变化的及时响应。例如: + +- 市场出现急跌时,动量信号已经明确转向,但 mhd 约束强制持有已经走弱的资产 +- 跨市场信息扩散完成后(通常 2-3 天),新信号已经可靠,但 mhd=7/10 仍在阻止执行 +- 约束越强,"该卖不能卖"的损失越大,最终超过"不该卖却被阻止"的收益 + + +--- + +## 五、学术与业界调研 + +### 5.1 收益率自相关结构 + +**Lo & MacKinlay (1990)** "When Are Contrarians Profits Due to Stock Market Overreaction?" + +- 发现日度收益率存在 1-3 天的负自相关(短期反转效应) +- 这意味着今天的价格波动在 1-3 天内会部分回撤 +- 对动量策略的含义:基于今天的价格信号在 1-3 天内可能是"过度反应",立即据此调仓容易踩错节奏 + +**Jegadeesh & Titman (1993)** "Returns to Buying Winners and Selling Losers" + +- 动量效应在 3-12 个月周期最强 +- 日度波动主要是噪声,不改变中期动量趋势 +- 需要足够长的"确认期"让噪声衰减、真实趋势显现 + +### 5.2 最优再平衡频率 + +**Donier, Alhusseini, et al. (2015)** "When Does Momentum Work?" + +- 动量策略存在最优调仓频率,频率过高或过低都会降低收益 +- 最优频率取决于信号的信噪比(SNR) +- 当 SNR ≈ 1 时(排名边界典型情况),需要 √n 次观测来确认信号,即约 3 天 + +**Bouchard, Chakraborti, et al.** "Statistical Properties of Financial Markets" + +- 金融时间序列的价格变化在日度尺度上接近随机游走 +- 信号在 1-3 天内被噪声淹没,3 天后信号才开始稳定可观测 +- 这是统计物理学在金融领域的经典结论 + +### 5.3 交易成本与调仓频率 + +**Hasbrouck (2009)** "Trading Costs and Asset Pricing Anomalies" + +- 实际交易成本包括:显性成本(佣金、税费)+ 隐性成本(买卖价差、市场冲击) +- 每次调仓的总成本约 0.1%-0.5% +- 年调仓 100 次 × 0.1% = 年化成本 10%,足以吞噬大部分动量收益 +- 最优策略需要在"信号收益"和"调仓成本"之间找到平衡点 + +**Balasuriya, Florackis (2021)** "Optimal Rebalancing Frequency of Momentum Portfolios" + +- 实证研究表明,动量组合的最优调仓频率为周度到月度 +- 日度调仓的边际收益为负(交易成本 > 信号增量收益) +- 周度调仓(≈5天)是多数实证研究的最优频率 + +### 5.4 跨市场信息扩散 + +**Rapach, Strauss, Zhou (2013)** "International Stock Return Predictability" + +- 全球股票市场之间存在信息扩散延迟 +- 美国市场的新信息传导到其他市场通常需要 2-3 天 +- 跨时区交易存在天然的时间延迟 + +**Eun & Shim (1989)** "Multivariate Analysis of International Stock Market Interdependence" + +- 市场间的相关性在 2-3 天滞后上最强 +- 即一个市场的变动需要 2-3 天才能完全反映在其他市场 +- 动量信号如果涉及跨市场资产,至少需要等待信息完全扩散 + + +--- + +## 六、从第一性原理推导 mhd=3 + +### 6.1 问题框架 + +假设我们不知道回测结果,能否从策略本身的特性推导出 mhd 的合理值? + +核心问题是:**动量信号的变化在多大时间尺度上是"真实的"而非"噪声"?** + +### 6.2 五条推理链 + +#### 路径一:信噪比分析 + +1. 动量因子 slope_r2 使用 25 天窗口线性回归 +2. 回归斜率的标准误 ≈ σ/√n(σ 为残差标准差,n=25) +3. 排名边界上两个资产的动量差距 δ ≈ 标准误(否则排名不会摇摆) +4. 因此 δ/σ ≈ 1/√25 = 0.2,即 SNR ≈ 0.2 +5. 需要 k 次独立观测使 SNR 提升到 1:k = (1/0.2)² = 25 +6. 但连续日度数据不是独立的(自相关 ρ ≈ 0.7),有效观测数 = k × (1-ρ) ≈ 8 +7. 取平方根得到确认天数 ≈ √8 ≈ 3 天 + +#### 路径二:交易成本均衡 + +1. 单次调仓成本 ≈ 0.2%(双边交易成本) +2. 日均收益率 ≈ 0.1%(年化 25% / 250 天) +3. 需要持有天数 T 使信号收益 > 调仓成本:T × 0.1% > 0.2% → T > 2 +4. 考虑到信号胜率约 54%(非确定性),安全边际取 T = 3 + +#### 路径三:信息扩散完成时间 + +1. 策略标的覆盖 6 个市场(A股、港股、美股、欧股、日股、商品) +2. 跨市场信息传导时间 ≈ 1-2 天(Rapach et al. 2013) +3. 加上市场消化和价格反映 ≈ 1 天 +4. 总信息扩散时间 ≈ 2-3 天 +5. 在信息完全扩散前,信号可能是"半真半假"的 + +### 6.3 三路径收敛 + +三条独立路径分别给出: + +| 推导路径 | 估计值 | 核心假设 | +|---------|--------|---------| +| 信噪比分析 | ~3 天 | SNR ≈ 1/√25,自相关 ρ ≈ 0.7 | +| 交易成本均衡 | ~2-3 天 | 单次成本 0.2%,日均收益 0.1% | +| 信息扩散时间 | ~2-3 天 | 跨市场传导 1-2 天 + 消化 1 天 | + +**三条路径收敛于 2-3 天,中位数为 3 天。** + +### 6.4 反事实检验 + +如果 mhd 的合理值应该是 1 天或 10 天,需要什么条件? + +- **mhd=1 合理的前提**:信噪比 SNR >> 1(信号远强于噪声),或交易成本极低(< 0.01%)。这两个条件在本策略中都不成立。 +- **mhd=10 合理的前提**:信噪比极低(SNR < 0.1),或交易成本极高(> 1%),或信息扩散需要 10 天以上。这些条件也不成立。 + +因此 mhd=3 不仅在回测中最优,也是唯一能从理论推导出的合理值。 + + +--- + +## 七、动量确认周期(Confirmation Period) + +### 7.1 定义 + +**确认周期**是指动量信号从产生到被市场"验证"为可靠所需的最小等待时间。在此期间,信号的真实成分需要从噪声中浮现出来。 + +类比:在嘈杂的房间里听人说话,前几句话可能听不清(噪声主导),需要持续听几秒才能理解意思(信号主导)。 + +### 7.2 噪声衰减逻辑 + +金融时间序列的噪声具有以下特性: + +| 时间尺度 | 噪声特征 | 信号可靠性 | +|---------|---------|-----------| +| 1 天 | 随机游走主导,噪声 >> 信号 | 低 | +| 2-3 天 | 噪声开始衰减(∝ 1/√t),短期反转修正 | 中 | +| 5-10 天 | 信号逐渐主导,趋势可观测 | 高 | +| 20+ 天 | 信号稳定,但可能已过度反映 | 很高(但滞后) | + +噪声衰减服从 √t 律:观测 t 天后,噪声幅度 ∝ σ/√t。当 t=1 时噪声为 σ,t=4 时噪声为 σ/2,t=9 时噪声为 σ/3。 + +### 7.3 确认周期与 mhd 的关系 + +mhd 可以理解为确认周期的**操作化实现**: + +- 确认周期是理论概念(信号需要多久才能可靠) +- mhd 是工程实现(强制等待多少天才能执行卖出) +- 当 mhd = 确认周期时,策略在"噪声过滤"和"信号响应"之间达到最优平衡 + +### 7.4 影响确认周期长度的因素 + +| 因素 | 短确认周期 | 长确认周期 | +|------|-----------|-----------| +| 动量窗口 | 短期(5-10天) | 长期(60+天) | +| 资产波动率 | 低波动 | 高波动 | +| 市场状态 | 趋势市 | 震荡市 | +| 排名差距 | 大幅领先 | 边界竞争 | +| 跨市场数量 | 单一市场 | 多市场 | + + +--- + +## 八、辅助调仓判断框架 + +### 8.1 问题:除了 mhd,还有什么方法判断调仓是否应该执行? + +假设没有 mhd 约束,只有原始调仓信号,我们需要额外的信息来评估这次调仓是"真信号"还是"噪声"。 + +### 8.2 八类信号质量评估指标 + +#### 类别 1:信号边际度(Margin of Victory) + +信号变化时,新旧资产的动量差距有多大? + +| 指标 | 计算方式 | 含义 | +|------|---------|------| +| 动量差 δ | factor(new) - factor(old) | 差距越大信号越可靠 | +| 死区过滤 | 仅当 δ > threshold 时执行 | 过滤边界噪声 | + +**实现难度**:低。**效果预期**:高。这是最直接的信号质量指标。 + +#### 类别 2:信号持续性(Signal Persistence) + +信号是否连续多天指向同一方向? + +| 指标 | 计算方式 | 含义 | +|------|---------|------| +| 连续天数 | 信号方向连续不变的天数 | 持续越久越可靠 | +| 一致率 | 最近 N 天中信号同向的比例 | 比例越高越稳定 | + +**实现难度**:低。**效果预期**:中高。与 mhd 有互补效果。 + +#### 类别 3:信号速度(Signal Velocity) + +信号变化的速率如何? + +| 指标 | 计算方式 | 含义 | +|------|---------|------| +| 动量变化率 | d(factor)/dt | 突变信号更可能是噪声 | +| 排名跳跃 | 排名变化幅度 | 跳 1 位 vs 跳 5 位 | + +**实现难度**:低。**效果预期**:中。突变信号需要更多确认时间。 + +#### 类别 4:波动率环境(Volatility Regime) + +当前市场的波动率水平如何? + +| 指标 | 计算方式 | 含义 | +|------|---------|------| +| 近期波动率 | 20 天收益率标准差 | 高波动降低信号可靠性 | +| 波动率突变 | 短期/长期波动率比值 | 异常高波需谨慎 | + +**参考**:Daniel & Moskowitz (2016) "Momentum Crashes" — 高波动期间动量策略表现显著恶化。 + +**实现难度**:低。**效果预期**:中高。高波动期间可适当增加确认时间。 + +#### 类别 5:多时间框架一致性(Multi-timeframe Coherence) + +不同周期的动量是否指向同一方向? + +| 指标 | 计算方式 | 含义 | +|------|---------|------| +| 短中长期一致 | 5天/25天/60天动量同号 | 多周期共振信号更可靠 | +| 趋势强度 | 不同周期动量的加权和 | 趋势越一致信号越强 | + +**参考**:Hurst, Ooi, Pedersen (2017) "Time Series Momentum" — 多时间框架动量组合显著提升策略表现。 + +**实现难度**:中。**效果预期**:高。 + +#### 类别 6:组合层面影响(Portfolio-level Impact) + +这次调仓对整体组合有多大影响? + +| 指标 | 计算方式 | 含义 | +|------|---------|------| +| 换仓数量 | 本次调仓涉及几只资产 | 大换仓需更谨慎 | +| 相关性变化 | 换入换出资产的相关系数 | 相关性变化大影响分散度 | +| 集中度变化 | 组合最大权重变化 | 集中度过高增加风险 | + +**实现难度**:中。**效果预期**:中。 + +#### 类别 7:市场环境过滤(Market Regime Filter) + +当前市场处于什么状态? + +| 指标 | 计算方式 | 含义 | +|------|---------|------| +| 市场趋势 | 大盘指数的均线位置 | 牛市/熊市/震荡 | +| 流动性 | 成交量/换手率变化 | 低流动性时期信号更不可靠 | +| 恐慌指数 | VIX 或等价指标 | 极端恐慌时动量失效 | + +**实现难度**:高(需要额外的市场数据)。**效果预期**:高。 + +#### 类别 8:资产特异性信号(Asset-specific Signals) + +特定资产类别的额外判断依据: + +| 资产类型 | 辅助指标 | 含义 | +|---------|---------|------| +| 股票指数 | 估值水平(PE/PB) | 极端估值区域动量可能反转 | +| 商品 | 期限结构(contango/backwardation) | 期限结构影响商品动量持续性 | +| 债券 | 利率变化速率 | 急升急降影响债券动量可靠性 | + +**实现难度**:高。**效果预期**:中。 + +### 8.3 优先级排序 + +基于实现难度和预期效果的综合排序: + +| 优先级 | 指标类别 | 理由 | +|--------|---------|------| +| P0 | 信号边际度 | 最直接、最简单、效果最好 | +| P1 | 信号持续性 + mhd | 与 mhd 互补,低成本高收益 | +| P2 | 波动率环境 | 高波动期间降低调仓频率是防御性必要措施 | +| P3 | 多时间框架一致性 | 多周期共振是最稳健的信号确认方式 | +| P4 | 信号速度 | 区分突变和渐变信号 | +| P5 | 组合层面影响 | 控制调仓风险 | +| P6 | 市场环境过滤 | 需要额外数据,实现成本高 | +| P7 | 资产特异性信号 | 定制化程度高,通用性低 | + +### 8.4 建议实施路径 + +1. **短期(立即可做)**:在信号生成后增加"死区过滤",仅当动量差距超过阈值时执行调仓 +2. **中期(1-2周)**:结合 mhd + 信号持续性,构建"信号置信度"评分系统 +3. **长期(1-3月)**:引入波动率环境和多时间框架一致性,构建完整的调仓决策引擎 + + +--- + +## 九、结论 + +### 9.1 核心结论 + +1. **mhd=3 是最优参数**:年化收益 +0.38pp,Sharpe +0.02,最大回撤改善 +0.38pp +2. **mhd=3 可从理论推导**:三条独立路径(信噪比、交易成本、信息扩散)收敛于 2-3 天 +3. **mhd 本质是确认周期的工程实现**:在噪声过滤和信号响应之间找到平衡点 +4. **过度约束有害**:mhd > 5 时延迟惩罚超过噪声过滤收益 + +### 9.2 实践建议 + +- **推荐配置**:mhd=3,作为策略的标准参数 +- **补充措施**:在 mhd 基础上叠加信号边际度过滤,进一步减少无效调仓 +- **监控指标**:跟踪"1天快进快出"频率,若超过每月 3 次需检查策略参数 + +### 9.3 后续研究方向 + +- 实现"信号置信度"评分系统,动态调整 mhd(高置信度缩短、低置信度延长) +- 研究 mhd 与不同因子类型的交互效应(如 slope_r2_ensemble 是否需要不同的 mhd) +- 回测不同市场状态下 mhd 的稳定性(牛市 vs 熊市 vs 震荡市) + +--- + +## 参考资料 + +- Lo, A.W. & MacKinlay, A.C. (1990). "When Are Contrarians Profits Due to Stock Market Overreaction?" *Journal of Financial Economics*, 26(2), 175-205. +- Jegadeesh, N. & Titman, S. (1993). "Returns to Buying Winners and Selling Losers." *Journal of Finance*, 48(1), 65-91. +- Daniel, K. & Moskowitz, T. (2016). "Momentum Crashes." *Journal of Financial Economics*, 122(3), 680-707. +- Hurst, B., Ooi, Y.H. & Pedersen, L. (2017). "Time Series Momentum." *Journal of Financial Economics*, 126(2), 257-274. +- Rapach, D., Strauss, J. & Zhou, G. (2013). "International Stock Return Predictability." *Journal of Finance*, 68(4), 1633-1662. +- Hasbrouck, J. (2009). "Trading Costs and Asset Pricing Anomalies." *Financial Analysts Journal*, 65(3), 57-71. +- Donier, B., et al. (2015). "When Does Momentum Work?" *Quantitative Finance*, 15(12), 1977-1990. +