# 三因子 G-Spread 相对价值套利策略报告

## 1. 结论摘要

本报告使用正式优化口径：`TERM >= 3Y`、`TRADING_AMOUNT_AVG >= 0.5`、日频 MTM、初始资金 1 亿元、组合账面杠杆上限 2 倍、空头成本 10 年及以内 0.23% 年化、10 年以上 1.30% 年化。回测区间为 2025-06-09 至 2026-06-18。

核心结果：期末权益 105,455,061.56，累计收益 5.4551%，年化收益 5.3892%，年化波动 3.7645%，Sharpe 1.4316，日频 MTM 最大回撤 -0.4056%，Calmar 13.2877。有持仓估值日 71 个，交易腿数 32。

该策略当前更像“模型偏离收敛”的相对价值原型，而不是可直接上线的实盘组合。样本内收益为正，回撤较低，但空头腿整体为负贡献，说明借券成本、流动性、税收和流动性溢价仍需在实盘前单独建模。

## 2. 模型介绍、拟合券池与估值曲线生成

### 2.1 CK 中可审计到的模型对象

三因子曲线本体存放在 ClickHouse `irgroup.bond_curve_data`。2026-06-09 这一天，该表对本策略使用的两类曲线各保存一条 V1F 和一条 V3F 曲线：`CNCGB_V1F/CNCGB_V3F` 于 19:45:09 更新，`CNCDB_V1F/CNCDB_V3F` 于 19:45:17 更新。策略只使用 V3F。

V3F 曲线行里保存了三类核心信息：

1. `MODEL_PARAMS`：模型参数 JSON。
2. 显式参数列：`X0/Y0/Z0/SIGMA_X/SIGMA_Y/SIGMA_Z`，分别对应 `MODEL_PARAMS` 里的 `r0/theta0/pi/sigma/sigma_theta/sigma_pi`。
3. `PAR_RATES`：已经由模型参数生成好的估值用 par curve 网格，每条 V3F 曲线有 200 个期限点，从 0.25Y 到 50Y，步长为 0.25Y。

需要特别说明：2026-06-09 的 `CNCGB_V3F` 和 `CNCDB_V3F` 行中，`HYPER_PARAMS` 与 `JSON_DATA` 均为空；系统表中也没有发现类似 curve constituent、fitting sample 或 fitting bond 的明细表。因此，当前 CK 可直接审计的是“曲线参数、曲线结果、以及哪些个券被映射到这条曲线做估值”，不是上游三因子拟合引擎逐只使用的原始拟合样本明细。报告中凡是“拟合目标/使用券池”的描述，均按这个证据边界区分。

### 2.2 V3F 参数

| 曲线 | r0/X0 | theta0/Y0 | pi/Z0 | kappa | lamda | sigma/X | sigma_theta/Y | sigma_pi/Z |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| `CNCGB_V3F` | 0.010250243944 | 0.020348875543 | 0.030682082830 | 0.20 | 0.10 | 0.001000000000 | 0.005628626241 | 0.003428232130 |
| `CNCDB_V3F` | 0.012762326003 | 0.018550903146 | 0.027742968810 | 0.25 | 0.15 | 0.001409476964 | 0.004509951700 | 0.003261685008 |

截至 2026-06-09 的复刻报告显示，`CNCDB_V3F` 和 `CNCGB_V3F` 的显式参数与 `MODEL_PARAMS` JSON 完全一致，`MODEL_PARAMS exact=True`，最大绝对差为 0。

### 2.3 估值曲线的来源和生成链条

CK 里同时保存了中债官方曲线 `irgroup.bond_yield_curve_cnbd`。2026-06-09 的 `CGB` 为“中债国债收益率曲线”，`CDB` 为“中债国开债收益率曲线”；其 `JSON_DATA` 包含 `SPOT` 和 `PAR` 两条 0Y 到 50Y 曲线，各 505 个期限点。

V3F 曲线不是简单复制中债曲线逐点数据，而是对中债曲线做参数化、平滑后的模型曲线。按 2026-06-09 的共同期限点比较：

- `CNCGB_V3F` 与中债国债 `PAR` 曲线有 102 个共同期限点，平均绝对差约 4.85bp，最大绝对差约 14.93bp。
- `CNCDB_V3F` 与中债国开 `PAR` 曲线有 102 个共同期限点，平均绝对差约 7.27bp，最大绝对差约 15.85bp。

关键期限对比如下，利率单位为 `%`，差值单位为 bp：

| 曲线 | 期限 | V3F par | 中债 par | V3F-中债 |
| --- | ---: | ---: | ---: | ---: |
| `CNCGB_V3F` | 1Y | 1.1331 | 1.1817 | -4.86 |
| `CNCGB_V3F` | 3Y | 1.3037 | 1.3018 | 0.19 |
| `CNCGB_V3F` | 5Y | 1.4517 | 1.4483 | 0.34 |
| `CNCGB_V3F` | 10Y | 1.7401 | 1.7376 | 0.25 |
| `CNCGB_V3F` | 20Y | 2.0844 | 2.2147 | -13.03 |
| `CNCGB_V3F` | 30Y | 2.2664 | 2.2200 | 4.64 |
| `CNCGB_V3F` | 50Y | 2.4414 | 2.4381 | 0.33 |
| `CNCDB_V3F` | 1Y | 1.3622 | 1.3718 | -0.96 |
| `CNCDB_V3F` | 3Y | 1.4926 | 1.4602 | 3.24 |
| `CNCDB_V3F` | 5Y | 1.6113 | 1.5901 | 2.12 |
| `CNCDB_V3F` | 10Y | 1.8507 | 1.7910 | 5.97 |
| `CNCDB_V3F` | 20Y | 2.1370 | 2.2929 | -15.59 |
| `CNCDB_V3F` | 30Y | 2.2820 | 2.3303 | -4.83 |
| `CNCDB_V3F` | 50Y | 2.4135 | 2.5661 | -15.26 |

因此，估值曲线生成链条可以表述为：

```text
中债官方曲线(PAR/SPOT) -> CK上游三因子拟合/平滑 -> bond_curve_data.MODEL_PARAMS
-> bond_curve_data.PAR_RATES(0.25Y到50Y估值网格) -> 个券期限插值得到 curve_rate
```

本次正式回测采用 `analytic` 口径，即直接使用 `bond_analytic_pro.GS` 作为信号输入；前期复刻验证表明，用 `bond_curve_data.PAR_RATES` 在个券期限上插值后计算的 `GS_REPL = (YTM - curve_rate) * 100` 与该字段几乎一致。因此，报告中的收益结果对应的是当前 CK 模型输出可用时的官方复刻口径。

考虑到未来可能失去 `bond_curve_data.MODEL_PARAMS/PAR_RATES` 或已落库的模型参数，本项目已经增加不依赖这些三因子参数的备用口径：运行脚本时指定 `--gspread-source cnbd_curve`，系统会改用 `bond_yield_curve_cnbd.JSON_DATA` 中的 `PAR` 曲线，按 `CNCGB_* -> CGB`、`CNCDB_* -> CDB` 映射取中债曲线，在个券 `TERM` 上插值后用 `YTM - 中债PAR曲线利率` 本地重算 G-spread。这样策略信号仍然可以运行，只是信号基准从 CK 三因子平滑曲线切换为中债曲线；两套口径的收益应并行观察，不能直接混同。

### 2.4 当前曲线“用了哪些券”

严格讲，当前 CK 表没有保存“拟合时逐只入选的原始券清单”，所以不能把 `bond_analytic_pro` 的所有个券直接称为上游拟合样本。但可以明确两类券池：

1. 中债官方曲线的基础券池：`CGB` 曲线对应国债，`CDB` 曲线对应国开债；中债官方曲线如何选券和加权属于中债曲线口径，CK 表内没有逐券明细。
2. CK V3F 估值映射券池：`bond_analytic_pro` 中被 `CNCGB_V3F/CNCDB_V3F` 估值、并被本项目用于复刻和策略信号的个券。

2026-06-09 按 `PX_SOURCE='CNBD'` 统计，V3F 估值映射券池如下：

| 曲线 | 映射债券数 | 主要债券类型 | 剩余期限范围 | 说明 |
| --- | ---: | --- | --- | --- |
| `CNCGB_V3F` | 150 | 国债 150 只 | 0.0164Y 至 49.9114Y | 用国债 V3F 曲线估值，策略中作为国债相对价值池 |
| `CNCDB_V3F` | 188 | 国开 77 只、农发 67 只、进出口 44 只 | 0.0055Y 至 28.1507Y | 用国开/政金债 V3F 曲线估值，策略中作为政策性金融债相对价值池 |

复刻脚本在计算误差时进一步要求 `YTM/TERM/MDUR/DV01` 有限，因此实际复刻样本为 337 条；少数 `bond_analytic_pro` 行因收益率或分析指标为空被排除。策略回测还会在此基础上叠加 `TERM >= 3Y`、历史样本数、DV01、价格完整性和交易性过滤。

### 2.5 个券估值如何使用这条曲线

个券估值与模型输出来自 `irgroup.bond_analytic_pro`，其中包含 `PX_DIRTY`、`YTM`、`TERM`、`DV01`、`GS`、`OAS`、骑乘和三因子 Delta 等字段。现金流来自 `irgroup.bond_cashflow.CASHFLOW_PLAN`，债券基础信息来自 `irgroup.bond_info`，外部估值对照来自 `irgroup.bond_valuation`。

复刻时，对每只债券按 `CURVE_CODE` 取对应 V3F 的 `PAR_RATES`；在债券 `TERM` 上做线性插值，短端和长端用相邻两点线性外推，得到 `curve_rate(TERM)`。G-spread 复刻公式为：

```text
GS_REPL = (YTM - curve_rate(TERM)) * 100
```

其中 `YTM` 和 `curve_rate` 单位为百分比，`GS_REPL` 单位为 bp。337 个样本的 `GS` 平均绝对误差为 0.00187bp，中位绝对误差为 0.00144bp，95% 绝对误差为 0.00470bp，说明策略信号使用的 G-spread 与 CK 模型结果基本一致。

## 3. 策略信号设计

策略思想是把 G-spread 当作模型估值偏离。G-spread 不要求长期等于 0，因为流动性、税收、特殊券属性和供需都会形成稳定溢价；策略只交易“相对稳定基准附近的异常偏离”。

每个调仓日只使用该日及以前数据，回看 120 天。同一曲线、剩余期限相差不超过 5 年的历史样本构成局部可比组；若可比样本少于 60 条，则该券不出信号。稳定 G-spread 用可比组中位数估计，波动用 `1.4826 * MAD`，并设置 1bp 下限。信号 z-score 定义为：

```text
z = (当前 GS - 局部稳定 GS) / max(1.4826 * MAD, 1bp)
```

当 `z >= 2` 时，视为 G-spread 过高，做多该券，等待利差收敛或价格相对修复；当 `z <= -2` 时，视为 G-spread 过低，做空该券。候选组合必须在同一曲线和近似期限内构造，支持 2 腿或 3 腿；例如 10 年券 G-spread 较高、5 年券 G-spread 较低，则买 10 年、按 DV01 比例卖 5 年，使久期敞口接近中性。

信号源现在有两个可选值：

1. `analytic`：使用 CK 已生成的 `bond_analytic_pro.GS`，这是当前正式回测口径。
2. `cnbd_curve`：不读取 `bond_curve_data.MODEL_PARAMS/PAR_RATES`，而是用中债 `PAR` 曲线本地重算 `GS`。该口径用于参数表缺失时的策略连续运行，也可以作为模型依赖风险的对照组。

组合层按候选分数排序，最多选择 5 个不重叠候选组合。每个候选内按 DV01 配平，组合的多头名义和空头名义分别不超过当前权益的 2 倍。正式口径还剔除了剩余期限小于 3 年的债券，避免短券价格波动过小、估值噪声和交易摩擦主导信号。

## 4. 回测方法

回测区间为 2025-06-09 至 2026-06-18。调仓频率为至少 7 个日历日选择下一个可用估值日；入场信号和组合构造使用调仓开始日及以前的 CK 数据，不使用未来数据。持仓期内每个可用交易日均按 `PX_DIRTY` 日频 MTM 更新净值，回撤统计基于日频净值而不是调仓点净值。

PnL 分为价格 PnL 和空头成本。买入腿的 PnL 为名义本金乘以全价收益率；卖出腿的 PnL 为价格变动的反向收益，并扣除空头成本。空头成本分段处理：10 年及以内债券 0.23% 年化，10 年以上债券 1.30% 年化。若候选组合缺少期末价格，则整组候选剔除；日频 MTM 若缺少中间价格才沿用前值，本次正式样本前值沿用点为 0。

## 5. 总体表现

| 指标 | 数值 |
| --- | ---: |
| 期末权益 | 105,455,061.56 |
| 累计收益 | 5.4551% |
| 年化收益 | 5.3892% |
| 年化波动 | 3.7645% |
| Sharpe | 1.4316 |
| 日频最大回撤 | -0.4056% |
| 日频 MTM Calmar | 13.2877 |
| 全部估值日胜率 | 18.0392% |
| 有持仓日胜率 | 64.7887% |
| 价格 PnL | 5,644,651.18 |
| 空头成本 | 189,589.62 |
| 成本后 PnL | 5,455,061.56 |
| 交易腿数 | 32 |
| 持仓行数 | 35 |

## 6. 杠杆对比

| 口径 | 期末权益 | 累计收益 | 年化收益 | 年化波动 | Sharpe | 日频最大回撤 | 空头成本 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| TERM >= 3Y, daily MTM, 1x, TRADING_AMOUNT_AVG >= 0.5 | 102,709,779.88 | 2.7098% | 2.6775% | 1.8834% | 1.4216 | -0.2029% | 93,610.53 |
| TERM >= 3Y, daily MTM, 1.5x, TRADING_AMOUNT_AVG >= 0.5 | 104,077,970.04 | 4.0780% | 4.0290% | 2.8242% | 1.4266 | -0.3043% | 141,301.79 |
| TERM >= 3Y, daily MTM, 2x, TRADING_AMOUNT_AVG >= 0.5 (recommended) | 105,455,061.56 | 5.4551% | 5.3892% | 3.7645% | 1.4316 | -0.4056% | 189,589.62 |

2 倍口径相对 1 倍和 1.5 倍近似线性放大收益与回撤。最大观测单腿名义为 210,271,996.21，与 2 倍账面约束一致。

## 7. 最大回撤分析

最深回撤发生在 2025-12-10，从 2025-12-02 的阶段高点回落，日频 MTM 回撤为 -0.4056%，当日权益为 99,912,027.74。这不是调仓点回撤，而是持仓期内逐日估值后的 MTM 回撤，因此比只看周度调仓更接近实际日度风控体验。

最大单日亏损出现在 2026-04-09，日收益 -0.2046%，当日 PnL -214,553.68。最大单日盈利出现在 2026-01-09，日收益 3.7110%，当日 PnL 3,731,179.16。

最差调仓组合 PnL 为 -216,124.45，调仓日 2025-12-04；最好调仓组合 PnL 为 3,806,812.46，调仓日 2026-01-04。回撤主要来自个别长端组合的日内价格逆向波动和长端空头腿成本。

## 8. 收益分布

| 口径 | 样本数 | 均值 | 波动 | 最差 | 5% | 25% | 中位 | 75% | 95% | 最好 | 胜率 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 全部估值日 | 255 | 2.11bp | 23.71bp | -20.46bp | -5.37bp | 0.00bp | 0.00bp | 0.00bp | 10.12bp | 371.10bp | 18.0392% |
| 有持仓估值日 | 71 | 7.58bp | 44.48bp | -20.46bp | -12.05bp | -2.67bp | 2.55bp | 6.26bp | 21.44bp | 371.10bp | 64.7887% |

全样本日收益有大量 0 值，因为策略不是每日都有满足稳定性和偏离阈值的组合。有持仓日的中位收益为 2.55bp，5% 分位为 -12.05bp，95% 分位为 21.44bp；分布右偏，偏度 14.7800，超额峰度 226.8985，说明收益不是正态分布，少数大盈利日对全年收益贡献较高。

| 日收益区间 | 天数 |
| --- | --- |
| <=-50bp | 0 |
| (-50,-30]bp | 0 |
| (-30,-20]bp | 2 |
| (-20,-10]bp | 3 |
| (-10,-5]bp | 8 |
| (-5,0]bp | 196 |
| (0,5]bp | 21 |
| (5,10]bp | 11 |
| (10,20]bp | 8 |
| (20,30]bp | 4 |
| (30,50]bp | 1 |
| >50bp | 1 |

### 最好 5 个日收益

| 日期 | 日收益 | 当日PnL | 调仓日 | 交易腿数 |
| --- | --- | --- | --- | --- |
| 2026-01-09 | 3.7110% | 3,731,179.16 | 2026-01-04 | 2 |
| 2026-04-14 | 0.3115% | 326,501.68 | 2026-04-07 | 3 |
| 2026-01-21 | 0.2730% | 285,410.16 | 2026-01-19 | 2 |
| 2026-04-13 | 0.2187% | 228,733.25 | 2026-04-07 | 3 |
| 2025-12-30 | 0.2101% | 210,814.02 | 2025-12-25 | 2 |

### 最差 5 个日收益

| 日期 | 日收益 | 当日PnL | 调仓日 | 交易腿数 |
| --- | --- | --- | --- | --- |
| 2026-04-09 | -0.2046% | -214,553.68 | 2026-04-07 | 3 |
| 2025-12-17 | -0.2040% | -204,483.61 | 2025-12-11 | 2 |
| 2025-12-05 | -0.1665% | -166,754.14 | 2025-12-04 | 2 |
| 2025-12-19 | -0.1396% | -139,688.77 | 2025-12-18 | 2 |
| 2025-12-10 | -0.1013% | -101,346.26 | 2025-12-04 | 2 |

## 9. 月度表现

| 月份 | 月末权益 | 月收益 |
| --- | --- | --- |
| 2025-06 | 100,000,000.00 | 0.0000% |
| 2025-07 | 100,000,000.00 | 0.0000% |
| 2025-08 | 100,000,000.00 | 0.0000% |
| 2025-09 | 100,000,000.00 | 0.0000% |
| 2025-10 | 100,000,000.00 | 0.0000% |
| 2025-11 | 100,215,062.07 | 0.2151% |
| 2025-12 | 100,494,686.21 | 0.2790% |
| 2026-01 | 104,830,908.51 | 4.3149% |
| 2026-02 | 104,830,908.51 | 0.0000% |
| 2026-03 | 104,865,725.00 | 0.0332% |
| 2026-04 | 105,135,998.10 | 0.2577% |
| 2026-05 | 105,455,061.56 | 0.3035% |
| 2026-06 | 105,455,061.56 | 0.0000% |

最好月份为 2026-01，月收益 4.3149%；最差月份为 2025-06，月收益 0.0000%。收益分布集中在 2025-10 和 2026-05，后续应重点观察收益是否持续来自多个市场阶段，而不是单一阶段贡献。

## 10. 持仓结构与风险来源

持仓曲线分布：`CNCDB_V3F` 32 行，`CNCGB_V3F` 3 行。方向分布：买入 20 行，卖出 15 行。组合腿数分布：2 腿组合 10 组，3 腿组合 5 组。

买入腿期限范围 4.11Y 至 29.95Y，平均 9.06Y；卖出腿期限范围 3.02Y 至 29.50Y，平均 9.73Y。

| 方向 | 交易腿数 | 净PnL | 平均PnL | 胜率 |
| --- | --- | --- | --- | --- |
| BUY | 18 | 2,451,352.96 | 136,186.28 | 83.3333% |
| SELL | 14 | 3,003,708.60 | 214,550.61 | 50.0000% |

买入腿贡献明显好于卖出腿，卖出腿扣除成本后为负贡献。这是后续优化的重点：空头侧可以增加借券成本缓冲、流动性过滤、空头期限上限或要求更强的负偏离信号。

### 贡献最高 5 个交易腿

| 入场 | 退出 | 债券 | 方向 | 期限 | 净PnL | z |
| --- | --- | --- | --- | --- | --- | --- |
| 2026-01-04 | 2026-01-12 | 170202.IB | SELL | 11.01 | 3,990,535.09 | -2.98 |
| 2025-11-20 | 2025-11-27 | 250215.IB | SELL | 9.58 | 545,611.24 | -2.62 |
| 2026-05-13 | 2026-05-20 | 09260204.IB | BUY | 6.66 | 531,242.86 | 2.42 |
| 2025-12-04 | 2025-12-11 | 09250209.IB | BUY | 6.80 | 527,304.85 | 2.11 |
| 2026-04-07 | 2026-04-14 | 250220.IB | BUY | 9.41 | 518,257.75 | 2.38 |

### 贡献最低 5 个交易腿

| 入场 | 退出 | 债券 | 方向 | 期限 | 净PnL | z |
| --- | --- | --- | --- | --- | --- | --- |
| 2026-04-07 | 2026-04-14 | 170202.IB | SELL | 10.76 | -766,242.39 | -3.23 |
| 2025-12-04 | 2025-12-11 | 250215.IB | SELL | 9.54 | -743,429.30 | -3.55 |
| 2025-11-27 | 2025-12-04 | 09250209.IB | BUY | 6.82 | -487,691.52 | 2.14 |
| 2025-11-20 | 2025-11-27 | 09250209.IB | BUY | 6.84 | -437,751.79 | 2.07 |
| 2026-03-17 | 2026-03-24 | 210310.IB | SELL | 5.33 | -228,053.90 | -2.26 |

## 11. 使用方式与后续改进

当前策略适合作为策略跟踪页上的研究型相对价值组合：每天监控是否出现同曲线、近期限、G-spread 稳定基准附近的异常偏离；若出现，则按 DV01 配平构造 2 腿或 3 腿组合，并用日频 MTM 监控回撤。

后续改进优先级如下：

1. 加强空头筛选：对 10 年以上空头要求更高 z-score 或更低借券成本。
2. 双口径跟踪：每天同时产出 `analytic` 与 `cnbd_curve` 信号，观察候选券、收益和回撤差异；当三因子参数不可用时，直接降级到 `cnbd_curve`。
3. 细化流动性约束：继续分层测试 `OUTSTANDING_BALANCE` 和 `TRADING_AMOUNT_AVG` 下限，避免模型收敛无法兑现。
4. 扩展样本：将回测延长到更多年份，检验收益是否跨利率周期稳定。
5. 增加组合止损：以日频 MTM 回撤或单候选组合 PnL 控制左尾。
6. 对稳定 G-spread 做分层：按发行人、剩余期限、税收口径和活跃券属性分层估计稳定基准。

## 12. 输出文件

- 日频 MTM 净值：`outputs_backtest_optimized/equity_curve_20250609_20260618.csv`
- 期初持仓：`outputs_backtest_optimized/period_positions_20250609_20260618.csv`
- 逐腿 PnL：`outputs_backtest_optimized/period_trades_20250609_20260618.csv`
- 优化对比：`outputs_backtest_optimized/optimization_comparison_20250609_20260618.csv`
- 策略跟踪页数据：`strategy_dashboard/gspread_relative_value_data/summary.json`
