如何用R的最小化方法求解使目标公式最小的a、b、c值
用R实现目标公式的最小化求解
我们需要找到参数a、b、c,使得以下目标公式的取值最小:
目标公式:$\sum_{i=1}^n \left[ V_i - \left( a + bS_i + c\times\max(S_i - K, 0) \right) \right]^2$
其中:
- $V_i$对应数据框
data中的V_discounted_to_year2列- $S_i$对应数据框
data中的S_2列- $K$为已定义的常数(值为1.10)
步骤1:确认预处理后的数据
先运行你提供的代码完成数据准备:
library(tidyverse) r = 0.06 K = 1.10 t = 3 stock_prices = data.frame( S_0 = c(1, 1, 1, 1, 1, 1, 1, 1), S_1 = c(1.09, 1.16, 1.22, 0.93, 1.11, 0.76, 0.92, 0.88), S_2 = c(1.08, 1.26, 1.07, 0.97, 1.56, 0.77, 0.84, 1.22), S_3 = c(1.34, 1.54, 1.03, 0.92, 1.52, 0.90, 1.01, 1.34) ) payoffs = data.frame( # P代表看跌期权的收益 P_0 = c(0, 0, 0, 0, 0, 0, 0, 0), P_1 = c(0, 0, 0, 0, 0, 0, 0, 0), P_2 = c(0, 0, 0, 0, 0, 0, 0, 0), P_3 = c(0, 0, 0.07, 0.18, 0, 0.20, 0.09, 0) ) data = stock_prices %>% bind_cols(payoffs) %>% mutate( monniness = ifelse(S_2 < K, "in_the_money", "out_the_money"), V_discounted_to_year2 = ifelse(monniness == "in_the_money", P_3* exp(-r * (t-2)), 0) )
步骤2:定义目标函数
编写一个函数,输入参数向量params(包含a、b、c),输出目标公式的平方和:
# 定义目标函数:计算平方和 objective_function <- function(params) { a <- params[1] b <- params[2] c <- params[3] # 计算每个样本的预测值:a + b*S_2 + c*max(S_2 - K, 0) predicted <- a + b * data$S_2 + c * pmax(data$S_2 - K, 0) # 计算平方和并返回 sum((data$V_discounted_to_year2 - predicted)^2) }
步骤3:使用R的优化函数求解
用基础包的optim()函数进行最小化求解,初始参数可以设为c(0, 0, 0),方法默认用Nelder-Mead(适合无约束优化):
# 初始参数猜测 initial_guess <- c(0, 0, 0) # 运行优化 optim_result <- optim(initial_guess, objective_function) # 查看结果 optim_result
结果解释
运行后optim_result会包含以下关键信息:
par:最优的a、b、c参数值value:目标公式的最小平方和convergence:收敛状态(0代表收敛成功)
你可以用以下代码提取最优参数:
# 提取最优a、b、c best_a <- optim_result$par[1] best_b <- optim_result$par[2] best_c <- optim_result$par[3] cat("最优参数:a =", round(best_a, 4), ",b =", round(best_b, 4), ",c =", round(best_c, 4), "\n") cat("最小平方和:", round(optim_result$value, 6), "\n")
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

