简介:这是一份围绕债券投资组合管理策略的培训课件,共64页PPT,适合金融专业学生、债券投资初学者以及需要搭建组合管理框架的从业者,无论是课堂教学还是机构内训都适用。课件从有效市场假说讲起,区分弱式、半强式与强式有效市场,并认识不同市场假设下的投资目标差异;在此基础上,消极策略强调风险匹配,积极策略追求超额回报。压缩包内仅1个PPT文件,整体约340KB,但内容结构相当完整:依次覆盖策略选择、消极管理(含负债管理、免疫策略与现金流匹配)、积极管理(含收益率曲线变动、或有免疫策略)、期限分析与久期应用等模块,既保留理论框架,也包含例题讲解。目前已有108人学习下载,适合作为培训教案或自学补充材料。通过学习,读者可掌握债券组合的构建逻辑与风险控制方法,理解如何利用免疫与现金流匹配规避利率风险,也可借鉴积极策略思路,在控制风险的同时获取超额回报,为实际投资决策提供参考。
1. 债券投资组合管理不只是调久期:先把收益归因和约束条件想清楚
做债券投资的人很容易陷入一个误区:以为组合管理的核心就是预测利率、调久期。但实际上,利率判断只是其中一环,真正的债券投资组合管理是一个多约束、多目标的动态决策过程。那些管理规模上百亿的账户,每天做的事情不是赌方向,而是在收益率、回撤、流动性、信用风险、监管指标之间做权衡,并持续做再平衡。这篇文章就是一套完整的债券投资组合管理策略培训讲义的落地版,把从基准构建、利率策略、信用策略、杠杆控制到组合监控的闭环讲透,适合从银行理财、保险资管到公募固收的广大从业者,也适合刚开始做债券投资、想把管理动作体系化的投资经理。
很多人对债券组合管理的认知停留在“久期越长,涨得越多”,可实盘里最反直觉的一点是,同样的久期敞口,不同的曲线结构判断和骑乘选择,最终收益差距可能超过50个bp。这篇文章的核心目的,就是帮你把组合管理从单一指标驱动,改造成一套期限结构、信用定价、流动性预算、约束优化协同的框架。
2. 债券组合管理的基准与约束:先定坐标,再谈策略
2.1 为什么基准不是业绩比较基准,而是策略的起点
在做任何债券组合策略之前,第一件事不是看多还是看空,不是买长还是买短,而是把基准定清楚。这里的基准有两层含义:一是业绩比较基准,比如中债综合财富指数、中债国债总财富指数,这决定了你的相对排名怎么算;二是策略构建的锚基准,比如你是以中债-国债总指数还是以中债-信用债总指数为起点,这决定了你能承受的信用风险敞口和流动性要求。
我一般会先做基准拆解。比如以中债-新综合财富指数为例,它的久期大概是4到5年,票息大约3%到4%,含有利率债和信用债的成分。把自己的组合和它对比时,要拆成久期贡献、曲线贡献、信用贡献、个券选择贡献四个部分,这样才能搞清楚相对于基准,你的收益究竟是从哪里来的。如果只看综合收益率,你根本不知道是自己运气好赶上了牛市,还是主动管理真的产生了alpha。
import numpy as np import pandas as pd # 模拟一个简单的业绩归因数据框,单位为% # 组合和基准的收益拆解为:久期效应、曲线效应、信用利差效应、个券选择效应 attribution_data = pd.DataFrame({ "效应类别": ["久期效应", "曲线效应", "信用利差效应", "个券选择效应"], "组合贡献": [0.85, 0.32, 1.21, 0.45], "基准贡献": [0.90, 0.15, 0.55, 0.05], "超额收益": [-0.05, 0.17, 0.66, 0.40] }) attribution_data["超额占比"] = (attribution_data["超额收益"] / attribution_data["超额收益"].sum() * 100).round(1) print(attribution_data)上面的归因框架中,如果超额收益里有很大一块来自信用利差效应,那说明这部分其实是你承担信用风险换来的,并不是通过利率判断或者选券获得的能力。这也是归因分析最重要的意义:把收益的来源按风险因子拆开,管理者才能知道自己究竟赚的是什么钱。
2.2 构建组合的三个硬约束条件
债券组合管理在设定基准之后,必须明确三个约束:久期偏离区间、信用等级准入、流动性预算。
久期偏离区间一般会结合自身的负债端稳定性和行情判断来设定。比如保险资金负债端稳定,可以给更大的久期偏离,比如正负1.5年;而开放式债基要考虑赎回压力,偏离就压到正负0.5年以内。信用等级准入更清晰,银行理财的信用债投资基本会限定在AA+及以上,而同业存单等等同AAA评级的资产也要有上限控制,不能因为流动性好就超出比例。
流动性预算容易被忽略,但它恰恰是组合管理的生死线。我一般会把流动性资产分三层:第一层是利率债和AAA同存,作为一级流动性储备,占比不低于5%,保证极端行情下可以当天变现;第二层是高等级信用债,占比20%到30%,作为常规再平衡的弹药库;第三层是长期限或者低流动性的信用债,这部分占比往下压,不能超过组合净资产的一半,否则一旦遭遇赎回潮,只能被迫卖资产,把浮亏变实亏。
注意:流动性和收益本来就是同源的。一个组合如果把流动性都消耗在票息上,那它在市场反转的时候就不再有主动权。不要拿流动性换收益,因为流动性是一种可以让你继续留在场内的期权。
3. 利率策略的实战框架:久期、骑乘与曲线交易的参数化执行
3.1 久期管理的目标不是预测利率,而是控制风险预算
在债券组合管理策略里,久期策略是最基础也最需要纪律性的一环。这里的核心是把久期当成一种预算管理,而不是方向押注。比如你管理的组合规模是50亿,投资指引里规定的久期区间是1到5年,如果中性久期是3年,那么你的风险预算是正负2年。换算成DV01的话,50亿乘以0.0001乘以(组合久期3年)就是基础的利率风险敞口,每调整1年久期,组合的DV01变化是50万元,也就是说利率上升1个bp,组合净值一天亏5万元。
明白这层关系之后就可以把久期决策变成一个系统化的步骤:先判断宏观基本面的方向,再看市场隐含的降息/加息概率,最后才谈要不要动久期。如果基本面数据(比如PMI在荣枯线下方、社融增速持续下行)指向货币宽松周期,那组合久期可以在区间上沿附近操作,比如用国债期货对冲掉部分底仓久期,或者在收益率曲线陡峭化时用长端现券做多。
# 计算组合DV01的简化逻辑 portfolio_nav = 5_000_000_000 # 组合净值50亿 dv01_per_year_old = 500_000 # 每调整1年久期DV01变化约50万元 # 久期从3年调至4.5年时,组合DV01的增量 duration_change = 4.5 - 3.0 dv01_move = duration_change * dv01_per_year_old print(f"久期从3年调整到4.5年,DV01增加 {dv01_move/10000:.1f} 万元") print(f"利率上行10bp时,组合净值变动约 {dv01_move/10000 * 10:.1f} 万元")上面这个计算逻辑时刻提醒我们,久期是一项动用风险预算的行为。在牛尾阶段,不能看着收益率还在往下就一路加久期,要先评估收益率已经隐含了多少降息预期,再看看自己的组合有没有浮盈垫。久期管理做得好的投资经理,不是在利率拐点时加得最多的人,而是在确定性最高的阶段把仓位、久期和套保工具配合得最顺畅的人。
3.2 骑乘策略的参数化执行:曲线形态、静态利率与风险收益比
骑乘策略是债券组合管理里最经典也最常用的策略,它的本质就是赚收益率曲线形态的钱:当曲线陡峭时,买入剩余期限比目标久期更长的债券、持有至目标久期处卖出,收益来自两方面,一是吃票息,二是期限缩短带来的收益率下移,对应价格上涨。执行骑乘策略时,关键参数有三个:曲线的斜率、静态利率的持有收益、以及卖出的可行性。
比如当前1年期国债收益率是1.4%,3年期国债收益率是1.8%,5年期收益率是2.1%,曲线斜率在1年-5年段大约70bp。如果目标久期只有1年且未来一年内没有大幅加息预期,那买入3年期国债并持有一年,到期时债券剩余期限为2年。假设届时两年期收益率不变,那么收益包含:当前三年期票息1.8%,加上两年期收益率从1.65%附近下行至1.4%所产生的价差收益,整体年化收益大约2.3%到2.5%,远高于直接买1年期国债的1.4%。这种执行并不是任何时候都合适,关键是看骑乘区间段的利差是否大于资金成本和目标期限的静态收益率。
-- 假设有一段债券行情数据表:bond_yield_curve -- 字段:maturity_term(期限), bond_yield(到期收益率), settlement_date(日期) -- 骑乘策略筛选:找到曲线斜率大于50bp的相邻期限段 SELECT a.maturity_term AS term_start, b.maturity_term AS term_end, ROUND(b.bond_yield - a.bond_yield, 4) AS curve_slope_bp, b.bond_yield AS yield_for_riding FROM bond_yield_curve a JOIN bond_yield_curve b ON b.settlement_date = a.settlement_date AND b.maturity_term = a.maturity_term + 2 WHERE a.settlement_date = '2025-06-30' AND (b.bond_yield - a.bond_yield) * 100 > 50 ORDER BY curve_slope_bp DESC;骑乘策略的执行细节在于:骑乘结束后卖出债券的那一瞬间,能不能按理论价格成交。如果这个期限段交易量很小、买卖价差很宽,那骑乘算出来的收益就是纸上富贵。我在实际管理时,会尽量选择国债、国开债或者流动性好的高等级信用债来做骑乘,避免为了赚几十bp的曲线收益把自己卡在流动性陷阱里。
3.3 收益率曲线交易:子弹型、哑铃型与阶梯型的参数和适用场景
曲线交易可以看作骑乘策略的升级版,核心是在不改变组合整体久期的前提下,通过调整组合在期限轴上的分布,来获取收益率曲线整体形态变化带来的额外收益。三种常见组合结构——子弹型、哑铃型、阶梯型——各有各的参数含义。
子弹型组合把所有仓位集中在某一期限段,比如全部放在3年到5年,优点是可以最大化单一期限的信誉。当收益率曲线整体下移时,子弹型组合在集中期限附近的价格弹性最大,但缺点是若曲线变陡,短端跌幅有限、长端不一定跟跌。哑铃型则是把资金分布在短端和长端两端,比如30%在1年以内,70%在10年以上,组合久期仍然控制在5年左右,短端提供流动性和票息安全垫,长端提供资本利得弹性。曲线变平或者说长端利率下行更快时,哑铃型表现会更好。阶梯型是平均分布在多个期限段,比如1年、3年、5年、7年、10年各配置20%,它的特点是平滑、不去赌曲线形态,稳定性最好。
参数上,无论选哪种结构,都要保持组合久期占目标久期的比例在90%到110%之间,偏离过大就变成了变相加久期,而不是纯粹的曲线策略。具体选哪种形态,我会看收益率曲线未来12个月的预期变化。如果预期曲线走平,选哑铃型;预期曲线变陡,选中短端的子弹型;预期曲线形态多变又看不清方向,就用阶梯型。
4. 信用策略与杠杆的配合:如何让收益来源分散又不失控
4.1 信用利差压缩与走阔的判断指标
债券组合管理里,信用策略的收益弹性比利率策略更大,但信用风险的尾部杀伤力也最致命。做信用策略前先要分清你说的信用策略是赚信用利差压缩的钱,还是赚信用资质下沉的评级溢价。很多组合亏大钱,就是把“利差压缩”错做成了“资质下沉”。而利差判断又有两套框架:一是用AAA中短期票据与同期限国债的利差,作为流动性溢价和信用风险的综合性定价指标;二是用AA+与AAA的等级利差,判断市场风险偏好的变化方向。
实操中我一般跟踪三类指标:信用利差绝对水平(分位数)、信用利差变动趋势(近20日、60日均线)、以及信用债成交活跃度。绝对水平到了历史分位数的80%以上时,说明信用债的票息保护已经很厚,可以逐步加仓高等级信用债;到了历史分位数的20%以下时,即使还有利差压缩空间,性价比也已经不合适,因为票息保护不足,一旦反弹会被打得措手不及。
import pandas as pd # 信用利差分位数计算示例 # 假设credit_spread_series是历史信用利差时间序列,单位bp # 当前利差是75bp,历史序列从2018年至今 historical_spreads = pd.Series([...]) # 这一行需要替换为真实的历史利差数据 current_spread = 75 percentile_rank = (historical_spreads < current_spread).mean() print(f"当前信用利差{current_spread}bp,处于历史{percentile_rank*100:.1f}%分位") # 分位数 > 0.8 说明债市风险偏好较低,可考虑逐步配置高等级信用债 # 分位数 < 0.25 说明利差已被压缩得很充分,谨慎追涨4.2 杠杆策略的边界:资金成本、回购期限与集中度管理
杠杆在债券组合管理中是一个放大器,它可以放大票息,也可以放大回撤。做杠杆策略之前要算清楚一个账:组合加杠杆后的静态收益等于基础票息收益加上杠杆息差,即借入资金成本与债券票息的差值。正常来说,10年国开债利率如果只有2.4%,隔夜回购利率可能在1.8%左右,那把杠杆加上去,用隔夜资金买国开债,息差空间也就60bp。这个息差还要扣除交易成本,实际落到组合里就是40到50bp。
但杠杆最大的风险不是息差收窄,而是负债端的稳定性。一旦资金面收紧,隔夜回购利率在一周内从1.8%飙升到3.0%,你会发现利差消失只是第一步,紧接着你可能被迫降价卖债还钱,造成亏损的自我实现。所以我做杠杆管理时有个铁律:预期回购利率与债券票息的利差底线必须不低于30bp;其次,单一资金方的融入比例不能超过总融入量的30%,避免被某个资金方卡脖子;第三,隔夜资金占比不能超过总融入资金的一半,至少一半要使用7天以上的期限来滚。这样的组合短期上可能牺牲一点收益,但在资金面波动的时候能保住组合的稳定性。
4.3 信用债的分散标准:行业、主体与个券上限
信用策略不是买一只好债的事,而是一个组合层面的分散问题。分散的标准有三个:行业、主体、个券。行业分散上,单一行业债券投资占比不超过组合净资产的20%,这样某一行业信用事件爆发时不至于伤筋动骨。主体分散下设两个维度,一是发债主体集中度,单一主体不超过组合净资产的5%;二是关联方合并口径,同一个集团旗下多家子公司合计不能超过8%。个券层面更直白,单只债券不超过组合净资产的3%。
举一个常用的操作规则。如果组合净资产10亿,那单一主体上限就是5000万,单券上限是3000万。市场上有一些中等规模城投或者产业债,收益率比同等级高不少,但发行量只有几个亿,如果组合资金量大,很容易在投了几千万之后就触及单券3%的上限。如果你因为看好这只债而突破这个限制,那本质上你已经不是在管理一个组合,而是在做一笔单边的信用押注。这种押注偶尔能赢,但没有可持续性。
5. 多策略组合的落地与再平衡:把策略装进一个可执行的框架
5.1 策略配制比例与触发条件
把利率策略、信用策略、杠杆策略放到同一个组合里,最关键的是设定每类策略的资金占比和触发条件,不能先决定方向再找策略。我一般会这样做:先把组合分成两层,一层是底仓,占比60%到70%,主要作用是跟上基准、获取稳定票息,底仓的配置以高等级信用债和利率债为主,不做频繁交易;另一层是策略仓,占比30%到40%,用来执行骑乘、曲线交易、信用利差交易等主动策略,这层仓位更灵活,可以在触发条件出现时动起来。
策略仓内部再按信号机制分好比例。比如,当信用利差分位数高于80%时,信用策略仓的上限是策略仓总规模的50%;当收益率曲线斜率处于1年-5年段的历史高位时,骑乘策略可以占50%以上;当资金面预期转松(存单利率开始下行、隔夜回购利率低于政策利率20bp以上),杠杆策略仓位可以提高。每个触发条件都要配套一个退出条件。比如隔夜回购利率连续三天低于政策利率20bp时开始加杠杆,一旦隔夜回购利率重回政策利率上方,就要在两周内把杠杆降回常态水平。
// 策略触发条件判断的更简化版本,用伪代码表达 // 目的是说明:策略不是主观决定的,而是由多组条件同时满足触发的 function checkRidingStrategy(conditions) { const slopeBp = conditions.curveSlopeBp; // 1Y-3Y曲线利差 const targetDuration = conditions.targetDuration; // 组合目标久期 const currentDuration = conditions.currentDuration; // 当前组合久期 if (slopeBp > 40 && // 1Y-3Y段足够陡 Math.abs(currentDuration - targetDuration) < 0.8 && // 久期偏离在安全窗口内 conditions.tradeVolumeIndex > 0.7) { // 该期限段成交活跃度足够 return "执行骑乘策略"; } else { return "继续等待,无骑乘信号"; } }触发条件的设定不能太多,否则策略仓会被切得太碎,难以管理。我最多同时启用三个主动策略,每个策略的仓位最小占比在10%以上,这样才值得花精力去跟踪和再平衡。
5.2 再平衡的节奏与成本控制
再平衡是组合管理中一直要做但执行起来不容易的部分。节奏上分两种:一种是时间驱动,比如每月底做一次常规再平衡;另一种是事件驱动,比如收益率突破一定阈值、信用利差大幅跳升或组合久期偏离区间,触发即时调整。前者保证了组合不漂移,后者保证了风险不被突破。
再平衡的执行难点在于成本控制。每一次买卖都有交易成本、冲击成本和税收成本(视产品类型而定)。频繁做小幅再平衡,一年下来交易成本可能吃掉大部分策略超额收益。所以我一般会给再平衡设一个有效区间:比如组合久期偏离目标0.2年以内不动,超过0.2年才开始调整;单次调整久期不超过0.4年。把动作做钝一点,不追求每一步都精准,反而最终收益表现更好。因为债券市场的趋势通常有惯性,你晚一周调整,付出的机会成本比频繁微调所产生的交易成本要低得多。
提示:再平衡不是追求最优,而是追求不失控。用阈值触发再平衡,可以避免情绪化交易造成的损失。
5.3 组合监控体系:用一个台账把组合看全
组合监控不能说空话。每个持仓债券都需要维护一个台账,字段至少包含:债券代码、债券简称、中债估值净价、到期收益率、剩余期限、久期、凸性、信用评级(中债/外部评级)、所属行业、持有面值、成本价、浮盈亏、剩余额度、流动性分类。这些字段每周更新一次,如果市场波动加大就改为日频更新。
多策略组合有了台账才能做压力测试、假设分析、评级变动预警和提前赎回计划。比如重庆某只AA级城投债收益率突然跳升50bp,你先查台账看看自己有没有持仓、持仓量多大、该债券的行业集中度是否已经超限,然后决定是补仓降成本还是止损走人。没有台账,你的所有决策就都是凭感觉。
6. 债券组合管理的进阶技巧:用压力测试预演组合的尾部风险
管理债券组合到了进阶阶段,看的不是谁在牛市里赚得多,而是谁在振荡市和熊市里回撤控制得住。压力测试就是一个可以提前预演组合尾部风险的工具,它不需要太复杂的模型,但需要按真实持仓来计算,不能拿组合久期这种粗指标去笼统估算。
压力测试的常见场景分三档。第一档是轻度压力,假设收益率曲线上行20bp,信用利差走阔15bp,测算组合净值的损失幅度;第二档是中度压力,假设收益率曲线上行50bp,信用利差走阔40bp,同时伴随资金利率上升80bp导致杠杆成本抬升;第三档是重度压力,假设收益率曲线上行100bp,信用利差走阔80bp,且部分信用债丧失流动性,买卖价差扩大到20bp以上甚至无买盘。做压力测试时要把杠杆成本纳入一起测算。特别是依赖隔夜回购加杠杆的组合,资金利率上升不仅减少了息差收入,还可能在保证金和质押券估值上形成双重打击。
# 组合压力测试的核心计算脚本 # 用持仓级别数据计算组合在不同利率情景下的净值损失 import pandas as pd # holdings模拟持仓表,字段包括:市值、久期、信用利差敏感度、杠杆资金成本 # 这里用模拟数据展示计算逻辑,实际使用时应读取组合台账 holdings = pd.DataFrame({ "债券类型": ["国债", "国开债", "AAA中票", "AA+城投债", "杠杆回购资金"], "市值(亿)": [2.0, 1.5, 1.0, 0.5, -1.2], "久期": [6.5, 4.2, 3.1, 2.4, 0], "利差久期": [0, 0, 2.8, 3.5, 0], }) rate_shock = 0.30 # 收益率曲线上行30bp spread_shock = 0.25 # 信用利差走阔25bp # 利率冲击损失 = 市值 * 久期 * 利率变动幅度 rate_loss = (holdings[holdings["债券类型"] != "杠杆回购资金"]["市值(亿)"] * holdings["久期"] * rate_shock).sum() # 信用冲击损失 = 信用债市值 * 利差久期 * 利差变动幅度 credit_assets = holdings[holdings["利差久期"] > 0] spread_loss = (credit_assets["市值(亿)"] * credit_assets["利差久期"] * spread_shock).sum() total_loss = rate_loss + spread_loss print(f"利率冲击30bp+利差冲击25bp,组合净值损失约{total_loss:.3f}亿元")脚本运行出来以后,还要做一步人工分析:如果重度压力场景下的损失超过了组合一个月能承受的极限(比如总资产的2%),那就得考虑提前降低组合久期或减配信用债,哪怕这意味着放弃一部分预期收益。这比真的碰到利率上行时被动卖券要好得多。
压力测试不需要天天做,但每次组合久期或信用结构发生较大变化时都要重新测算一次,并把测试结果记录在案。一个成熟的投资经理拿到压力测试结果后不是简单看一眼数字,而是会问自己:如果这个场景真的发生了,我在市场上能不能按模型假设的价格卖出去?如果不能,那模型给出的损失数字就偏乐观了。所以重度压力场景里,我习惯额外再打个八折流动性折扣,让压力值真正变成可执行的风险边界。
本文还有配套的精品资源,点击获取