Merton 违约距离:用期权定价思想给公司违约概率打分
股权本质是公司资产对债务的一份看涨期权:资产高于债务,股东拿走剩余;资产跌破债务,股东行权失败、公司违约。Merton(1974) 用这个洞见把 Black-Scholes 反过来用——由可观测的股权市值与波动率,联立两条方程反解不可观测的资产价值与资产波动率,再算出违约距离 DD 与违约概率 PD=N(−DD)。合成三家公司里,健康公司 DD=7.39/PD≈0、中等 DD=3.63/PD=0.014%、困境 DD=1.91/PD=2.80%,蒙特卡洛 200 条路径经验 PD=2.50% 验证理论值。附完整 Python 与六类真实陷阱(高阶)。
信用风险最核心的问题只有一个:这家公司多大概率会违约? 评级机构给你一个字母(AAA、BBB、CCC),但字母更新慢、滞后于市场。有没有办法用天天在变的股价,实时算出一个违约概率?有——Merton 在 1974 年就给出了答案,而且用的是 Black-Scholes 期权定价那套东西。
结论先放这:把公司的股权看成「资产对债务的一份看涨期权」——到期日资产价值高于债务面值,股东行权拿走差额;资产跌破债务,股东放弃行权(有限责任),公司违约、债权人接管。既然股权是期权,那 Black-Scholes 就能反过来用:由可观测的股权市值 E 和股权波动率 σ_E,联立两条方程反解出不可观测的资产价值 V 和资产波动率 σ_V,再算出「违约距离」:
DD = [ln(V/D) + (μ − 0.5σ_V²)T] / (σ_V·√T), PD = N(−DD)plaintextDD 的含义极其直观:当前资产价值离违约边界还有几个标准差。 合成三家公司里,健康公司 DD=7.39(PD≈0)、中等公司 DD=3.63(PD=0.014%)、困境公司 DD=1.91(PD=2.80%)。用 200 条蒙特卡洛资产路径独立验证困境公司,经验违约频率 2.50% 紧贴理论 PD 2.80%。附完整 Python 与六类真实陷阱(高阶)。

一、股权就是一份看涨期权#
这是整个模型的灵魂,值得慢慢说。假设一家公司在时刻 T 有一笔债务到期,面值为 D。到期时公司资产价值为 V_T:
- 如果 V_T > D:公司还清债务,股东拿走剩余
V_T − D; - 如果 V_T < D:公司资不抵债,股东有限责任、什么都不拿(价值 0),债权人接管全部资产。
股东在到期日的收益是 max(V_T − D, 0)——这正是一份行权价为 D、标的为公司资产 V 的欧式看涨期权的到期收益。所以:
股权 E = 看涨期权(标的=资产V, 行权价=债务D, 到期=债务期限T)plaintext对称地,债权人相当于持有无风险债券、同时卖出了一份看跌期权(卖出了「资产跌破 D 时的损失保护」)。这套「股权=看涨、债务=无风险债券−看跌」的拆解,就是结构化信用模型的基石。
二、可观测的和不可观测的#
问题来了:Black-Scholes 需要知道标的(资产 V)的当前价值和波动率 σ_V,但这两个都看不见——资产价值不在市场上交易,只有股权在交易。我们能观测的是:
- 股权市值 E:股价 × 流通股数,天天有;
- 股权波动率 σ_E:从股价历史或期权隐含波动率估计;
- 债务面值 D:从财报读(通常用「短期负债 + 0.5×长期负债」作违约点);
- 无风险利率 r、期限 T。
Merton 的巧思是:用两条方程把「可观测」和「不可观测」连起来。第一条是 BS 定价方程本身:
E = V·N(d1) − D·e^{−rT}·N(d2)plaintext第二条来自伊藤引理——股权波动率和资产波动率的关系(股权是资产的期权,杠杆放大波动):
σ_E·E = N(d1)·σ_V·Vplaintext两个方程、两个未知数(V 和 σ_V),联立迭代求解即可。 这就是 Merton 模型的全部数学。
三、用 Python 反解资产价值与波动率#
先写自包含的正态 CDF 和 Merton 迭代求解器:
import numpy as np
def norm_cdf(x):
x = np.asarray(x, dtype=float)
sign = np.sign(x)
z = np.abs(x) / np.sqrt(2.0)
t = 1.0 / (1.0 + 0.3275911 * z)
a = [0.254829592, -0.284496736, 1.421413741, -1.453152027, 1.061405429]
erf = 1.0 - (((((a[4]*t+a[3])*t)+a[2])*t+a[1])*t+a[0])*t*np.exp(-z*z)
return 0.5 * (1.0 + sign * erf)
def solve_merton(E, sigma_E, D_face, r, T, tol=1e-8, max_iter=500):
"""由可观测股权 E, σ_E 反解资产 V, σ_V(不动点迭代)"""
V = E + D_face # 初值:资产≈股权+债务
sigma_V = sigma_E * E / V
for _ in range(max_iter):
d1 = (np.log(V/D_face) + (r + 0.5*sigma_V**2)*T) / (sigma_V*np.sqrt(T))
d2 = d1 - sigma_V*np.sqrt(T)
V_new = (E + D_face*np.exp(-r*T)*norm_cdf(d2)) / norm_cdf(d1)
sigma_V_new = sigma_E * E / (V_new * norm_cdf(d1))
if abs(V_new-V) < tol and abs(sigma_V_new-sigma_V) < tol:
V, sigma_V = V_new, sigma_V_new
break
V, sigma_V = V_new, sigma_V_new
d1 = (np.log(V/D_face) + (r + 0.5*sigma_V**2)*T) / (sigma_V*np.sqrt(T))
d2 = d1 - sigma_V*np.sqrt(T)
return V, sigma_V, d1, d2python然后是违约距离和违约概率:
def dd_pd(V, sigma_V, D_face, mu, T):
DD = (np.log(V/D_face) + (mu - 0.5*sigma_V**2)*T) / (sigma_V*np.sqrt(T))
PD = norm_cdf(-DD)
return DD, PDpython注意这里用的是真实漂移 μ(资产的期望增长率),不是无风险利率 r——因为我们要算的是真实世界(P 测度)的违约概率,不是风险中性定价。这是一个关键区别(见陷阱四)。
四、三家公司,三种命运#
跑三家杠杆和波动率各异的公司:
r, T, mu = 0.03, 1.0, 0.08
firms = [
("健康公司 A", 800.0, 0.25, 300.0), # 股权大、债务小
("中等公司 B", 400.0, 0.40, 400.0), # 股权≈债务
("困境公司 C", 120.0, 0.65, 500.0), # 股权小、债务大、波动高
]
for name, E, sE, Df in firms:
V, sV, d1, d2 = solve_merton(E, sE, Df, r, T)
DD, PD = dd_pd(V, sV, Df, mu, T)
print(f"{name}: V={V:.1f} σ_V={sV:.3f} 杠杆={Df/V:.2f} DD={DD:.2f} PD={PD*100:.3f}%")python真实输出:
| 公司 | 反解资产 V | 资产波动 σ_V | 杠杆 D/V | 违约距离 DD | 违约概率 PD |
|---|---|---|---|---|---|
| 健康公司 A | 1091.1 | 0.183 | 0.27 | 7.39 | ≈0.000% |
| 中等公司 B | 788.2 | 0.203 | 0.51 | 3.63 | 0.014% |
| 困境公司 C | 603.6 | 0.136 | 0.83 | 1.91 | 2.80% |

几个值得注意的点:
- DD 是「离违约还有几个标准差」的直觉度量。 健康公司离违约边界 7.4 个标准差,正态尾部概率几乎为 0;困境公司只剩 1.9 个标准差,PD 跳到 2.8%。
- 困境公司的股权波动 σ_E=0.65 很高,但反解的资产波动 σ_V 只有 0.136。 这不矛盾——高杠杆下股权是资产的高杠杆期权,σ_E 被杠杆放大了好几倍。第二条方程
σ_E·E = N(d1)·σ_V·V正是干这个去杠杆的活。 - PD 对杠杆高度非线性。 杠杆从 0.27 升到 0.51 再到 0.83,PD 从 ≈0 到 0.014% 再到 2.80%——最后一步的跳升远比前一步剧烈。
五、DD 对杠杆与波动率的敏感性#
违约距离由两个因素驱动:杠杆越高、资产波动越大,DD 越低、越危险。把这两个维度扫一遍:

图里三条曲线是三个波动率水平下,DD 随杠杆的变化。规律很清楚:
- 同样杠杆,波动率越高 DD 越低(红线永远在绿线下方)——一家波动大的公司,即使杠杆不高也可能很危险;
- DD 随杠杆单调下降,且在高杠杆区(D/V>0.8)加速塌向 0;
- 当 DD 跌破 0,意味着当前资产价值已经低于债务的预期增长路径,违约概率超过 50%。
这解释了为什么 2008 年高杠杆 + 资产波动飙升的组合会让金融机构的隐含违约概率在几周内爆炸——两个因素同时朝坏的方向走,DD 被双重挤压。
六、蒙特卡洛独立验证#
DD 和 PD 是解析公式,怎么知道它对不对?用一个完全独立的方法验证:直接模拟困境公司的资产价值路径,数数有多少条到期跌破债务边界。
rng = np.random.default_rng(42)
V0, sV, Df = 603.6, 0.136, 500.0
n_paths, n_steps = 200, 252
dt = T / n_steps
paths = np.full((n_paths, n_steps+1), V0)
for i in range(n_steps):
z = rng.standard_normal(n_paths)
paths[:, i+1] = paths[:, i] * np.exp((mu-0.5*sV**2)*dt + sV*np.sqrt(dt)*z)
emp_pd = (paths[:, -1] < Df).mean()
print(f"经验 PD={emp_pd*100:.2f}% 理论 PD=2.80%")python
200 条几何布朗运动路径里,5 条(经验 PD=2.50%)到期跌破债务边界,紧贴解析理论值 2.80%(差异来自有限样本抽样误差,路径数越多越贴合)。两条独立路线得到一致结果,说明公式实现正确。
七、六类真实陷阱(高阶)#
陷阱一:违约点 D 不是账面总负债。 实务里(KMV/Moody’s 版本)违约点常取「短期负债 + 0.5×长期负债」,因为长期债务不会全在 T 时刻到期。用总负债作 D 会系统性高估 PD。违约点的选取直接决定 DD 的绝对水平,跨公司比较必须用同一口径。
陷阱二:迭代可能不收敛或收敛到荒谬值。 对极度困境的公司(股权接近 0、波动率极高),不动点迭代可能振荡或跑飞。生产系统要加收敛检查、失败回退(改用更稳的股权价值滚动窗口估 σ_V 的 KMV 迭代法),并对 σ_V 加合理边界约束。本文三家公司都干净收敛,真实脏数据没这运气。
陷阱三:正态假设让极端 PD 严重偏低。 DD→PD 的映射 PD=N(−DD) 用的是正态分布。但资产收益有肥尾,正态在远尾(高 DD)严重低估违约概率——理论上 DD=7 的公司 PD≈10⁻¹²,现实里 AAA 公司也没这么安全。这就是为什么 KMV 不直接用 N(−DD),而是用 DD 去查一张历史违约频率表(EDF,Expected Default Frequency)做经验映射。把 DD 当排序信号可靠,把 N(−DD) 当绝对 PD 危险。
陷阱四:漂移 μ 用真实还是风险中性,取决于你要算什么。 算真实世界违约概率(P 测度)用资产的真实期望增长率 μ;算信用利差/债券定价(Q 测度)要用无风险利率 r。本文算 PD 用 μ=0.08。混用会导致 PD 系统性偏差——用 r(通常 < μ)会高估 PD。报告 PD 时必须说明用的是哪个测度。
陷阱五:单期到期假设过度简化了真实资本结构。 经典 Merton 假设公司只有一笔零息债务、在 T 时刻一次性到期,且只在到期日检验违约。真实公司债务期限错落、可能在到期前任何时刻违约(First-Passage 模型如 Black-Cox 允许这点)。单期 Merton 会低估「早违约」风险,是它已知的保守偏差。
陷阱六:σ_E 的估计窗口决定一切。 股权波动率用历史窗口估会滞后(危机来了波动率还没反映),用期权隐含波动率更前瞻但个股期权流动性差。σ_E 估偏,通过第二条方程直接污染 σ_V,进而污染 DD。压力期尤其危险——恰恰是你最需要准确 PD 的时候,σ_E 估计最不可靠。实务里常同时报「历史波动版」和「隐含波动版」两个 DD 做交叉验证。
八、诚实结论#
Merton 违约距离是「把股价变成信用信号」的标杆方法:股权是资产对债务的看涨期权,反用 Black-Scholes 由可观测的股权反解不可观测的资产,DD 告诉你离违约还有几个标准差。合成三家公司里 DD 从 7.39(健康)到 1.91(困境)单调恶化、PD 从 ≈0 到 2.80% 非线性跳升,蒙特卡洛 200 条路径经验 PD 2.50% 验证了理论 2.80%。
落到实盘,先过 违约点口径、迭代收敛性、正态尾部低估、P/Q 测度选择、单期简化、σ_E 估计窗口 这六关。最有用的姿势:别把 N(−DD) 当绝对违约概率信,把 DD 当跨公司、跨时间的相对信用排序信号用——DD 天天更新、领先评级、对杠杆和波动率的恶化极其敏感,这正是它相对静态评级最大的价值。
注:全文数据为自洽合成(三家公司的股权/波动/债务为设定值,资产价值与波动率由 Merton 方程真实反解,蒙特卡洛用确定性种子)。所有 DD、PD 均由文中 Python 逻辑真实计算。真实复现请用实际财报与市场数据,并对违约点口径、σ_E 估计、测度选择与迭代稳健性逐一检验。