
金融科技科学计算【免费下载链接】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.douglas_adi模块为核心系统讲解 Douglas ADI交替方向隐式时间推进格式的原理、API 用法与源码实现。Douglas ADI 是 tf-quant-finance 有限差分 PDE 求解器在多维空间n_dims ≥ 2场景下的默认时间推进方案被 fd_solvers.py 自动选用。读完本文你将掌握如何用douglas_adi_step/douglas_adi_scheme构造多步推进器、theta参数如何影响精度与稳定性、底层multidim_parabolic_equation_step如何完成空间离散→时间推进→边界恢复的完整一步以及如何在 Heston-Hull-White 等含混合导数项的金融 PDE 上正确使用它。Douglas ADI 在 tf-quant-finance 中的定位tf-quant-finance 的 math/pde 包提供线性抛物线 PDE 的数值求解能力。steppers子包见 steppers/init.py内置了多种时间推进time marching方案包括explicit显式格式implicit隐式格式crank_nicolsonCrank-Nicolson 格式一维默认方案oscillation_damped_crank_nicolson带振荡阻尼的 Crank-Nicolson一维solve_backward/solve_forward默认douglas_adiDouglas ADI 格式多维默认方案extrapolation、weighted_implicit_explicit、composite_stepper等进阶方案在 fd_solvers.py 的通用求解循环中若调用方没有显式传入one_step_fn则if one_step_fn is None: if n_dims 1: one_step_fn oscillation_damped_crank_nicolson_step() else: one_step_fn douglas_adi_step(theta0.5)也就是说只要空间维度大于 1tf-quant-finance 就默认使用 Douglas ADI 作为时间推进格式这是它在该库中最重要的工程地位。模块的公开符号由 douglas_adi.py 末尾的__all__ [douglas_adi_step, douglas_adi_scheme]限定另有一个从multidim_parabolic_equation_stepper复导出的multidim_parabolic_equation_step入口。模块 API 总览douglas_adi模块对外暴露三个函数对应 api 文档函数作用douglas_adi_step(theta0.5)高层入口构造一个单步推进器_step_fn内部委托给multidim_parabolic_equation_step并绑定 Douglas 格式。适合传给solve_forward/solve_backward的one_step_fn参数douglas_adi_scheme(theta)低层入口构造时间推进函数time marching scheme直接消费空间离散后的矩阵/向量参数完成一个 Douglas 步multidim_parabolic_equation_step(...)完整一步接收 PDE 系数函数与边界条件完成空间离散化 时间推进 边界恢复返回新坐标网格与新解三者是层层封装的关系douglas_adi_step→multidim_parabolic_equation_step→douglas_adi_scheme。下面依次深入。douglas_adi_step一步推进器工厂签名与默认值tf_quant_finance.math.pde.steppers.douglas_adi.douglas_adi_step( theta0.5 )theta是唯一参数必须是正数theta 0时退化为全显式格式此时隐式子步完全不起作用theta越大隐式子步对解的修正越强推荐值theta 0.5因为此时格式达到二阶时间精度除非 PDE 中存在混合二阶导数项见下文精度讨论。从 douglas_adi.py 源码看douglas_adi_step(theta)返回一个闭包_step_fn其签名与multidim_parabolic_equation_step一致多一个num_steps_performed参数但直接忽略内部调用return multidim_parabolic_equation_step( time, next_time, coord_grid, value_grid, boundary_conditions, douglas_adi_scheme(theta), # 绑定 Douglas 时间推进格式 second_order_coeff_fn, first_order_coeff_fn, zeroth_order_coeff_fn, inner_second_order_coeff_fn, inner_first_order_coeff_fn, dtypedtype, namename)返回的 callable 即 fd_solvers.py 中solve_forward/solve_backward所要求的one_step_fn形态给定当前时刻的解推进一个时间步返回新网格与新解。douglas_adi_schemeDouglas 时间推进格式的数学定义问题背景空间离散后的方程douglas_adi_scheme(theta)解决的是空间离散后的常微分方程组。如 douglas_adi.py 与 multidim_parabolic_equation_stepper.py 所述抛物线 PDE 经空间离散后写作du_inner/dt A(t) u_inner(t) A_mixed(t) u(t) b(t)其中u、u_inner、b是向量u_inner是裁剪掉 Robin 边界后的内部网格解内点解A是带状矩阵描述当前点及其邻点在空间离散中的贡献A_mixed是混合导数项的贡献矩阵b是非齐次项通常来自各边界上的边界条件。算子分解与关键假设在 Douglas 格式以及所有 ADI 类格式中矩阵A被分解为各空间方向上的贡献之和A sum_i A_iA_i是仅含对第i维偏导的项的贡献零阶shift项被均匀拆分到各个A_i上。同样非齐次项也按边界正交方向拆分b sum_i b_i其中b_i来自与第i维正交的边界上的边界条件。一步迭代公式对应文献 [2] 的 Eq. 3.1给定当前解向量U_{n-1} u(t1)、步长dt t2 - t1Douglas 步定义如下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}可见第 0 步Y_0是全显式子步用t1时刻的完整算子A(t1) A_mixed(t1)显式外推混合项在此时刻被显式处理后续 N 个子步Y_1 ... Y_{N-1}是交替方向的隐式子步每个子步只对某一维度的A_j隐式求解其余维度保持显式——这正是ADIAlternating Direction Implicit交替方向隐式名称的由来每个隐式子步最终只需解一个三对角线性方程组避免了直接解完整带状矩阵的高昂代价这是 ADI 方法相对一般隐式格式的核心优势见 multidim_parabolic_equation_stepper.py。theta 参数的约束与语义douglas_adi_scheme对theta有显式校验douglas_adi.pyif theta 0 or theta 1: raise ValueError(Theta should be in the interval [0, 1].)即theta必须落在[0, 1]区间。theta 0对应纯显式格式theta越大隐式修正越强。精度与混合项的重要警告文档明确给出两条关键结论务必在选用时注意theta 0.5时Douglas 格式对时间达到二阶精度这也是默认值 0.5 的由来douglas_adi_step如果 PDE 含有混合二阶导数项A_mixed ≠ 0Douglas 格式整体只有一阶精度。需要更高精度时应改用 Craig-Sneyd 等更高级的格式。这一限制对金融定价意义重大Heston-Hull-White 等随机波动率模型的价格 PDE 通常含有x-y交叉混合导数项直接套用 Douglas ADI 只能获得一阶时间收敛这正是文献 [2]Haentjens int Hout 关于 Heston-Hull-White PDE 的 ADI 有限差分格式研究强调的要点。参考文献[1] Douglas Jr., Jim (1962), Alternating direction methods for three space variables, Numerische Mathematik, 4 (1): 41-63 —— Douglas 格式的原始出处[2] Tinne Haentjens, Karek J. int Hout. ADI finite difference schemes for the Heston-Hull-White PDE.arXiv 编号 1111.4087—— Douglas 格式在金融 PDE 上的精度分析。源码实现一个 Douglas 步如何被计算在 douglas_adi.py 中_marching_scheme是douglas_adi_scheme(theta)返回的内部函数。其执行流程与上面的公式逐行对应获取两个时刻的离散参数分别调用equation_params_fn(t1)与equation_params_fn(t2)得到矩阵参数matrix_params_t1/t2与非齐次项inhomog_terms_t1/t2显式子步 Y_0先用append_boundaries_fn把内部网格恢复成带边界的完整网格value_grid_with_boundaries对所有维度对(i, j)若matrix_params_t1[i][j]混合项非空则调用_apply_mixed_term_explicitly把混合项显式作用于四个对角邻点并乘上dt对每个维度i取三对角参数(superdiag, diag, subdiag)用_apply_tridiag_matrix_explicitly计算A_i(t1) * U_{n-1} * dt同时缓存到explicit_contributions供后续修正子步复用累加各维非齐次项inhomog_term * dt提前返回分支若theta 0直接返回纯显式结果此时无需任何三对角求解交替方向隐式修正对每个维度i计算inhomog_term_delta b_i(t2) - b_i(t1)再调用_apply_correction其核心操作douglas_adi.py为rhs values - theta * explicit_contribution theta * inhomog_term_delta * (t2 - t1) # 构建三对角矩阵 subdiag -theta * subdiag * (t2 - t1) diag 1 - theta * diag * (t2 - t1) superdiag -theta * superdiag * (t2 - t1) result tf.linalg.tridiagonal_solve( (superdiag, diag, subdiag), rhs, diagonals_formatsequence, partial_pivotingFalse)这正是公式Y_i (1 - theta * A_i(t2) * dt)^(-1) * (Y_{i-1} - theta * A_i(t1) * U_{n-1} * dt dt*(b_i(t2)-b_i(t1)))的矩阵实现。两个值得注意的工程细节维度置换技巧_apply_tridiag_matrix_explicitly与_apply_correction都会调用_get_permutationdouglas_adi.py把当前活跃维度置换到张量的最后一维从而把沿该维度的三对角求解统一转化为对最后一维的三对角批量求解其余空间维度被当作 batch 维度处理求解完再置换回来。混合项的对角邻点处理_apply_mixed_term_explicitlydouglas_adi.py把混合项(pp, pm, mp, mm)与四个对角偏移切片相乘后求和。对于默认Dirichlet 零边界先用tf.pad补零避免对角切片越界——因为默认边界上的混合项恒为零越界值无关紧要只需把形状补齐。一步求解引擎multidim_parabolic_equation_stepmultidim_parabolic_equation_step是完整的一步求解器源码签名如下tf_quant_finance.math.pde.steppers.douglas_adi.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 )文档强调除非实现自定义时间推进格式否则通常无需直接调用此函数——用douglas_adi_step就够了。它求解的 PDE 一般形式为dV/dt Sum[a_ij d2(A_ij V)/dx_i dx_j, 1 i, j n] Sum[b_i d(B_i V)/dx_i, 1 i n] c V 0其中a_ij、A_ij、b_i、B_i、c均可依赖空间变量x与时间t求解器支持时间前向与后向两种方向对应solve_forward与solve_backward。参数说明实操要点time/next_time实标量Tensor分别表示步前、步后时刻coord_grid长度为n的 rank-1 实Tensor列表第i个张量形状为[d_i]或B [d_i]d_i为第i维网格点数B为 batch 形状value_grid当前时刻解值形状需能与B [d_1, ..., d_n]广播B允许同时演进多个函数各函数可拥有不同的边界条件、PDE 系数boundary_conditions长度为n的元组列表仅支持矩形边界。boundary_conditions[k][0]/[k][1]分别描述第k维的最小 / 最大边界。元素为None时表示该维度边界上二阶项为零默认边界非None时以alpha(t,x) V beta(t,x) V_n gamma(t,x)形式给出V_n为外法向导数callable 返回(alpha, beta, gamma)三元组其中alphaNone表示 Neumann 条件、betaNone表示 Dirichlet 条件整个对象设为None等价于所有边界施加零 Dirichlet 条件time_marching_scheme时间推进 callable即douglas_adi_scheme(theta)的返回值或任意自定义格式系数函数second_order_coeff_fn返回a_ij(t,r)可用列表的列表或 rank-2 Tensor只使用j i的上三角元素假定对称a_ji a_ijfirst_order_coeff_fn返回b_i(t,r)zeroth_order_coeff_fn返回c(t,r)inner_second_order_coeff_fn/inner_first_order_coeff_fn返回的是二阶导数内部系数A_ij(t,x)/B_i(t,x)。各系数均可为None表示对应项不存在或可广播到网格形状的Tensor。一步的执行流水线从 multidim_parabolic_equation_stepper.py 可以看到一步内部依次完成根据boundary_conditions判断每维上下边界是否为默认边界has_default_lower/upper_boundary并确定裁剪索引L265-L286构造equation_params_fn(t)把系数函数在给定时刻离散成三对角矩阵与非齐次项_construct_discretized_equation_params用_trim_boundaries裁剪出内部网格inner_grid_in移除 Robin 边界点调用time_marching_scheme(inner_grid_in, t1time, t2next_time, ...)得到内部解inner_grid_out用_append_boundaries把边界值按next_time时刻的边界条件恢复回完整网格返回(coord_grid, updated_value_grid)。离散参数的数据结构约定time_marching_scheme收到的equation_params_fn返回(A 矩阵参数, b 非齐次项)二元组其中A是长度为n_dims的嵌套列表A[i][0]是第i维方向上的三对角矩阵superdiagonal、diagonal、subdiagonal 三个 Tensor形状与value_grid相同superdiag[..., -1]与subdiag[..., 0]被忽略A[i][j]i j是四个对角邻点贡献的 Tensor 元组顺序为(k1,l1)、(k1,l-1)、(k-1,l1)、(k-1,l-1)。以 2D 网格value_grid.shape (b, ny, nx)为例非零元素布局为a_mm a_y- a_mp a_x- a_0 a_x a_pm a_y a_ppequation_params_fn应返回([[ (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])其中a_0x a_0y a_0对角项只需出现一次第二次以None占位。这一约定在测试中也有直接体现见下文。测试验证以简化 NumPy 实现交叉校验tf_quant_finance/math/pde/steppers/douglas_adi_scheme_test.py 用逐行手写的 NumPy 简化实现与 TensorFlow 版 Douglas 步做交叉验证误差阈值 0.01是理解格式正确性的最佳参考。测试覆盖2D 情形test_douglas_step_2d4x4网格同时含dx、dy三对角项与混合项dxytheta 0.3。简化版_simplified_douglas_step_2d依次完成u0 u (dx_contrib dy_contrib dxy_contrib)*dt (bxby)*dt显式子步→ 沿 y 方向三对角求解u1 (1 - theta*dt*A_y)^(-1)(u0 - theta*dt*A_y*u)→ 沿 x 方向三对角求解u2 ...。测试用_spread_mixed_term(term)把单个混合系数dxy扩展为(term, -term, -term, term)四元组与公式中u_{pp} - u_{pm} - u_{mp} u_{mm}的四点差分结构完全一致3D 情形test_douglas_step_3d4x4x5网格含三组三对角项与三个混合项dxy、dyz、dxz且同时验证了默认边界has_default_lower_boundary[True, False, False]、has_default_upper_boundary[False, True, True]批处理情形test_douglas_step_with_batching4x4x5网格中把首维作为 batch验证 batch 维度上的逐条独立演进与向量化实现结果一致。这些测试同时说明equation_params_fn是纯用户自定义结构——矩阵参数、非齐次项全部由调用方给出Douglas 格式只负责按公式推进。测试中append_boundaries_fn用tf.pad实现与multidim_parabolic_equation_stepper内部的_append_boundaries职责一致。端到端使用在多维求解器中的接入方式将 Douglas ADI 接入完整 PDE 求解的典型方式有两种方式一默认路径推荐直接调用 solve_forward 或solve_backward不传one_step_fn。n_dims 1时求解器自动选用douglas_adi_step(theta0.5)边界条件不传时自动施加全边界零 Dirichlet 条件fd_solvers.py。方式二显式控制自行构造推进器并传入from tf_quant_finance.math.pde import fd_solvers from tf_quant_finance.math.pde.steppers.douglas_adi import douglas_adi_step result fd_solvers.solve_forward( start_time0.0, end_time1.0, coord_grid[x_grid, y_grid], # 二维空间网格 values_gridinitial_values, # B [nx, ny] 形状 num_steps100, one_step_fndouglas_adi_step(theta0.5), boundary_conditionsmy_bc, # 每维 (下界, 上界) 的 callable second_order_coeff_fna_ij_fn, first_order_coeff_fnb_i_fn, zeroth_order_coeff_fnc_fn, dtypetf.float64)需要自定义时间推进格式时才需要直接用douglas_adi_scheme(theta)或multidim_parabolic_equation_step。使用建议与注意事项小结何时选用多空间维度的抛物线 PDE扩散-对流-反应方程、Black-Scholes 类多因子定价方程默认即可获得高效的三对角求解路径无需手动指定theta 取值默认0.5在无混合项时达到二阶精度增大theta增强隐式修正与稳定性但超出[0, 1]会直接抛ValueError混合项陷阱PDE 含混合二阶导数如 Heston 模型时 Douglas 格式只有一阶精度追求二阶应升级到 Craig-Sneyd 等格式见 douglas_adi.py 的说明边界条件类型支持 DirichletbetaNone、NeumannalphaNone、Robin两者均非空及默认零 Dirichlet只有矩形边界受支持时间方向同一格式可用于前向solve_forward与后向solve_backward即终值问题期权定价常用。如需进一步了解整个 PDE 求解框架可继续阅读 math/pde/README.md 及配套的 pde_solvers.pdf 详细指南其他推进格式可对照 steppers 文档 中的crank_nicolson、implicit、extrapolation等模块按需选用。赞分享金融科技科学计算【免费下载链接】tf-quant-financeHigh-performance TensorFlow library for quantitative finance.项目地址https://gitcode.com/gh_mirrors/tf/tf-quant-finance点击查看免费下载相关推荐tf-quant-finance 中的 Douglas ADI 时间推进方案多维抛物 PDE 有限差分求解的原理、源码与用法tf quant finance 中的 Douglas ADI 时间推进方案多维抛物 PDE 有限差分求解的原理、源码与用法 本文以 tf_quant_fin金融科技科学计算NewsBlur Android 3.5 并行网络请求重写从串行阻塞到毫秒级阅读体验的演进实录NewsBlur Android 3.5 并行网络请求重写从串行阻塞到毫秒级阅读体验的演进实录 导读 本篇技术指南以 NewsBlur Android 3.5金融科技科学计算InternVL3-78B-AWQ 源码精读chat 与 batch_chat 核心流程逐行拆解InternVL3 78B AWQ 源码精读chat 与 batch_chat 核心流程逐行拆解 这是一篇面向新手与普通用户的多模态大模型源码入门指南。 In人工智能大模型多模态模型量化计算机视觉上一篇Agent OS GitHub CLI 扩展实战用 gh agent-os 命令为 AI 智能体启用内核级治理下一篇AionUi ACP 单聊会话管理F-SESSION实战指南从会话创建到生命周期守护的完整实现解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考