如何在 R 中創建一籃子相關性最低的貨幣對?
我的策略旨在買賣宇宙中的所有資產並定期重新平衡。它要麼長要麼短。為了限制對單一貨幣的風險敞口,我希望宇宙中的資產具有較低的關聯性和較低的價格相關性(正面甚至負面,因為它可以做空)。
例如,如果宇宙有 3 個貨幣對 A、B 和 C,我的目標是使價格相關性 c1(A 和 B 之間)、c2(B 和 C 之間)和 c3(A 和 C 之間)盡可能低. 假設 c0 是 c1、c2 和 c3 的平均值,它將提供有關 A、B 和 C 對之間“全域”相關性的資訊。
現在假設我們有 26 個貨幣對(從 A 到 Z)來考慮創建一個包含 5 個的小宇宙(例如 3 個)。
我應用的方法是創建 5 個貨幣對組的所有可能組合,然後計算
correl$corr
每個組的 c0。我還計算了 c1、c2 和 c3 的標準偏差,correl$stddev
因為它會過濾掉 c0 低和 c1、c2 和 c3 高的組。最後,我將全域相關性和 stddev 相加,以便對具有單個值的組進行排名correl$"corr+stddev
。在這個例子中,有 16 對是候選者。
我的數據集是一個 xts 對象,其中包含 16 個貨幣對的歷史價格。我可以將其擴展到 ~50 以改進選擇,因為我猜池越大,它必須越好。
這就是我繼續實現這一目標的方式:
# Put all symbols name in a list pairs <- names(mydata) # Create groups of 5 currency pairs with no duplication group <- combn( pairs , 5 ) # Calculate number of groups nb_group <- ncol(group) # Create empty object to store my result result <- NULL # For every groups for (i in 1:nb_group) { # Calculate the mean correlation for the group correl <- round(mean(cor(mydata[, group[,i]])),3) # Transform as data frame and give a name correl <- as.data.frame(correl) colnames(correl) <- "cor" rownames(correl) <- toString(group[,i]) # Calculate stddev and the sum of correlation and stddev correl$stddev <- round(sd(cor(mydata[, group[,i]])),3) correl$"cor+sddev" <- correl$cor + correl$stddev # export data result <- rbind(correl, result) } # Basket of currency pairs with the lowest correlation and stddev head(result[order(result[,3]),])
這返回類似於:
> head(result[order(result[,3]),]) cor stddev cor+sddev GBPUSD, USDCAD, USDRUB, USDTRY, NZDUSD 0.032 0.583 0.615 GBPUSD, USDCHF, USDCAD, USDRUB, USDTRY 0.048 0.569 0.617 GBPUSD, USDJPY, USDRUB, USDTRY, NZDUSD 0.052 0.576 0.628 GBPUSD, USDCAD, EURCHF, USDRUB, USDTRY 0.048 0.582 0.630 GBPUSD, USDCAD, USDRUB, USDMXN, NZDUSD 0.065 0.566 0.631 GBPUSD, USDCHF, USDCAD, USDRUB, USDMXN 0.097 0.536 0.633
當我平均相關性和標準差(而不是總和)時,結果是相同的
你認為 R 可以幫助實現這一目標嗎?是否有更有效的方法來創建這樣一籃子貨幣對?
我檢查了 tawny 、 PortfolioAnalytics 和 fPortfolio 等投資組合優化包,但不幸的是我不熟悉財務公式,所以我迷路了。
謝謝你,弗洛倫特
如果我正確理解您的問題,您正在嘗試搜尋 5 對的最佳籃子(不用擔心權重)。
問題是計算上有太多的組合需要排序。
所以我會提出一個簡單的算法:
計算相關矩陣,獲取具有最小平均相關性的對作為籃子的種子,然後迭代與其餘對的相關性,以搜尋與目前籃子相關性最小的下一對並迭代地添加它們直到你有足夠的物品需要。
如果你想添加相關性和 stddev,我建議你想出一個偏好函式或效用函式來模擬它們之間的權衡。
require(PerformanceAnalytics) data(edhec) ##simple example on edhec test data cormat = cor(edhec) ###Seed the basket inital_asset = which.min(colMeans(cormat)) names_in_basket = labels(inital_asset) ###Grab the one least avg correlated with existing basket while(length(names_in_basket)<5){ if(length(names_in_basket)<2){ names_in_basket=c(names_in_basket, labels(which.min(cormat[,names_in_basket[1]]))) }else{ names_in_basket=c(names_in_basket, labels(which.min(rowMeans(cormat[!rownames(cormat)%in%names_in_basket,names_in_basket])))) } } ###Sanity Check mean(cormat[rownames(cormat)%in%names_in_basket,names_in_basket])<mean(cormat)