# Credit Analysis

> 固收与信用分析：信用债评级、利差分析、违约风险评估、城投债研究、可转债定价与策略。

- Skill: `hkuds/credit-analysis` (Agent Skill)
- Install (CLI): `npx skillmds@latest add hkuds/credit-analysis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/hkuds/credit-analysis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: HKUDS (https://skillmd.com/u/hkuds)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/hkuds/credit-analysis

---


# Credit Analysis Skill — 固收与信用分析

## 适用场景

当用户提出以下类型问题时，优先调用本 skill：
- 债券定价、YTM 计算、久期/凸性分析
- 企业信用评级、违约概率估算
- 信用利差分析与交易策略
- 城投债、ABS/MBS 信用评估
- 利率风险管理（DV01、关键利率久期）
- 中国固收市场结构分析

---

## 一、信用分析框架

### 1.1 信用评级体系

#### 主体评级 vs 债项评级

| 类型 | 定义 | 评级对象 |
|------|------|----------|
| **主体评级（Issuer Rating）** | 发行人整体偿债能力 | 企业、政府、金融机构 |
| **债项评级（Issue Rating）** | 特定债券的信用质量 | 具体债券，考虑抵押品、优先级、契约条款 |

债项评级可高于或低于主体评级（取决于担保结构）。

#### 标准普尔 / 穆迪 / 中国评级对照

| S&P | Moody's | 中国评级 | 含义 |
|-----|---------|----------|------|
| AAA | Aaa | AAA | 最高信用质量，极低违约风险 |
| AA+/AA/AA- | Aa1/Aa2/Aa3 | AA+/AA/AA- | 高质量，极低违约风险 |
| A+/A/A- | A1/A2/A3 | A+/A/A- | 较高信用质量 |
| BBB+/BBB/BBB- | Baa1/Baa2/Baa3 | BBB+/BBB/BBB- | 投资级下限（IG/HY分水岭） |
| BB+及以下 | Ba1及以下 | BB+及以下 | 高收益/投机级 |
| D | D | D | 违约 |

> **中国特点**：国内评级虚高，AA级在国内约等同于国际BBB-，需结合评级展望（正面/稳定/负面）综合判断。

---

### 1.2 Altman Z-Score 模型

用于预测企业财务困境，原始模型适用于上市制造业：

```
Z = 1.2×X1 + 1.4×X2 + 3.3×X3 + 0.6×X4 + 1.0×X5
```

| 变量 | 计算公式 | 含义 |
|------|----------|------|
| X1 | 营运资本 / 总资产 | 流动性 |
| X2 | 留存收益 / 总资产 | 盈利积累 |
| X3 | EBIT / 总资产 | 盈利能力 |
| X4 | 股权市值 / 总负债账面值 | 财务杠杆 |
| X5 | 销售收入 / 总资产 | 资产效率 |

**判断区间**：
- Z > 2.99：安全区（低违约风险）
- 1.81 < Z < 2.99：灰色区（需深入分析）
- Z < 1.81：危险区（高违约风险）

**改进版本**：
- Z'（私有企业）：X4改用股权账面值，临界值2.90/1.23
- Z''（非制造业/新兴市场）：去掉X5，临界值2.60/1.10

**局限性**：
- 基于历史数据，滞后性强
- 不适用金融类企业（杠杆定义不同）
- 中国市场需重新标定参数

---

### 1.3 Merton 结构化模型

将公司股权视为对公司资产的看涨期权（执行价格=债务面值）：

**核心假设**：
- 公司资产价值 V 遵循几何布朗运动：`dV = μV dt + σ_V V dW`
- 债务为零息债，面值 D，到期日 T
- 违约仅在 T 时刻发生（欧式违约设定）

**股权定价（BS公式）**：
```
E = V·N(d1) - D·e^(-rT)·N(d2)

d1 = [ln(V/D) + (r + σ_V²/2)T] / (σ_V·√T)
d2 = d1 - σ_V·√T
```

**违约概率（风险中性）**：
```
PD = N(-d2)
```

**距违约距离（DD, Distance to Default）**：
```
DD = [ln(V/D) + (μ - σ_V²/2)T] / (σ_V·√T)
```

**信用利差估算**：
```
信用利差 ≈ -ln[N(d2) + (V/D·e^(rT))·N(-d1)] / T
```

**参数估算方法**（联立方程组）：
1. E = V·N(d1) - D·e^(-rT)·N(d2)
2. σ_E·E = N(d1)·σ_V·V

---

### 1.4 KMV 模型（预期违约频率 EDF）

KMV 是 Merton 模型的商业化实现，由穆迪收购：

**步骤**：
1. 用股价和股权波动率反推资产价值 V 和资产波动率 σ_V
2. 计算违约触发点（Default Point）：`DP = 短期债务 + 0.5×长期债务`
3. 计算距违约距离：`DD = (V - DP) / (V × σ_V)`
4. 通过历史违约数据库将 DD 映射为 EDF（非正态映射）

**与 Merton 的区别**：
- 违约触发点不是全部债务，而是短期+半长期
- DD→EDF 映射基于实证数据库，非正态分布假设
- EDF 是真实世界概率，而非风险中性概率

**EDF 参考区间**（约）：
- EDF < 0.1%：投资级
- 0.1%–1%：BBB-BB 级
- 1%–5%：B 级
- EDF > 5%：CCC 及以下

---

### 1.5 信用评分卡方法论

适用于零售信贷/ABS 底层资产分析：

**建模流程**：
1. **数据准备**：收集历史贷款数据，定义违约标签（如逾期90天+）
2. **特征工程**：WOE（Weight of Evidence）编码
3. **特征选择**：IV值（Information Value）筛选，IV>0.02保留
4. **模型训练**：Logistic Regression（主流）、XGBoost
5. **评分转换**：`Score = A - B×ln(odds)`，通常基准分600，PDO=20

**WOE 和 IV 计算**：
```python
WOE_i = ln(好样本比例_i / 坏样本比例_i)
IV_i = (好样本比例_i - 坏样本比例_i) × WOE_i
总IV = Σ IV_i
```

**IV 参考标准**：
- IV < 0.02：无预测力
- 0.02–0.1：弱预测力
- 0.1–0.3：中等预测力
- IV > 0.3：强预测力

---

## 二、固收产品分析

### 2.1 国债与政府债

#### 收益率曲线分析

**即期利率曲线（Zero Curve）**：各期限无风险零息债收益率，通过 Bootstrap 方法从附息债提取。

**远期利率曲线（Forward Curve）**：
```
f(T1, T2) = [(1+r2)^T2 / (1+r1)^T1]^(1/(T2-T1)) - 1
```

**期限利差**：
- 10Y-2Y：经济周期预判指标，负值通常预示衰退
- 10Y-1Y：流动性偏好衡量指标
- 30Y-10Y：超长端供需判断

**收益率曲线形态**：
| 形态 | 特征 | 经济含义 |
|------|------|----------|
| 正斜率（Normal） | 长端>短端 | 经济扩张预期 |
| 平坦（Flat） | 各期限相近 | 经济转折点 |
| 倒挂（Inverted） | 短端>长端 | 衰退信号 |
| 驼峰（Humped） | 中端最高 | 流动性分层 |

#### 中国国债收益率曲线特点
- 基准曲线：中国国债（CGBs）+ 国开债（Policy Bank Bonds）
- 关键点位：1Y/3Y/5Y/7Y/10Y/30Y
- 10Y国债为核心基准利率

---

### 2.2 企业债分析

#### 核心指标

**票面利率（Coupon Rate）**：发行时约定，按面值计息。

**到期收益率 YTM（Yield to Maturity）**：
使 债券现值 = 市场价格的内部收益率：
```
P = Σ [C/(1+y)^t] + F/(1+y)^n
```
其中 C=票息，F=面值，y=YTM，n=期数。

**当期收益率（Current Yield）**：`CY = 年票息 / 市场价格`（忽略本金损益）

**修正久期（Modified Duration）**：
```
MD = -dP/P ÷ dy = Macaulay Duration / (1+y/m)
```
含义：利率每变化1%，债券价格变化约MD%（反向）。

**凸性（Convexity）**：
```
CX = [Σ t(t+1)·CF_t/(1+y)^(t+2)] / P
价格变化修正：ΔP/P ≈ -MD·Δy + 0.5·CX·(Δy)²
```

#### 债券价格公式（实现）

定价函数是仓库里的实测代码，直接 import，**不要在会话里重新手写**：

```python
from src.quantlib.fixedincome import bond_price

bond_price(face=100, coupon_rate=0.05, ytm=0.04, n_periods=5, freq=1)
# -> 104.4518...   5年期、票息5%、YTM=4%、年付
```

两个约定在这里是**显式参数**，不是隐含假设：

- `compounding`：`"discrete"`（默认，每年 `freq` 次离散复利，即上面 `P = Σ C/(1+y/m)^t` 的形式）或 `"continuous"`。
- 日算基准：`bond_price` 按整数付息期贴现，因此返回的是**付息日**的价格（净价，应计为 0）。
  非付息日结算要另加应计利息才是全价（脏价）：

```python
import datetime as dt
from src.quantlib.fixedincome import accrued_interest

accrued = accrued_interest(
    face=100, coupon_rate=0.05, freq=2,
    last_coupon=dt.date(2024, 1, 15),
    settlement=dt.date(2024, 4, 15),
    next_coupon=dt.date(2024, 7, 15),
    day_count="30/360",   # ACT/365F(默认) | ACT/360 | ACT/ACT | 30/360 | 30E/360
)                          # -> 1.25
dirty_price = bond_price(100, 0.05, 0.04, 10, 2) + accrued
```

---

### 2.3 可转债（纯债部分）

> 可转债的转股期权部分详见 `convertible-bond` skill，本节聚焦纯债价值。

**纯债价值（Bond Floor）**：
```
纯债价值 = Σ [票息/(1+r_straight)^t] + 面值/(1+r_straight)^n
```
其中 r_straight 为同评级同期限直债收益率。

**转股溢价率与纯债溢价率**：
- 转股溢价率 = (可转债价格 - 转股价值) / 转股价值
- 纯债溢价率 = (可转债价格 - 纯债价值) / 纯债价值

**下修条款信用含义**：
下修转股价可能导致摊薄，需评估公司意愿（强赎冲动 vs 回售压力）。

---

### 2.4 ABS/MBS 分析

#### 底层资产分析框架

**资产质量指标**：
- 加权平均票息（WAC）
- 加权平均剩余期限（WAM）
- 加权平均贷款价值比（LTV）
- 历史逾期率（DPD 30/60/90+）
- 累计违约率（CDR，Cumulative Default Rate）

**早偿率模型**：
- CPR（Conditional Prepayment Rate）：年化早偿率
- SMM（Single Monthly Mortality）：月早偿率
  ```
  CPR = 1 - (1 - SMM)^12
  SMM = 1 - (1 - CPR)^(1/12)
  ```
- PSA 模型：标准早偿假设（PSA100 = 前30个月线性增至6%/年，之后6%/年恒定）

**分层结构（Tranche）分析**：
- 优先级（Senior）：最先受偿，评级最高
- 夹层（Mezzanine）：次级受偿
- 劣后级（Equity/Junior）：首先吸收损失，超额利差归属

**关键风险指标**：
```
增信倍数 = (底层资产池规模 - 优先级规模) / 优先级规模
超额利差 = 底层资产池利率 - 优先级融资成本 - 服务费
```

---

### 2.5 城投债信用分析

城投债（LGFV，地方政府融资平台债）是中国固收市场特有品种。

#### 分析框架

**四维评估模型**：

| 维度 | 核心指标 | 权重 |
|------|----------|------|
| 区域财政实力 | 一般公共预算收入、GDP规模、财政自给率 | 40% |
| 平台层级 | 省级>市级>区县级，级别越高隐性支持越强 | 25% |
| 平台地位 | 是否唯一城投、资产注入力度、业务多元化 | 20% |
| 债务结构 | 有息负债规模、短期债务占比、再融资压力 | 15% |

**隐性债务风险信号**：
- 城投货币资金/短期债务 < 0.5（流动性紧张）
- EBITDA利息覆盖率 < 1（依赖外部融资付息）
- 非标融资占比>30%（再融资风险高）
- 区县级城投、弱区域（负债率>100%）

**城投估值溢价结构**（参考）：
```
城投利率 ≈ 同期国债 + 流动性溢价(30-50bp) + 区域溢价(0-200bp) + 平台溢价(0-100bp)
```

**政策风险**：2023年城投化债政策后分化加剧，关注：
- 一揽子化债进度
- 平台转型（城投转企业）
- 区域名单管理政策

---

## 三、利率风险管理

### 3.1 久期体系

#### Macaulay Duration（麦考利久期）

时间加权现金流现值之和，单位为"年"：
```
D_mac = Σ [t × CF_t/(1+y)^t] / P
```

#### Modified Duration（修正久期）

利率敏感性度量：
```
D_mod = D_mac / (1 + y/m)
ΔP ≈ -D_mod × P × Δy
```

#### Effective Duration（有效久期）

适用于含权债券（可赎回债、MBS等）：
```
D_eff = (P_down - P_up) / (2 × P_0 × Δy)
```
其中 P_down/P_up 为利率下移/上移Δy后的价格。

#### Dollar Duration（久期金额）

```
Dollar Duration = D_mod × P × 面值
```

---

### 3.2 凸性（Convexity）

衡量久期对利率的敏感性（二阶效应）：

```
C = Σ [t(t+1) × CF_t/(1+y)^(t+2)] / P

价格精确估算：
ΔP/P ≈ -D_mod·Δy + 0.5·C·(Δy)²
```

**凸性的价值**：正凸性使债券在利率下行时涨幅大于预期（利率上行时跌幅小于预期），因此正凸性债券比负凸性债券（如可赎回债、MBS）更受青睐。

---

### 3.3 DV01（基点价值）

利率变动1基点（0.01%）导致的价格变化：
```
DV01 = D_mod × P × 0.0001
```

组合层面：`Portfolio DV01 = Σ (DV01_i × 持仓量_i)`

**用途**：利率对冲比率计算
```
对冲比率 = DV01_被对冲头寸 / DV01_对冲工具
```

---

### 3.4 关键利率久期（Key Rate Duration, KRD）

衡量收益率曲线各关键期限平行移动1bp对价格的影响：
- 常用关键点：1Y, 2Y, 3Y, 5Y, 7Y, 10Y, 20Y, 30Y
- `KRD_i = -ΔP/(P × Δy_i)`（仅第i个关键利率变动1bp）
- `Σ KRD_i ≈ D_mod`（各关键利率久期之和约等于修正久期）

**应用**：
- 识别组合对特定期限利率的暴露
- 精确对冲非平行移动风险（扭曲/蝶式）

---

### 3.5 免疫策略

**久期匹配（Duration Matching）**：
使资产组合久期 = 负债久期，对利率平行移动免疫。
条件：`Σ (w_i × D_i) = D_liability`

**现金流匹配（Cash Flow Matching）**：
直接匹配每期现金流，彻底消除再投资风险，但灵活性差、成本高。

**条件免疫（Contingent Immunization）**：
当组合价值超过安全底线时主动管理，跌至底线时切换为被动免疫。

**再平衡频率**：
- 久期随时间漂移，需定期（季度/月度）再平衡
- 利率大幅变动（>50bp）后立即再平衡

---

## 四、信用利差分析

### 4.1 信用利差的构成

```
信用利差（Credit Spread）= 违约风险溢价 + 流动性溢价 + 税收溢价（部分市场）
```

| 组成部分 | 影响因素 | 量化方式 |
|----------|----------|----------|
| 违约风险溢价 | 评级、行业、财务状况、宏观周期 | CDS报价、模型测算 |
| 流动性溢价 | 发行规模、剩余期限、市场深度 | 买卖价差、换手率 |
| 税收溢价 | 国债免税优惠（部分国家/投资者） | 利率差异分析 |

**利差衡量基准**：
- 国际市场：G-Spread（vs 国债）、I-Spread（vs 掉期）、Z-Spread（零息利差）、OAS（期权调整利差）
- 中国市场：信用利差通常对比国债或AAA城投

**OAS（Option-Adjusted Spread）**：
剥离嵌入期权价值后的信用利差，适用于含权债比较：
```
P = Σ CF_t / (1 + r_t + OAS)^t
```

---

### 4.2 信用利差曲线形态

**正斜率**（常见）：长期利差 > 短期利差，反映期限不确定性叠加。

**平坦/倒挂**：
- 市场对长期信用风险乐观（平坦）
- 短期流动性危机/再融资困境（倒挂），警示信号

**信用利差与国债收益率的相关性**：
- 经济扩张：信用利差收窄（风险偏好上升）
- 经济衰退/信用事件：信用利差走阔
- "逃向质量"效应：国债收益率下行+信用利差扩大，双重打击高收益债

---

### 4.3 信用利差变化的驱动因素

**宏观因素**：
- GDP增速、PMI：预期改善→利差收窄
- 货币政策宽松：流动性溢价下降
- 信用事件（违约潮）：系统性利差走阔

**行业因素**：
- 行业政策（如地产调控、城投化债）
- 行业景气周期
- 再融资环境

**个券因素**：
- 评级调整（下调→利差跳升）
- 财务数据变化
- 到期压力（临近到期→流动性利差增加）

---

### 4.4 信用利差交易策略

**利差压缩交易（Spread Tightening）**：
做多被低估（高利差）信用债，做空国债对冲利率风险。
- 适用场景：经济复苏初期、央行宽松周期

**利差扩大交易（Spread Widening）**：
做空信用债（通过CDS），做多国债。
- 适用场景：经济下行、信用事件频发

**跨评级利差交易**：
做多高收益/做空投资级（利差压缩时），或相反。

**蝶式利差交易（Butterfly）**：
做多中期、做空短端和长端，获利于信用曲线中段的相对价值。

**中国特色工具**：
- 信用风险缓释工具（CRMW/CDS）：对冲信用风险
- 国债期货：对冲利率久期风险

---

## 五、Python 实现（quantlib）

本章的模型**已经是仓库里的实测代码**，位于 `src/quantlib/fixedincome.py`（债券数学 + 曲线拟合）
与 `src/quantlib/credit.py`（Altman Z / Merton-KMV / 利差）。两个模块都有对应的
`tests/quantlib/test_fixedincome.py`、`tests/quantlib/test_credit.py`，久期与 DV01 是对
"重新定价 ±1bp" 逐点核过的。

**直接 import 调用，不要在会话里重写这些公式。** 手写一遍既拿不到测试保障，也不可复现。

一律的单位约定：利率与比率是小数（`0.05` 表示 5%），期限与时间跨度是**年**，
久期/凸性的返回值是**年 / 年²**（不是付息期数），带 `_bp` 后缀的才是基点。

### 5.1 债券定价、久期与 DV01

```python
from src.quantlib.fixedincome import (
    bond_price, ytm_solve, macaulay_duration, modified_duration,
    convexity, dv01, effective_duration,
)

face, coupon, ytm, n, freq = 100, 0.05, 0.04, 5, 1

price = bond_price(face, coupon, ytm, n, freq)          # 104.4518
ytm_solve(price, face, coupon, n, freq)                 # 0.04（价格反解 YTM）

macaulay_duration(face, coupon, ytm, n, freq)           # 4.5571 年
modified_duration(face, coupon, ytm, n, freq)           # 4.3818 年
convexity(face, coupon, ytm, n, freq)                   # 24.4766 年²
dv01(face, coupon, ytm, n, freq, par_amount=1_000_000)  # 457.69 元/bp
```

**参数要点**

| 参数 | 说明 |
|------|------|
| `freq` | 每年付息次数，`1`=年付、`2`=半年付。所有函数都接受，绝不写死 |
| `compounding` | `"discrete"`（默认）或 `"continuous"`。连续复利下修正久期恒等于 Macaulay 久期 |
| `par_amount` | `dv01` 的持仓面值，默认 100 万；对冲的市值按 `par_amount * price / face` 计 |
| `bracket` | `ytm_solve` 的求根区间，默认 `(-0.5, 10.0)`，覆盖所有可交易债券 |

含权债（可赎回债、MBS）的现金流会随利率移动，解析久期不适用，改用重新定价法：

```python
d_eff = effective_duration(reprice=lambda y: my_oas_model(y), yield_level=0.04, bump=1e-4)
```

`reprice` 必须自带赎回/早偿逻辑；`effective_duration` 只负责 `(P_down - P_up) / (2·P₀·Δy)`。

### 5.2 收益率曲线拟合（Nelson-Siegel / Svensson）

```python
import numpy as np
from src.quantlib.fixedincome import fit_yield_curve, nelson_siegel, svensson

maturities = np.array([0.25, 0.5, 1, 2, 3, 5, 7, 10, 20, 30])
yields     = np.array([0.019, 0.020, 0.022, 0.024, 0.025, 0.027, 0.028, 0.029, 0.033, 0.035])

fit = fit_yield_curve(maturities, yields, model="svensson")
fit.params      # (beta0, beta1, beta2, beta3, lambda1, lambda2)
fit.rmse        # 拟合残差（小数，与输入同单位）
fit(4.5)        # 任意期限插值 -> 该点即期利率
fit([1, 5, 10]) # 也接受数组
```

`fit_yield_curve` 返回一个 **`CurveFit` 对象**（不是 `(params, func)` 元组）：它本身可调用，
同时带 `model` / `params` / `rmse` 三个只读字段。`model` 取 `"nelson_siegel"`（4 参数）
或 `"svensson"`（6 参数，双曲率因子）。

拟合方式是**可分离最小二乘**：给定衰减参数 λ 后 β 是线性的，用 OLS 精确求解，
只对 1~2 个 λ 做网格 + Nelder-Mead 搜索。这一点很要紧——对全部参数一起做单点起始的
L-BFGS-B（本 skill 早先模板的做法）**连自己生成的曲线都还原不回来**：
在 10 个期限的无噪 Nelson-Siegel 曲线上它停在 RMSE 6.4e-4（6.4bp），
而现在这个实现是 4.0e-14。

需要直接按参数取值（例如做因子分解、做情景模拟）时用底层函数：

```python
nelson_siegel(tau=[1, 5, 10], beta0=0.045, beta1=-0.02, beta2=0.03, lambda1=2.5)
svensson(tau=5.0, beta0=0.05, beta1=-0.03, beta2=0.04, beta3=-0.02,
         lambda1=1.2, lambda2=8.0)
```

`beta0` 是水平因子（长端渐近利率），`beta0 + beta1` 是瞬时短端利率，
`beta2` / `beta3` 是曲率因子，`lambda*` 是衰减速度（年）。传标量返回标量，传数组返回数组。

### 5.3 Altman Z-Score 计算

```python
from src.quantlib.credit import altman_z_score

z = altman_z_score(
    working_capital=200,      # X1 分子：流动资产 - 流动负债
    retained_earnings=300,    # X2 分子：留存收益
    ebit=150,                 # X3 分子：息税前利润
    equity_value=900,         # X4 分子：original 用股权市值，prime/double_prime 用账面净资产
    total_liabilities=600,    # X4 分母：全部负债的账面值
    total_assets=1000,        # X1/X2/X3/X5 的分母
    revenue=1200,             # X5 分子；double_prime 不需要，可省略
    model="original",         # original | prime | double_prime
)

z.z_score            # 3.255
z.zone               # "safe" | "grey" | "distress"
z.label_zh           # "安全区（低违约风险）"
z.components         # {"x1": 0.20, "x2": 0.30, "x3": 0.15, "x4": 1.50, "x5": 1.20}
z.safe_threshold     # 2.99
z.distress_threshold # 1.81
```

三个变体的系数与临界值在 `ALTMAN_MODELS` 里，与 §1.2 的表格一一对应：

| `model` | 适用对象 | 系数 (X1..X5) | 安全 / 危险 |
|---------|----------|---------------|-------------|
| `original` | 上市制造业（Altman 1968） | 1.2 / 1.4 / 3.3 / 0.6 / 1.0 | > 2.99 / < 1.81 |
| `prime`（Z'） | 私有企业，X4 改用账面净资产 | 0.717 / 0.847 / 3.107 / 0.420 / 0.998 | > 2.90 / < 1.23 |
| `double_prime`（Z''） | 非制造业 / 新兴市场，去掉 X5 | 6.56 / 3.26 / 6.72 / 1.05 / — | > 2.60 / < 1.10 |

> **X4 的分母是「全部负债」，不是「有息负债」。** §1.2 的变量表写的是"总负债账面值"，
> 参数名 `total_liabilities` 与模型定义一致。用有息负债代入会系统性高估 Z 值。

同一份报表在三个变体下给出的分区可以不同（上例：`original` 安全区、`prime` 灰色区），
这正是重新标定的意义，不是矛盾。

### 5.4 信用利差分析

```python
from src.quantlib.credit import credit_spread_analysis, spread_term_structure

df = credit_spread_analysis(
    bond_yields=bond_ytm_series,       # pd.Series，索引=日期
    risk_free_yields=cgb_ytm_series,   # 必须与上面同一个索引
    window=252,                        # 滚动窗口（交易日）
    lookback_periods=21,               # 慢速变化列的回溯期
    signal_z=1.5,                      # 触发 rich/cheap 的 |z| 阈值
    input_unit="percent",              # percent | decimal | bp
)
```

返回的 DataFrame 列固定为：`spread_bp`、`rolling_mean_bp`、`rolling_std_bp`、`z_score`、
`historical_percentile`、`change_1p_bp`、`change_lookback_bp`、`signal`。
`signal` 取 `"rich"`（利差偏低、偏贵）/ `"neutral"` / `"cheap"`（利差偏高、偏便宜）。

> **`historical_percentile` 是全样本排名，带前视偏差，不能当回测信号用。** 它把每一行
> 和它**之后**的行一起排序——同一天的分位数会随着新数据到来而改变（实测：同一行在 50 行
> 切片上是 0.02，在 100 行上变成 0.01）。这是原模板的行为，保留是为了不静默改变口径。
> `z_score` 与 `signal` 走滚动窗口，是因果的，要做信号用这两个。

```python
grid = spread_term_structure(
    issuers={"AAA城投": {1: 0.025, 3: 0.028, 5: 0.032},
             "AA城投":  {1: 0.032, 3: 0.041, 5: 0.055}},
    risk_free_curve={1: 0.020, 3: 0.022, 5: 0.025},
    input_unit="decimal",   # 注意默认值与上面那个函数不同
    decimals=1,
)
# 行=发行人，列=1Y_spread_bp / 3Y_spread_bp / 5Y_spread_bp
```

> **输入单位必须自己确认。** 两个函数的历史默认值不一致：`credit_spread_analysis`
> 默认收益率是**百分数**（`3.2` 表示 3.2%），`spread_term_structure` 默认是**小数**（`0.032`）。
> 默认值保留了原模板的行为，但 `input_unit` 现在是显式参数——喂数据前先看清楚手里的序列是哪一种，
> 搞反就是 100 倍的利差。

### 5.5 Merton 结构化模型与 KMV

```python
from src.quantlib.credit import (
    merton_model, merton_asset_solve, distance_to_default,
    kmv_default_point, kmv_distance_to_default, edf_reference_band,
)

m = merton_model(
    equity_value=100,   # 股权市值
    equity_vol=0.40,    # 股权年化波动率
    debt_face=100,      # 债务面值（简化为单笔零息债）
    risk_free=0.03,     # 连续复利无风险利率
    horizon=1.0,        # 债务到期年限
    asset_drift=None,   # 距违约距离用的资产漂移；None = 用 risk_free（风险中性口径）
)

m.asset_value           # 197.04  反推出的资产价值
m.asset_vol             # 0.2030  反推出的资产波动率
m.distance_to_default   # 3.3868  asset_drift=None 时等于 d2
m.default_probability   # 0.000354  风险中性违约概率 N(-d2)
m.credit_spread_bp      # 0.176 bp
```

联立方程（§1.3 的两式）在 `merton_asset_solve` 里解，且是在**对数空间**求解的，
所以根不会跑到负资产或负波动率上；不收敛会直接抛 `ValueError`，不会静默返回垃圾解。

**Merton 与 KMV 的 DD 是两个不同的量，不要混用**：

```python
# Merton：对数空间、带漂移与期限
distance_to_default(asset_value=200, asset_vol=0.25, default_point=100,
                    horizon=2.0, drift=0.06)

# KMV：线性缺口，无期限无漂移，违约点只含短债 + 部分长债
dp = kmv_default_point(short_term_debt=100, long_term_debt=200,
                       long_term_weight=0.5)      # -> 200
kmv_distance_to_default(asset_value=1000, asset_vol=0.25, default_point=dp)  # -> 3.2

edf_reference_band(3.2)   # -> (0.001, 0.01)，即 §8 表里的 0.1%–1% 档
```

> `edf_reference_band` 只是把 §8 那张"DD → EDF"经验表做成了查表函数。
> 真正的 KMV EDF 来自穆迪的专有违约数据库，这里的输出只能当**量级校验**，
> 绝不能当作已标定的违约概率报出去。

**风险中性 vs 真实世界**：`asset_drift` 只影响 `distance_to_default`，不影响 `d2`、
`default_probability` 和 `credit_spread`——后三者按定义就是风险中性的。想看真实世界口径，
传一个预期资产回报进去，然后配 `edf_reference_band` 读档，不要拿 `N(-dd)` 当 EDF 报。

---

## 六、中国固收市场特色

### 6.1 市场结构

#### 银行间市场 vs 交易所市场

| 维度 | 银行间市场（CFETS） | 交易所市场（上交所/深交所） |
|------|---------------------|--------------------------|
| 监管机构 | 人民银行 | 证监会 |
| 主要参与者 | 银行、保险、基金、外资 | 券商、基金、个人投资者 |
| 交易方式 | 询价（OTC）+ 匿名点击 | 集中撮合 + 大宗交易 |
| 主要品种 | 国债、政金债、信用债、ABS | 企业债、公司债、可转债 |
| 规模占比 | ~90%（以交易量计） | ~10% |
| 结算方式 | T+0/T+1（DVP） | T+1 |
| 流动性 | 高（国债/政金债） | 高（可转债）/低（纯债） |

#### 主要债券品种

| 品种 | 发行主体 | 监管/注册 | 信用风险 |
|------|----------|-----------|----------|
| 国债（CGBs） | 财政部 | 无限制 | 无（主权信用） |
| 地方政府债 | 各省市政府 | 财政部审批 | 极低 |
| 政策性银行债（国开/农发/进出口） | 政策行 | 无限制 | 极低（准主权） |
| 同业存单（NCD） | 银行 | 央行 | 低（银行信用） |
| 超短期融资券（SCP）/ 短融（CP）/ 中票（MTN） | 非金融企业 | 交易商协会（NAFMII） | 中 |
| 企业债 | 企业 | 发改委 | 中高 |
| 公司债 | 上市公司 | 证监会 | 中高 |
| 城投债 | 地方融资平台 | 多元 | 中高（隐性政府背书） |
| ABS/ABN | SPV | NAFMII/证监会 | 取决于底层资产 |

---

### 6.2 城投债深度分析要点

**一级市场分析**（发行定价）：
1. 核查发行人层级和区域（省/市/区县）
2. 审查主业占比（基础设施业务vs商业化业务比例）
3. 评估区域一般公共预算收入和政府负债率
4. 分析近3年城投流转资产的真实性（往来款异常）

**二级市场分析**（持仓估值）：
1. 跟踪利差变化（vs 同评级同期限）
2. 关注舆情事件（技术性违约/商票逾期/评级下调）
3. 监测再融资节奏（到期压力 vs 新发节奏）
4. 关注区域政策（化债名单、债务置换进度）

**风险预警信号（红线）**：
- 货币资金/短期债务 < 0.3
- 非标融资/有息负债 > 40%
- 商票逾期被纳入系统（票据失信名单）
- 所在区域城投整体再融资受阻
- 管理层人事变动叠加区域评级负面展望

---

### 6.3 理财/资管产品信用分析

**净值化转型后的底层穿透分析**：
- 混合型理财：需分别评估权益端（市值波动）和固收端（信用风险）
- 固收+策略：主体80%+债券，20%-以内权益/可转债
- FOF型理财：两层嵌套穿透，需评估底层基金持仓

**流动性分析框架**：
```
产品层面流动性 = f(底层资产流动性, 赎回条款, 摊余成本法 vs 市值法)
```
- 摊余成本法：价格稳定但隐藏风险（不适用净值化产品）
- 市值法：反映真实价值，但波动暴露可能引发赎回潮

**底层信用评估步骤**：
1. 获取债券持仓明细（季报/半年报披露）
2. 按评级/行业/城投/非城投分类
3. 计算加权信用利差
4. 识别集中度风险（单券 > 5%为高集中度）
5. 评估流动性梯度（高流动→低流动覆盖度）

---

### 6.4 违约案例分析方法论

**违约类型**：
| 类型 | 特征 | 中国典型案例 |
|------|------|------------|
| 流动性违约 | 资产健康但现金流断裂 | 部分中小房企 |
| 技术性违约 | 触发条款（交叉违约/加速到期） | 多见于弱资质主体 |
| 经营性违约 | 主业恶化导致还款能力下降 | 永煤、华晨（2020） |
| 欺诈性违约 | 财务造假/资产腾挪 | 康美药业、蓝盛博 |

**违约前沿信号（Precursor Signals）**：

```
财务层面：
  - 应收账款/总资产 异常增高（虚增收入）
  - 货币资金余额高但受限比例高
  - 商誉/无形资产占比持续增大
  - 关联方交易占比异常

市场层面：
  - 二级市场价格持续下跌（跌破90）
  - 信用利差快速走阔（单周>50bp）
  - 主承销商更换或不参与后续发行
  - CDS报价（如有）快速上升

评级层面：
  - 评级列入负面观察
  - 多家评级机构下调
  - 展望由稳定下调至负面
```

**事后分析框架（Post-Default Analysis）**：
1. 违约触发时点与资金流向重构
2. 资产负债表"真实性"评估（区分真实资产 vs 账面资产）
3. 债权优先级梳理（担保顺序、抵质押品）
4. 处置预期回收率估算（Recovery Rate）
5. 系统性风险传染路径（交叉持有、同类主体）

**中国市场回收率参考**：
- 城投债（技术性违约后化解）：接近100%
- 房企违约：约20%-50%（取决于土储质量）
- 工业企业违约：约30%-60%
- 金融机构（非银）：约40%-70%（监管介入程度）

---

## 七、与其他 Skill 的关联

| 相关 Skill | 互补关系 |
|------------|----------|
| `convertible-bond` | 可转债转股期权部分由 convertible-bond skill 处理，本 skill 负责纯债定价和信用风险 |
| `macro-analysis` | 宏观利率环境和信用周期判断由 macro skill 提供输入 |
| `risk-management` | 组合层面信用风险（VaR/CVaR）参考 risk-management skill |
| `equity-fundamental` | 信用分析与股权估值共享财务报表分析框架，Altman Z-Score两侧均适用 |

---

## 八、快速参考

### 常用公式速查

```
YTM 近似公式：
  YTM ≈ [C + (F-P)/n] / [(F+P)/2]

久期与价格变化：
  ΔP ≈ -D_mod × P × Δy + 0.5 × CX × P × (Δy)²

DV01 = D_mod × P × 0.0001 × 持仓面值

信用利差 = 债券YTM - 同期限国债YTM

Z-Score 风险信号：
  Z > 2.99 → 安全   1.81 < Z < 2.99 → 灰色   Z < 1.81 → 危险

违约距离 DD → EDF：
  DD > 4: EDF < 0.1%
  DD 2-4: EDF 0.1%-1%
  DD 1-2: EDF 1%-5%
  DD < 1: EDF > 5%
```

### 中国固收数据源

| 数据类型 | 推荐来源 |
|----------|----------|
| 国债收益率曲线 | 中央结算公司（CCDC）、财政部官网 |
| 信用债行情 | Wind、DM数据 |
| 城投财务数据 | 发债主体年报、Wind |
| 评级报告 | 中诚信、联合资信、东方金诚官网 |
| 违约数据 | Wind、中国债券信息网（chinamoney.com.cn） |
| ABS数据 | CNABS（中国资产证券化分析网） |

