如何仅调整指定参数最小化两个期权定价函数的价格平方差和
期权定价模型参数校准实现方案(平方差和最小化)
需求说明
仅调整theta、alpha1、alpha2、beta1、beta2五个参数,最小化以下两个期权定价函数输出价格的平方差和:
Function1 <- function(phi,SpotPrice,Strike, TimetoMaturity, Volat, Liborrate, DividendYield)
Function2 <- function(Strike, Liborrate, theta, alpha1, alpha2, beta1, beta2, TimetoMaturity)
实现步骤
1. 预定义固定参数
首先将不需要优化的公共参数赋值为实际业务取值,固定后传入损失函数:
- 固定参数列表:
phi、SpotPrice、Strike、TimetoMaturity、Volat、Liborrate、DividendYield
若需同时校准多组不同合约(不同行权价/到期日),可将
Strike、TimetoMaturity等可变参数传入向量格式,损失函数计算时自动批量算平方差和即可。
2. 定义平方差损失函数
# 损失函数输入为待优化的5个参数组成的向量,输出为两个模型价格的平方差/平方差和 loss_calculator <- function(opt_params) { # 拆分待优化参数 theta <- opt_params[1] alpha1 <- opt_params[2] alpha2 <- opt_params[3] beta1 <- opt_params[4] beta2 <- opt_params[5] # 计算两个模型的价格输出 price_model1 <- Function1( phi = phi_fixed, SpotPrice = SpotPrice_fixed, Strike = Strike_fixed, TimetoMaturity = TimetoMaturity_fixed, Volat = Volat_fixed, Liborrate = Liborrate_fixed, DividendYield = DividendYield_fixed ) price_model2 <- Function2( Strike = Strike_fixed, Liborrate = Liborrate_fixed, theta = theta, alpha1 = alpha1, alpha2 = alpha2, beta1 = beta1, beta2 = beta2, TimetoMaturity = TimetoMaturity_fixed ) # 单合约返回平方差,多合约返回所有样本的平方差加总 return(sum((price_model1 - price_model2)^2)) }
3. 执行参数优化
使用R内置的优化函数求解最小平方差对应的参数:
# 设定待优化参数的初始值,需符合参数实际合理区间,避免陷入局部最优 init_params <- c(theta = 0.05, alpha1 = 0.15, alpha2 = 0.2, beta1 = 0.1, beta2 = 0.3) # 执行优化,L-BFGS-B方法支持参数上下限约束 optim_result <- optim( par = init_params, fn = loss_calculator, method = "L-BFGS-B", # 可根据参数业务逻辑调整取值上下限,如下设所有参数为非负 lower = c(0, 0, 0, 0, 0), upper = c(10, 5, 5, 2, 2) )
4. 提取优化结果
- 最优参数:
optim_result$par,按顺序对应theta、alpha1、alpha2、beta1、beta2 - 最小平方差和:
optim_result$value
注意事项
- 初始值设置对优化结果影响较大,可尝试多组不同初始值验证结果稳定性
- 若参数存在明确的业务约束(如beta系数小于1、theta在某个固定区间内),需在优化的上下限参数中明确配置,避免输出无实际意义的参数结果
- 多合约校准场景下需确保两个函数输入的可变参数(行权价、到期日等)长度一致,避免计算时报错
内容的提问来源于stack exchange,提问作者Nazario Maria Cruciano
相关产品推荐
相关产品推荐

