如何批量传入参数调用LSMonteCarlo包AmerPutLSM函数计算期权价格
批量调用AmerPutLSM计算美式看跌期权价格方案
你可以直接使用R的迭代映射函数批量传入数据框每行的参数,无需手动逐行赋值。以下是两种常用实现方法:
方法1:基础R原生mapply实现
# 加载依赖包 library(LSMonteCarlo) # 假设你的期权数据框命名为opt_data opt_prices <- mapply( FUN = function(Spot, sigma, Strike, r, dr, mT) { # 固定参数n、m直接写死在函数内,需要动态调整可改为参数传入 AmerPutLSM(Spot = Spot, sigma = sigma, n = 500, m = 100, Strike = Strike, r = r, dr = dr, mT = mT) }, # 逐行传入数据框的对应列参数 Spot = opt_data$UnderlyingPrice, sigma = opt_data$Volatility, Strike = opt_data$StrikePrice, r = opt_data$RfRate, dr = opt_data$DividendRate, mT = opt_data$Days2Exp ) # 提取计算结果的价格值,新增到原数据框 opt_data$put_price <- sapply(opt_prices, function(x) x@price)
方法2:tidyverse生态purrr::pmap实现
适合习惯用dplyr链式操作的场景:
library(tidyverse) library(LSMonteCarlo) opt_data <- opt_data %>% mutate( put_price = pmap( .l = list( Spot = UnderlyingPrice, sigma = Volatility, Strike = StrikePrice, r = RfRate, dr = DividendRate, mT = Days2Exp ), .f = function(Spot, sigma, Strike, r, dr, mT) { res <- AmerPutLSM(Spot = Spot, sigma = sigma, n = 500, m = 100, Strike = Strike, r = r, dr = dr, mT = mT) # 直接返回价格数值,不需要后续再解析S4对象 return(res@price) } ) ) # 需要把列表格式的put_price转为数值列的话,追加 %>% mutate(put_price = as.numeric(put_price))即可
小提示:如果n、m参数也需要按行自定义,直接把对应参数列添加到迭代列表中,替换掉写死的固定值即可。
内容的提问来源于stack exchange,提问作者LukeAJN
相关产品推荐
相关产品推荐

