R - 存储 zoo/data 框架(股票投资组合)以使用迭代进行后续分析的最佳方式?

R - best way to store zoo/data frame (stock portfolios) for subsequent analysis using iteration?

我的脚本从 5 只股票中生成 10 个 3 只股票的投资组合,并将它们组合在一个列表中。我想最终分析每个投资组合(累积 returns、方差等),我相当确定该列表不是可行的方法。

我知道如何在没有迭代的情况下生成单独的数据帧和 运行 分析,但这会很麻烦,但我不知道如何使用迭代来构造它。我考虑过创建一个空数据框,但不确定如何构建它。任何 suggestions/nudges 都表示赞赏。

library(quantmod)

startDate = '2016-03-10'
endDate = '2017-03-10'

# Download 1-yr data 
stocks <- suppressWarnings(getSymbols(c("CIG", 
    "SO", "CNP", "NRG", "AES"),from=startDate, to=endDate))

# combine adjusted close data
prices <- merge.zoo(CIG[,6], SO[,6], CNP[,6], NRG[,6], AES[,6])

# Calculate Monthly returns
mo_end_pxs <- prices[endpoints(prices,on='months'),] # get monthly endpoints
monthly_ret <- ROC(mo_end_pxs,type='discrete') # calculate monthly returns
monthly_ret <- monthly_ret[!is.na(monthly_ret)] # remove NA from first month
colnames(monthly_ret) <- c("CIG", "SO", "CNP", "NRG", "AES")

# generate all possible portfolios 
poss_ports <- combn(stocks,3)
portfolios <- list() 
for (i in 1:ncol(poss_ports)){
    portfolios[[i]] <- monthly_ret[,poss_ports[,i]]
    }

我完全会把它作为一个列表。

您可以简单地访问它: portfolios[1]

    [[1]]
                   CIG            SO          CNP
2016-04-29 -0.13274370 -0.0315097796  0.025334600
2016-05-31 -0.20021441 -0.0020678714  0.062807886
2016-06-30  0.48322121  0.0847492493  0.065246332
2016-07-29  0.25339362 -0.0024240452 -0.003333349
2016-08-31 -0.03610090 -0.0302915203 -0.049819374
2016-09-30 -0.02996270 -0.0005845002  0.033822879
2016-10-31  0.16602306  0.0052631794 -0.018510575
2016-11-30 -0.25496674 -0.0814869561  0.058405282
2016-12-30  0.05517647  0.0506193682  0.032690654
2017-01-31  0.24561404  0.0048790762  0.063717516
2017-02-28  0.16197183  0.0401680053  0.052930938
2017-03-07  0.12121212 -0.0082644235  0.024890190

或者在后面添加具体的查询字段进行查询:

   portfolios[[1]][as.Date("2016-05-31")]

                  CIG           SO        CNP
2016-05-31 -0.2002144 -0.002067871 0.06280789

或者您可以稍后将每个分解成一个数据框进行比较:

    y<-as.data.frame(portfolios[3])
str(y)
'data.frame':   12 obs. of  3 variables:
 $ CIG: num  -0.1327 -0.2002 0.4832 0.2534 -0.0361 ...
 $ SO : num  -0.03151 -0.00207 0.08475 -0.00242 -0.03029 ...
 $ AES: num  -0.04501 -0.00627 0.12534 -0.00154 -0.02267 ...

如果你把它留在那个列表中,你可以让它用 for 循环遍历列表并稍后保存到数据帧,或者直接访问列的总和,或者比较每个列的日期列表元素。 除非您有特定的未来需求,否则这似乎是一种无需大量开销即可维护数据的合理方法。