多頭/空頭股票投資組合的目標市場相關性
給定一個多頭/空頭股票投資組合,我想擁有一些淨多頭市場敞口。
我的投資組合波動率固定在一個目標上,所以我認為以市場貝塔為目標是沒有意義的。我認為我必須針對我與市場的相關性。
通過定位相關性來獲得市場曝光是否有意義?如果是這樣,我該如何做到這一點?潛在相關數量:
- 投資組合股票之間的相關矩陣
- 股票與市場的滾動相關性的時間序列
- 股票滾動波動率估計的時間序列
- 市場滾動波動率估計的時間序列
另外,我應該注意到,多頭往往擁有低貝塔股票,而空頭往往擁有高貝塔股票,因此使用美元敞口來管理市場敞口是不夠的。
投資組合貝塔是市場波動率、投資組合波動率以及市場與投資組合之間相關性的函式;所以相關性確實是唯一的自由變數。(但是,如果您完全控制了投資組合的建構過程,您不妨以 beta 為目標,然後調整權重,以達到您的波動率目標。)
為了控制相關性,您首先需要對相關性進行預測,並且獲得這些預測的不同設置——例如使用具有收縮、特定時間範圍等的歷史數據——可能會產生不同的結果。行之有效的是一個經驗問題,但鑑於相關性是出了名的不穩定,您不應該期望能夠精細控製樣本外的相關性。無論如何,最終,這些預測都會被放入相關矩陣(允許的資產 + 市場)中。
如果您的投資組合是通過優化模型創建的,您可以直接添加相關性,作為目標或限制。或者,您可以創建一個疊加模型,其目的是最大限度地提高相關性,但要限制您願意允許對投資組合進行多少更改。
在評論之後更新:我建議他們處理這個問題的方式是通過直接優化相關性。然後,您所需要的只是一種能夠解決此類模型的優化算法。例如,啟發式可以處理此類模型(請參閱金融建模中的啟發式優化或投資組合選擇的啟發式)。一個特定的模型在經驗上是否有意義是一個經驗問題;但計算非常簡單。讓我為“覆蓋”方法繪製一個使用 R 的範例。我將保持這個例子非常簡單。
假設您有一組
R
資產的回報場景。每列包含一項資產的回報。我還創建了一個“市場”時間序列,M
. 為簡單起見,我在這裡使用歷史數據。該數據集由 Kenneth French 提供的 48 個行業組合組成(我放棄了該other
行業。)library("NMOF") ## https://github.com/enricoschumann/NMOF library("neighbours") ## https://github.com/enricoschumann/neighbours R <- French("~/Downloads/French", "49_Industry_Portfolios_daily_CSV.zip") R <- R[seq(to = nrow(R), length.out = 500), 1:48] R <- as.matrix(R) M <- French("~/Downloads/French", dataset = "market", frequency = "daily") all(row.names(R) %in% row.names(M)) ## check ## [1] TRUE M <- M[row.names(R), ] M <- as.matrix(M)
我創建了一個隨機的原始投資組合。它是一個零投資組合,權重相當大。
orig.portfolio <- runif(ncol(R), min = 0, max = 0.3) orig.portfolio <- orig.portfolio - mean(orig.portfolio) summary(orig.portfolio) ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## -0.15474 -0.07257 0.02445 0.00000 0.06513 0.12166 round(sum(orig.portfolio), 8) ## [1] 0
現在的目標是創建一個零投資疊加,最大偏差為 -0.025 到 0.025,例如,最大限度地提高與市場的相關性
M
。目標函式cr
很簡單。我們後來最小化,所以我在相關性前面加上了一個減號。cr <- function(x, orig.portfolio, R, M) -c(cor(R %*% (x + orig.portfolio), M)) ## cor(R %*% (orig.portfolio), M) -cr(0, orig.portfolio, R, M) ## [1] 0.04762037
所以原始投資組合的相關性為
0.05
。現在我使用一種稱為門檻值接受的方法最小化該函式。nb <- neighbourfun(min = -0.025, max = 0.025, stepsize = 0.005) sol <- TAopt(cr, list(nI = 10000, x0 = c(0.01,-0.01, rep(0, ncol(R)-2)), neighbour = nb), orig.portfolio = orig.portfolio, M = M, R = R) -cr(sol$xbest, orig.portfolio, R, M) ## [1] 0.4776
所以新的投資組合仍然是零投資,相關性為
0.48
。為簡單起見,我調整了新的投資組合,使其具有與原始投資相同的波動性。這不會影響相關性。new.portfolio <- orig.portfolio + sol$xbest new.portfolio <- new.portfolio/sd(R %*% new.portfolio)*sd(R %*% orig.portfolio) sd(R %*% orig.portfolio) ## [1] 0.004195 sd(R %*% new.portfolio) ## [1] 0.004195 -cr(new.portfolio-orig.portfolio, orig.portfolio, R, M) ## [1] 0.4776
我們還可以繪製情景下的投資組合收益
R
。左邊是原始投資組合;右側是帶有疊加層的投資組合。par(mfrow = c(1, 2)) plot(R %*% orig.portfolio, M, main = paste("correlation ", round(-cr(0, orig.portfolio, R, M), 2))) plot(R %*% new.portfolio, M, main = paste("correlation ", round(-cr(new.portfolio-orig.portfolio, orig.portfolio, R, M), 2)))
(披露:我是
R
範例中使用的包的維護者,也是我上面建議的論文的合著者。)