從預期收益和 SD 計算有效邊界
我正在嘗試計算給定投資組合的兩個向量的有效邊界(以及夏普比率下的最佳投資組合):(1)預期收益和(2)歷史標準差。我希望能夠在 R 中計算這一點。使用R
portfolioFrontier()
中的包函式fPortfolio
,我已經使用歷史收益的時間序列成功地計算了夏普比率下的有效前沿和最優投資組合分配。但是,該fPortfolio
軟體包似乎只允許對時間序列進行回測。我想以夏普比率計算未來(即預期)回報的有效前沿和最優投資組合。我怎樣才能做到這一點?理想情況下,這將使用 R 中的一個函式來實現。我能找到的最接近的資源是使用 Octave 程式碼的這個網站。我成功地將程式碼轉換為 R,但有效邊界似乎與 R 包中的邊界不匹配(或準確)。
這是我在 R 中的嘗試(從上述網站翻譯 Octave 程式碼):
expectedReturns <- c(4, 2, 13, 10) covarianceMatrix <- matrix(c(185, 86.5, 80, 20, 86.5, 196, 76, 13.5, 80, 76, 411, -19, 20, 13.5, -19, 25), nrow=4, ncol=4, byrow=TRUE) # Calculate Efficient Frontier unity <- rep(1, length(expectedReturns)) A <- unity %*% solve(covarianceMatrix) %*% unity B <- unity %*% solve(covarianceMatrix) %*% expectedReturns C <- expectedReturns %*% solve(covarianceMatrix) %*% expectedReturns D <- A*C-B^2 mu = seq(0, 30, by=.1) minVar = ((A*mu^2)-2*B*mu+C)/D minSD = sqrt(minVar) plot(minSD, mu)
正如我的評論中所指出的,該軟體包
mvFrontier
的開發版本中的功能可能會對您有所幫助。NMOF
(披露:我是包維護者。)您可以從 GitHub 獲得最新版本。一些評論,首先是關於相關性:與投資組合收益相比,有效邊界顯示投資組合風險,通常是波動性。投資組合波動率是資產波動率和這些資產之間的收益相關性的函式,因此您無法擺脫相關性。
變異數-共變異數矩陣可以分解為(矩陣)乘積
S
乘以C
時間S
,其中S
是一個對角矩陣,其主對角線上的標準差和其他地方為零,其中C
是相關矩陣。假設您有以下預測:
na <- 4 ## number of assets vols <- c(0.10, 0.15, 0.20, 0.22) ## forecast vols m <- c(0.06, 0.12, 0.09, 0.07) ## forecast returns
然後可以通過以下方式計算常數相關性為 0.5 的共變異數矩陣:
const_cor <- function(rho, na) { C <- array(rho, dim = c(na, na)) diag(C) <- 1 C } var <- diag(vols) %*% const_cor(0.5, na) %*% diag(vols)
因此,您可能想嘗試有關相關性的不同假設:很難提出有效的任意相關性矩陣,但有效的是恆定的正相關性(即所有成對相關性都是 0.1 或 0.2,…)。根據實際數據,相關性可能對結果幾乎沒有影響(例如,請參閱此註釋)。
關於矩陣推導的另一句話(如您提供的連結中):我更願意將問題作為優化問題來解決,而不是遵循某種分析方法。優點是您可能想要引入限制(例如,不允許短頁岩),這在分析方法中變得更加困難。
所以這裡是一個呼叫的例子
mvFrontier
:library("NMOF") wmax <- 1 ## maximum holding size wmin <- 0.0 ## minimum holding size rf <- 0.02 ## without cash p1 <- mvFrontier(m, var, wmin = wmin, wmax = wmax, n = 50) ## with cash p2 <- mvFrontier(m, var, wmin = wmin, wmax = wmax, n = 50, rf = rf) plot(p1$volatility, p1$return, pch = 19, cex = 0.5, type = "o", xlab = "Expected volatility", ylab = "Expected return") lines(p2$volatility, p2$return, col = grey(0.5)) abline(v = 0, h = rf)