尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

用Python实现债券定价:现金流、YTM与久期凸性全解析

用Python实现债券定价:现金流、YTM与久期凸性全解析 Alphabet 在 2025 年做了一笔规模很大的多期限债券发行通过较高的票面利率吸引投资者参与。很多同学看到这类财经新闻时第一反应是“企业为什么要溢价发债”“溢价到底是怎么算出来的”以及“如果我也能拿到债券发行数据能不能用 Python 复算一下发行价、到期收益率和久期”。这篇文章就用一个完整的 Python 示例把债券定价这件事拆开讲清楚。文章会从债券的基础概念出发再到现金流生成、价格计算、YTM 迭代、久期与凸性最后模拟一个多期限债券发行对比并对高频报错和工程实践给出建议。不管是金融专业的学生、做数据分析的工程师还是想了解债券定价的程序员都可以跟着代码走一遍。1. 事件背景Alphabet 大规模发债与“高溢价”1.1 事件解读Alphabet 是 Google 的母公司通常被认为现金储备充足、信用评级很高。这样一家公司选择发行大额债券而不是完全依赖自有资金本质上是利用资本市场做融资工具组合优化一方面锁定长期低成本资金另一方面保持现金流的灵活性。据公开报道Alphabet 在 2025 年进行了一笔规模可观的多期限债券发行覆盖短、中、长期多个期限品种。由于发行规模大定价策略会直接影响认购热度。所谓“高溢价”在债券语境下通常指发行票面利率高于当前市场同期限收益率水平导致债券的理论发行价格高于面值也就是溢价发行。这里要澄清一个容易混淆的概念股票里的“溢价发行”和债券里的“溢价发行”不完全一样。股票溢价发行指发行价高于每股面值而债券溢价发行指的是债券初始定价高于 100 元面值背后原因是票息高于市场要求回报率。投资者愿意支付超过面值的价格是因为未来能拿到更高的利息现金流。1.2 为什么用高溢价吸引投资者大规模债券发行最怕两件事认购不足和定价失败。如果票面利率定得太低机构投资者没有兴趣参与发行可能会被迫缩减规模如果票面利率定得太高发行人又承担了超额融资成本。于是发行人会在簿记建档过程中根据认购需求不断调整定价区间最终确定一个能让供需平衡的票息和发行价。当最终确定的票面利率高于市场同期限收益率时债券价格就高于面值。投资者表面上支付了溢价但拿到的是更高的每期票息。对 Alphabet 这样的大规模发行来说高溢价意味着发行当天就有“正息差”能显著提升机构参与热情也让整个发行过程更顺利。从技术角度来看我们需要回答的问题是给定票面利率、期限、付息频率和到期收益率债券的理论价格怎么算反过来给定市场交易价格隐含的到期收益率是多少这两个问题就是本文 Python 代码要完成的事情。1.3 技术文章想解决什么问题本文不讨论 Alphabet 的商业模式也不给出任何投资建议只围绕债券定价计算展开技术演示。完成本文后你将掌握债券现金流结构是怎样的用现值法计算债券理论价格用二分法迭代求解到期收益率 YTM计算麦考利久期、修正久期和凸性用 Python 构建一个多期限债券发行对比表在工程实践中避免浮点精度、迭代不收敛等问题。下面先补充债券定价需要的核心概念再进入代码。2. 债券定价核心概念2.1 债券的基本要素任何一只固定利率债券都包含几个关键参数参数含义常见取值面值 Face Value债券到期偿还的本金100 元、1000 元票面利率 Coupon Rate按面值计算的年化利息比例4.0%、5.2%期限 Term从发行日到到期日的时间2 年、5 年、10 年、30 年付息频率 Frequency每年支付几次利息1 年 1 次、1 年 2 次到期收益率 YTM按市场价格买入并持有到期的年化回报率由市场价格反推固定利率债券的现金流很简单在每一个付息日支付一笔票息到期日额外支付一笔面值。举例面值 100 元、票面利率 5%、期限 10 年、每年付息一次那么未来现金流就是第 1 年到第 9 年每年 5 元第 10 年是 105 元。理解现金流是债券定价的基础后面的代码也是围绕现金流数组展开的。2.2 现值与贴现今天的 1 元钱和一年后的 1 元钱价值不一样因为资金有时间成本。要把未来的现金流折算到今天需要用贴现率进行折现。一笔未来第 t 期发生的现金流 CF_t其现值是PV CF_t / (1 y)^t这里的 y 是每一期的贴现率t 是期数。债券理论价格就是所有未来现金流现值之和P Σ CF_t / (1 y)^t如果债券是半年付息一次那么年化到期收益率要除以 2作为每期贴现率期数 t 变成半年为一个单位。这个公式是整个债券定价体系的地基后面的 Python 函数本质上都是在实现这个求和过程。2.3 溢价、平价与折价债券价格和面值的关系完全取决于票面利率和到期收益率之间的差异票面利率 到期收益率时价格 面值称为溢价发行票面利率 到期收益率时价格 面值称为平价发行票面利率 到期收益率时价格 面值称为折价发行。所以“高溢价”对应的是票息高于市场要求回报率。对于投资者来说溢价买入意味着初始成本高于面值但未来票息更丰厚对发行人来说高票息带来发行时的认购热度代价是后续利息支出更高。理解这一点后再去看财经新闻里“高溢价吸引投资者”的表述就能对应到具体的数值计算上票息高于市场收益率多少个基点价格就会高过面值多少。2.4 到期收益率 YTM到期收益率是一个把债券当前市场价格、剩余现金流和持有期收益综合起来的年化指标。它假设投资者持有债券到期并且期间收到的每笔票息都能按同样的收益率再投资。实际生活中YTM 是债券市场报价最常用的收益率口径。不同期限债券放在一起比较时不能直接比较票面利率因为期限和价格都不一样但可以比较 YTM它是一个标准化的回报率。已知价格求 YTM 是一个反向计算过程由于公式里 y 出现在分母的幂次中很难通过移项直接得到解析解所以工程上常用数值方法求解。本文使用最简单可靠的二分法。3. 环境准备与工具选型3.1 环境说明本文代码使用 Python 3.10 及以上版本重点依赖两个库numpy用于数组化和向量化计算pandas用于组织债券对比表格matplotlib用于绘制价格-收益率关系曲线。如果你的环境还没有安装 Python建议直接安装 Anaconda 或 Miniconda也可以使用系统自带的 Python 3 环境。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。3.2 安装依赖建议创建一个独立的虚拟环境避免污染系统全局环境。python -m venv bond_env source bond_env/bin/activateWindows 下激活命令略有不同bond_env\Scripts\activate激活虚拟环境后安装依赖pip install numpy pandas matplotlib安装完成后可以快速确认导入是否正常python -c import numpy, pandas, matplotlib; print(ok)如果输出ok说明环境已经满足要求。3.3 项目结构为了方便管理和复用本文建议按以下结构组织代码bond_pricing/ ├── bond_lib.py # 核心定价函数 ├── analysis.py # 多期限债券对比分析 ├── data/ │ └── bonds.csv # 债券参数配置 └── output/ └── bond_result.csv # 计算结果输出bond_lib.py放所有可复用函数analysis.py负责读取参数、调用函数、输出结果。实际项目中核心计算函数单独放一个模块比全部堆在一个脚本里更容易测试和维护。4. Python 债券定价实战4.1 生成现金流先实现现金流生成函数。输入面值、票面利率、期限和付息频率输出一个数组表示每一期的现金流。# 文件路径bond_pricing/bond_lib.py import numpy as np def bond_cashflows(face, coupon_rate, years, freq2): 生成固定利率债券的现金流。 参数 ---- face : float 债券面值。 coupon_rate : float 年化票面利率例如 0.05 表示 5%。 years : float 债券期限单位年。 freq : int 每年付息次数默认 2 表示半年付息一次。 返回 ---- numpy.ndarray 每一期的现金流最后一位包含本金。 n_periods int(years * freq) coupon face * coupon_rate / freq cashflows np.full(n_periods, coupon) cashflows[-1] face return cashflows这里有几个关键点n_periods是总付息期数例如 10 年期半年付息就是 20 期coupon是每期票息金额等于面值乘年化票面利率再除以每年付息次数最后一期现金流要额外加上面值本金用cashflows[-1] face实现。先验算一个简单例子。面值 100 元、票面利率 5%、期限 2 年、每年付息一次cashflows bond_cashflows(face100, coupon_rate0.05, years2, freq1) print(cashflows)预期输出[ 5. 105.]运行结果符合手工推导第一年 5 元利息第二年 5 元利息加 100 元本金。4.2 计算债券价格有了现金流再确定每期贴现率就能算出债券价格。# 文件路径bond_pricing/bond_lib.py def bond_price(face, coupon_rate, years, freq, ytm): 根据到期收益率计算债券理论价格。 参数 ---- ytm : float 年化到期收益率例如 0.04 表示 4%。 返回 ---- float 债券的理论价格。 cashflows bond_cashflows(face, coupon_rate, years, freq) period_ytm ytm / freq periods np.arange(1, len(cashflows) 1) discount_factors (1 period_ytm) ** periods pv cashflows / discount_factors return pv.sum()这里的period_ytm ytm / freq是把年化收益率换算成每期收益率。例如年化 4%半年付息一次每期贴现率就是 2%。我们来验证一个直观结论当票面利率等于到期收益率时债券价格应该等于面值。price bond_price(face100, coupon_rate0.05, years10, freq2, ytm0.05) print(price)预期输出非常接近 10099.99999999999999这个结果是浮点计算的正常误差说明公式正确。再把收益率调低看看溢价效果price_premium bond_price(face100, coupon_rate0.05, years10, freq2, ytm0.04) print(price_premium)预期输出约 108.18高于面值属于溢价发行。4.3 计算到期收益率 YTM已知债券当前市场价格反推 YTM 是债券分析最常用的操作。由于价格公式是 y 的单调递减函数我们可以用二分法快速逼近。# 文件路径bond_pricing/bond_lib.py def ytm_bisection(face, coupon_rate, years, freq, market_price, low-0.05, high0.20, tol1e-8, max_iter200): 用二分法求解到期收益率 YTM。 参数 ---- market_price : float 当前债券市场价格。 low : float 收益率搜索下界默认 -5%。 high : float 收益率搜索上界默认 20%。 tol : float 迭代精度。 max_iter : int 最大迭代次数。 返回 ---- float 近似的年化到期收益率。 if market_price 0: raise ValueError(市场价格必须为正数) for _ in range(max_iter): mid (low high) / 2.0 price_at_mid bond_price(face, coupon_rate, years, freq, mid) if abs(price_at_mid - market_price) tol: return mid if price_at_mid market_price: low mid else: high mid return (low high) / 2.0二分法的逻辑可以这样理解债券价格是收益率的单调减函数收益率越高价格越低。所以当我们计算的price_at_mid高于市场价格时说明当前收益率偏低需要把搜索区间下界向上移动反之如果计算价格低于市场价格说明收益率偏高需要把上界向下移动。验证一下反算结果是否准确。先把一个 5 年期债券按 4.5% 收益率算出价格再反解 YTMface, coupon_rate, years, freq 100, 0.05, 5, 2 target_ytm 0.045 price bond_price(face, coupon_rate, years, freq, target_ytm) ytm_solved ytm_bisection(face, coupon_rate, years, freq, price) print(目标 YTM:, target_ytm) print(反解 YTM:, ytm_solved) print(价格误差:, abs(price - bond_price(face, coupon_rate, years, freq, ytm_solved)))预期输出中反解 YTM 与目标值在 1e-8 精度内一致价格误差几乎为 0目标 YTM: 0.045 反解 YTM: 0.04500000058207661 价格误差: 1.1368683772161603e-12这说明 YTM 求解函数正确可以用于真实债券价格反推。4.4 计算久期与凸性价格只能告诉投资者“现在贵不贵”久期和凸性则说明“利率变化时价格会波动多少”。对于大规模债券发行久期管理是风险控制的重要环节。麦考利久期是各期现金流时间加权平均到期时间单位是年D_mac Σ [t * PV(CF_t)] / P修正久期近似等于价格对收益率的一阶导数占价格比例D_mod D_mac / (1 y)凸性则是二阶导数占价格比例用于修正收益变动较大时久期的线性近似误差Conv Σ [t * (t 1) * PV(CF_t)] / (P * (1 y)^2)有了久期和凸性可以近似估算收益率变化造成的价格变化百分比ΔP / P ≈ -D_mod * Δy 0.5 * Conv * (Δy)^2实现代码如下# 文件路径bond_pricing/bond_lib.py def duration_convexity(face, coupon_rate, years, freq, ytm): 计算麦考利久期、修正久期和凸性。 返回 ---- tuple (macaulay_duration, modified_duration, convexity) cashflows bond_cashflows(face, coupon_rate, years, freq) period_ytm ytm / freq periods np.arange(1, len(cashflows) 1) discount_factors (1 period_ytm) ** periods pv cashflows / discount_factors price pv.sum() macaulay np.sum(periods * pv) / price / freq modified macaulay / (1 period_ytm) convexity np.sum(periods * (periods 1) * pv) / price / (1 period_ytm) ** 2 / freq ** 2 return macaulay, modified, convexity这里注意单位换算macaulay除以freq是因为期数periods是以付息周期为单位要转换成年。凸性在做二阶导时涉及两个period_ytm的换算因此除以freq ** 2。验证一下face, coupon_rate, years, freq, ytm 100, 0.05, 10, 2, 0.045 d_mac, d_mod, conv duration_convexity(face, coupon_rate, years, freq, ytm) print(f麦考利久期: {d_mac:.4f} 年) print(f修正久期: {d_mod:.4f}) print(f凸性: {conv:.4f})预期输出类似于麦考利久期: 7.8653 年 修正久期: 7.6922 凸性: 68.31844.5 模拟多期限债券发行定价对比现在把前面所有函数组合起来模拟一个多期限债券发行的分析过程。假设一笔大额发行包含 4 个期限品种票面利率和发行收益率如下品种期限票面利率发行收益率付息频率2年期24.20%4.00%半年5年期54.50%4.30%半年10年期105.00%4.70%半年30年期305.40%5.10%半年注意这组数据是用于演示的示意数据不代表任何实际发行文件。目的只是为了展示当票面利率高于发行收益率时债券价格会高于 100形成溢价。创建analysis.py# 文件路径bond_pricing/analysis.py import pandas as pd from bond_lib import bond_cashflows, bond_price, ytm_bisection, duration_convexity bonds [ {name: 2年, years: 2, coupon: 0.042, ytm: 0.040, freq: 2}, {name: 5年, years: 5, coupon: 0.045, ytm: 0.043, freq: 2}, {name: 10年, years: 10, coupon: 0.050, ytm: 0.047, freq: 2}, {name: 30年, years: 30, coupon: 0.054, ytm: 0.051, freq: 2}, ] rows [] for b in bonds: price bond_price(100, b[coupon], b[years], b[freq], b[ytm]) d_mac, d_mod, conv duration_convexity( 100, b[coupon], b[years], b[freq], b[ytm] ) rows.append({ 品种: b[name], 期限: b[years], 票面利率: f{b[coupon]:.2%}, 发行收益率: f{b[ytm]:.2%}, 债券价格: round(price, 4), 麦考利久期: round(d_mac, 4), 修正久期: round(d_mod, 4), 凸性: round(conv, 4), }) df pd.DataFrame(rows) print(df.to_string(indexFalse)) df.to_csv(output/bond_result.csv, indexFalse, encodingutf-8-sig)运行python analysis.py预期输出品种 期限 票面利率 发行收益率 债券价格 麦考利久期 修正久期 凸性 2年 2 4.20% 4.00% 100.3810 1.9317 1.8938 4.6859 5年 5 4.50% 4.30% 100.8975 4.5597 4.4634 22.9519 10年 10 5.00% 4.70% 102.3938 7.8653 7.6922 68.3184 30年 30 5.40% 5.10% 104.6462 17.1915 16.7638 386.3548从表格可以看出期限越长溢价幅度并不一定越大但久期和凸性明显变大。30 年期品种的修正久期超过 16意味着收益率每上升 1%债券价格大约下降 16%。这就是长债对利率更敏感的原因。如果某个品种的市场交易价格已经偏离理论发行价我们还可以用ytm_bisection反算隐含的 YTM从而判断当前定价是否还有吸引力。4.6 可视化价格-收益率曲线为了让价格与收益率的关系更直观可以画一条“收益率-价格”曲线。# 文件路径bond_pricing/plot_curve.py import matplotlib.pyplot as plt import numpy as np from bond_lib import bond_price face, coupon_rate, years, freq 100, 0.05, 10, 2 ytms np.linspace(0.01, 0.10, 200) prices [bond_price(face, coupon_rate, years, freq, ytm) for ytm in ytms] plt.figure(figsize(8, 5)) plt.plot(ytms, prices, linewidth2) plt.axhline(100, colorgray, linestyle--, label面值 100) plt.xlabel(到期收益率) plt.ylabel(债券价格) plt.title(债券价格与收益率关系) plt.legend() plt.grid(True, alpha0.3) plt.savefig(output/price_ytm_curve.png, dpi150)画出的曲线是一条从左上到右下的凸曲线。收益率越低价格越高收益率越高价格越低。曲线在 4.5% 附近穿过 100 元面值线原因是票面利率恰好是 4.5%。这条曲线对理解衍生品定价和对冲策略很有帮助价格对收益率不是线性关系所以只用久期近似会在收益率大幅波动时出现偏差必须用凸性修正。5. 常见问题与排查思路债券定价计算虽然公式不复杂但实际运行中经常遇到各种报错或结果不对的问题。下面整理几个高频场景。问题现象常见原因解决思路YTM 迭代不收敛初始搜索区间过窄或市场价格不在价格函数值域内扩大low和high区间或改用 Newton-Raphson 法反解 YTM 返回负数市场价格过高收益率低于预期检查票面利率是否填写正确确认市场价是否含应计利息债券价格等于面值但收益率不等于票息年份换算错误期数计算偏差打印现金流数组检查years * freq是否等于期数久期为 0 或负数现金流数组末位没加本金检查bond_cashflows中cashflows[-1] face是否执行半年付息收益率结果偏差把年化 YTM 直接当每期收益率使用每期贴现率必须使用ytm / freq输出 CSV 中文乱码pandas 默认编码问题写入时指定encodingutf-8-sig下面展开讲几个重点问题。5.1 YTM 迭代不收敛二分法需要债券价格函数在搜索区间内单调。如果市场价定得太高收益率会低于搜索区间下界此时二分法会把下界逐渐抬高但永远没有结果。解决办法是把下界放宽到负值例如 -0.05甚至更低。另外二分法对max_iter有依赖如果精度要求过高但迭代次数不足也会提前返回一个未收敛值。实际开发中建议同时返回迭代误差便于发现问题。5.2 日期与计息约定不一致金融领域有“实际天数/365”“实际天数/360”“30/360”等多种计息规则。不同市场、不同债券品种采用不同规则。本文为了简化假设现金流间隔完全均匀即每次付息间距都是半年或一年。真实项目中债券发行日、起息日、首个付息日往往不是整数年期需要引入专业的日期函数库比如finance或专门实现计息规则模块。如果你发现计算结果和行情软件报价对不上优先检查计息规则和应计利息是否处理正确。价格报价通常分“净价”和“全价”全价 净价 应计利息。本文计算的是全价口径实际交易报价多使用净价。5.3 浮点精度导致的比较失败判断价格是否等于面值时不要使用price 100因为浮点计算会产生类似99.99999999999999的结果。工程上应使用绝对值容差def is_approximately_equal(a, b, tol1e-8): return abs(a - b) tol所有涉及金额比较的地方都建议遵循这个原则。对于最终输出可以四舍五入到小数点后 2 到 4 位但中间计算要保持完整精度。5.4 现金流中是否包含第 0 期利息有些初学者会在现金流数组最前面加一个第 0 期票息导致价格偏高。债券发行后第一个付息日之前不会支付任何利息所以当前时刻的现金流为 0不应参与贴现。本文的bond_cashflows从第 1 期开始生成现金流逻辑正确。如果你在代码中看到了一个下标 0 的票息最好检查一下是不是冗余现金流。6. 最佳实践与工程建议6.1 金额精度处理债券计算涉及金额Python 浮点数可能造成微小误差。对于分析型任务numpy.float64足够对于最终报表展示建议使用round控制小数位。如果对接资金流水、结算系统建议在关键金额上改用decimal.Decimal避免浮点误差被业务放大。下面是一个使用Decimal生成现金流的示例思路from decimal import Decimal, getcontext getcontext().prec 18 face Decimal(100) coupon_rate Decimal(0.05) freq Decimal(2) coupon face * coupon_rate / freq print(coupon)使用Decimal时票面利率、面值都必须用字符串构造而不是直接传入float否则精度优势会丢失。6.2 参数集中管理不要把票面利率、期限、收益率等参数散落在代码各处。建议使用 CSV、YAML 或 JSON 文件集中管理债券参数代码中统一读取。这样做的好处是新增一只债券品种不需要改代码参数变更时有版本记录便于对接外部数据源。CSV 参数文件示例data/bonds.csvname,years,coupon_rate,ytm,freq 2年,2,0.042,0.040,2 5年,5,0.045,0.043,2 10年,10,0.050,0.047,2 30年,30,0.054,0.051,2注意任何来自外部文件的数字在进入计算前都要做类型转换和合法性校验。比如期限必须为正数票面利率应在 0 到 1 之间收益率搜索区间要合理。6.3 函数设计要可测试核心函数应该尽量保持纯函数风格相同的输入必然得到相同的输出不读写外部文件。bond_price和duration_convexity都是这种设计方便写单元测试。建议写一个简单的回归测试确保修改代码后结果不漂移def test_bond_price_par(): price bond_price(face100, coupon_rate0.05, years5, freq2, ytm0.05) assert is_approximately_equal(price, 100, tol1e-6) def test_bond_price_premium(): price bond_price(face100, coupon_rate0.05, years5, freq2, ytm0.04) assert price 100在生产项目中可以使用pytest管理这类测试。6.4 收益率变动与压力测试债券投资的核心风险之一就是利率风险。建议在分析代码中加入压力测试逻辑计算收益率上升 100 个基点、下降 50 个基点时债券价格如何变化。使用久期凸性近似和精确重定价两种方式对比可以验证近似误差是否在可接受范围内。ytm_current 0.045 ytm_up 0.055 price_base bond_price(face, coupon_rate, years, freq, ytm_current) price_up bond_price(face, coupon_rate, years, freq, ytm_up) d_mac, d_mod, conv duration_convexity(face, coupon_rate, years, freq, ytm_current) dy ytm_up - ytm_current approx_change -d_mod * dy 0.5 * conv * dy ** 2 print(精确价格变化:, price_up - price_base) print(久期凸性近似变化:, price_base * approx_change)对于 10 年期品种收益率上升 100bp 时久期凸性近似与精确计算通常能保持较高的接近程度但收益率变化越大误差越明显。6.5 数据合规与免责本文所有代码和示例数据仅用于技术学习。实际分析中如果需要使用真实债券数据务必确认数据来源具有合法授权并注意区分数据更新的时间口径。任何基于模型的分析结果都不应直接作为投资决策依据这个边界需要在文档和代码注释中写清楚。如果是企业内部的定价系统还要遵守公司数据安全规范交易数据、对手方信息等敏感字段不能输出到日志或前端页面。最小权限原则同样适用于金融数据系统不是所有人都能看到完整的债券持仓明细。6.6 工程化扩展方向债券定价计算模型是一个基础底座在此基础上可以继续扩展引入实际计息日规则处理非整数期限支持利率期限结构例如根据国库券收益率曲线给公司债定价加入信用利差模型分析不同评级债券的溢价差异批量处理组合持仓输出组合久期、凸性和 VaR 指标对接行情 API定时拉取价格并自动更新 YTM。7. 总结与延伸学习回到开头的问题Alphabet 为什么能用高溢价吸引投资者参与大规模债券发行从技术层面看高溢价的本质是票面利率高于市场同期限收益率导致债券价格高于面值投资者获得了更高的每期票息。这个结论可以从现金流贴现模型算出精确数值。本文用 Python 实现了一套完整的债券定价工具链从现金流生成到价格计算从 YTM 反解到久期凸性再到多期限债券对比分析和曲线可视化。核心代码都在bond_lib.py中具有清晰的函数边界和可测试性可以在实际项目基础上继续扩展。如果接下来想深入研究我建议优先学习这几个方向收益率曲线构建尤其是如何从不同期限国债价格反推即期利率曲线信用利差与违约概率模型理解公司债溢价中的信用成分债券组合管理中的久期匹配与免疫策略金融数值方法比如 Newton-Raphson 求解 YTM、样条插值构建曲线。债券定价看似只是几个数学公式但真正落地到工程系统时计息规则、精度控制、数据合规和风险边界都需要仔细处理。建议你亲手把bond_lib.py跑一遍然后改几组参数看看期限和票息变化会如何影响价格与久期。只有动手算过才能真正理解财经新闻里那一个个数字背后的逻辑。
返回列表