halo 的技术博客

返回

买过股指期货的人对期货的直觉是「一个标的、一个价格」。但国债期货完全不是这样:一张 5 年期国债期货合约(比如中金所 TF)对着的不是某一只国债,而是一整篮子符合条件的可交割券。交割日到了,是空头决定用篮子里的哪一只券去交割——理性的空头当然会挑对自己成本最低、也就是「最便宜」的那只交。

这只被挑中的券,就叫 CTD(Cheapest-to-Deliver,最便宜可交割券)。理解 CTD,是理解国债期货定价、基差交易乃至久期对冲的第一块基石。因为期货价格实际上是被 CTD 锚定的——期货追的不是某只固定的债,而是「此刻篮子里最便宜的那只」,而这只券会随着收益率变化而切换。

可交割券篮子毛基差对比:最小者即 CTD

一、为什么需要「转换因子」#

问题的起点是:可交割券篮子里的债票息不同、剩余期限不同,价格天差地别。一只 3.4% 票息的债和一只 2.4% 票息的债,净价可能差好几块钱。如果直接按净价交割,空头永远只会交那只最便宜(票息最低、久期最短)的券,合约就没意义了。

交易所的解决办法是给每只可交割券配一个转换因子(Conversion Factor, CF):它约等于「假设该券到期收益率等于合约名义票息(比如 3%)时,每 1 元面值的净价」。这样做的目的,是把不同票息久期的债券在名义票息水平上「拉平」。

空头实际交割时收到的钱是:

发票价格(Invoice Price)=F×CF+应计利息\text{发票价格(Invoice Price)} = F \times CF + \text{应计利息}

其中 FF 是期货结算价。空头买入现券付出的是现券全价(净价 + 应计利息)。所以空头的净交割成本(忽略应计利息,因为两边都有、大致抵消)近似为:

交割损益F×CF现券净价\text{交割损益} \approx F \times CF - \text{现券净价}

要让这个损益最大(成本最小),空头就选让 (净价F×CF)(\text{净价} - F \times CF) 最小的那只券。这个 (净价F×CF)(\text{净价} - F \times CF) 有个名字——毛基差(Gross Basis)

二、毛基差与 CTD 的判定#

毛基差的定义直接给出:

Gross Basisi=PiF×CFi\text{Gross Basis}_i = P_i - F \times CF_i

其中 PiP_i 是第 ii 只券的净价,CFiCF_i 是它的转换因子。毛基差最小的那只券,就是 CTD。

我们用一个 5 年期国债期货的可交割券篮子做算例。假设期货价格 F=100.15F = 100.15

输出:

券A 2.60% 4.1y    毛基差 = +0.0014
券B 3.10% 4.6y    毛基差 = +0.6785
券C 2.85% 5.2y    毛基差 = +0.3202
券D 3.40% 6.3y    毛基差 = +1.0963
券E 2.40% 3.8y    毛基差 = -0.5675

CTD = 券E 2.40% 3.8y  毛基差 = -0.5675
plaintext

结果符合直觉:券E票息最低(2.40%)、久期最短(3.8 年),它的毛基差最小(甚至为负),是当前的 CTD。这也印证了一条经验法则——在收益率高于名义票息时,低票息、短久期的券倾向于成为 CTD(后文第四节会验证这条规律会随利率翻转)。

三、把毛基差拆成 carry 和净基差#

毛基差还不够干净。持有一只现券到交割日,你会收到票息(正 carry),同时要付出资金成本(融资买券的利息,负 carry)。这部分「持有期损益」叫持有收益(Carry),它和交割时点的期权价值是两回事。

把它剥离出来,剩下的就是净基差(Net Basis),也叫 BNOC(Basis Net of Carry)

Net Basis=Gross BasisCarry\text{Net Basis} = \text{Gross Basis} - \text{Carry}

净基差的经济含义非常重要:它约等于空头持有的那只「择券期权 + 时机期权」的隐含价值。空头在交割月里有权选择交哪只券、哪天交——这些可选性(optionality)不是免费的,市场会给它定价,价格就体现在净基差里。净基差恒非负(理论上),就是因为期权价值非负。

r = 0.018      # 资金成本(年化)
days = 60      # 到交割天数

carry = np.array([
    cp/100 * p * days/365   -   r * p * days/365   # 票息收入 - 资金成本
    for (_, cp, _, p, _) in bonds
])
net = gross - carry

for (nm, *_), g, c, n in zip(bonds, gross, carry, net):
    print(f"{nm:16s} 毛基差={g:+.4f}  carry={c:+.4f}  净基差={n:+.4f}")
python

基差拆解:毛基差 = 持有收益 carry + 净基差

上图把每只券的毛基差(黑色虚线)拆成绿色的 carry 和橙色的净基差两段。可以看到:CTD(券E)的净基差最小——这正是「CTD 是让空头的择券期权最不值钱、也就是空头最不需要为可选性付费的那只券」的另一种表述。净基差最小 ⇔ 隐含期权价值最低 ⇔ 最便宜可交割。

注意 carry 的口径:上面用了「票息收入按面值票息 - 资金成本按净价」的简化写法。严格算法应区分应计利息累积、回购利率(repo)与实际结算日历,这一点在第五节陷阱里展开。

四、CTD 会切换:收益率一漂移,最便宜的券就换人#

CTD 不是一成不变的。转换因子是在「名义票息 3%」这个固定假设下算出来的,一旦市场收益率偏离 3%,转换因子的「拉平」就会失真,产生系统性偏差:

  • 收益率 > 名义票息时:长久期券对利率更敏感,价格跌得更多,转换因子「高估」了它们,于是低息短久期券变成 CTD;
  • 收益率 < 名义票息时:情况反转,高息长久期券反而更便宜,成为 CTD。

我们让整条收益率曲线平移 −150bp 到 +150bp,重新计算每只券的「远期净价 / CF」,最小者即 CTD:

def bond_price(coupon, mat, ytm, freq=1):
    n = int(round(mat*freq)); c = coupon/100/freq; y = ytm/freq
    t = np.arange(1, n+1)
    return (c*100/(1+y)**t).sum() + 100/(1+y)**n

base_ytm = 0.030
for dy in np.linspace(-0.015, 0.015, 7):
    ratios = [bond_price(cp, mt, base_ytm+dy)/cf for (_, cp, mt, _, cf) in bonds]
    ctd = int(np.argmin(ratios))
    print(f"Δy={dy*10000:+5.0f}bp -> CTD = {bonds[ctd][0]}")
python

CTD 随收益率变动而切换

上图纵轴是被选为 CTD 的券,横轴是收益率平移幅度。可以清楚看到 CTD 在利率上行区和下行区之间跳变。这个「切换」性质极其重要:它意味着国债期货的久期不是固定的,当收益率接近某个临界点时,期货的价格行为会发生突变(因为它突然开始跟踪另一只久期不同的券)。这就是国债期货天然带有的嵌入期权(embedded option)——空头的择券权在收益率临界点附近价值最高。

五、基差交易:做多 / 做空那只看不见的期权#

理解了基差结构,基差交易就水到渠成。所谓基差交易(Basis Trade),就是同时操作现券和期货,去博弈基差的收敛或走阔:

  • 做多基差(Long Basis):买入现券 + 卖出期货。当基差走阔(或净基差上升)时盈利。本质是买入空头的择券期权——你赌可选性会变贵,或赌基差在交割前不会收敛到零。
  • 做空基差(Short Basis):卖出现券(或反向回购借券卖出)+ 买入期货。赌基差收敛。这本质是卖出期权收 carry——最常见的形态就是「买期货、赚净基差随时间衰减到零」的收敛交易。

到期时,CTD 的净基差必然收敛到 0(因为交割时刻期权价值归零,且套利会强制毛基差 ≈ carry)。做空基差的人就是在赚这段收敛。

np.random.seed(7)
days_path = 60
basis0 = gross[ctd_idx]                       # 入场净基差
conv = (np.linspace(basis0, 0.02, days_path)
        + np.random.normal(0, 0.03, days_path).cumsum()*0.15)  # 收敛+噪声路径
pnl_long = (conv - basis0) * 100              # 做多基差每百元面值 P&L
python

基差交易示意:做多基差的 P&L 区间

图中紫线是净基差的模拟路径,灰色虚线是入场基差。做多基差(买券卖期货)在基差走阔的绿色区间盈利、收敛的红色区间亏损。真实的收敛交易往往押注净基差随时间必然衰减这个偏正的期望,但代价是承担 CTD 切换和逼空(squeeze)的尾部风险。

A. 实现细节#

  • 信号字段:CTD 判定完全基于净价与转换因子(毛基差 = 净价 − 期货×CF),不涉及日内高低价;这是交割经济学决定的,用收盘净价即可。
  • CTD 判据:主判据用毛基差最小;第四节的切换分析改用「远期净价 / CF 最小」作等价判据,两者在忽略 carry 差异时一致。
  • carry 口径:本文用「面值票息收入 − 净价×资金成本,按持有天数 /365 折算」的简化式,未逐日累积应计利息、未用真实回购曲线。方向与量级正确,但绝对值会与交易台口径有偏差。
  • 收益率曲线处理:CTD 切换实验用平行移动单一到期收益率重估各券价格(单券自贴现),未建模曲线斜率变化,属一阶近似。
  • P&L 口径:基差交易 P&L 按每百元面值净基差变动折算,未计入保证金占用、期货逐日盯市的资金流与交易成本。

B. 已知偏差#

  • 转换因子偏差是系统性的:CF 假设所有券都按 3% 名义票息定价,这个假设在真实收益率偏离 3% 时必然失真——这既是 CTD 切换的来源,也意味着「转换因子拉平」永远只是近似,不同久期券之间存在结构性错配。
  • 净基差 ≠ 精确期权价值:把净基差直接当成择券期权价值是教学简化。严格定价需要用 HJM / 短率模型对交割月的择券权和时机权做 option-adjusted 分析,本文未建模波动率维度。
  • 忽略了逼空与流动性:交割月现券可能被逼空(short squeeze),回购利率可能飙升(special repo),这些会让做空基差的收敛交易在尾部大幅亏损,本文未纳入。
  • 数据为示例构造:可交割券篮子、价格、转换因子均为教学示例,非真实中金所合约快照;结论演示的是方法与规律,不是当前市场的实际 CTD。

C. 结果解读#

CTD 由券E(低息短久期)胜出,毛基差 −0.5675,净基差最小——完全符合「高利率环境下低息短久期券最便宜」的固收经验法则。这说明只要收益率显著高于合约名义票息 3%,篮子里久期最短的券几乎总会是 CTD。

基差的真正内涵是一份期权,而非无风险价差。 净基差恒非负,是因为它定价的是空头手中的择券权 + 时机权。把基差交易当成「稳赚收敛」是危险的直觉——你赚的是期权时间价值衰减,代价是承担 CTD 切换与逼空的凸性风险。收敛交易的收益分布是左偏的:大部分时候小赚 carry,偶尔在利率临界点或逼空时大亏。

CTD 切换是国债期货最独特的风险源。 第四节的切换图说明:期货的实际久期会在收益率临界点附近跳变。用国债期货做久期对冲的人如果忽略这一点,会在利率穿越临界区时发现自己的对冲比率突然失效——因为期货开始跟踪一只久期完全不同的新 CTD。真正稳健的对冲必须监控 CTD 的邻近切换点,并在临界区附近调整对冲手数。

方法可直接迁移到实盘。 把示例篮子换成真实合约的可交割券清单、真实净价、交易所公布的转换因子、以及真实回购利率,上面的四步(算毛基差 → 拆 carry 与净基差 → 找 CTD → 监控切换)就是交易台每天在做的基差监控流程。

国债期货最便宜可交割券 CTD 与基差交易:期货背后那只看不见的择券期权
https://blog.halo26812.eu.org/blog/bond-futures-ctd-basis
Author halo
Published at 2026年7月20日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨