You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于最大去相关性的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:43:36