如何优化带mu、b双参数的R函数使输出向量取得最大值
R语言CPPI参数优化方案
1 先修复原函数的运行错误
你提供的CPPIopt函数中Tt.T、Ft、Ct等变量未提前初始化,直接运行会报错。同时优化算法需要输入单值的优化目标,这里默认你需要最大化1000次模拟最终财富的均值,若你需要最大化其他指标(如中位数、95%分位数等),可自行替换目标计算逻辑。
先运行你给出的模拟矩阵生成代码,保证S.m在全局环境可用:
sim=1000 subp=12 set.seed(1) eps.m <- matrix(rnorm(sim*subp), sim, subp, byrow=TRUE) mü5=0.0003934473 sigma5=0.07147787 r.m<-mü5-sigma5^2/2 + sigma5*eps.m S.m <- matrix(0,sim,subp+1) S.m[,1] <- 1000 for (j in 2:13) S.m[,j]<-S.m[,j-1]*exp(r.m[,j-1])
编写优化用的目标包装函数,因为R内置优化函数默认做最小化,所以我们返回目标值的负数,将最大化问题转为最小化问题:
opt_target <- function(params) { mu <- params[1] b <- params[2] # 初始化所有内部变量 FT <- 650000 W0 <- 1000000 T0 <- 1 m <- 12 rf <- log(1.01) SIM <- matrix(0, nrow(S.m), m+1) SIM[,1] <- W0 Tt.T <- numeric(m+1) Tt.T[1] <- T0 Ft <- numeric(m+1) Ct <- numeric(m+1) Xr.t <- numeric(m+1) Xf.t <- numeric(m+1) for(i in 2:(m+1)) { Wt <- SIM[,i-1] Tt.T[i] <- Tt.T[i-1] - (T0/m) Ft[i] <- FT * exp((-rf)*Tt.T[i]) Ct[i] <- max(mean(Wt) - Ft[i], 0) Xr.t[i] <- min(mu * Ct[i], b * mean(Wt)) Xf.t[i] <- W0 - Xr.t[i] SIM[,i] <- (Xr.t[i] * S.m[,i])/S.m[,i-1] + Xf.t[i] * exp(rf/m) } final_return <- SIM[,13] # 返回负的均值,转为最小化问题 return(-mean(final_return)) }
备注:原函数对1000条模拟路径统一计算仓位的逻辑不符合常规CPPI逐路径计算的规则,若你需要逐路径独立计算,可将
Ct、Xr.t等变量改为矩阵,调整为向量化运算即可,优化逻辑无需修改。
2 带约束的参数优化
CPPI参数有明确业务约束:
- 风险乘数mu:取值范围为1~10(可根据你的策略规则调整)
- 仓位上限b:取值范围为0~1(若允许杠杆可提高上限)
使用R内置的optim函数的L-BFGS-B方法做带边界约束的优化:
# 设置初始值和参数上下界 init_params <- c(mu = 3, b = 0.5) lower_bounds <- c(1, 0) upper_bounds <- c(10, 1) # 运行优化 opt_result <- optim( par = init_params, fn = opt_target, method = "L-BFGS-B", lower = lower_bounds, upper = upper_bounds ) # 输出最优结果 cat("最优mu值:", round(opt_result$par[1], 4), "\n") cat("最优b值:", round(opt_result$par[2], 4), "\n") cat("最优参数下平均最终财富:", round(-opt_result$value, 2), "\n")
3 可选:网格搜索验证避免局部最优
如果担心优化陷入局部最优,可先做粗粒度网格搜索确定参数范围,再做精细化优化:
# 生成参数网格 mu_grid <- seq(1, 10, by = 1) b_grid <- seq(0, 1, by = 0.1) grid_df <- expand.grid(mu = mu_grid, b = b_grid) grid_df$mean_return <- NA # 遍历网格计算结果 for (i in 1:nrow(grid_df)) { grid_df$mean_return[i] <- -opt_target(c(grid_df$mu[i], grid_df$b[i])) } # 输出网格内最优结果 best_grid <- grid_df[which.max(grid_df$mean_return), ] print(best_grid)
内容的提问来源于stack exchange,提问作者ES1099
相关产品推荐
相关产品推荐

