複製
幾乎複製了一個帶有一些成分的籃子
動機
我有一個包含 30 個成分的籃子,每個成分的權重我想用少於 30 次交易幾乎複製它以降低交易成本。
更好的定義
- 更好的複制等於更高的相關性
- 我有一個成本函式,與我願意為降低交易成本而放棄多少相關性有關
- 名義金額應相同
- 沒有負權重
- 您只能交易籃子中的物品。任何東西都是不允許的,無論它是多麼相關。
我試過的
- 具有預定義的臨時子集的線性回歸:打破了 defs #3-4,儘管根據定義具有更高的歷史相關性,但權重對於未來似乎並不穩健,並且看起來有些過擬合。
- 使用 lasso 回歸併調整 lambda 參數以獲得更多或更少的選定項目:仍然會破壞 defs #3-4,但選擇不再是臨時的
- 線性回歸受到限制,因此權重總和為 1,並且在 adhoc 子集上不允許負權重:通過所有規則,但估計過程似乎很挑剔。起始係數的微小差異導致不同的結束權重。有時估計也不會收斂
- 首先刪除權重最低的成分,重新分配權重:儘管它有效,但它對我來說缺乏形式,並且一旦刪除許多項目,可能會導致一個非常次優的籃子。權重的重新分配也有爭議。它是通過重量還是通過相對相關性來完成的?
另外,我還沒有找到關於這個主題的任何正式材料(論文或書籍),如果你能指出我,這將非常有幫助
您可能想查看有關索引跟踪的文獻;也許你會在那裡找到有用的想法。
我會把它寫成一個優化模型來解決。由於您似乎對密切複製您的籃子所需的資產數量(即複製籃子的基數)最感興趣,您可以求解不同基數的模型,然後查看權衡相關性/基數。
NMOF
讓我勾勒一下如何在 R 中使用稱為門檻值接受的方法(在包中實現)處理這樣的優化模型。正如您所描述的,我使用相關性,即使相關性可能不是衡量緊密度的最佳指標,因為您可能擁有高度相關但波動性非常不同的籃子。n <- 30 ## number of assets in original basket k <- 3 ## number of assets in replicating basket
原始籃子:我假設重量相同,但只需根據需要插入其他重量。
w.basket <- rep(1/n, n) library("NMOF") ## https://github.com/enricoschumann/NMOF library("neighbours") ## https://github.com/enricoschumann/neighbours
我首先為您的 30 個資產創建一些隨機回報。結果是一個
R
大小為ns
times的矩陣na
。random_returns <- function(na, ns, sd, mean = 0, rho = 0) { ## na = number of assets ## ns = number of scenarios ## sd = vol of returns ## mean = means of returns ## ==> sd and mean may be scalars or ## vectors of length na ans <- rnorm(na*ns) dim(ans) <- c(na, ns) if (rho != 0) { C <- array(rho, dim = c(na, na)) diag(C) <- 1 ans <- t(chol(C)) %*% ans } ans <- ans*sd ans <- ans + mean t(ans) } R <- random_returns(na = n, ns = 250, 0.01, rho = 0.1)
門檻值接受是一種優化方法,因此我們需要一個目標函式:您的籃子與複製投資組合之間的相關性
x
。為簡單起見,我也對 使用相同的權重x
,但僅對k
包含的資產使用。所有其他權重均為零。cor_basket <- function(x, R, w.basket, k, ...) -c(cor(R %*% (x/k), R %*% w.basket))
您可以達到的最佳結果是相關性為 1。由於我們遵循約定最小化,我們使用減去相關性。
cor_basket(w.basket, R, w.basket, k) ## [1] -1
接下來,Threshold Accepting 的關鍵部分:鄰域函式。鄰域採取解決方案,製作副本,稍微(隨機)修改副本,然後返回這個修改後的副本。在這種情況下,該函式隨機選擇籃子中的資產並將其替換為不在籃子中的資產。
nb <- neighbourfun(type = "logical", kmin = k, kmax = k) x0 <- c(rep(TRUE, k), rep(FALSE, n - k)) data.frame(x0, n1 = nb(x0), n2 = nb(x0)) ## x0 n1 n2 ## 1 TRUE TRUE FALSE ## 2 TRUE FALSE TRUE ## 3 TRUE TRUE TRUE ## 4 FALSE FALSE FALSE ## 5 FALSE FALSE FALSE ## 6 FALSE FALSE FALSE ## 7 FALSE FALSE FALSE ## [...] ## 12 FALSE TRUE FALSE ## [...] ## 23 FALSE FALSE TRUE ## [...] sol.ls <- TAopt(cor_basket, list(x0 = x0, nI = 5000, neighbour = nb), R = R, k = k, w.basket = w.basket) ## Threshold Accepting ## [...] ## Best solution overall: -0.6534397
回想一下,我們最小化了:因此與三個資產的跟踪投資組合的最高相關性是 0.65。現在,要查看權衡相關性/資產數量的樣子,只需執行一個循環。
for (k.i in 2:20) { x0 <- c(rep(TRUE, k.i), rep(FALSE, n - k.i)) sol.ls <- TAopt(cor_basket, list(x0 = x0, nI = 5000, neighbour = nb, printDetail= FALSE, printBar = FALSE), R = R, k = k.i, w.basket = w.basket) message(format(k.i, width = 3), " | ", round(-sol.ls$OFvalue, 3)) } ## 2 | 0.566 ## 3 | 0.653 ## 4 | 0.721 ## 5 | 0.765 ## 6 | 0.8 ## 7 | 0.833 ## 8 | 0.86 ## 9 | 0.876 ## 10 | 0.89 ## 11 | 0.9 ## 12 | 0.913 ## 13 | 0.921 ## 14 | 0.931 ## 15 | 0.938 ## 16 | 0.946 ## 17 | 0.95 ## 18 | 0.955 ## 19 | 0.96 ## 20 | 0.965