在R中编写函数筛选满足i+j=5的列以运行optimize.portfolio
解决方法:生成满足i+j=5的列索引范围并应用于portfolio优化
核心逻辑梳理
首先明确有效索引对:因为i和j是正整数列索引,且i:j需要有效(i≤j),满足i+j=5的组合只有(1,4)和(2,3)。需要先检查ret_Nifty的列数是否支持这些组合(比如列数至少为3才能用(2,3),至少为4才能用(1,4))。
完整实现函数
下面的函数会自动筛选有效列范围,直接调用optimize.portfolio并返回所有有效组合的优化结果:
run_portfolio_optimization <- function(ret_Nifty, portfolio_spec) { n_cols <- ncol(ret_Nifty) # 生成候选索引对,过滤掉超出列数的无效组合 valid_pairs <- Filter( f = function(pair) pair[2] <= n_cols, x = list(c(1,4), c(2,3)) ) if (length(valid_pairs) == 0) { stop("ret_Nifty列数不足,无满足i+j=5的有效列范围") } # 遍历有效组合执行优化 results <- lapply(valid_pairs, function(pair) { selected_returns <- ret_Nifty[, pair[1]:pair[2]] optimize.portfolio(R = selected_returns, portfolio_spec = portfolio_spec) }) # 给结果命名,便于区分对应列范围 names(results) <- sapply(valid_pairs, function(pair) sprintf("cols_%d_to_%d", pair[1], pair[2])) return(results) }
仅获取列范围的简化版本
如果只需要提取满足条件的列数据集,不需要直接执行优化,可以用这个简化函数:
get_valid_col_ranges <- function(ret_Nifty) { n_cols <- ncol(ret_Nifty) valid_pairs <- Filter( f = function(pair) pair[2] <= n_cols, x = list(c(1,4), c(2,3)) ) if (length(valid_pairs) == 0) { warning("无满足条件的有效列范围") return(NULL) } col_datasets <- lapply(valid_pairs, function(pair) ret_Nifty[, pair[1]:pair[2]]) names(col_datasets) <- sapply(valid_pairs, function(pair) sprintf("cols_%d_to_%d", pair[1], pair[2])) return(col_datasets) }
使用示例
假设你已经定义好了portfolio_spec,调用方式如下:
# 执行优化并获取结果 optim_results <- run_portfolio_optimization(ret_Nifty, your_portfolio_spec) # 查看第一个组合的优化结果 print(optim_results$cols_1_to_4)
内容的提问来源于stack exchange,提问作者user20486146
相关产品推荐
相关产品推荐

