使用组约束优化投资组合

问题描述 投票:0回答:1

[我的目标是通过在内部利用参数add.constraint()优化type="group"中的投资组合。特别是,根据市值将组创建为区分变量。

library(tidyverse)
library(timetk)
library(quantmod)
library(stringr)
library(purrr)
library(PortfolioAnalytics)

[一切始于从csv导入的两个数据帧,在其列中分别包含2010年至2015年的股票价格和市值的时间序列。名称是发行人的公司名称。在这一点上,我通过操纵了包含市值的数据框,以得到以下结果:

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))

如您所见,包含4列,其中包含日期,资产(股票名称),mktcap(区分性变量)和Ptf。在这种情况下,Ptf包含逻辑值,表示该观察值的变量TRUE在特定日期内落在所有mktcapmktcap的第一五分位数之内时的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_sizeshort_comps_size的结构,它们不应该只是字符,而应该更多。我的最终目标是通过对在FALSE中产生data_SIZE的股票进行负加权,并对TRUE-的那些股票进行正加权,从而得出0重量-每天。

r quantitative-finance portfolio computational-finance r-portfolioanalytics
1个回答
0
投票

我看到您在使用ROI方法之前尚未使用Rglpk和quadprog库。尝试先安装然后导入这些软件包。

© www.soinside.com 2019 - 2024. All rights reserved.