程式

在 R 中設置套利策略

  • September 16, 2020

我正在嘗試建構套利投資組合 $ \textbf{x} $ 這樣 $ S^T\textbf{x} = 0 $ 和 $ A\textbf{x} \geq \textbf{0} $ , 在哪裡 $ A $ 是支付矩陣 $ t=1 $ 和 $ S $ 價格是 $ t=0 $ . 我無法手動完成,所以我嘗試使用R中的limSolvelpSolve包中包含的函式,但沒有成功。我也不知道如何自己編碼。任何有關如何進行的幫助或提示將不勝感激。謝謝! 在此處輸入圖像描述

對 LP 套利機會的測試是最小化建立投資組合的成本,但受制於投資組合在世界任何一個州都不會虧損的限制。(請注意,在您的公式中,您錯過了實際目標;您只列出了約束條件。)如果您發現一個投資組合具有負成本(即您因持有它而獲得報酬),但您從未虧本,那麼您就發現了套利文件夾。或者,如果找到一個成本為零但沒有損失可能性且至少有一個正收益的投資組合,那麼您就找到了套利機會。如果您找到一個套利投資組合,那麼在沒有限制的情況下,您通常會找到無限多。這應該很直覺:如果你有一個零成本的投資組合,但只有非負收益,你可以將所有權重乘以某個常數,仍然有一個套利投資組合。

在 R 中執行此操作:

A <- matrix(c(2, 1, 0, 3, 1,
             1, 1, 1, 2, 1,
             0, 1, 2, 1, 0), byrow = TRUE, nrow = 3)
S <- c(1, 1, 1, 2, 1/3)


library("Rglpk")
bounds <- list(lower = list(ind = 1:5, val = rep(-Inf, 5)))
lp.sol <- Rglpk_solve_LP(S,
                        mat = A,
                        dir = rep(">=", 3),
                        rhs = c(0, 0, 0),
                        bounds = bounds,
                        control = list(canonicalize_status = FALSE,
                                       verbose = TRUE))
## [....]
## LP HAS UNBOUNDED PRIMAL SOLUTION

這並沒有太大幫助,因為它只會告訴您存在套利機會。所以我們添加約束:負位置不能超過-1。

bounds <- list(lower = list(ind = 1:5, val = rep(-1, 5)))
lp.sol <- Rglpk_solve_LP(S,
                        mat = A,
                        dir = rep(">=", 3),
                        rhs = c(0, 0, 0),
                        bounds = bounds)
sum(lp.sol$solution*S)
## [1] -1
A %*% lp.sol$solution
##      [,1]
## [1,]    0
## [2,]    3
## [3,]    0

現在你有一個負成本投資組合(即你收到 1 用於建立投資組合)。為了使其零成本,您將這些收益投資於一項資產:

x <- lp.sol$solution
x[2] <- x[2] + 1/S[2]
sum(x*S)
## [1] 0
A %*% x
##      [,1]
## [1,]    1
## [2,]    4
## [3,]    1

現在你有一個零成本的投資組合,收益嚴格為正。

或者,您可以使用另一個數值求解器直接求解優化模型。這是一個例子。(披露:我是包NMOFneighbours. 的維護者。)使用返回更方便:

R <- t(t(A)/S) - 1
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    0   -1  0.5    2
## [2,]    0    0    0  0.0    2
## [3,]   -1    0    1 -0.5   -1


library("NMOF")         ## https://github.com/enricoschumann/NMOF
library("neighbours")   ## https://github.com/enricoschumann/neighbours

現在我們直接最大化平均收益,比如說。(我使用的實現最小化,所以我乘以 -1。)

max_payoff <- function(x, R, S)
   -sum(R %*% x) +                ## => maximize average payoff
   -10*sum(pmin(R %*% x, 0))      ## => penalty for negative state returns

nb <- neighbourfun(-1, 5, length = 5, stepsize = 5/100)

ta.sol <- LSopt(max_payoff,
               list(neighbour = nb,
                    x0 = rep(0, length(S)),
                    nI = 5000),
               R = R, S = S)
round(ta.sol$xbest, 3) ## the portfolio
## [1] -1.00 -1.00 0.75 -1.00 2.25
round(R %*% ta.sol$xbest, 1)  ## the state returns
##      [,1]
## [1,]  2.2
## [2,]  4.5
## [3,]  0.0

股票投資組合:

x <- round(ta.sol$xbest/S, 3)
sum(x*S)
## [1] 0
A %*% x
##      [,1]
## [1,] 2.25
## [2,] 4.50
## [3,] 0.00

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