波動率

多頭/空頭股票投資組合的目標市場相關性

  • January 13, 2020

給定一個多頭/空頭股票投資組合,我想擁有一些淨多頭市場敞口。

我的投資組合波動率固定在一個目標上,所以我認為以市場貝塔為目標是沒有意義的。我認為我必須針對我與市場的相關性。

通過定位相關性來獲得市場曝光是否有意義?如果是這樣,我該如何做到這一點?潛在相關數量:

  • 投資組合股票之間的相關矩陣
  • 股票與市場的滾動相關性的時間序列
  • 股票滾動波動率估計的時間序列
  • 市場滾動波動率估計的時間序列

另外,我應該注意到,多頭往往擁有低貝塔股票,而空頭往往擁有高貝塔股票,因此使用美元敞口來管理市場敞口是不夠的。

投資組合貝塔是市場波動率、投資組合波動率以及市場與投資組合之間相關性的函式;所以相關性確實是唯一的自由變數。(但是,如果您完全控制了投資組合的建構過程,您不妨以 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範例中使用的包的維護者,也是我上面建議的論文的合著者。)

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