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
循环遍历列表并稍后保存到数据帧,或者直接访问列的总和,或者比较每个列的日期列表元素。
除非您有特定的未来需求,否则这似乎是一种无需大量开销即可维护数据的合理方法。
我的脚本从 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
循环遍历列表并稍后保存到数据帧,或者直接访问列的总和,或者比较每个列的日期列表元素。
除非您有特定的未来需求,否则这似乎是一种无需大量开销即可维护数据的合理方法。