複製

幾乎複製了一個帶有一些成分的籃子

  • July 24, 2019

動機

我有一個包含 30 個成分的籃子,每個成分的權重我想用少於 30 次交易幾乎複製它以降低交易成本。

更好的定義

  1. 更好的複制等於更高的相關性
  2. 我有一個成本函式,與我願意為降低交易成本而放棄多少相關性有關
  3. 名義金額應相同
  4. 沒有負權重
  5. 您只能交易籃子中的物品。任何東西都是不允許的,無論它是多麼相關。

我試過的

  1. 具有預定義的臨時子集的線性回歸:打破了 defs #3-4,儘管根據定義具有更高的歷史相關性,但權重對於未來似乎並不穩健,並且看起來有些過擬合。
  2. 使用 lasso 回歸併調整 lambda 參數以獲得更多或更少的選定項目:仍然會破壞 defs #3-4,但選擇不再是臨時的
  3. 線性回歸受到限制,因此權重總和為 1,並且在 adhoc 子集上不允許負權重:通過所有規則,但估計過程似乎很挑剔。起始係數的微小差異導致不同的結束權重。有時估計也不會收斂
  4. 首先刪除權重最低的成分,重新分配權重:儘管它有效,但它對我來說缺乏形式,並且一旦刪除許多項目,可能會導致一個非常次優的籃子。權重的重新分配也有爭議。它是通過重量還是通過相對相關性來完成的?

另外,我還沒有找到關於這個主題的任何正式材料(論文或書籍),如果你能指出我,這將非常有幫助

您可能想查看有關索引跟踪的文獻;也許你會在那裡找到有用的想法。

我會把它寫成一個優化模型來解決。由於您似乎對密切複製您的籃子所需的資產數量(即複製籃子的基數)最感興趣,您可以求解不同基數的模型,然後查看權衡相關性/基數。

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大小為nstimes的矩陣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

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