halo 的技术博客

返回

信用风险最核心的问题只有一个:这家公司多大概率会违约? 评级机构给你一个字母(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)
plaintext

DD 的含义极其直观:当前资产价值离违约边界还有几个标准差。 合成三家公司里,健康公司 DD=7.39(PD≈0)、中等公司 DD=3.63(PD=0.014%)、困境公司 DD=1.91(PD=2.80%)。用 200 条蒙特卡洛资产路径独立验证困境公司,经验违约频率 2.50% 紧贴理论 PD 2.80%。附完整 Python 与六类真实陷阱(高阶)。

Merton 结构化模型:资产跌破债务面值即违约

一、股权就是一份看涨期权#

这是整个模型的灵魂,值得慢慢说。假设一家公司在时刻 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·V
plaintext

两个方程、两个未知数(V 和 σ_V),联立迭代求解即可。 这就是 Merton 模型的全部数学。

三、用 Python 反解资产价值与波动率#

先写自包含的正态 CDF 和 Merton 迭代求解器:

然后是违约距离和违约概率:

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, PD
python

注意这里用的是真实漂移 μ(资产的期望增长率),不是无风险利率 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
健康公司 A1091.10.1830.277.39≈0.000%
中等公司 B788.20.2030.513.630.014%
困境公司 C603.60.1360.831.912.80%

违约距离与违约概率对比

几个值得注意的点:

  1. DD 是「离违约还有几个标准差」的直觉度量。 健康公司离违约边界 7.4 个标准差,正态尾部概率几乎为 0;困境公司只剩 1.9 个标准差,PD 跳到 2.8%。
  2. 困境公司的股权波动 σ_E=0.65 很高,但反解的资产波动 σ_V 只有 0.136。 这不矛盾——高杠杆下股权是资产的高杠杆期权,σ_E 被杠杆放大了好几倍。第二条方程 σ_E·E = N(d1)·σ_V·V 正是干这个去杠杆的活。
  3. 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 估计、测度选择与迭代稳健性逐一检验。

Merton 违约距离:用期权定价思想给公司违约概率打分
https://blog.halo26812.eu.org/blog/credit-merton-distance-to-default
Author halo
Published at 2026年7月15日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨