基于最大去相关性的R语言多资产组合构建及风险收益分析问询
解决方案
步骤1:筛选非零权重行业
从已计算的行业权重中提取权重不为0的行业列表:
# 提取非零权重的行业 nonzero_sectors <- names(weights_max_decorrel[weights_max_decorrel > 0]) print(nonzero_sectors) # 输出示例:"Durable" "Manufacturing" "Energy" "NonDurable" "Shops"
步骤2:准备公司收益与行业映射数据
假设你有两个核心数据集:
company_returns:行是日期,列是各公司的日度/月度收益company_sector_map:包含company_id(公司代码/名称)和sector(所属行业)两列
先过滤出非零权重行业对应的公司及收益:
# 筛选目标行业的公司 target_companies <- company_sector_map[company_sector_map$sector %in% nonzero_sectors, ] # 提取这些公司的收益数据 target_returns <- company_returns[, colnames(company_returns) %in% target_companies$company_id]
步骤3:构建不同规模组合并计算夏普比率
以4只、8只、12只资产的组合为例,按行业权重比例抽样维持配置结构,再计算夏普比率:
# 定义无风险利率(示例用年化2%,转换为日度利率,假设年交易日252天) risk_free_rate <- 0.02/252 # 设定要测试的组合规模 portfolio_sizes <- c(4, 8, 12) # 存储结果的列表 sharp_results <- list() for (size in portfolio_sizes) { # 按行业权重分配各行业抽样数量(四舍五入取整) sector_sample_counts <- round(weights_max_decorrel[nonzero_sectors] * size) # 调整数量,确保总和等于目标规模(修正四舍五入误差) while(sum(sector_sample_counts) != size) { diff <- size - sum(sector_sample_counts) if (diff > 0) { max_sector <- names(which.max(sector_sample_counts)) sector_sample_counts[max_sector] <- sector_sample_counts[max_sector] + 1 } else { min_sector <- names(which.min(sector_sample_counts)) sector_sample_counts[min_sector] <- sector_sample_counts[min_sector] - 1 } } # 从各行业抽样对应数量的公司 sampled_companies <- lapply(names(sector_sample_counts), function(s) { comps_in_sector <- target_companies[target_companies$sector == s, ]$company_id sample(comps_in_sector, size = sector_sample_counts[s], replace = FALSE) }) %>% unlist() # 提取抽样公司的收益 sampled_returns <- target_returns[, sampled_companies] # 计算公司层面权重:行业权重平均分配给行业内抽样公司 company_weights <- unlist(lapply(names(sector_sample_counts), function(s) { rep(weights_max_decorrel[s]/sector_sample_counts[s], sector_sample_counts[s]) })) names(company_weights) <- sampled_companies # 计算组合日度收益 portfolio_returns <- rowSums(sampled_returns * company_weights) # 计算年化夏普比率 annualized_return <- mean(portfolio_returns) * 252 annualized_volatility <- sd(portfolio_returns) * sqrt(252) sharpe_ratio <- (annualized_return - 0.02) / annualized_volatility # 存储结果 sharp_results[[as.character(size)]] <- list( sampled_companies = sampled_companies, company_weights = company_weights, sharpe_ratio = round(sharpe_ratio, 4) ) # 打印当前规模的夏普比率 cat("组合规模:", size, "只 | 夏普比率:", round(sharpe_ratio, 4), "\n") } # 查看所有结果 print(sharp_results)
关键说明
- 抽样时按行业权重比例分配公司数量,保证组合的行业配置与max decorrelation权重一致,确保实验变量仅为公司数量
- 若要减少随机抽样误差,可在循环中嵌套多次抽样,取夏普比率的平均值作为最终结果
内容的提问来源于stack exchange,提问作者Moataz
相关产品推荐
相关产品推荐

