[我的目标是通过在portfolioanalytics内部利用参数add.constraint()
优化type="group"
中的投资组合。特别是,根据市值将组创建为区分变量。
library(tidyverse)
library(timetk)
library(quantmod)
library(stringr)
library(purrr)
library(PortfolioAnalytics)
[一切始于从csv导入的两个数据帧,在其列中分别包含2010年至2015年的股票价格和市值的时间序列。名称是发行人的公司名称。在这一点上,我通过xts和dplyr操纵了包含市值的数据框,以得到以下结果:
structure(list(date = structure(c(14638, 14666, 14699, 14729,
14760, 14790), class = "Date"), asset = c("X3M.cap", "X3M.cap",
"X3M.cap", "X3M.cap", "X3M.cap", "X3M.cap"), mktcap = c(56983.51,
57045.4, 59591.06, 63227.7, 56553.39, 56330.44), ptf = c(TRUE,
TRUE, TRUE, TRUE, TRUE, TRUE)), class = c("grouped_df", "tbl_df",
"tbl", "data.frame"), row.names = c(NA, -6L), groups = structure(list(
date = structure(c(14638, 14666, 14699, 14729, 14760, 14790
), class = "Date"), .rows = list(1L, 2L, 3L, 4L, 5L, 6L)), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))
如您所见,tibble包含4列,其中包含日期,资产(股票名称),mktcap(区分性变量)和Ptf
。在这种情况下,Ptf
包含逻辑值,表示该观察值的变量TRUE
在特定日期内落在所有mktcap
的mktcap
的第一五分位数之内时的asset
。当它落在最后一个五分位数中时为FALSE
,否则为NA
。
[从那里,我使用以下代码为每个date
提取值为asset
和false的TRUE
:
long_components_size <- data_SIZE %>% filter(ptf==TRUE) %>%
select(asset,date) %>% group_by(date)
long_comps_size <- group_split(long_components_size, keep=FALSE)
names(long_comps_size) <- unique(long_components_size$date) #long
ptf==FALSE
复制相同的代码。通过这种方式,我获得了两个列表,每个列表包含每个日期的小标题,其中asset
s为chr
。
list(`2010-01-29` = structure(list(asset = c("X3M.cap", "ABBOTT.LABORATORIES.cap",
"ACCENTURE.CLASS.A.cap", "ALPHABET.A.cap", "ALTRIA.GROUP.cap",
"AMAZON.COM.cap", "AMERICAN.EXPRESS.cap", "AMGEN.cap", "ANTHEM.cap",
"APACHE.cap", "APPLE.cap", "AT.T.cap", "BANK.OF.AMERICA.cap",
...
"UNION.PACIFIC.cap", "UNITED.PARCEL.SER..B..cap", "UNITED.TECHNOLOGIES.cap",
"UNITEDHEALTH.GROUP.cap", "US.BANCORP.cap", "VERIZON.COMMUNICATIONS.cap",
"VISA..A..cap", "WALGREENS.BOOTS.ALLIANCE.cap", "WALMART.cap",
"WALT.DISNEY.cap", "WELLS.FARGO...CO.cap")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -91L)))
我不确定,但是可能这些列表包含列表本身,然后存储这些chr
。每个列表中的小标题/列表的名称与stock
属于一个或另一个类别的日期一致。
我的目标是创建一个投资组合,并因此通过将参数optimize.portfolio
传递到add.constraint
中来从type="groups"
中获得合适的权重,该参数允许选择每个组的权重。
我以以下方式尝试过:
stocks <- read.csv("prova_price.csv",sep=";")
stocks_xts <- as.xts(data[,-1], order.by=as.Date(data$Index,
format="%d/%m/%Y"))
port_size <- portfolio.spec(assets=stocks_xts)
port_size <- add.constraint(port_size,type="dollar neutral")
port_size <- add.constraint(port_size, type="group",
groups=list(groupA=long_comps_size$`2010-01-29`$asset,
groupB=short_comps_size$`2010-01-29`$asset),
group_min=c(+1,-1),
group_max=c(+1,-1))
port_size <- add.objective(port_size, type="risk",name="sd")
optimize.portfolio(R=stocks_xts, portfolio=port_size,
optimize_method="ROI", trace=FALSE)
其中stocks_xts
的列中包含价格的时间序列,并且其data_SIZE$asset
的字符与商品名相同。
> str(stocks_xts)
An ‘xts’ object on 2010-01-01/2015-12-31 containing:
Data: num [1:1565, 1:505] 58527 58775 58407 59235 59277 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:505] "X3M...MARKET.VALUE" "ABBOTT.LABORATORIES...MARKET.VALUE" "ABBVIE...MARKET.VALUE" "ABIOMED...MARKET.VALUE" ...
Indexed by objects of class: [Date] TZ: UTC
xts Attributes:
NULL
我试图将两组的权重设置为先前获得的列表的参数,并为它们分配权重-1和+1,因为我想获得dollar-neutral
投资组合。
我认为问题在于列表long_comps_size
和short_comps_size
的结构,它们不应该只是字符,而应该更多。我的最终目标是通过对在FALSE
中产生data_SIZE
的股票进行负加权,并对TRUE
-的那些股票进行正加权,从而得出0重量-每天。
我看到您在使用ROI方法之前尚未使用Rglpk和quadprog库。尝试先安装然后导入这些软件包。