R

R-package PortfolioAnalytics 計算中的 optimize.portfolio.rebalancing 是什麼?

  • December 17, 2016

我最近開始使用 R-packagePortfolioAnalytics來執行一些投資組合優化。我正試圖了解該函式optimize.portfolio.rebalancing正在計算什麼。特別是,我想知道為什麼計算的權重(從第二個時期開始)與我直接呼叫時得到的權重不同optimize.portfolio

我的印象optimize.portfolio.rebalancing基本上是一個“包裝器optimize.portfolio”(來自手冊),所以我認為該函式只是optimize.portfolio在一段時間內重複呼叫 length rolling_window。但是,結果不應該與optimize.portfolio完全相同時期的手動呼叫產生的結果相同嗎?或者正在optimize.portfolio.rebalancing執行一些額外的計算?我錯過了什麼?

這是一個說明我的問題的最小範例:

data("edhec")
returns <- edhec[, 1:4]
funds <- colnames(returns)

portfolio <- portfolio.spec(assets = funds)
portfolio <- add.constraint(portfolio = portfolio, type = "full_investment")
portfolio <- add.constraint(portfolio = portfolio, type = "long_only")
portfolio <- add.objective(portfolio = portfolio, type = "risk", name = "ES")

portfolio.rebalanced <- optimize.portfolio.rebalancing(R = returns,
                                                      portfolio = portfolio,
                                                      optimize_method = "ROI",
                                                      rebalance_on = "quarters",
                                                      training_period = 12,
                                                      rolling_window = 12)

# check, if optimize.portfolio gives the same results: first period
portfolio.optimized <- optimize.portfolio(R = returns["::1997-12-31",],
                                         portfolio = portfolio,
                                         optimize_method = "ROI")
portfolio.optimized
portfolio.rebalanced$opt_rebalancing$`1997-12-31`
# YES!

# but: last period
portfolio.optimized <- optimize.portfolio(R = returns["2006-08-31::2009-08-31",],
                                         portfolio = portfolio,
                                         optimize_method = "ROI")
portfolio.optimized
portfolio.rebalanced$opt_rebalancing$`2009-08-31`
# NO! What's wrong?

它在端點(R)上重新平衡,您通過了四分之一,因此每個季度都由端點(返回,‘四分之一’)確定,它將使用最後 12 個觀察值重新平衡。

在您的情況下,您在 37 個觀察值的數據集上呼叫了優化投資組合

    nrow(edhec["2006-08-31::2009-08-31"]) 
[1] 37

這應該可以解釋兩個呼叫之間的差異,因為一個呼叫的數據集是 12 對 37。

在您的第一次測試中,您在 12 個觀察值的數據集上呼叫了優化投資組合,這與 optimize.portfolio.rebalancing 呼叫一致

nrow(edhec["::1997-12-31",])
[1] 12

引用自:https://quant.stackexchange.com/questions/29566