
金融科技科学计算【免费下载链接】tf-quant-financeHigh-performance TensorFlow library for quantitative finance.项目地址https://gitcode.com/gh_mirrors/tf/tf-quant-finance点击查看免费下载本文是 tf-quant-finance 中tf_quant_finance.math.pde.steppers模块PDE 求解器的时间推进步进器的完整技术指南。该模块为库内的一维与多维抛物线型偏微分方程parabolic PDE有限差分求解器fd_solvers.py提供可插拔的时间推进方案time marching scheme是期权定价、利率建模等金融数值计算场景的核心部件。读完本文你将掌握各 stepper 的数学原理、稳定性与精度特性、参数选择要点以及如何在solve_backward/solve_forward中按需选用或自定义时间推进方案。模块总览一个家族、两个层次tf_quant_finance.math.pde.steppers在 steppers/init.py 中导出 10 个子模块按职责可以分为两个层次一维方案基于抛物型方程步进器parabolic_equation_stepper单步框架、weighted_implicit_explicit加权隐-显式家族核心、explicit、implicit、crank_nicolson、extrapolation、oscillation_damped_crank_nicolson、composite_stepper方案组合器多维方案基于 ADI 交替方向隐式multidim_parabolic_equation_stepper多维单步框架、douglas_adiDouglas ADI 方案。每个子模块通常提供两个层次的 APIxxx_scheme纯时间推进方案只负责在给定空间离散方程du/dt A(t)u(t) b(t)上走一步和xxx_step返回一个完整 stepper 函数可直接作为one_step_fn交给 fd_solvers。两者关系可从一个典型实现看出crank_nicolson.py 中crank_nicolson_step()内部只是把time_marching_schemecrank_nicolson_scheme传给parabolic_equation_step而crank_nicolson_scheme本身又只是weighted_implicit_explicit_scheme(theta0.5)的别名见 crank_nicolson.py。下表汇总了各模块的定位与关键参数信息来自 steppers.md 及其子文档子模块方案定位关键参数/默认值精度阶数稳定性explicit纯显式θ1无一阶仅小时间步稳定implicit纯隐式θ0无一阶稳定weighted_implicit_explicit加权隐-显式theta∈ [0,1]θ0.5 时二阶否则一阶θ ≥ 0.5 时稳定crank_nicolsonCrank-Nicolsonθ0.5无二阶稳定extrapolation外推两个半步整步组合无二阶稳定oscillation_damped_crank_nicolson先外推后 CNextrapolation_steps1二阶稳定composite_stepper任意两方案组合first_scheme_steps等取决于子方案取决于子方案douglas_adi多维 Douglas ADItheta0.5θ0.5 且无混合导数项时二阶稳定parabolic_equation_stepper一维单步框架———multidim_parabolic_equation_stepper多维单步框架———注意multidim_parabolic_equation_stepper模块中的multidim_parabolic_equation_step与douglas_adi模块中的同名函数指向同一实现multidim_parabolic_equation_stepper.md只是文档入口不同。一维时间推进方案加权隐-显式家族一维空间离散后抛物线 PDE 被化为常微分方程组du/dt A(t)u(t) b(t)其中u是解向量A是三对角矩阵每个网格点只受其两个邻居影响b是非齐次项通常来自边界条件。所有一维方案的差异本质上就是如何对右端项做时间离散。加权隐-显式Weighted Implicit-Explicit家族的统一框架weighted_implicit_explicit_scheme(theta)将右端项取为步前值与步后值的加权平均推导见 weighted_implicit_explicit_scheme.md(u(t2) - u(t1)) / (t2 - t1) theta * (A(t1)u(t1) b(t1)) (1 - theta) * (A(t2)u(t2) b(t2))该家族通过单一参数theta覆盖三种经典方案weighted_implicit_explicit_step.mdtheta 0→ 纯隐式implicit方案theta 1→ 纯显式explicit方案theta 0.5→ Crank-Nicolson 方案。精度与稳定性的关键结论当theta 0.5时方案无条件稳定theta 0.5时达到二阶精度即 Crank-Nicolson 情形其余取值只有一阶精度。这些结论在 time_marching_schemes_test.py 的参数化测试中被逐一验证Implicit、Explicit、Weighted(theta0.3)均标注accuracy_order1而CrankNicolson与Extrapolation标注accuracy_order2测试用u(t) exp(At)u(0)的精确解对比误差容限设为30 * time_step^(order1)。实现中的两个工程细节见 weighted_implicit_explicit.py中点求值省一半开销通常显式项在t1、隐式项在t2分别求A和b本实现统一在(t1 t2)/2处求值一次精度阶数不变θ0.5 时仍二阶、否则仍一阶但系数函数调用次数减半。三对角求解是性能瓶颈闭式解为u(t2) (1 - (1-theta)·dt·A)^(-1) · (1 theta·dt·A)·u(t1) dt·b。核心开销是求逆(1 - (1-theta)·dt·A)该矩阵是三对角的因此直接调用tf.linalg.tridiagonal_solvediagonals_formatsequence、partial_pivotingFalse高效求解见 _weighted_scheme_implicit_part。显式部分则只做三对角矩阵-向量乘见 _weighted_scheme_explicit_part。theta需满足0 theta 1越界会抛出ValueErrorweighted_implicit_explicit.py。三个特例Explicit / Implicit / Crank-Nicolson三者都只是weighted_implicit_explicit_scheme(theta)的别名实例定义在各自模块末尾# explicit.py explicit_scheme weighted_implicit_explicit_scheme(theta1) # L79 # implicit.py implicit_scheme weighted_implicit_explicit_scheme(theta0) # L77 # crank_nicolson.py crank_nicolson_scheme weighted_implicit_explicit_scheme(theta0.5) # L80它们各自的单步公式与定位分别见 explicit_step.md、implicit_step.md、crank_nicolson_step.md方案右端项近似优点缺点Explicitθ1(u(t2)-u(t1))/dt A(t1)u(t1) b(t1)只用步前值完全无需矩阵求逆速度最快仅小时间步下稳定一阶精度Implicitθ0只用步后值A(t2)u(t2) b(t2)稳定一阶精度Crank-Nicolsonθ0.5前后值的算术平均二阶精度且稳定一维 PDE 中最常用对不连续初值可能产生振荡三个*_step()工厂函数都返回一个与one_step_fn签名一致的可调用对象接收time, next_time, coord_grid, value_grid, boundary_conditions, 各阶系数 fn, num_steps_performed, dtype, name可直接作为 fd_solvers 的one_step_fn使用见 crank_nicolson.py 的step_fn定义。Explicit/Implicit 文档均明确指出通常优先选择 Crank-Nicolson 或 Extrapolation 方案。处理不连续初值Extrapolation 与振荡阻尼 Crank-NicolsonExtrapolation外推隐-显式方案extrapolation_step()/extrapolation_scheme通过组合两个隐式半步与一个隐式整步来获得二阶精度extrapolation_step.md。其价值在于Crank-Nicolson 对含不连续discontinuity的初始值网格例如敲入/敲出障碍期权在边界处的 payoff 跳变会产生高波数振荡而 Extrapolation 对高波数分量逼近更好因而无振荡代价是比 Crank-Nicolson 更慢多走子步。源码 extrapolation.py 的 docstring 对此有明确说明其理论基础为 Lawson Morris 1978 年的外推法论文SIAM J. Numer. Anal. 15, 1212。Oscillation-Damped Crank-Nicolson鱼与熊掌兼得oscillation_damped_crank_nicolson_step(extrapolation_steps1)的思路很直接前extrapolation_steps步用 Extrapolation 方案之后切回 Crank-Nicolson 方案oscillation_damped_crank_nicolson_step.md。这样既借助 Extrapolation 抑制了初始振荡又利用 Crank-Nicolson 的低计算成本完成其余步数。实现上它直接复用了方案组合器# oscillation_damped_crank_nicolson.py L48-L49 return composite_scheme_step(extrapolation_steps, extrapolation_scheme, crank_nicolson_scheme)参考文献 [2]Giles Carter, Convergence analysis of Crank-Nicolson and Rannacher time-marching, J. Comput. Finance 9, 2005虽主要讨论首步用全隐式方案但在文末同样提到了用外推方案获得更好精度的做法。重要性oscillation_damped_crank_nicolson_step()正是solve_backward/solve_forward在一维 PDE 且未显式指定one_step_fn时的默认 stepper见 fd_solvers.py。组合方案Composite Steppercomposite_scheme_step(first_scheme_steps, first_scheme, second_scheme)提供任意两个时间推进方案的顺序组合当已执行的步数小于first_scheme_steps时使用first_scheme否则使用second_schemecomposite_scheme_step.md。其step_fn内部依赖num_steps_performed计数切换方案composite_stepper.py。这是实现热身步 主方案类策略的通用工具oscillation_damped_crank_nicolson正是其典型应用。多维 PDE 与 Douglas ADI 方案当空间维数n 1时全隐式时间推进需要求解高带宽矩阵代价过高。douglas_adi_step(theta0.5)采用ADI交替方向隐式alternating direction implicit思想规避该问题douglas_adi_step.md每个时间步拆分为若干子步第 1 步完全显式随后N 个子步分别对 N 个空间轴做该轴隐式、其余轴显式的处理这样每步只需解三对角方程组而不是高带宽带状方程组。数学形式douglas_adi_scheme.md采用 Haentjens int Hout 论文的记号把矩阵拆成A sum_i A_iA_i为沿维度 i 的偏导数贡献平移项在A_i间均匀分配非齐次项同样拆为b sum_i b_i单步迭代为Y_0 (1 (A(t1) A_mixed(t1))·dt)·U_{n-1} b(t1)·dt Y_j Y_{j-1} theta·dt·(A_j(t2)·Y_j - A_j(t1)·U_{n-1} b_j(t2) - b_j(t1)) 对每个空间维度 j U_n Y_{n_dims-1}参数theta的选择theta 0对应完全显式theta越大隐式子步的修正越强。推荐theta 0.5因为此时方案为二阶精度——前提是 PDE 中不含混合二阶导数项若存在混合项如 Heston 模型中的相关项Douglas 方案退化为仅一阶精度需要 Craig-Sneyd 等更高级的 ADI 方案见 douglas_adi_scheme.md 末尾的 Note以及 multidim_parabolic_equation_step.md 参考文献 [1]。重要douglas_adi_step(theta0.5)是solve_backward/solve_forward在多维 PDE 且未指定one_step_fn时的默认 stepperfd_solvers.py。底层步进框架parabolic_equation_step 与 multidim_parabolic_equation_step所有*_step工厂最终都委托给两个底层框架函数之一理解它们才能真正读懂 stepper 的数据流。一维框架parabolic_equation_step签名parabolic_equation_step.md、parabolic_equation_stepper.pyparabolic_equation_step( time, next_time, coord_grid, value_grid, boundary_conditions, second_order_coeff_fn, first_order_coeff_fn, zeroth_order_coeff_fn, inner_second_order_coeff_fn, inner_first_order_coeff_fn, time_marching_scheme, dtypeNone, nameNone)它求解如下一维抛物线 PDE支持时间正向/反向演化dV/dt a·d²(A·V)/dx² b·d(B·V)/dx c·V 0各参数要点coord_grid长度为 1 的列表内含形状为[d]或B [d]的 rank-1 张量B为 batch 形状允许同时演化多组解value_gridtime时刻的函数值形状须与B [d]广播兼容boundary_conditions仅支持矩形边界。每个边界可用 callable 或None表示None表示该边界上二阶项为零方程退化为dV/dt b·d(B·V)/dx c·V 0非None时采用 Robin 形式alpha(t)·V beta(t)·V_n gamma(t)其中alpha或beta可为None分别对应 Neumann 与 Dirichlet 条件second_order_coeff_fn/first_order_coeff_fn/zeroth_order_coeff_fn返回a、b、c三个系数均接受(t, locations_grid)并返回可广播到网格形状的数值或张量缺席项返回Noneinner_second_order_coeff_fn/inner_first_order_coeff_fn返回导数括号内的系数A、B用于处理形如a·d²(A·V)/dx²的守恒形式要求同上time_marching_scheme核心可调用对象按关键字接收inner_value_grid形状为value_grid[..., 1:-1]边界点已剔除、t1、t2、equation_params_fn后者在给定时刻构造三对角矩阵A主/上/下三条对角线元组与非齐次项b并返回与value_grid同形状的近似解。返回(new_coord_grid, new_value_grid)两个张量分别代表一步之后的坐标网格与近似解。多维框架multidim_parabolic_equation_step签名multidim_parabolic_equation_step.md增加了可选的多维参数multidim_parabolic_equation_step( time, next_time, coord_grid, value_grid, boundary_conditions, time_marching_scheme, second_order_coeff_fnNone, first_order_coeff_fnNone, zeroth_order_coeff_fnNone, inner_second_order_coeff_fnNone, inner_first_order_coeff_fnNone, dtypeNone, nameNone)它求解dV/dt Sum[a_ij·d²(A_ij·V)/dx_i·dx_j] Sum[b_i·d(B_i·V)/dx_i] c·V 0与一维版本的关键差异coord_grid为n个 rank-1 张量的列表第 i 个形状为[d_i]或B [d_i]boundary_conditions为长度为n的元组列表boundary_conditions[i][0]描述沿维度 i 的下边界boundary_conditions[i][1]描述上边界callable 返回的alpha/beta/gamma形状为去掉对应维度后的网格形状例如二维网格(b, ny, nx)下boundary_conditions[0][i]返回形状(b, nx)的张量混合导数项time_marching_scheme收到的equation_params_fn返回一个嵌套结构A[i][i]是沿维度 i 的三对角矩阵三条对角线A[i][j]i j是表示平面 (i,j) 上四个对角点(k1,l1), (k1,l-1), (k-1,l1), (k-1,l-1)贡献的四个张量A[i][j]中的None表示对应混合项不存在。文档还给出了二维网格上 3×3 影响模板a_mm...a_pp与返回结构([[ (a_y-, a_0y, a_y), (a_pp, a_pm, a_mp, a_pp) ], [ None, (a_x-, a_0x, a_x) ]], [b_y, b_x])的对应关系边界类型标记has_default_lower_boundary/has_default_upper_boundary布尔列表标记各维度边界是默认边界还是 Robin 边界用于决定u_inner剔除 Robin 边界后的解向量如何补回边界得到完整u。文档建议除非要自定义时间推进方案否则不要直接调用这两个框架函数直接用crank_nicolson_step()一维或douglas_adi_step()多维即可。实战在 fd_solvers 中选型与自定义默认行为solve_backward/solve_forwardfd_solvers.py在one_step_fnNone时自动选型fd_solvers.pyn_dims 1→oscillation_damped_crank_nicolson_step()n_dims 1→douglas_adi_step(theta0.5)。因此常规场景下无需任何手动配置。显式指定 stepper当默认方案不合适时通过one_step_fn参数传入即可import tf_quant_finance.math.pde as pde # 一维需要二阶精度且初值光滑时也可直接用 Crank-Nicolson one_step_fn pde.steppers.crank_nicolson.crank_nicolson_step() # 一维初值含不连续如敲入/敲出 payoff且不介意稍慢时用纯 Extrapolation one_step_fn pde.steppers.extrapolation.extrapolation_step() # 多维默认就是 douglas_adi_step(theta0.5)也可显式传入自定义 theta one_step_fn pde.steppers.douglas_adi.douglas_adi_step(theta0.5) # 自定义组合前 3 步用 Extrapolation 抑制振荡之后切 Crank-Nicolson one_step_fn pde.steppers.oscillation_damped_crank_nicolson.oscillation_damped_crank_nicolson_step( extrapolation_steps3) # 通用组合器任意两方案拼接 one_step_fn pde.steppers.composite_stepper.composite_scheme_step( first_scheme_steps2, first_schemepde.steppers.extrapolation.extrapolation_scheme, second_schemepde.steppers.crank_nicolson.crank_nicolson_scheme) pde.fd_solvers.solve_backward( start_time..., end_time..., coord_grid..., values_grid..., num_steps..., one_step_fnone_step_fn, boundary_conditions..., second_order_coeff_fn..., ...)自定义时间推进方案如果你有自研方案只需实现符合框架约定的 callable 并传给框架函数def my_scheme(value_grid, t1, t2, equation_params_fn): # equation_params_fn(t) 返回 (三对角矩阵三对角线, 非齐次项 b) diag, upper, lower, b ... # 计算并返回 u(t2) 的近似值 ... def my_step(): def step_fn(time, next_time, coord_grid, value_grid, boundary_conditions, second_order_coeff_fn, first_order_coeff_fn, zeroth_order_coeff_fn, inner_second_order_coeff_fn, inner_first_order_coeff_fn, num_steps_performed, dtypeNone, nameNone): return pde.steppers.parabolic_equation_stepper.parabolic_equation_step( time, next_time, coord_grid, value_grid, boundary_conditions, second_order_coeff_fn, first_order_coeff_fn, zeroth_order_coeff_fn, inner_second_order_coeff_fn, inner_first_order_coeff_fn, time_marching_schememy_scheme, dtypedtype, namename) return step_fn选型建议速查场景推荐方案一维、初值光滑、追求精度与效率平衡crank_nicolson_step()或默认的oscillation_damped_crank_nicolson_step()一维、初值含不连续障碍/二元期权 payoff 跳变oscillation_damped_crank_nicolson_step()首步外推或extrapolation_step()需要极快但可接受小时间步限制explicit_step()θ1需要无条件稳定但不苛求精度implicit_step()θ0多维n≥2、无混合二阶导数项douglas_adi_step(theta0.5)二阶精度多维且含混合二阶导数项如 Heston-Hull-Whitedouglas_adi_step()退化为 1 阶或改用 Craig-Sneyd 等高级 ADI需要热身方案 主方案混合策略composite_scheme_step(first_scheme_steps, ...)扩展阅读模块索引与全量 APIsteppers.md一维/多维步进框架parabolic_equation_stepparabolic_equation_step.md、multidim_parabolic_equation_stepmultidim_parabolic_equation_step.md上层求解器fd_solvers.md 与 fd_solvers.py精度与稳定性测试time_marching_schemes_test.py、parabolic_equation_stepper_test.py、douglas_adi_scheme_test.py网格与边界工具grids.md、boundary_conditions.md赞分享金融科技科学计算【免费下载链接】tf-quant-financeHigh-performance TensorFlow library for quantitative finance.项目地址https://gitcode.com/gh_mirrors/tf/tf-quant-finance点击查看免费下载相关推荐tf-quant-finance 多维抛物线 PDE 求解中的 Douglas ADI 时间推进格式详解tf quant finance 多维抛物线 PDE 求解中的 Douglas ADI 时间推进格式详解 导读 本文以 tf quant finance 中 t金融科技科学计算tf-quant-finance 中的 Douglas ADI 时间推进方案多维抛物 PDE 有限差分求解的原理、源码与用法tf quant finance 中的 Douglas ADI 时间推进方案多维抛物 PDE 有限差分求解的原理、源码与用法 本文以 tf_quant_fin金融科技科学计算tf-quant-finance 隐式时间推进Implicit Stepper深度解析原理、源码实现与 PDE 求解实战tf quant finance 隐式时间推进Implicit Stepper深度解析原理、源码实现与 PDE 求解实战 本指南围绕 tf quant f金融科技科学计算上一篇dbKoda可视化查询编辑器如何提升MongoDB开发效率的7个技巧下一篇Textual 鼠标滚轮事件完全指南深入解析 MouseScrollDown创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。