金融经济学作业:R语言计算投资组合Beta遇Date对象运算错误
问题分析与解决方案
报错根源
报错Error in Ops.Date(left, right) : * not defined for "Date" objects的核心原因是:你用来计算组合收益的returns_data数据框中,前5列包含了日期(Date类型)列。当执行returns_data[, 1:5] * as.numeric(ponderaciones)时,Date类型无法与数值进行乘法运算,直接触发了这个错误。
修复步骤
- 调整数据列选择:先检查
returns_data的结构,确认日期列的位置,确保用来计算的5列都是股票收益率的数值列。比如如果日期列是第1列,就把代码里的returns_data[, 1:5]改成returns_data[, 2:6],或者直接指定收益率列的名称:returns_data[, c("股票1", "股票2", "股票3", "股票4", "股票5")]。 - 修正优化器参数:你在
optim里设置的control = list(fnscale = -1)是错误的——这个参数会把目标函数变成最大化逻辑,但你的需求是最小化beta的绝对误差,直接删掉这个参数即可。 - 清理冗余代码:
restricciones <- list(sum = 1)这个变量根本没被用到,而且L-BFGS-B方法不支持这种约束,你已经在目标函数里做了权重归一化,直接删掉该变量即可。
修正后的完整代码
# 定义正确的组合beta计算函数 calcular_beta_portafolio <- function(ponderaciones, returns_data) { # 假设日期列是第1列,取2-6列作为5家公司的收益率数据 portafolio_retorno <- rowSums(returns_data[, 2:6] * as.numeric(ponderaciones)) modelo_portafolio <- lm(portafolio_retorno ~ returns_data$GSPC) return(coef(modelo_portafolio)["returns_data$GSPC"]) } betas_deseados <- c(0.8, 1.0, 1.2) ponderaciones_resultados <- matrix(NA, nrow = length(betas_deseados), ncol = 5) for (i in 1:length(betas_deseados)) { objetivo <- function(ponderaciones) { ponderaciones <- ponderaciones / sum(ponderaciones) return(abs(calcular_beta_portafolio(ponderaciones, returns_data) - betas_deseados[i])) } resultado_optimizacion <- optim(rep(0.2, 5), objetivo, method = "L-BFGS-B", lower = rep(0, 5), upper = rep(1, 5)) ponderaciones_resultados[i, ] <- resultado_optimizacion$par / sum(resultado_optimizacion$par) } resultados <- data.frame(Beta_Deseado = betas_deseados, Ponderaciones = NA) for (i in 1:length(betas_deseados)) { resultados$Ponderaciones[i] <- paste(round(ponderaciones_resultados[i, ], 3), collapse = ", ") } print(resultados)
额外验证建议
可以提前检查数据列的类型,确保用于计算的列都是数值型:
# 查看前5列的数据类型 sapply(returns_data[, 1:5], class)
内容的提问来源于stack exchange,提问作者Ingrid Campos
相关产品推荐
相关产品推荐

