我在R中使用了随机森林来获得股票属于某一类的概率。有了这些概率,我想构建包含数据集第一天概率最高的5只股票的投资组合,然后每10天用当时排名最高的股票重新平衡一次。投资组合的权重应该相等。
下面是一些我认为可以代表我的数据的示例数据。
Date <- rep(seq(as.Date("2009/01/01"), by = "day", length.out = 100), 10)
Name <- c(rep("Stock A", 100), rep("Stock B",100), rep("Stock C", 100), rep("Stock D", 100), rep("Stock E",100), rep("Stock F",100), rep("Stock G",100), rep("Stock H",100), rep("Stock I", 100), rep("Stock J", 100))
Return <- rnorm(1000)
Prob <- runif(1000)
DF <- data.frame(Date, Name, Return, Prob)
DF <- DF %>% arrange(Date, desc(Prob))
> head(DF)
Date Name Return Prob
1 2009-01-01 Stock F 0.52259644 0.8084277
2 2009-01-01 Stock A 0.57720376 0.7617348
3 2009-01-01 Stock B -0.09864981 0.7256358
4 2009-01-01 Stock E -1.26136381 0.6200346
5 2009-01-01 Stock G -1.37360527 0.5680765
6 2009-01-01 Stock D -0.04794049 0.4793370
因此,投资组合将在前10天包含股票F、A、B、E和G,然后用百分比最高的股票重新平衡。
我不太擅长编码和R,并尝试过使用PortfolioAnalytics、PerformanceAnalytics和tidyquant来寻找如何做到这一点的选项,但无法找到一个我了解如何做到的解决方案,因为我对使用任何形式的优化都不感兴趣。我需要一个简单的投资组合,由我计算的百分比决定,再平衡。
如果有人对我如何做到这一点有任何建议,我将不胜感激。如果这是发布这个问题的错误论坛,我很抱歉,并将在其他地方发布。
下面是如何使用PMwR
包进行此操作的示例。(披露:我是软件包的维护者。(
让我从一个示例数据集开始:Kenneth French网站上的12个行业系列。请注意,我只使用这些数据来运行函数。
library("NMOF")
library("PMwR")
P <- French(dest.dir = "~/Downloads/French",
"12_Industry_Portfolios_daily_CSV.zip",
price.series = TRUE, na.rm = TRUE)
timestamp <- as.Date(row.names(P))
价格被存储在数据帧CCD_ 2中。每列包含一项资产的价格;每一行都有一个日期的价格。
你面临的主要问题是如何组织你的信号。我将创建随机信号,并将它们组织成逻辑矩阵。每行保存信号对于一个再平衡日期:如果要包括资产,则为TRUE;如果不包括,则为FALSE。
reb.dates <- timestamp[seq(from = 5, to = length(timestamp), by = 10)]
best.stocks <- t(replicate(length(reb.dates),
sample(c(rep(TRUE, 5), rep(FALSE, 7)))))
colnames(best.stocks) <- colnames(P)
head(data.frame(reb.dates, best.stocks))
## reb.dates NoDur Durbl Manuf Enrgy .... Hlth Money Other
## 1 1926-07-07 TRUE FALSE TRUE TRUE .... FALSE FALSE FALSE
## 2 1926-07-19 FALSE FALSE TRUE TRUE .... FALSE TRUE FALSE
## 3 1926-07-30 FALSE TRUE TRUE FALSE .... FALSE FALSE FALSE
## 4 1926-08-11 TRUE TRUE FALSE FALSE .... FALSE FALSE TRUE
## 5 1926-08-23 FALSE FALSE TRUE FALSE .... TRUE TRUE FALSE
## 6 1926-09-03 FALSE FALSE TRUE TRUE .... TRUE FALSE FALSE
一旦你有了价格和这样的信号矩阵,实际的回溯测试不需要太多代码。
关键成分是signal
函数。它在每个再平衡日期(即每10天(被调用,并查找并返回目标投资组合。
signal <- function(best.stocks, reb.dates) {
w <- numeric(ncol(Close()))
w[best.stocks[Timestamp(0) == reb.dates]] <- 1
w <- w/sum(w)
w
}
bt <- btest(prices = list(as.matrix(P)),
timestamp = timestamp,
signal = signal,
do.signal = reb.dates,
initial.cash = 100,
convert.weights = TRUE,
best.stocks = best.stocks,
reb.dates = reb.dates)
## see a performance summary
summary(as.NAVseries(bt))
## see the trades
journal(bt)
有关使用该软件包的更多详细信息,请参阅本教程。