第三章 收益率曲线入门

收益率曲线这东西,说白了就是债券市场的「体温计」。我做了这么多年利率模型,每次看市场第一件事就是瞄一眼曲线长什么样。它告诉你短期利率和长期利率之间的关系,背后藏着市场对经济的所有预期。

3.1 收益率曲线到底是什么?

先给个最直白的定义:收益率曲线是同一信用等级、不同期限债券的收益率连线。通常我们拿国债来做,因为国债没有信用风险,纯粹反映利率本身。

举个例子。假设今天市场上:

  • 3个月国债收益率 2.0%
  • 1年期国债收益率 2.5%
  • 5年期国债收益率 3.0%
  • 10年期国债收益率 3.2%
  • 30年期国债收益率 3.3%

把这些点连起来,就是一条收益率曲线。横轴是期限,纵轴是收益率。

核心要点:收益率曲线不是预测出来的,是市场交易出来的。每一笔成交都在告诉你,市场参与者对未来的利率走势怎么看。

我个人习惯把收益率曲线分成三部分看:短端(1年以内)、中端(2-7年)、长端(10年以上)。短端受货币政策影响最大,长端反映经济增长和通胀预期。

3.2 三种经典曲线形态

我在项目中见过无数次曲线变脸,但万变不离其宗,就三种基本形态。

正常曲线(向上倾斜)

这是最常见的形态。短期收益率低,长期收益率高。为什么?因为借钱时间越长,不确定性越大,投资者要求更高的补偿——也就是期限溢价。

正常曲线说明市场预期经济温和增长,通胀可控。我2017年做美债模型时,大部分时间曲线都是这个形状。

倒挂曲线(向下倾斜)

短期收益率比长期还高,这就反常了。倒挂通常出现在加息周期的末端,市场预期经济要衰退,央行很快会降息。

避坑指南:我曾经在2022年看到2年期和10年期美债收益率倒挂,当时很多人说这次不一样。结果呢?2023年硅谷银行就出事了。倒挂不是100%预测衰退,但历史上准确率相当高。

倒挂的典型特征是:短端被加息推得很高,长端因为衰退预期涨不动。你想想看,如果大家都觉得半年后经济不行了,谁还愿意锁定高利率?

平坦曲线

长短端收益率差不多,曲线几乎水平。这通常是正常曲线和倒挂曲线之间的过渡状态。市场在观望,方向不明。

平坦曲线最让人头疼。做交易策略时,方向性押注很难赚钱。我一般建议这时候做曲线交易,比如做陡或做平策略。

小技巧:判断曲线形态,我常用10年期减2年期利差。利差大于100bp算陡峭,小于0算倒挂,0-50bp之间算平坦。

3.3 曲线构建方法

你可能觉得,曲线不就是把收益率点连起来吗?嗯,没那么简单。市场上只有有限期限的债券在交易,比如3个月、6个月、1年、2年...但我们需要任意期限的收益率来做定价。

这就引出了曲线构建的核心问题:如何从离散的样本点得到连续的收益率曲线?

方法一:线性插值

最简单粗暴的方法。两个已知点之间画直线。比如1年期收益率2.5%,2年期收益率2.8%,那1.5年就是2.65%。

def linear_interpolate(t, t1, t2, y1, y2):
    """
    线性插值计算收益率
    t: 目标期限
    t1, t2: 已知期限
    y1, y2: 已知收益率
    """
    return y1 + (y2 - y1) * (t - t1) / (t2 - t1)

# 示例
y_1_5 = linear_interpolate(1.5, 1.0, 2.0, 0.025, 0.028)
print(f"1.5年期收益率: {y_1_5:.4f}")  # 输出: 0.0265

线性插值的问题很明显——曲线不够平滑,导数不连续。做衍生品定价时,这会导致对冲参数不稳定。

方法二:样条插值

我更喜欢用三次样条。它保证曲线二阶连续可导,看起来更自然。说白了,就是用分段三次多项式把点连起来。

import numpy as np
from scipy.interpolate import CubicSpline

# 已知数据点
maturities = np.array([0.25, 0.5, 1.0, 2.0, 3.0, 5.0, 7.0, 10.0, 20.0, 30.0])
yields = np.array([0.020, 0.022, 0.025, 0.028, 0.030, 0.032, 0.033, 0.034, 0.035, 0.036])

# 构建三次样条
cs = CubicSpline(maturities, yields)

# 预测任意期限
target = 4.5
pred_yield = cs(target)
print(f"{target}年期收益率: {pred_yield:.4f}")

注意:样条插值在数据点稀疏时可能过冲。我在2019年做人民币利率曲线时,5年和7年之间数据太少,样条跑出了负利率。后来加了边界约束才解决。

方法三:参数化模型

这是机构最常用的方法。用少数几个参数描述整条曲线。最经典的是Nelson-Siegel模型:

def nelson_siegel(t, beta0, beta1, beta2, tau):
    """
    Nelson-Siegel收益率曲线模型
    t: 期限(年)
    beta0: 长期利率水平
    beta1: 短期利率偏离
    beta2: 曲率
    tau: 衰减因子
    """
    factor = (1 - np.exp(-t/tau)) / (t/tau)
    return beta0 + beta1 * factor + beta2 * (factor - np.exp(-t/tau))

# 拟合示例参数
params = {'beta0': 0.035, 'beta1': -0.015, 'beta2': 0.005, 'tau': 2.5}
t = np.linspace(0.1, 30, 100)
curve = nelson_siegel(t, **params)

Nelson-Siegel的好处是参数有经济含义:beta0是长期水平,beta1是斜率,beta2是曲率。做宏观分析时,看这几个参数的变化比看整条曲线方便得多。

3.4 知识体系总览

下面这张图把收益率曲线的核心逻辑串起来了。我每次培训都拿它当开场白:

收益率曲线知识体系 收益率曲线 定义与核心概念 期限结构 风险溢价 市场预期 三种经典形态 正常(向上) 倒挂(向下) 平坦 曲线构建方法 线性插值 样条插值 参数化模型 应用:债券定价 · 风险管理 · 宏观分析

这张图你看懂了吗?收益率曲线不是孤立的概念。它连接了期限结构、风险溢价和市场预期,最终服务于债券定价和风险管理。我每次做新项目,都会先画这么一张图,把知识点串起来。

3.5 实战中的选择

说了这么多方法,到底用哪个?我的建议是:

场景 推荐方法 原因
快速估值 线性插值 简单、计算快、不易出错
衍生品定价 三次样条 平滑性好,对冲参数稳定
宏观分析 Nelson-Siegel 参数有经济含义,便于解释
高频交易 多项式插值 计算效率最高

我的经验:别在方法选择上纠结太久。先跑通一个简单的版本,再慢慢优化。我见过太多人花两周选模型,最后发现数据质量才是瓶颈。

收益率曲线入门就讲到这里。记住三件事:曲线形态告诉你市场在想什么,构建方法决定了你的定价精度,而实战经验能帮你避开那些坑。嗯,这些够你消化一阵子了。


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