算法实战:用 least_square_mc 为美式期权定价)
金融科技科学计算【免费下载链接】tf-quant-financeHigh-performance TensorFlow library for quantitative finance.项目地址https://gitcode.com/gh_mirrors/tf/tf-quant-finance点击查看免费下载导读本文围绕 tf-quant-financeTFF中tf_quant_finance.experimental.lsm_algorithm.least_square_mc展开讲解如何用最小二乘蒙特卡洛Least-Squares Monte-Carlo, LSM算法为美式期权估值。你将掌握该 API 的完整签名与每个参数的含义学会配合make_basket_put_payoff与make_polynomial_basis完成一条从蒙特卡洛路径采样、期权行权判定到最终定价的完整链路并通过源码级剖析理解其向后迭代、回归拟合与现金流更新的底层实现。一、算法背景为什么美式期权要用 LSM美式期权与欧式期权最大的区别在于持有者可以在到期日之前的任意行权时刻提前行权因此其价值包含了提前行权权的时间价值。直接对每条样本路径枚举所有行权策略在计算上不可行而经典的 Longstaff-Schwartz2001方法给出了一个蒙特卡洛框架下的近似解——最小二乘回归在每一个可行权时刻用继续持有期权的期望价值continuation value对当前标的资产价格或其函数展开做回归拟合出条件期望函数当立即行权收益大于该回归估计的继续持有价值时该路径在该时刻选择行权。least_square_mc正是这一思想的 TensorFlow 实现它基于用户提供的标的资产样本路径与收益函数为每条路径寻找最优行权点最终把最优行权假设下的平均收益折现到当前时刻作为期权价格。其算法依据为 Longstaff, F.A. and Schwartz, E.S., 2001 年的论文《Valuing American options by simulation: a simple least-squares approach》(The Review of Financial Studies, 14(1), pp.113-147)。二、API 签名与参数详解least_square_mc的完整签名如下见 lsm.py 与 API 文档 least_square_mc.mdtf_quant_finance.experimental.lsm_algorithm.least_square_mc( sample_paths, exercise_times, payoff_fn, basis_fn, discount_factorsNone, dtypeNone, nameNone )参数类型与形状含义sample_pathsTensor形状[num_samples, num_times, dim]底层 Itô 过程在num_times个时间点上的样本路径维度为dimexercise_timesint32Tensor形状[num_exercise_times]可行权时刻对应的 tick 索引必须是[0, ..., num_times-1]的子集payoff_fnCallable输入[num_samples, num_times, dim]的路径张量与一个表示当前时刻的整数标量输出[num_samples, payoff_dim]的收益张量payoff_dim允许在同一标的上并行定价多个期权basis_fnCallable输入[num_samples, dim]输出[basis_size, num_samples]的设计矩阵用于回归期权继续持有价值discount_factorsTensor形状[num_exercise_times]或[num_samples, num_exercise_times]第k个元素表示时刻 tickk的折现因子默认None时映射为与samples同 dtype、形状[num_exercise_times]的全 1 张量dtype可选tf.float32或tf.float64输入输出张量的 dtype默认None时由 TensorFlow 自动推断namePythonstr添加到本函数创建 Ops 名称前缀默认映射为least_square_mc返回值一个与samples同 dtype、形状[num_samples, payoff_dim]的Tensor即每条样本路径对应各收益维度各期权的现值估计实际期权价格通常取其均值。参数要点exercise_times不必覆盖全部num_times可以只挑出部分时间点作为可行权日LSM 只在列出的这些时刻做行权决策payoff_fn返回的payoff_dim维可以一次定价多个期权例如多个不同行权价它们共享同一组路径与基函数discount_factors若为None算法相当于零利率环境若传入的是形状[num_exercise_times]的向量源码中会自动expand_dims展开以匹配批处理维度见 lsm.py。三、配套工具函数收益函数与多项式基least_square_mc的payoff_fn与basis_fn均需用户提供但模块内已内置两个开箱即用的实现二者一起构成了官方文档示例的默认组合。3.1 make_basket_put_payoff篮子看跌收益tf_quant_finance.experimental.lsm_algorithm.make_basket_put_payoff( strike_price, dtypeNone, nameNone )strike_price与samplesdtype 一致的Tensor形状[num_samples, num_strikes]在 v1 版 LSM 中使用返回一个可调用对象输入形状[num_samples, num_exercise_times, dim]的路径与当前时刻标量输出形状[num_samples, num_strikes]的收益。从实现看payoff.py该收益函数在给定time_index处切片出当期的标的资产价格对最后一维求均值得到篮子均价average然后计算relu(strike_price - average)——即标准的看跌收益max(K - S, 0)同时天然屏蔽了虚值out-of-the-money路径。其 docstring 提到支持[num_samples, num_times, dim]与[batch_size, num_samples, num_times, dim]两种输入后者可用于批量定价。API 文档见 make_basket_put_payoff.md。3.2 make_polynomial_basis回归用的多项式基tf_quant_finance.experimental.lsm_algorithm.make_polynomial_basis(degree)degreeint32标量期望的多项式次数若小于 0 会触发断言Degree of polynomial basis can not be negative.返回一个可调用对象输入[num_samples, dim]的样本先做中心化Y X - mean(X, axis0)再输出形状[degree * dim, num_samples]的基展开。以degree 2, dim 2为例基函数为1, X, X**2, Y, Y**2, X*Y, X**2*Y, X*Y**2X、Y为两个空间轴。官方文档给出的验证示例见 make_polynomial_basis.mdbasis make_polynomial_basis(2) x [1.0, 2.0, 3.0, 4.0] x tf.expand_dims(x, -1) basis(x) # Expected result: [[ 1.0, 1.0, 1.0, 1.0], [-1.5, -0.5, 0.5, 1.5]]实现上lsm.py通过tf.meshgrid构造各维度的幂指数组合grid再对中心化样本做samples_centered**grid的逐元素幂乘并沿最后一维reduce_prod最终转置为[basis_size, num_samples]的设计矩阵。四、完整示例Black-Scholes 模型下的美式看跌期权定价官方 API 文档least_square_mc.md给出了一个端到端示例以下将其完整复现并逐行注释import tensorflow as tf import numpy as np import tf_quant_finance as tff # 标的为 Black-Scholes 过程 # dS_t / S_t rate dt sigma**2 dW_t, S_0 1.0 # 其中 rate 0.1波动率 sigma 1.0 rate 0.1 # 为 log(S_t) 定义漂移与波动率函数 def drift_fn(_, x): return rate - tf.ones_like(x) / 2. def vol_fn(_, x): return tf.expand_dims(tf.ones_like(x), -1) # 用 Euler 格式将 100000 条路径向前传播 1 年 times np.linspace(0., 1, num50) num_samples 100000 log_paths tf.function(tff.models.euler_sampling.sample)( dim1, drift_fndrift_fn, volatility_fnvol_fn, random_typetff.math.random.RandomType.PSEUDO_ANTITHETIC, timestimes, num_samplesnum_samples, seed42, time_step0.01) # 取指数得到 S_t 的样本 paths tf.math.exp(log_paths) # 行权价为 1.1、到期日为 1 的美式看跌期权 # 假设采用实际天数惯例且无交割调整 strike [1.1] exercise_times tf.range(times.shape[-1]) # 每个时间点都可行权 discount_factors tf.exp(-rate * times) # 连续复利折现因子 payoff_fn make_basket_put_payoff(strike) basis_fn make_polynomial_basis(10) lsm_price(paths, exercise_times, payoff_fn, basis_fn, discount_factorsdiscount_factors) # Expected value: [0.397] # 同一参数下欧式看跌期权价格BS 闭式解作为对照 tff.black_scholes.option_price(volatilities[1], strikesstrikes, expiries[1], spots[1.], discount_factorsdiscount_factors[-1], is_call_optionsFalse, dtypetf.float64) # Expected value: [0.379]关键点解读路径采样tff.models.euler_sampling.sample实现见 euler_sampling.py以 Euler-Maruyama 格式生成 Itô 过程路径RandomType.PSEUDO_ANTITHETIC表示使用带对偶变量antithetic variates的伪随机序列其定义位于 multivariate_normal.py可有效降低方差行权网格exercise_times tf.range(times.shape[-1])表示在 50 个时间点全部可行权对应几乎连续的美式行权近似折现discount_factors tf.exp(-rate * times)将每个时刻的收益折回t 0结果对照美式看跌期权约0.397高于欧式看跌期权约0.379两者之差约0.018即为提前行权权的价值——这也是该示例最有说服力的验证点美式价格必然不低于欧式价格。注意示例注释中函数名为lsm_price实为least_square_mc的示意写法同时原文中strikes变量在闭式解调用处应为strike。以当前仓库 lsm.py 的 docstring 为准。五、源码级原理LSM 的核心计算链路理解了用法之后我们从 lsm.py 出发拆解算法的实际执行流程。整体采用从到期日向前的向后迭代初始化现金流在最后一个可行权时刻tick exercise_times[num_times - 1]计算每条路径的exercise_value payoff_fn(sample_paths, tick)构造形状[num_samples, payoff_dim, num_exercise]的cashflow张量除最后一列外均为 0见 lsm.py主循环以tf.while_loop驱动_lsm_loop_body从后往前扫描每个可行权时刻循环条件lsm_loop_cond为exercise_index 0见 lsm.py并用LsmLoopVars这个 namedtuple 保存exercise_index与cashflow继续持有价值continuation_value_fn把cashflow中当前行权时刻右侧的所有现金流按折现因子折回当前时刻lsm.py回归拟合期望继续持有价值expected_exercise_fn是 LSM 的精髓lsm.py用mask exercise_value 0仅保留实值in-the-money路径参与回归虚值路径对应的设计矩阵行被清零这些样本不改变回归系数但能保证设计矩阵结构稳定对最优线性无偏估计求解正规方程XX · beta Xy其中lhs XX、rhs Xy使用tf.linalg.pinv伪逆求解回归系数以保证数值稳定性最后用tf.maximum(..., 0.0)截断负的估计值因为继续持有价值不可能为负更新最优行权决策_updated_cashflow对每条路径比较exercise_value与expected_continuation若立即行权更优则把该时刻的收益写入cashflow同时屏蔽掉该路径后续时刻的旧现金流lsm.py最终定价循环结束后把最终cashflow折现回t0得到每条路径的现值present_values再沿样本维求均值tf.math.reduce_mean(present_values, axis0)输出[payoff_dim]的价格。这套流程说明了一个重要事实回归只在实值路径上进行这正是 Longstaff-Schwartz 原始论文的核心技巧也是payoff_fn返回relu形式的看跌收益虚值自动为 0能与之无缝配合的原因。六、V2 版本与高级能力least_square_mc_v2除了本文主角least_square_mc同一模块还提供面向 XLA 编译的least_square_mc_v2见 lsm_v2.py 与 API 文档 least_square_mc_v2.md。其签名如下tf_quant_finance.experimental.lsm_algorithm.least_square_mc_v2( sample_paths, exercise_times, payoff_fn, basis_fn, discount_factorsNone, num_calibration_samplesNone, dtypeNone, nameNone )v2 与 v1 的关键差异源码 docstring 明确列出静态形状_continuation_value_fn、_expected_exercise_fn与_updated_cashflow内部的所有张量均为静态形状避免了动态形状张量对 XLA 编译的阻碍代价是内存消耗增加、部分场景下比非 XLA 版本略慢基函数签名不同v2 的make_polynomial_basis生成的 callable 额外接收一个time_index参数同样是为了避免动态形状批量与校准sample_paths支持[batch_size, num_samples, num_times, dim]四维输入可一次性并行定价多个期权新增num_calibration_samples参数指定仅用前num_calibration_samples条路径做回归校准而只用最后num_samples - num_calibration_samples条路径参与定价从而降低用同一批样本既回归又定价带来的过拟合偏差默认None表示全部样本既用于回归也用于定价v2 的收益函数输出形状为[num_samples, batch_size]返回值形状为[num_samples, batch_size]批量维度对应多个并行期权。七、测试验证与数值结果仓库自带的测试用例为算法的正确性提供了可复现的数值锚点非常适合作为入门验证基准Longstaff-Schwartz 论文第 1 节的标准例子lsm_test.py8 条手算样本路径、利率[0.06, 0.06, 0.06]、折现因子np.exp(-np.cumsum(interest_rates))仅在第 3 时刻行权等价于欧式时least_square_mc定价结果约0.0564见test_european_option_put在时刻 1、2、3 均可行使时美式看跌价格约0.1144见test_american_option_put明显高于欧式价格体现了提前行权价值2 维完全相关篮子期权的价格应与 1 维期权一致且输出形状为[3]对应 3 个行权价见test_american_basket_option_putv2 版本lsm_v2_test.py在float32/float64下复现同样的欧式0.0564与美式0.1144基准并额外验证了num_calibration_samples4时价格约为0.174226内部函数单测test_continuation_value验证折现累加的正确性预期1.625test_expected_continuation验证回归仅在正收益路径上进行这一核心行为lsm_test.py。你可以用论文原例的 8 条路径快速跑通整个 API再逐步替换为 Euler 采样的大规模路径观察价格向论文/闭式解收敛。八、实践建议与注意事项基函数次数与样本量make_polynomial_basis的输出规模为degree * dimv2 为(degree1)**dim维度高、次数大时设计矩阵迅速膨胀官方示例在 1 维场景使用degree10测试中则注明10 是测试通过所需的最少基函数个数实际使用时需权衡拟合精度与计算量回归数值稳定性源码特意用伪逆tf.linalg.pinv求解正规方程但若基函数高度共线仍建议控制次数并保证样本量充足折现因子对齐discount_factors的第k个元素必须与exercise_times的第k个 tick 对齐且应包含t0时刻的因子源码在折现因子前concat了一个 1见 lsm.py精度选择金融定价建议使用tf.float64以获得更稳定的回归结果dtypeNone时由 TensorFlow 推断XLA 场景若需要tf.function(jit_compileTrue)或 TPU 执行优先选用least_square_mc_v2并注意 v2 基函数需传入time_index模块归属本算法位于experimental命名空间见init.pyAPI 尚未完全冻结升级依赖时留意接口变动模块导出的四个符号为least_square_mc、least_square_mc_v2、make_basket_put_payoff、make_polynomial_basis、make_polynomial_basis_v2。九、总结least_square_mc是 tf-quant-finance 中为数不多把论文级算法完整工程化的组件它用tf.while_loop实现向后迭代、用伪逆回归拟合继续持有价值、用现金流矩阵精确记录每条路径的最优行权决策并且通过payoff_dim与批量维度天然支持多期权并行。结合本文给出的完整示例、参数表、源码链路与测试基准你可以直接复现美式看跌期权定价并在此基础上扩展自定义收益函数、多维篮子期权或批量定价场景。赞分享金融科技科学计算【免费下载链接】tf-quant-financeHigh-performance TensorFlow library for quantitative finance.项目地址https://gitcode.com/gh_mirrors/tf/tf-quant-finance点击查看免费下载相关推荐tf-quant-finance 中最小二乘蒙特卡洛LSM算法实战向量化定价美式期权tf quant finance 中最小二乘蒙特卡洛LSM算法实战向量化定价美式期权 本文围绕 tf_quant_finance.models.longs金融科技科学计算tf-quant-finance 中 Longstaff-Schwartz 最小二乘蒙特卡洛LSM美式期权定价least_square_mc 的用法、源码原理与测试验证tf quant finance 中 Longstaff Schwartz 最小二乘蒙特卡洛LSM美式期权定价least_square_mc 的用法、源码金融科技科学计算终极指南如何使用 TensorFlow 量化金融库实现最小二乘蒙特卡洛算法终极指南如何使用 TensorFlow 量化金融库实现最小二乘蒙特卡洛算法 最小二乘蒙特卡洛算法LSM是金融工程中用于美式期权定价的核心技术之一。tf q金融科技科学计算创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考