tf-quant-finance 欧拉采样(Euler-Maruyama)路径生成完全指南:tff.models.euler_sampling.sample 深入解析
金融科技科学计算【免费下载链接】tf-quant-financeHigh-performance TensorFlow library for quantitative finance.项目地址https://gitcode.com/gh_mirrors/tf/tf-quant-finance点击查看免费下载导读本文围绕 tf-quant-finance 中随机过程路径采样的核心入口tf_quant_finance.models.euler_sampling.sample源码见 euler_sampling.py展开系统讲解如何使用 Euler-Maruyama 数值格式对一般 Ito 过程进行 Monte Carlo 路径模拟。你将掌握该函数的完整参数语义时间网格、随机数类型、批处理、自定义噪声、梯度观测等、一维/多维与批处理场景下的真实调用方式以及底层tf.while_loop/custom for_loop双引擎实现原理与测试验证方法可直接用于金融模型如利率、波动率、权益资产模型的路径模拟与定价实践。一、方法背景从 Ito 过程到 Euler-Maruyama 格式sample面向如下形式的 Ito 过程维数为dimdX a(t, X_t) dt b(t, X_t) dW_t X(t0) x0其中a漂移与b波动率均为用户提供的函数。Euler 方法即 Euler-Maruyama 方法将时间离散化后生成路径序列{X_n}X_{n1} X_n a(t_n, X_n) dt b(t_n, X_n) (N(0, t_{n1}) - N(0, t_n)) X_0 x0其中dt t_{n1} - t_nN为标准正态分布采样。X_{n1} - X_n的增量由两部分构成确定性漂移项a(t_n, X_n) dt与扩散项b(t_n, X_n) * dW而dW正是正态增量N(0, t_{n1}) - N(0, t_n)其标准差为sqrt(dt)。从源码实现看euler_sampling.py算法先计算相邻时刻的步长dt times[1:] - times[:-1]及其平方根sqrt_dt然后在每步中按dw normal_draws[i] * sqrt_dt[i]缩放噪声、按dt_inc dt[i] * drift_fn(...)累加漂移最终得到next_state current_state dt_inc dw_inc_euler_step。适用性与局限Euler-Maruyama 是强收敛阶为 0.5 的显式格式实现简单、对任意漂移/波动率函数通用若需要更高的强收敛精度可考虑仓库中基于 Milstein 格式的 milstein_sampling.sample。二、函数签名与完整参数说明sample的完整签名与文档及源码一致tf_quant_finance.models.euler_sampling.sample( dim, drift_fn, volatility_fn, times, time_stepNone, num_time_stepsNone, num_samples1, initial_stateNone, random_typeNone, seedNone, swap_memoryTrue, skip0, precompute_normal_drawsTrue, times_gridNone, normal_drawsNone, watch_paramsNone, validate_argsFalse, toleranceNone, dtypeNone, nameNone )2.1 核心必选参数参数类型与形状说明dimPythonint≥ 1Ito 过程的维数drift_fn可调用对象计算漂移a(t, X)接收两个同dtype的实值Tensor参数第一个是标量时间t第二个是过程值X形状batch_shape [num_samples, dim]返回同dtype、形状batch_shape [num_samples, dim]的实值Tensorvolatility_fn可调用对象计算波动率b(t, X)接收与drift_fn相同的两个实值Tensor参数返回形状batch_shape [num_samples, dim, dim]的实值Tensor最后一个维度为dim × dim用于与噪声向量做矩阵-向量乘法timesRank 1 实值Tensor需要输出路径点的时刻要求严格递增的正实值序列注意drift_fn/volatility_fn返回形状的差异漂移是向量[..., num_samples, dim]波动率是矩阵[..., num_samples, dim, dim]。在 euler_sampling.py 中扩散项通过tf.linalg.matvec(volatility_fn(...), dw)实现因此多维过程可以包含交叉相关性非对角波动率项。2.2 时间离散化参数三选一参数默认值说明time_stepNone标量实值TensorEuler 网格上的最大时间步长提供它时不要同时提供num_time_stepsnum_time_stepsNone标量整型Tensor算法执行的总步数网格最大步长被限制为times[-1] / (num_time_steps - times.shape[0])times_gridNoneRank 1 实值Tensor直接指定时间离散化网格若times不在网格上则取网格上的最近点一旦提供num_time_steps与time_step均被忽略三者必须且只能提供其一times_grid除外否则抛出ValueError——这一约束在源码中有明确校验euler_sampling.py既未提供num_time_steps也未提供time_step时报错两者同时提供时同样报错。2.3 采样规模与初始状态参数默认值说明num_samples1正标量int需要生成的路径条数initial_stateNone形状可与batch_shape [num_samples, dim]广播的Tensor即过程初值x0。batch_shape表示独立随机过程的批量维度由initial_state推断而来因此对一批随机过程采样时initial_state的形状至少应为batch_shape [1, 1]。None表示零初值源码中映射为tf.zeros(dim)见 euler_sampling.py2.4 随机数类型与随机种子参数默认值说明random_typeNoneRandomType枚举值见第三节None映射为标准伪随机数seedNone随机数生成器种子。仅当random_type为STATELESS、PSEUDO、HALTON_RANDOMIZED、PSEUDO_ANTITHETIC、STATELESS_ANTITHETIC时有效。其中PSEUDO、PSEUDO_ANTITHETIC、HALTON_RANDOMIZED要求 Pythonint种子STATELESS与STATELESS_ANTITHETIC必须提供形状为[2]的整型Tensor种子skip00 维int32Tensor仅对SOBOL、HALTON、HALTON_RANDOMIZED生效跳过序列前若干个初始点其余类型忽略2.5 性能与噪声控制参数默认值说明swap_memoryTruePythonbool是否对该算子启用 GPU-CPU 内存交换语义同tf.while_loop的同名标志由于路径传播使用tf.while_loop在计算该算子梯度时尤为有用precompute_normal_drawsTruePythonbool是否预先计算噪声增量N(0, t_{n1}) - N(0, t_n)。对HALTON与SOBOL类型总是预计算。预计算会使计算图消耗更多内存但性能收益可能显著2.6 自定义噪声与梯度观测参数默认值说明normal_drawsNone形状可与batch_shape [num_samples, num_time_points, dim]广播、dtype与times相同的Tensor表示用于计算增量N(0, t_{n1}) - N(0, t_n)的正态随机数。提供时num_samples参数被忽略改用normal_draws的第一个维度默认各批次的噪声相互独立watch_paramsNone与initial_state同dtype的 0 维Tensor列表。提供后指定对哪些Tensor求导并切换至更高效的求导算法此时函数仅对这些Tensor与initial_state可微对其它Tensor的梯度被置零2.7 参数校验参数默认值说明validate_argsFalsePythonbool。为True时执行多项检查①times以指定tolerance为最小间隔严格递增② 若提供normal_draws检查normal_draws.shape[1]等于num_time_steps参数给定值或由time_step计算值。为False时非法维度可能静默产出错误结果toleranceNone非负标量Tensor时间网格上可分辨时刻的最小容差比tolerance更近的时刻被视为相同。None时单精度dtype映射为1e-6双精度映射为1e-10见 euler_sampling.py2.8 类型与命名参数默认值说明dtypeNonetf.Dtype。指定时强制输入/输出Tensor使用该dtypeNone时使用times隐含的dtypenameNonePythonstr该算子的名称None映射为euler_sample三、随机数类型 RandomType从伪随机到拟随机random_type对应枚举tff.math.random.RandomType定义于 multivariate_normal.py共七种取值枚举值含义是否需要 seedPSEUDO标准 TensorFlow 随机生成器可选PythonintSTATELESSTensorFlow 无状态随机生成器固定 seed 时跨会话/跨图可复现必须形状[2]的TensorHALTON标准 Halton 低差异序列不使用 seed可用skip跳过初始点HALTON_RANDOMIZED随机化 Halton 序列可选PythonintSOBOL标准 Sobol 低差异序列不使用 seed可用skip跳过初始点PSEUDO_ANTITHETIC伪随机 对偶变量antithetic variates可选PythonintSTATELESS_ANTITHETIC无状态随机 对偶变量必须形状[2]的Tensor低差异序列HALTON/SOBOL的使用约束这类序列必须在算法开始前一次性生成完整的高维正态随机数因此源码中当random_type为SOBOL、HALTON、HALTON_RANDOMIZED、STATELESS、STATELESS_ANTITHETIC或precompute_normal_drawsTrue时会通过 utils.generate_mc_normal_draws 预先抽取全部噪声而PSEUDO/PSEUDO_ANTITHETIC可在每步_euler_step内即时采样euler_sampling.py。generate_mc_normal_draws会把num_time_steps * dim维的联合正态采样 reshape 为[steps_num] batch_shape [num_samples, dim]供逐步消费。四、端到端示例二维 Ito 过程路径采样以下示例完整继承自官方文档采样如下二维过程dX_1 mu_1 * sqrt(t) dt s11 * dW_1 s12 * dW_2 dX_2 mu_2 * sqrt(t) dt s21 * dW_1 s22 * dW_2import tensorflow as tf import tf_quant_finance as tff import numpy as np mu np.array([0.2, 0.7]) s np.array([[0.3, 0.1], [0.1, 0.3]]) num_samples 10000 dim 2 dtype tf.float64 # 定义漂移与波动率函数 def drift_fn(t, x): return mu * tf.sqrt(t) * tf.ones([num_samples, dim], dtypedtype) def vol_fn(t, x): return s * tf.ones([num_samples, dim, dim], dtypedtype) # 设置初始位置 x0 np.array([0.1, -1.1]) # 在指定时刻上使用 Euler 格式采样 num_samples 条路径 times [0.1, 1.0, 2.0] paths tff.models.euler_sampling.sample( dimdim, drift_fndrift_fn, volatility_fnvol_fn, timestimes, num_samplesnum_samples, initial_statex0, time_step0.01, seed42, dtypedtype) # 预期结果paths.shape [10000, 3, 2]这里需要注意两点实操细节drift_fn/vol_fn返回形状必须与调用方约定一致。若想写出与num_samples解耦的通用函数可以像 euler_sampling_test.py 那样基于tf.ones_like(x)构造返回张量例如drift mu * tf.sqrt(t) * tf.ones_like(x, dtypet.dtype)。times可以直接传入 Python 列表内部会经tf.convert_to_tensor转换且dtype未指定时以其推导。五、时间网格的三种构造方式与取舍sample内部通过 utils.prepare_grid 构造完整时间网格time_step模式在[0, times[-1])上以time_step生成均匀网格与times合并、排序并做容差去重最后用searchsorted定位各times在网格中的索引_grid_from_time_step。num_time_steps模式构造网格点数不少于max(len(times), num_time_steps)确保times全部落在网格上_grid_from_num_times。times_grid模式直接使用给定网格并通过比较前后邻近点的距离把times映射到最近网格点utils.py。无论哪种模式最终都会生成布尔掩码keep_mask用于标记哪些迭代步的输出需要写入结果TensorArray——这正是只在times对应时刻记录路径、中间网格点只做递推的实现机制euler_sampling.py。实践建议time_step最直观固定最大步长num_time_steps适合控制总计算量times_grid适合复用既有的交易日历/利率曲线时间网格。网格越细Euler 格式离散误差越小但计算量与内存尤其precompute_normal_drawsTrue时越大。六、返回值、批处理与形状语义sample返回一个实值Tensor形状为batch_shape_process [num_samples, k, n]其中k为times的大小输出时刻数n为过程维数dim。具体包括无批处理[num_samples, k, dim]如上述示例的[10000, 3, 2]有批处理initial_state形状为batch_shape [1, 1]时返回batch_shape [num_samples, k, dim]。测试用例中批量初值x0 [[[0.1]], [[0.1]]]对应的返回形状为[2, num_samples, 6, 1]见 euler_sampling_test.py单时刻当times只有 1 个点时结果仍会扩展出长度为 1 的维度轴euler_sampling.py。若times[0] 0则返回的首个时刻点即初始状态x0测试用例验证了包含初始状态与不包含初始状态两次采样的路径一致性见 euler_sampling_test.py。七、高级特性自定义噪声、对偶变量与可控求导7.1 外部提供噪声normal_draws当需要复现特定随机数、或实现方差缩减如对偶变量时可预先构造normal_draws。测试用例中的典型做法euler_sampling_test.pynum_samples 1 normal_draws tf.random.stateless_normal( shape[5000, 30, 1], seed[1, 42], dtypedtype) # 拼上相反数即得到对偶变量样本 normal_draws tf.concat([normal_draws, -normal_draws], axis0) paths euler_sampling.sample( dim1, drift_fndrift_fn, volatility_fnvol_fn, times[0.1, 0.2, 0.3], num_samplesnum_samples, normal_drawsnormal_draws, random_typerandom.RandomType.STATELESS_ANTITHETIC, seed[1, 42]) # 实际有效样本数由 normal_draws 第一维决定此处 10000提供normal_draws时num_samples参数被忽略若normal_draws.shape[-1] ! dim会抛出ValueError若其时间步数与num_time_steps不匹配则抛出tf.errors.InvalidArgumentError源码校验见 euler_sampling.py。7.2 对偶变量提升均值估计精度采用对偶变量后同一均值估计的误差显著下降。测试 test_antithetic_sample_paths_mean_2d 显示对偶变量场景用rtol/atol 5e-3的容差即可通过均值一致性检验而普通PSEUDO场景容差为1e-2。7.3 基于watch_params的可微采样当需要在采样路径上对模型参数如漂移系数、波动率矩阵元素求梯度典型应用蒙特卡洛定价中的梯度回传、校准问题时把待求导参数放入watch_params列表。源码据此选择两条路径euler_sampling.pywatch_params is None使用tf.while_loop_while_loop传播路径适合普通采样提供watch_params改用 custom_loops.for_loop 驱动_for_loop该实现能沿watch_params高效求导同时把对其它张量的梯度置零。测试 test_halton_sample_paths_2d 即把mu, a, b三个系数传入watch_params在tf.function内完成带参采样。八、错误处理与参数校验策略sample可能抛出的异常与文档一致且均在源码中实现ValueError(a) 未提供times_grid时num_time_steps与time_step同时缺失或同时给出(b) 提供了normal_draws但dim与其最后一维不匹配tf.errors.InvalidArgumentError提供了normal_draws但其时间步数与num_time_steps不匹配或validate_argsTrue时times/times_grid不严格递增。测试 test_wrong_times 与 test_sample_shape_mismatch 分别验证了上述两类运行时错误。建议在开发阶段开启validate_argsTrue以尽早发现times排序或维度问题在生产性能敏感场景可关闭以省去校验开销。九、实现原理与测试验证9.1 双引擎实现while_loop 与 custom for_loop_sample完成网格与噪声准备后按watch_params分流euler_sampling.py_while_loop使用tf.TensorArray记录各时刻输出tf.while_loop的终止条件为i steps_num 且 written_count num_requested_times最后stack并transpose到batch_shape [num_samples, k, dim]euler_sampling.py_for_loop基于custom_loops.for_loop仅返回最终状态并按time_indices聚合输出避免 TensorArray 开销利于反向传播euler_sampling.py。两者的单步逻辑共用_euler_step先取该步噪声预计算或即时random.mv_normal_sample再叠加漂移增量与扩散增量。9.2 测试如何验证正确性euler_sampling_test.py 提供了可复现的验证范式共覆盖 Wiener 过程、一维/二维 Ito 过程、批处理、对偶变量、低差异序列、dtype、异常路径等场景统计矩校验对dX dW的 Wiener 过程断言路径均值为零、协方差矩阵等于min(t_i, t_j)test_sample_paths_wiener解析期望校验对dX mu * sqrt(t) dt (a * t b) dW期望E[X(t)] x0 2/3 * mu * t^1.5测试以rtol1e-2断言test_sample_paths_1d形状与 dtype 校验断言paths.shape与paths.dtypetest_sample_paths_dtypes。十、与其它采样方法的定位sample位于 models/euler_sampling.py是tff.models子包中通用 Ito 过程路径生成的基础设施。仓库还提供models/milstein_sampling/sample.mdMilstein 格式强收敛阶更高models/GenericItoProcess.md 等模型类在sample之上封装了 GBM、Heston、CIR、Hull-White 等具体金融过程。理解euler_sampling.sample的参数与实现是使用上述高级模型、乃至自行扩展自定义随机过程如局部波动率模型的前提。十一、快速上手要点总结必选四件套dim、drift_fn、volatility_fn、times时间网格在time_step/num_time_steps/times_grid中三选一。形状记忆口诀漂移输出[..., num_samples, dim]波动率输出[..., num_samples, dim, dim]返回值batch_shape [num_samples, k, dim]。随机类型选型追求可复现用STATELESSseed[s1, s2]方差缩减用PSEUDO_ANTITHETIC/STATELESS_ANTITHETIC低维高精度可用SOBOL/HALTON并配skip跳过序列头部。需要求导时把待求导参数放入watch_params函数将自动切换高效求导路径。调试期开启validate_argsTrue可捕获times非递增、normal_draws维度不匹配等问题。赞分享金融科技科学计算【免费下载链接】tf-quant-financeHigh-performance TensorFlow library for quantitative finance.项目地址https://gitcode.com/gh_mirrors/tf/tf-quant-finance点击查看免费下载相关推荐Vue Big Screen Plugin大数据可视化大屏解决方案Vue Big Screen Plugin大数据可视化大屏解决方案 项目概述 核心价值 快速构建企业级数据可视化大屏支持动态适配与灵活扩展 Vue金融科技科学计算tf-quant-finance 批量欧式期权定价完全指南深入 black_scholes.option_pricetf quant finance 批量欧式期权定价完全指南深入 black_scholes.option_price 导读 tf_quant_finance.金融科技科学计算douyin-downloader批量下载抖音作品的 Python 工具douyin downloader批量下载抖音作品的 Python 工具 douyin downloader 是一个基于 Python 的抖音下载工具支持单金融科技科学计算上一篇探索美味的编程艺术 AnimatedPieView —— 你的甜蜜统计助手下一篇Brazilian Utils 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考