R语言如何将公式计算得到的多个投资组合向量存入列表
问题原因
代码运行不符合预期的核心问题出在列表存储步骤:
- 你使用
c()拼接空列表和每次计算得到的my_out时,c()函数会自动拆解所有嵌套结构,把传入的矩阵/向量拆成单个基础元素存入列表,不会把每次生成的完整投资组合作为一个独立列表项保存。 - 你提前计算好的
w_min、w_m都是带股票名列名的1行矩阵,每次算出的my_out也继承了矩阵结构,直接用c()合并时,5个股票的权重会被拆成5个独立的列表元素,所以调用my_vec[1]只能拿到第一个股票的权重值,拿不到完整组合。
正确实现方案
方法1:按索引给列表赋值(兼容性最好)
不要用c()循环拼接,提前初始化固定长度的列表,按索引给对应位置赋值即可,还可以直接给列表项绑定对应的s值作为名称,方便后续调用:
# 生成所有s的取值序列 s_seq <- seq(-2, 2, by = 0.1) # 预创建对应长度的空列表,比循环中动态拼接效率更高 my_vec <- vector("list", length(s_seq)) # 给每个列表项命名,对应s的取值 names(my_vec) <- paste0("s=", round(s_seq, 1)) for (i in seq_along(s_seq)) { current_s <- s_seq[i] port_w <- current_s * w_min + (1 - current_s) * w_m # 直接将完整权重矩阵赋值给对应列表位,不会拆解结构 my_vec[[i]] <- port_w }
完成后调用my_vec[[1]]或者my_vec[["s=-2"]],就能得到s=-2时完整的投资组合权重,和你之前循环打印的结果完全一致。
方法2:用lapply直接生成列表(更简洁的R原生写法)
不需要手动管理循环和空列表,用lapply遍历s序列即可,函数会自动把每次计算的结果整合为列表返回:
s_seq <- seq(-2, 2, by = 0.1) my_vec <- lapply(s_seq, function(current_s) { current_s * w_min + (1 - current_s) * w_m }) names(my_vec) <- paste0("s=", round(s_seq, 1))
运行结果和方法1完全一致。
调用注意
取列表中存储的完整权重对象时,要使用双中括号[[,单中括号[返回的是子列表,不是存储在列表里的权重矩阵本身。
内容的提问来源于stack exchange,提问作者kabin
相关产品推荐
相关产品推荐

