使用 R 和 princomp 創建對沖籃子
我正在嘗試尋找更好的方法來對沖我們的一些股票投資組合。使用 R 來獲得投資組合的風險敞口的 PCA 細分很容易,但我不知道如何使用它來實際對沖某些東西。
在下面的範例中,我只使用了四種證券。在現實生活中,我們會使用更多,但為了讓這個例子易於管理,我們會設置它。這是R程式碼:
# Get publicly available data library(dplyr) library(TTR) px.spy=getYahooData("SPY", 20130101, 20160101)$Close px.iwm=getYahooData("IWM", 20130101, 20160101)$Close px.tlt=getYahooData("TLT", 20130101, 20160101)$Close px.gld=getYahooData("GLD", 20130101, 20160101)$Close names(px.spy)[1]="SPY" names(px.iwm)[1]="IWM" names(px.tlt)[1]="TLT" names(px.gld)[1]="GLD" px=merge( px.spy , px.iwm ) px=merge( px , px.tlt ) px=merge( px , px.gld ) # turn it into something that we can put into princomp pxList=as.data.frame(px) %>% mutate( SPYr = (lag(SPY,1) - SPY )/SPY , IWMr = (lag(IWM,1) - IWM )/IWM , TLTr = (lag(TLT,1) - TLT )/TLT , GLDr= (lag(GLD,1) - GLD )/GLD) %>% filter( complete.cases(.)) %>% select(SPYr,IWMr,TLTr,GLDr ) pxCov=cor(pxList) pc=princomp(pxCov)
現在我們載入
pc$loadings
. 現在,假設我們想持有 100 毫米的 SPY 投資組合,並根據 PCA 敞口使用 IWM、TLT、GLD 對沖它。什麼是簡單地提取它並創建一個帶有權重的框架的正確方法?謝謝,喬什
請注意,我不會詳細介紹使用這種方法的所有數學警告。
讓 $ \Sigma $ 是你的共變異數矩陣,並且 $ X $ 每日收益的隨機向量。所以
$$ \text{Var}(X) = \Sigma. $$ 您的程式碼中有錯誤。在您的程式碼中,您呼叫它
pxCov
,但您可能打算使用cov()
insted ofcor()
。查看文件princomp().
,預設情況下它需要共變異數矩陣。這會改變一些事情。 此外,princomp()
將您的共變異數矩陣解釋為數據框。您應該執行以下命令而不是最後兩行:pxCov=cov(pxList) pc=princomp(covmat=pxCov)
現在是數學的東西。您在評論中提到的所有您想做的事情都可以通過獲取隨機返迴向量的線性組合的期望、變異數或共變異數來完成。權重將由載荷或特徵向量構成,變異數的計算將使用載荷對應的特徵值或標準差項來簡化。
讓 $ w $ 是一個權重(列)向量。現在假設它的整數之和是 $ 1 $ . 每個元素都表示您的投資組合在該股票中的份額。基本屬性告訴我們
$$ \text{Var}(w’X) = w’\Sigma w, $$ 其中撇號表示轉置。 我們可以對共變異數矩陣(正定和對稱)進行譜分解:
$$ \Sigma = \sum_{i=1}^4 \lambda_i v_i v_i’ $$ 使用一組載荷或特徵向量, $ {v_i} $ 是正交的。在您的程式碼中,這些是
pc$loadings
. 與這些對應的 lambda 是pc$sdev^2
. 此函式按降序對所有內容進行排序,因此 $ \lambda_1 > \cdots > \lambda_4 $ . 當您說 PCA 時,您可能正在嘗試使用 $ v_i $ s 建構一個“好” $ w $ . 沒有單一的方法可以做到這一點。如果您想在不考慮預期收益的情況下最小化波動率,您可以設置 $ w = v_4 $ . 那麼您的投資組合變異數/風險將是$$ \text{Var}(wX) = v_4’ \left[ \sum_{i=1}^4 \lambda_i v_i v_i’\right] v_4 = \lambda_4 v_4’v_4 v_4’v_4 = \lambda_4, $$ 因為載入向量的正交性。 如果您想最小化其他一些目標函式,那麼您也可以這樣做。例如,如果您的預期回報是 $ w’\mu $ ,那麼你可能想要最小化 $ w’\Sigma w - m w’\mu $ . 不過,我不知道在實踐中通常會做什麼。
如果您想查看每次載入解釋的每個變異數有多少,請執行
plot(pc$sdev^2/sum(pc$sdev^2))
. 如果你想要 90%,你需要前兩個負載的混合。所以我們需要找到一些 $ 0 < \alpha < 1 $ 這樣 $ w = \alpha v_1 + (1-\alpha)v_2 $ . 使用我之前向您展示的正交性之類的東西,您可以獲得$$ \text{Var}(wX) = \alpha^2\lambda_1 + (1-\alpha)^2\lambda_2 \overset{\text{set}}{=} .9 $$ 所以你必須使用二次公式來找到 $ \alpha $ 為了得到你的 $ w $ . 您也可以混合使用最後三個載入。我也不確定在實踐中通常會做什麼。
如果你想找到你的新投資組合的“曝光率”, $ w’X $ ,對於間諜的回報, $ e_1’X $ ,我把它的意思是共變異數,那麼你可以使用雙線性 $ \text{Cov}(\cdot,\cdot) $
$$ \text{Cov}(w’X, e_1’X) = w’\Sigma e_1 $$ 在哪裡 $ e_1’ = (1, 0, 0, 0) $ .