☰
tf-quant-finance 利率分析模块(rates.analytics)完全指南:现金流现值、远期利率与互换定价
2026/10/13 9:54:12 网站建设 项目流程
  • 金融科技
  • 科学计算

【免费下载链接】tf-quant-finance

High-performance TensorFlow library for quantitative finance.

项目地址:https://gitcode.com/gh_mirrors/tf/tf-quant-finance
点击查看免费下载

导读:本文系统讲解 tf-quant-finance 中tf_quant_finance.rates.analytics模块的三大核心能力——现金流属性计算(cashflows)、远期利率计算(forwards)以及利率/权益互换的创建与定价(swap)。通过本文,你将掌握如何用 TensorFlow 张量运算完成债券现值/到期收益率(YTM)求解、零息曲线与远期利率的相互转换、互换平值利率与年金计算,并理解其中groups分段批处理机制与 Newton 迭代反求解等底层实现原理。

模块总览与定位

rates.analytics是 tf-quant-finance 中面向利率产品的"分析工具箱",对外暴露为三个子模块,模块入口定义在 rates/analytics/init.py:

子模块定位核心函数
cashflows现金流属性计算present_value、pv_from_yields、yields_from_pv
forwards远期利率属性计算forward_rates、forward_rates_from_yields、yields_from_forward_rates
swap利率/权益互换创建与定价swap_price、rate_leg_cashflows、equity_leg_cashflows、ir_swap_price、ir_swap_par_rate_and_annuity、equity_swap_price

模块的定位在源码中表述为 "Functions to handle rates",其中cashflows子模块被描述为 "Collection of functions to compute properties of cashflows",swap子模块则承担 "create interest rate and equity swaps" 的职责。整个模块直接基于tensorflow.compat.v2构建,所有函数都遵循统一的张量风格:输入输出均为Tensor,支持batch_shape + [n]形状的批量运算,并支持 float32 / float64 双精度。

调用入口示例:

import tf_quant_finance as tff # 三个子模块的完整引用路径 tff.rates.analytics.cashflows.present_value(...) tff.rates.analytics.forwards.forward_rates(...) tff.rates.analytics.swap.swap_price(...)

现金流模块(cashflows):债券现值与到期收益率

cashflows子模块提供三个互为"正逆"关系的函数,构成完整的债券定价闭环:已知折现因子求现值、已知收益率求现值、已知现值反求收益率。

present_value:用折现因子直接折现

present_value(cashflows, discount_factors, dtype=None, name=None)是最基础的函数,它把现金流与对应的折现因子逐项相乘再求和。

关键参数:

  • cashflows:实数Tensor,形状batch_shape + [n],其中n是每只债券的现金流个数,batch_shape是债券数量;现金流个数不同的债券必须用 0 补齐到统一的n;
  • discount_factors:与cashflows同 dtype、形状兼容的Tensor,对应各现金流的折现因子;
  • dtype:默认None,自动从cashflows推断;
  • name:默认None,映射为'present_value'。

官方示例(两只面值 1000、半年付息的债券,第一只票息 4% 期限 2 年,第二只票息 6% 期限 3 年,尾部用 0 补齐):

cashflows = [[20, 20, 20, 1020, 0, 0], [30, 30, 30, 30, 30, 1030]] discount_factors = [[0.96, 0.93, 0.9, 0.87, 1.0, 1.0], [0.97, 0.95, 0.93, 0.9, 0.88, 0.86]] present_values = tff.rates.analytics.cashflows.present_value( cashflows, discount_factors, dtype=np.float64) # 期望结果: [943.2, 1024.7]

实现原理:从 cashflows.py 源码看,该函数的核心实现只有两步——先做逐元素乘法cashflows * discount_factors,再沿最后一个轴求和tf.math.reduce_sum(discounted, axis=-1)。由于是纯张量运算,可整体参与 TensorFlow 的自动微分与 XLA 编译。测试用例 cashflows_test.py(test_discount_factors)在 float32 与 float64 两种精度下均验证了该结果。

pv_from_yields:由到期收益率计算现值

pv_from_yields(cashflows, times, yields, groups=None, dtype=None, name=None)不直接给折现因子,而是给定(连续复利的)到期收益率,内部按exp(-yield * time)生成折现因子。

数学背景:这里yields指 Hull《期权、期货及其他衍生产品》(第九版)4.4 节定义的债券收益率,即债券的内部收益率(IRR)。每笔现金流按cashflow_i * exp(-yield * t_i)折现后求和。

关键参数:

  • cashflows/times:均为长度n的 rank-1 实数Tensor,times以年为单位、必须为正;
  • yields:长度1(无groups)或长度k(groups最大值为k-1)的 rank-1Tensor,第i个分量作用于所有标签为i的现金流;
  • groups:可选的长度n的 intTensor,取值在[0, k-1],用于把n笔现金流划分成k组(即k只债券);默认None表示全部现金流视为一组;
  • dtype/name:默认None。

官方示例(两只面值 1000 的半年付息债券,YTM 分别为 7% 与 5%):

dtype = np.float64 yields_to_maturity = np.array([0.07, 0.05], dtype=dtype) cashflows = np.array([20, 20, 20, 1020, 30, 30, 30, 30, 30, 1030], dtype=dtype) times = np.array([0.5, 1, 1.5, 2, 0.5, 1, 1.50, 2, 2.5, 3], dtype=dtype) groups = np.array([0] * 4 + [1] * 6) present_values = tff.rates.analytics.cashflows.pv_from_yields( cashflows, times, yields_to_maturity, groups=groups, dtype=dtype) # 结果: [942.712, 1025.778]

实现细节:源码(cashflows.py)中,groups非空时先通过tf.gather(yields, groups)把每个现金流"贴"上自己的收益率,折现后分别用tf.math.segment_sum(discounted, groups)按组求和;groups为空时则用tf.math.reduce_sum(discounted, keepdims=True)返回长度为 1 的结果。测试中还覆盖了零收益率(PV 等于票息加本金之和 1080/1180)与极端高收益率(300%,PV 趋于 0)两个边界场景(cashflows_test.py)。

yields_from_pv:由现值反求到期收益率(Newton 迭代)

yields_from_pv(cashflows, times, present_values, groups=None, tolerance=1e-8, max_iterations=10, dtype=None, name=None)是pv_from_yields的逆运算,用于从已知市场价格反解隐含 YTM。

关键参数(与pv_from_yields相同部分不再重复):

  • present_values:长度k的 rank-1Tensor,第i个分量是组i的现值;
  • tolerance:正实数标量Tensor,默认1e-8。收益率用 Newton 求根法求解,当推断收益率变化量小于该容差或达到最大迭代次数时停止(二者取先到者);
  • max_iterations:正整数标量Tensor,默认10;传None可取消迭代上限。

官方示例(用前一个例子的 PV 反解 YTM,期望还原出 7% 与 5%):

dtype = np.float64 present_values = np.array([942.71187528177757, 1025.7777300221542], dtype=dtype) cashflows = np.array([20, 20, 20, 1020, 30, 30, 30, 30, 30, 1030], dtype=dtype) times = np.array([0.5, 1, 1.5, 2, 0.5, 1, 1.50, 2, 2.5, 3], dtype=dtype) groups = np.array([0] * 4 + [1] * 6) yields = tff.rates.analytics.cashflows.yields_from_pv( cashflows, times, present_values, groups=groups, dtype=dtype) # 期望: [0.07, 0.05]

实现原理:源码(cashflows.py)展示了一个经典的 Newton 迭代。每次迭代计算两组量:pvs = segment_sum(cashflows * exp(-times * yields))与durations = segment_sum(cashflows * times * exp(-times * yields))(即麦考利久期的折现加权和),然后按delta_yields = (pvs - present_values) / durations更新收益率。迭代通过tf.while_loop完成,_cond判断delta_yields的最大绝对值是否小于tolerance,从而支持在计算图中展开循环。测试用例(cashflows_test.py)验证了分组场景、零收益率饱和场景,以及需要把max_iterations提高到 30 才能收敛的高收益率场景(隐含 YTM 高达 25% 与 42%),说明默认的 10 次迭代对极端收益率可能不足,实际使用时可按需调大。

远期利率模块(forwards):零息曲线与远期曲线的双向转换

forwards子模块围绕"零息率(zero rate)"与"远期利率(forward rate)"两个概念提供三个函数。模块文档(forwards.md)开宗明义:设Z(t)为到期时间t的零息债券价格,则零息率定义为

r(t) = -ln(Z(t)) / t (1)

这是 0 时刻观察到的、适用于时段[0, t]的连续复利利率。而t1与t2之间的远期利率f(t1, t2)与零息债券价格的关系为:

exp(-f(t1, t2)(t2-t1)) = Z(t2) / Z(t1) (2) f(t1, t2) = -(ln Z(t2) - ln Z(t1)) / (t2 - t1) (3) f(t1, t2) = (t2 * r(t2) - t1 * r(t1)) / (t2 - t1) (4)

forward_rates:由折现因子直接计算远期利率

forward_rates(df_start_dates, df_end_dates, daycount_fractions, dtype=None, name=None)是最直接的远期利率计算:给定起止日期的折现因子与日计数分数(year fraction),返回该区间内的远期利率。该函数对形状没有特殊约束,天然支持batch_shape批量计算。

官方示例:

df_start_dates = [[0.95, 0.9, 0.75], [0.95, 0.99, 0.85]] df_end_dates = [[0.8, 0.6, 0.5], [0.8, 0.9, 0.5]] daycount_fractions = [[0.5, 1.0, 2], [0.6, 0.4, 4.0]] result = tff.rates.analytics.forwards.forward_rates( df_start_dates, df_end_dates, daycount_fractions, dtype=tf.float64) # 期望: # [[0.375, 0.5, 0.25], # [0.3125, 0.25, 0.175]]

实现原理:源码(forwards.py)中公式为divide_no_nan(divide_no_nan(df_start, df_end) - 1, daycount_fractions),即简单的(DF_start / DF_end - 1) / τ。注意这里使用了tf.math.divide_no_nan,当区间长度为 0(daycount_fractions为 0)时返回 0 而不是 NaN,避免了除零异常。测试 forwards_test.py 对该结果在两种精度下做了验证。

forward_rates_from_yields:零息率曲线 → 远期利率曲线

forward_rates_from_yields(yields, times, groups=None, dtype=None, name=None)利用式 (4) 从一组递增时点上的零息率计算相邻区间上的远期利率。对区间[0, t1],远期利率与零息率相同。

关键参数:

  • yields:长度n的 rank-1Tensor,各时点上的零息率;
  • times:长度n的正实数 rank-1Tensor。无groups时整个数组必须严格递增;有groups时每个组内的时点必须递增;
  • groups:可选 intTensor,取值[0, k-1],k为曲线条数;默认None表示全部视为单条曲线。

关于 groups 批处理的设计:不同零息曲线(例如不同币种)往往具有不同数量的期限点(tenor),无法直接堆叠成统一的 batch 维度。因此该模块借鉴tf.segment_sum的"分组分段"概念,把所有曲线拼成一维向量,再用groups标注每条曲线所辖区间。官方示例中两条曲线(3 个期限点与 4 个期限点)拼接如下:

Groups: [0, 0, 0, 1, 1, 1, 1] Times: [0.25, 0.5, 1.0, 0.25, 0.5, 1.0, 1.5] Rates: [0.04, 0.041, 0.044, 0.022, 0.025, 0.028, 0.036]
dtype = np.float64 groups = np.array([0, 0, 0, 1, 1, 1, 1]) times = np.array([0.25, 0.5, 1.0, 0.25, 0.5, 1.0, 1.5], dtype=dtype) rates = np.array([0.04, 0.041, 0.044, 0.022, 0.025, 0.028, 0.036], dtype=dtype) forward_rates = tff.rates.analytics.forwards.forward_rates_from_yields( rates, times, groups=groups, dtype=dtype)

实现原理:源码(forwards.py)先计算rate_times = yields * times,再用tf_quant_finance.math.segment_ops.segment_diff对rate_times与times分别做一阶分段差分,最后相除得到(t2*r2 - t1*r1) / (t2 - t1)。该实现完全避开 Python 循环,可在图模式与 XLA 下高效执行。测试 forwards_test.py 同时验证了带 groups 与无 groups(单条曲线、7 个期限点)两种场景,前者期望输出[0.04, 0.042, 0.047, 0.022, 0.028, 0.031, 0.052]。

yields_from_forward_rates:远期利率曲线 → 零息率曲线

yields_from_forward_rates(discrete_forwards, times, groups=None, dtype=None, name=None)是上一个函数的逆运算:给定相邻区间[0, t1], [t1, t2], ..., [t_{n-1}, tn]上的远期利率,反推各到期时点上的零息收益率。注意discrete_forwards的第一个分量适用于区间[0, times[0]]。

官方示例(用上一个例子的远期利率反推,期望还原出原始零息率[0.04, 0.041, 0.044, 0.022, 0.025, 0.028, 0.036]):

dtype = np.float64 groups = np.array([0, 0, 0, 1, 1, 1, 1]) times = np.array([0.25, 0.5, 1.0, 0.25, 0.5, 1.0, 1.5], dtype=dtype) discrete_forwards = np.array( [0.04, 0.042, 0.047, 0.022, 0.028, 0.031, 0.052], dtype=dtype) yields = tff.rates.analytics.forwards.yields_from_forward_rates( discrete_forwards, times, groups=groups, dtype=dtype) # 结果: [0.04, 0.041, 0.044, 0.022, 0.025, 0.028, 0.036]

实现原理:源码(forwards.py)的注释给出了一条"无循环"的求解策略:记x_i = f_i * (t_i - t_{i-1})(t_{-1}=0)、y_i = r_i * t_i,则x_i = y_i - y_{i-1},于是y_i = x_0 + x_1 + ... + x_i。实现先用segment_diff计算相邻时点间隔,乘以远期利率得到x,再用segment_ops.segment_cumsum做分段前缀和得到y,最后divide_no_nan(y, times)还原零息率。这一"差分 ↔ 前缀和"的对称设计,使正反两个函数在计算图上互为精确逆运算。

互换模块(swap):利率与权益互换的创建与定价

swap子模块提供从"单条腿现金流"到"整笔互换定价"的完整工具箱,所有定价函数返回的现值均站在"收取方(receiver)"视角。

基础设施:rate_leg_cashflows 与 equity_leg_cashflows

rate_leg_cashflows(coupon_rates, notional, daycount_fractions, dtype=None, name=None)计算利率腿的现金流,公式为notional * daycount_fraction * coupon_rate。coupon_rates可以是标量(固定腿)也可以是向量(浮动腿的远期利率),因此一个函数同时覆盖固定利率腿与浮动利率腿。官方示例:

coupon_rates = [[0.1, 0.1, 0.1], [0.02, 0.12, 0.14]] notional = 1000 daycount_fractions = [[1, 1, 1], [1, 2, 1]] tff.rates.analytics.swap.rate_leg_cashflows( coupon_rates, notional, daycount_fractions, dtype=tf.float64) # 期望: # [[100.0, 100.0, 100.0], # [20.0, 240.0, 140.0]]

equity_leg_cashflows(forward_prices, spots, notional, dividends=None, dtype=None, name=None)计算权益腿的现金流,定义为各付息日之间的总权益收益率。设S_i为T_i时刻的权益价值、d_i为该时刻支付的离散股息,则T_i时刻的支付为(S_i - S_{i-1}) / S_{i-1} + d_i,其理论依据见 Chance 与 Rich 的经典论文The Pricing of Equity Swaps and Swaptions(1998)。dividends默认None表示零股息。

关键参数:

  • forward_prices:形状batch_shape + [num_cashflows]的实数Tensor,各重置时点上的权益远期价格;
  • spots:形状与batch_shape兼容的Tensor,各批量元素的即期价格;
  • notional:形状兼容的Tensor,每笔现金流的名义本金;
  • dividends:形状兼容的Tensor,重置时点的离散股息,默认 0。

官方示例:

notional = 10000 forward_prices = [[110, 120, 140], [210, 220, 240]] spots = [100, 200] dividends = [[1, 1, 1], [2, 2, 2]] tff.rates.analytics.swap.equity_leg_cashflows( forward_prices, spots, notional, dividends, dtype=tf.float64) # 期望: # [[1000.01, 909.1, 1666.675], # [500.01, 476.2, 909.1]]

实现细节:源码(swap.py)先把即期价格spots通过tf.expand_dims(spots, axis=-1)拼接到远期价格序列头部(即S_0),再计算相邻差分forward[..., 1:] - forward[..., :-1]并加上股息,最后除以forward[..., :-1]得到收益率,乘以名义本金。同样使用divide_no_nan防御除零。测试 swap_test.py 验证了无 batch 与有 batch 两种场景。

swap_price:通用互换定价

swap_price(pay_leg_cashflows, receive_leg_cashflows, pay_leg_discount_factors, receive_leg_discount_factors, dtype=None, name=None)是模块的核心拼装函数:两条腿各自折现求和后相减。由于它直接接收"已算好的现金流",因此对任何"能表达为两条现金流序列"的产品(利率互换、权益互换、甚至更一般的基础互换)都通用。

官方示例:

pay_leg_cashflows = [[100, 100, 100], [200, 250, 300]] receive_leg_cashflows = [[200, 250, 300, 300], [100, 100, 100, 100]] pay_leg_discount_factors = [[0.95, 0.9, 0.8], [0.9, 0.85, 0.8]] receive_leg_discount_factors = [[0.95, 0.9, 0.8, 0.75], [0.9, 0.85, 0.8, 0.75]] tff.rates.analytics.swap.swap_price( pay_leg_cashflows=pay_leg_cashflows, receive_leg_cashflows=receive_leg_cashflows, pay_leg_discount_factors=pay_leg_discount_factors, receive_leg_discount_factors=receive_leg_discount_factors, dtype=tf.float64) # 期望: [615.0, -302.5]

实现细节:源码(swap.py)内部复用了cashflows.present_value分别计算两条腿的现值,返回receive_leg_pv - pay_leg_pv。注意两条腿的现金流个数可以不同(示例中 pay 腿 3 笔、receive 腿 4 笔),折现因子各腿独立提供。测试 swap_test.py 中NoBatch场景得到标量615.0。

ir_swap_price:利率互换一键定价

ir_swap_price(pay_leg_coupon_rates, receive_leg_coupon_rates, pay_leg_notional, receive_leg_notional, pay_leg_daycount_fractions, receive_leg_daycount_fractions, pay_leg_discount_factors, receive_leg_discount_factors, dtype=None, name=None)省去手工拼装现金流的手续:直接输入两条腿的票息率、名义本金、日计数分数与折现因子,函数内部依次调用rate_leg_cashflows生成现金流、再调用swap_price完成定价。调用链可概括为:

ir_swap_price → rate_leg_cashflows × 2(生成 pay/receive 腿现金流) → swap_price(两条腿各自 present_value 后相减)

官方示例:

pay_leg_coupon_rates = [[0.1], [0.15]] receive_leg_coupon_rates = [[0.1, 0.2, 0.05], [0.1, 0.05, 0.2]] notional = 1000 pay_leg_daycount_fractions = 0.5 receive_leg_daycount_fractions = [[0.5, 0.5, 0.5], [0.4, 0.5, 0.6]] discount_factors = [[0.95, 0.9, 0.85], [0.98, 0.92, 0.88]] tff.rates.analytics.swap.ir_swap_price( pay_leg_coupon_rates=pay_leg_coupon_rates, receive_leg_coupon_rates=receive_leg_coupon_rates, pay_leg_notional=notional, receive_leg_notional=notional, pay_leg_daycount_fractions=pay_leg_daycount_fractions, receive_leg_daycount_fractions=receive_leg_daycount_fractions, pay_leg_discount_factors=discount_factors, receive_leg_discount_factors=discount_factors, dtype=tf.float64) # 期望: [23.75, -40.7]

ir_swap_par_rate_and_annuity:平值互换利率与年金

ir_swap_par_rate_and_annuity(floating_leg_start_times, floating_leg_end_times, fixed_leg_payment_times, fixed_leg_daycount_fractions, reference_rate_fn, dtype=None, name=None)用于从参考利率曲线出发计算平值互换利率(par swap rate)与互换年金(annuity),是利率曲线构建(如 swap_curve_bootstrap)中的基础工具。

关键参数:

  • floating_leg_start_times/floating_leg_end_times:形状expiries.shape + [m]的实数Tensor,浮动腿每笔支付的计息起止时间;
  • fixed_leg_payment_times:形状expiries.shape + [n]的实数Tensor,固定腿每笔支付时间;
  • fixed_leg_daycount_fractions:与fixed_leg_payment_times同 dtype 且形状兼容,固定腿各支付的日计数分数;
  • reference_rate_fn:Python 可调用对象,接受到期时间(实数Tensor)并返回input_shape + [dim]形状的输出,即当前时点观察到的、对应到期时间的连续复利零息率。

实现原理:源码(swap.py)通过exp(-reference_rate_fn(t) * t)由零息率函数生成三个折现因子序列(浮动腿起息日、浮动腿到期日、固定腿支付日),然后计算:

annuity = Σ fixed_payment_df * fixed_daycount_fraction (年金) swap_rate = Σ (floating_start_df - floating_end_df) / annuity (平值利率)

即平值利率等于浮动腿各期折现因子之差的和除以年金。测试 swap_test.py 使用恒常利率函数lambda x: 0.01验证:三条腿各 3 期、日计数分数均为 0.5 时,得到平值利率0.010025041718802、年金1.477680223329493。reference_rate_fn的可插拔设计使该函数可以无缝对接本仓库其他曲线构建模块(如 hagan_west 或 nelson_seigel_svensson)。

equity_swap_price:权益互换定价

equity_swap_price(rate_leg_coupon_rates, equity_leg_forward_prices, equity_leg_spots, rate_leg_notional, equity_leg_notional, rate_leg_daycount_fractions, rate_leg_discount_factors, equity_leg_discount_factors, equity_dividends=None, is_equity_receiver=None, dtype=None, name=None)将利率腿(固定/浮动)与权益腿组合定价。权益腿现金流由equity_leg_cashflows生成,利率腿现金流由rate_leg_cashflows生成,最终调用swap_price组合。

关键参数:

  • rate_leg_coupon_rates:形状batch_shape + [num_rate_cashflows],利率腿票息率;
  • equity_leg_forward_prices/equity_leg_spots:权益腿远期价格(形状batch_shape + [num_equity_cashflows])与即期价格;
  • rate_leg_notional/equity_leg_notional:两腿名义本金;
  • rate_leg_daycount_fractions:利率腿日计数分数;
  • rate_leg_discount_factors/equity_leg_discount_factors:两腿各自的折现因子(两腿现金流个数不同,因此必须分开提供);
  • equity_dividends:权益重置时点的股息,默认None(零股息);
  • is_equity_receiver:形状与batch_shape兼容的布尔Tensor,指示持有者是否为权益接收方;默认None表示全部为权益接收方互换(equity receiver swap)。

官方示例:

rate_leg_coupon_rates = [[0.1, 0.2, 0.05], [0.1, 0.05, 0.2]] forward_prices = [[110, 120, 140, 150], [210, 220, 240, 0]] # 4 笔与 3 笔支付 spots = [100, 200] notional = 1000 rate_leg_daycount_fractions = [[0.5, 0.5, 0.5], [0.4, 0.5, 0.6]] rate_leg_discount_factors = [[0.95, 0.9, 0.85], [0.98, 0.92, 0.88]] equity_leg_discount_factors = [[0.95, 0.9, 0.85, 0.8], [0.98, 0.92, 0.88, 0.0]] tff.rates.analytics.swap.equity_swap_price( rate_leg_coupon_rates=rate_leg_coupon_rates, equity_leg_forward_prices=forward_prices, equity_leg_spots=spots, rate_leg_notional=notional, equity_leg_notional=notional, rate_leg_daycount_fractions=rate_leg_daycount_fractions, rate_leg_discount_factors=rate_leg_discount_factors, equity_leg_discount_factors=equity_leg_discount_factors, is_equity_receiver=[True, False], dtype=tf.float64) # 期望: [216.87770563, -5.00952381]

实现细节:源码(swap.py)中,is_equity_receiver通过tf.where映射为+1/-1符号,再乘上swap_price(rate_cashflows, equity_cashflows, ...)的结果——这里的swap_price返回的正是"收取权益腿、支付利率腿"的现值,因此对非权益接收方直接取反即可。示例中第一个批量元素是权益接收方(正值 216.88),第二个不是(负值 -5.01)。测试 swap_test.py 同时覆盖了is_equity_receiver=None(全部视为接收方)与显式指定[True, False]两种用法。

工程实践要点与常见用法

1. 精度选择

所有函数都支持dtype参数,默认从输入推断。官方示例与测试大量使用np.float64/tf.float64以获得精确数值结果(如 YTM 反解需要atol=1e-9级别的精度),而 float32 适用于对精度要求不高的批量场景。建议:定价与曲线构建使用 float64,性能敏感的原型使用 float32。

2. groups 分段机制是"不等长批量"的通用解法

pv_from_yields、yields_from_pv、forward_rates_from_yields、yields_from_forward_rates四个函数都用groups解决"每条曲线/每只债券期限点个数不同、无法直接堆叠成 batch"的问题。使用要点:

  • groups取值必须在[0, k-1],k为组数;
  • 每个组内的times必须严格递增;
  • 返回结果按组序排列,第i个分量对应组i。

该设计与tf.segment_sum/tf.segment_cumsum等分段算子一脉相承(forwards.py正是直接调用了 segment_ops 中的segment_diff与segment_cumsum)。

3. Newton 迭代的收敛性控制

yields_from_pv默认max_iterations=10、tolerance=1e-8。对普通债券(YTM 在个位数百分比量级)足够;但对深度折价债券(隐含收益率极高)可能需要增大max_iterations(测试中用到 30)。若担心不收敛,可同时观察delta_yields的收敛趋势或适当放宽tolerance。

4. 模块间的组合使用

本模块的函数是上游产品定价的基础件:cashflows.present_value被swap_price复用(swap.py),swap_price又被ir_swap_price与equity_swap_price复用;ir_swap_par_rate_and_annuity的reference_rate_fn回调则可对接 hagan_west、nelson_seigel_svensson 等曲线模型,进而服务于 swap_curve_bootstrap 等更上层的利率曲线构建流程。

参考资料

  • 模块文档:analytics.md、cashflows.md、forwards.md、swap.md
  • 源码实现:cashflows.py、forwards.py、swap.py
  • 测试用例:cashflows_test.py、forwards_test.py、swap_test.py
  • 数学参考:John C. Hull,Options, Futures and Other Derivatives, 9th Edition(收益率定义见第 4.4 节);Don M. Chance & Don R. Rich,The Pricing of Equity Swaps and Swaptions, 1998(权益腿现金流定义)
  • 金融科技
  • 科学计算

【免费下载链接】tf-quant-finance

High-performance TensorFlow library for quantitative finance.

项目地址:https://gitcode.com/gh_mirrors/tf/tf-quant-finance
点击查看免费下载

相关推荐

上一篇:Armeria Kubernetes 混沌测试实战:用 Chaos Mesh 验证 SharedInformer 的 WebSocket 恢复能力
下一篇:Whisky 终极指南:免费兼容层工具如何三步让 Apple Silicon Mac 运行 Windows 软件

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询