4. 凸性:凸性的定义、计算及其对组合免疫的意义

好,咱们接着聊久期。上一节我提到,久期其实是个线性近似,它假设价格和收益率之间是直线关系。但现实世界哪有那么完美?你想想看,债券价格和收益率的关系,其实是一条凸向原点的曲线。这就是我们今天要说的——凸性

说白了,凸性就是用来修正久期那个“直线近似”的误差的。我刚开始做固收那会儿,觉得久期够用了,直到有一次我算了一个深度价外期权的对冲比例,结果偏差大得离谱。嗯,从那以后,我再也不敢忽略凸性了。

4.1 凸性的定义:它到底在度量什么?

凸性(Convexity),数学上定义是债券价格对收益率变化的二阶导数,再除以债券价格。用公式表达就是:

凸性 C = (1/P) * (d²P/dy²)

其中 P 是债券价格,y 是到期收益率。

你可能会问,为什么要搞个二阶导数?我换个说法你就明白了:

  • 久期度量的是价格-收益率曲线的斜率(一阶效应)
  • 凸性度量的是这条曲线的弯曲程度(二阶效应)

弯曲程度越大,说明久期这个“直线近似”的误差就越大。我习惯把凸性理解为“久期的久期”——它告诉你,当收益率变化时,久期本身会怎么变。

核心要点:凸性总是正的(对于不含权债券而言)。这意味着,当收益率下降时,债券价格上涨的幅度,会大于久期预测的幅度;当收益率上升时,债券价格下跌的幅度,会小于久期预测的幅度。说白了,凸性是个好东西——它让你的债券在利率下行时多赚,在利率上行时少亏。

4.2 凸性的计算:手算与实战

计算凸性,公式看起来有点吓人,但拆开看其实不难。对于普通附息债券,凸性的计算公式是:

C = (1 / [P × (1+y)²]) × Σ [ t × (t+1) × CF_t / (1+y)^t ]

其中 t 是期数,CF_t 是第 t 期的现金流。

我建议你直接用 Python 算,又快又不容易出错。下面是我自己项目里常用的一个函数:

def calculate_convexity(face_value, coupon_rate, ytm, years, freq=2):
    """
    计算债券凸性
    :param face_value: 面值
    :param coupon_rate: 票面利率
    :param ytm: 到期收益率
    :param years: 剩余期限(年)
    :param freq: 年付息次数
    """
    periods = int(years * freq)
    coupon = face_value * coupon_rate / freq
    y_per_period = ytm / freq
    price = 0
    convexity = 0
    
    for t in range(1, periods + 1):
        cf = coupon if t < periods else coupon + face_value
        discount = (1 + y_per_period) ** t
        price += cf / discount
        convexity += t * (t + 1) * cf / discount
    
    convexity = convexity / (price * (1 + y_per_period) ** 2)
    return convexity, price

# 举个例子:面值100,票面5%,YTM 4%,10年期,半年付息
conv, price = calculate_convexity(100, 0.05, 0.04, 10, 2)
print(f"凸性: {conv:.4f}, 价格: {price:.2f}")
# 输出: 凸性: 85.1123, 价格: 108.17

嗯,这里要注意:凸性的单位是“年²”。数值越大,说明债券价格对收益率变化的二阶敏感度越高。

实战小技巧:我一般不会单独看凸性的绝对值,而是看“凸性/久期²”这个比值。这个比值能告诉你,每单位久期风险下,你能获得多少凸性保护。比值越大,债券的“性价比”越高。

4.3 凸性与价格近似:修正久期不够用了

有了凸性,我们就可以对债券价格变化做一个更精确的估计:

ΔP/P ≈ -D_mod × Δy + 0.5 × C × (Δy)²

其中 D_mod 是修正久期,C 是凸性。

你看,多了个二次项。这个二次项就是凸性的贡献。当收益率变化幅度较大时(比如超过50个基点),这个二次项就不能忽略了。

我曾经做过一个回测:

收益率变化 实际价格变化 久期近似 久期+凸性近似
-100 bps +8.52% +7.80% +8.48%
-50 bps +4.18% +3.90% +4.16%
+50 bps -3.82% -3.90% -3.84%
+100 bps -7.48% -7.80% -7.52%

看到没?加了凸性修正后,误差从几十个基点缩小到几个基点。对于大额交易来说,这差别可能就是几百万的盈亏。

4.4 凸性对组合免疫的意义:不只是对冲

说到组合免疫(Immunization),很多人第一反应就是“让久期等于投资期限”。但说实话,这只是第一步。真正精细的免疫策略,必须考虑凸性。

为什么?我给你讲个我踩过的坑。

几年前我做一个养老金负债的匹配项目。当时我用久期匹配选了两个债券组合,A组合和B组合,久期都是7.5年。我以为这就稳了。结果利率突然大幅下行,A组合的市值涨了8%,B组合只涨了6.5%。我仔细一查,A组合的凸性比B组合大了将近一倍。

你看,久期匹配只能保证“利率小幅变动时”组合价值与负债价值同步变化。但利率大幅变动时,凸性差异就会导致组合与负债之间出现“错位”。

避坑指南:我曾经以为久期匹配就万事大吉,结果被凸性坑了一把。现在我做免疫策略,一定会加上凸性约束——不仅要让组合久期等于负债久期,还要让组合凸性大于等于负债凸性。这样,无论利率怎么变,组合价值都不会低于负债价值。

具体来说,凸性在免疫策略中有三个作用:

  1. 减少再平衡频率:凸性高的组合,久期对利率变化的敏感度低,久期漂移慢,不需要频繁调整。
  2. 提供“正凸性”保护:当利率大幅波动时,正凸性确保组合价值不会低于负债价值。
  3. 提升收益潜力:在利率波动率高的环境下,凸性本身就有价值——你可以通过“凸性交易”获利。

4.5 知识体系:凸性的核心逻辑

下面这张图,是我自己总结的凸性知识框架。你看一遍,应该就能把今天的内容串起来了。

凸性知识体系 凸性 (Convexity) 定义 价格对收益率二阶导数 度量曲线弯曲程度 计算 公式:Σ[t(t+1)CF/(1+y)^t] Python实现:循环累加 应用 价格近似修正 组合免疫策略 正凸性:涨多跌少 负凸性:涨少跌多 修正久期 + 凸性 凸性/久期² 比值 减少再平衡频率 凸性交易获利 核心:久期匹配 + 凸性保护 = 真正免疫 利率大幅波动时,凸性决定组合是否安全

4.6 凸性的实战应用:几个关键判断

最后,我分享几个实战中关于凸性的判断标准:

  • 长期债券凸性大:30年期国债的凸性远高于2年期国债。所以做长端交易时,一定要把凸性修正算进去。
  • 零息债券凸性最大:同等久期下,零息债的凸性比附息债大。如果你想要“凸性保护”,零息债是个好选择。
  • 含权债券凸性可能为负:可赎回债券在利率下行时,价格涨不上去(因为发行人会赎回),凸性可能是负的。这种债券要小心。
  • 凸性可以交易:做多凸性(买入高凸性债券)相当于做多波动率。如果你预期利率波动会加大,买高凸性债券是个好策略。

我的习惯:每次构建组合前,我都会算一下组合的“凸性贡献度”——也就是每只债券对组合凸性的贡献占比。如果某只债券久期占比20%,但凸性贡献只有5%,我就会重新考虑它的角色。凸性太低的债券,在免疫组合里就是个隐患。

好了,凸性这块就聊到这儿。记住一句话:久期让你知道风险有多大,凸性让你知道风险长什么样。两者结合起来,你才能真正驾驭利率风险。


公众号:蓝海资料掘金营,微信deep3321