主题切换
12.5 MBS与资产证券化
MBS 的证券结构
抵押贷款支持证券(Mortgage-Backed Securities, MBS)是将住房抵押贷款池打包成可交易证券的金融产品。MBS 投资者实质上是购买了底层抵押贷款池的现金流权益。
名词解释:过手证券(Pass-Through)
最基本的 MBS 结构。底层抵押贷款的现金流(本金+利息,扣除服务费后)按比例直接"传递"给投资者,没有任何分层或优先级安排。
过手证券的现金流
对于过手证券,每月现金流由三部分组成:
$$CF_t = \underbrace{B_t \cdot \frac{WAC}{12}}_{\text{计划利息}} + \underbrace{SP_t}_{\text{计划本金}} + \underbrace{PP_t}_{\text{提前还款本金}}$$
其中
此处有展示代码展开 ▼
python
import numpy as np
def pass_through_cashflows(original_balance, wac, wam, servicing_fee, cpr_assumption):
"""
过手证券现金流模拟
original_balance: 初始本金余额
wac: 加权平均票面利率(年化)
wam: 加权平均剩余期限(月)
servicing_fee: 服务费率(年化)
cpr_assumption: CPR 提前还款率假设(年化百分比)
返回:每月现金流列表
"""
n_months = wam
balance = original_balance
net_rate = (wac - servicing_fee) / 12
smm = 1 - (1 - cpr_assumption) ** (1/12) # 单月死亡率
cashflows = []
for month in range(1, n_months + 1):
scheduled_principal = balance / (n_months - month + 1) # 简化:等额本金
interest = balance * net_rate
prepayment = (balance - scheduled_principal) * smm
total_principal = scheduled_principal + prepayment
total_cf = total_principal + interest
cashflows.append({
'month': month,
'beginning_balance': balance,
'interest': interest,
'scheduled_principal': scheduled_principal,
'prepayment': prepayment,
'total_principal': total_principal,
'total_cashflow': total_cf
})
balance -= total_principal
if balance <= 0:
break
return cashflows点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `pass_through_cashflows`(过手证券现金流模拟)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
提前还款风险(CPR/PSA 模型)
提前还款风险(Prepayment Risk)是 MBS 投资者面临的最核心、最独特的风险。与普通债券不同,MBS 投资者无法控制底层借款人何时还款。
CPR(Conditional Prepayment Rate)
CPR 是一个年化百分比率,表示在给定年份预计被提前偿还的剩余本金比例。
PSA(Public Securities Association)标准模型
PSA 模型假设 CPR 在贷款发放后的前30个月线性增加(100% PSA = 第1个月0.2% CPR,每月增加0.2%,直到第30个月达到6% CPR),此后保持6%不变:
此处有展示代码展开 ▼
python
def psa_prepayment_model(loan_age_months, psa_speed=100):
"""
PSA 标准提前还款模型
loan_age_months: 贷款已存续的月数
psa_speed: PSA速度倍数(100=标准, 150=快, 50=慢)
"""
if loan_age_months <= 30:
cpr = 0.06 * (loan_age_months / 30)
else:
cpr = 0.06
# 根据 PSA 速度倍数调整
cpr *= (psa_speed / 100)
# 转换为单月死亡率(SMM)
smm = 1 - (1 - cpr) ** (1/12)
return cpr, smm
# 模拟不同 PSA 速度下的提前还款曲线
for psa in [50, 100, 150, 200]:
cprs = [psa_prepayment_model(m, psa)[0] for m in range(1, 361)]
print(f"PSA {psa}: 第360个月 CPR = {cprs[-1]:.2%}")点击展开可浏览运行结果
PSA 50: 第360个月 CPR = 3.00% PSA 100: 第360个月 CPR = 6.00% PSA 150: 第360个月 CPR = 9.00% PSA 200: 第360个月 CPR = 12.00%
影响提前还款的经济因素:
- 再融资激励:当前市场利率低于贷款票面利率时,借款人倾向于再融资
- 房屋周转率:搬家、换房导致的提前还款
- 违约:贷款违约导致本金提前回收
- 部分提前还款(Curtailments):借款人多还本金但不完全清偿
此处有展示代码展开 ▼
python
def refi_incentive_model(wac, current_rate, base_cpr, refi_sensitivity=0.3):
"""
考虑再融资激励的提前还款模型
wac: 贷款加权平均票面利率
current_rate: 当前市场利率
base_cpr: 基准CPR(再融资无激励时)
refi_sensitivity: 再融资弹性
"""
rate_spread = wac - current_rate
if rate_spread > 0:
# 再融资激励存在,CPR上升
refi_multiplier = 1 + refi_sensitivity * rate_spread * 100
else:
refi_multiplier = 1.0
cpr = base_cpr * refi_multiplier
return min(cpr, 0.60) # CPR 上限 60%点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `refi_incentive_model`(考虑再融资激励的提前还款模型)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
CMO 与分层结构
担保抵押贷款债务(Collateralized Mortgage Obligation, CMO)通过将过手证券的现金流重新分配到不同的"档(Tranche)",创造具有不同风险/收益特征的证券。
顺序支付结构(Sequential Pay)
最经典的 CMO 结构。各档按顺序获得本金支付——A档先获得所有本金直到还清,然后B档开始获得本金,依此类推:
此处有展示代码展开 ▼
python
def sequential_pay_cmo(pool_cashflows, tranche_sizes):
"""
顺序支付 CMO 的现金流分配
pool_cashflows: 整个贷款池的现金流
tranche_sizes: 各档的初始本金 [tranche_A, tranche_B, ...]
"""
n_tranches = len(tranche_sizes)
remaining = list(tranche_sizes)
tranche_cfs = [[] for _ in range(n_tranches)]
active_tranche = 0
for cf in pool_cashflows:
total_principal = cf['total_principal']
# 按顺序分配本金
for t in range(active_tranche, n_tranches):
if total_principal <= 0:
break
allocated = min(total_principal, remaining[t])
remaining[t] -= allocated
total_principal -= allocated
# 计算利息分配
interest_allocation = remaining[t] * cf['interest'] / cf['beginning_balance']
tranche_cfs[t].append({
'month': cf['month'],
'principal': allocated,
'interest': interest_allocation,
'remaining_balance': remaining[t]
})
if remaining[t] <= 0:
active_tranche = t + 1
return tranche_cfs点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `sequential_pay_cmo`(顺序支付 CMO 的现金流分配)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
其他分层类型
| 结构类型 | 特征 | 风险特征 |
|---|---|---|
| 顺序支付(PAC) | 在特定提前还款速度范围内有稳定现金流 | 最低提前还款风险 |
| 支持档(Support) | 吸收PAC档的提前还款波动 | 高提前还款风险,高收益率 |
| Z档(Accrual) | 前期不付息,利息滚入本金 | 极大凸度风险 |
| IO/PO | IO仅收利息,PO仅收本金 | 极端提前还款敏感性 |
负凸度问题
MBS 最让投资者头痛的特征是负凸度(Negative Convexity)。
正常债券是正凸度:收益率下降时价格涨幅扩大,收益率上升时价格跌幅收窄。这是投资者的朋友。
MBS 因为内嵌了借款人的提前还款期权,呈现出负凸度:
- 利率下降
提前还款激增 投资者提前收回本金,只能以更低利率再投资 价格涨幅受限制("压缩") - 利率上升
提前还款骤减 投资者本金锁定时间更长 价格跌幅扩大("延伸")
此处有展示代码展开 ▼
python
def mbs_price_vs_rate(pool_cf_generator, rates_range):
"""
MBS 在不同利率情景下的价格模拟 —— 展示负凸度
pool_cf_generator: 函数(rate)->cashflows
rates_range: 测试的利率范围
"""
prices = []
for r in rates_range:
cfs = pool_cf_generator(r)
# 用当前利率折现
price = sum(cf['total_cashflow'] / (1 + r/12)**cf['month'] for cf in cfs)
prices.append(price)
# 计算有效久期和有效凸度
P0 = prices[len(prices)//2]
dy = rates_range[1] - rates_range[0]
duration = -(prices[len(prices)//2 + 1] - prices[len(prices)//2 - 1]) / (2 * P0 * dy)
convexity = (prices[len(prices)//2 + 1] + prices[len(prices)//2 - 1] - 2*P0) / (P0 * dy**2)
print(f"有效久期: {duration:.2f}")
print(f"有效凸度: {convexity:.2f} {'正凸度' if convexity > 0 else '负凸度⚠️'}")
return prices点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `mbs_price_vs_rate`(MBS 在不同利率情景下的价格模拟 —— 展示负凸度)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。
中美资产证券化对比
| 维度 | 美国 MBS | 中国信贷资产证券化 |
|---|---|---|
| 基础资产 | 住房抵押贷款为主 | 企业贷款(CLO)、房贷(RMBS)、消费贷(ABS)多元 |
| 政府担保 | GSE(房利美/房地美)提供大量担保 | 无政府机构担保,信用增级靠结构分层 |
| 市场规模 | ~12万亿美元(agency MBS) | 约3-4万亿人民币,增长快但体量差距大 |
| 流动性 | 流动性极好 | 流动性较差,主要在银行间市场 |
| 提前还款 | 成熟模型(CPR/PSA),数据丰富 | 再融资文化不同,提前还款率通常更低 |
| 定价基准 | 国债+OAS | 多为固定利率,缺乏活跃二级市场定价 |
| 信息披露 | 贷款级数据透明 | 资产池信息披露正在改善中 |
中国市场的特殊关注点:由于中国房贷利率以LPR为基准(2019年后),以及购房政策变化(限购、限贷调整),提前还款行为与美国存在根本性差异。美国"再融资驱动"的分析框架在中国不完全适用,需要结合政策周期和居民理财行为重新构建模型。
OAS(期权调整利差)的概念:
$$P_{\text{market}} = \frac{1}{N}\sum_{i=1}^N \sum_{t=1}^T \frac{CF_t(\text{path}_i)}{(1 + r_t(\text{path}_i) + OAS)^t}$$
OAS 是使模型价格等于市场价格所需加在每条利率路径折现率上的固定利差。它是衡量 MBS 相对价值的最核心指标。