【问题标题】:Create stock portfolio based on probabilities with rebalancing in R基于 R 中重新平衡的概率创建股票投资组合
【发布时间】:2020-07-28 08:00:04
【问题描述】:

我在 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 执行此操作的选项,但我无法找到我了解如何执行此操作的解决方案,如我对使用任何形式的优化都不感兴趣。我需要一个由我计算的百分比确定的简单投资组合,并进行再平衡。

如果有人对我如何做到这一点有任何建议,我将不胜感激。如果这是发布此问题的错误论坛,我很抱歉并将其发布在其他地方。

【问题讨论】:

    标签: r finance stock portfolio r-portfolioanalytics


    【解决方案1】:

    这是一个如何使用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))
    

    价格存储在数据框P 中。每列包含一种资产的价格;每一行保存一个日期的价格。

    您的主要问题是如何组织您的信号。我将创建随机信号并将它们组织成一个逻辑矩阵。每行包含信号 对于一个再平衡日期:如果要包含资产,则为 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)
    

    有关使用该软件包的更多详细信息,请参见tutorial

    【讨论】:

      猜你喜欢
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 2019-06-02
      • 2014-02-03
      • 2018-07-11
      • 2021-06-15
      相关资源
      最近更新 更多