拓端tecdat|R語(yǔ)言投資組合優(yōu)化求解器:條件約束最優(yōu)化、非線性規(guī)劃求解
原文鏈接:http://tecdat.cn/?p=22853
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
本文將介紹R中可用于投資組合優(yōu)化的不同求解器。
通用求解器
通用求解器可以處理任意的非線性優(yōu)化問(wèn)題,但代價(jià)可能是收斂速度慢。
默認(rèn)包
包stats(默認(rèn)安裝的基本R包)提供了幾個(gè)通用的優(yōu)化程序。
optimize()。用于區(qū)間內(nèi)的一維無(wú)約束函數(shù)優(yōu)化(對(duì)于一維求根,使用uniroot())。
f <- function(x) exp(-0.5*x) * sin(10*pi*x)
f(0.5)

?
result <- optimize(f, interval = c(0, 1), tol = 0.0001)
result
# 繪制
curve(0, 1, n = 200)
optim()通用優(yōu)化,有六種不同的優(yōu)化方法。
Nelder-Mead:相對(duì)穩(wěn)健的方法(默認(rèn)),不需要導(dǎo)數(shù)。
CG:適用于高維無(wú)約束問(wèn)題的低內(nèi)存優(yōu)化
BFGS:簡(jiǎn)單的無(wú)約束的準(zhǔn)牛頓方法
L-BFGS-B:用于邊界約束問(wèn)題的優(yōu)化
SANN
: 模擬退火法Brent
: 用于一維問(wèn)題(實(shí)際上是調(diào)用optimize())。
這個(gè)例子做了一個(gè)最小二乘法擬合:最小化
?
# 要擬合的數(shù)據(jù)點(diǎn)
# 線性擬合的l2-norm誤差平方 y ~ par[1] + par[2]*x
# ?調(diào)用求解器(初始值為c(0, 1),默認(rèn)方法為 "Nelder-Mead")。
optim(par = c(0, 1), f, data = dat)
# 繪制線性回歸圖
# 與R中內(nèi)置的線性回歸進(jìn)行比較
lm(y ~ x, data = dat)
下一個(gè)例子說(shuō)明了梯度的使用,著名的Rosenbrock香蕉函數(shù):
,梯度
,無(wú)約束最小化問(wèn)題
# ?Rosenbrock香蕉函數(shù)及其梯度
banana <- function(x)
c(-400 * x[1] * (x[2] - x[1] * x[1]) - 2 * (1 - x[1]),
200 * (x[2] - x[1] * x[1]))
optim(c(-1.2, 1), f_banana)
optim(c(-1.2, 1), f, gr, method = "BFGS")
下面的例子使用了界約束。
最小化
約束:?
p <- length(x); sum(c(1, rep(4, p-1)) * (x - c(1, x[-p])^2)^2) }
# 25維度約束
optim(rep(3, 25), f,lower = rep(2, 25), upper = rep(4
這個(gè)例子使用模擬退火法(用于全局優(yōu)化)。
#全局最小值在-15左右
res <- optim(50, f, method = "SANN")
# 現(xiàn)在進(jìn)行局部改進(jìn)(通常只改進(jìn)了一小部分)
optim(res$par, f , method = "BFGS")
?
constrOptim()。使用自適應(yīng)約束算法,在線性不等式約束下最小化一個(gè)函數(shù)(調(diào)用optim())。
# ?不等式約束(ui %*% theta >= ci): x <= 0.9, ?y - x > 0.1
constrOptim(c(.5, 0)
?
nlm()
: 這個(gè)函數(shù)使用牛頓式算法進(jìn)行目標(biāo)函數(shù)的最小化。
nlm(f, c(10,10))
nlminb()
: 進(jìn)行無(wú)界約束優(yōu)化。.
nlminb(c(-1.2, 1), f)
nlminb(c(-1.2, 1), f, gr)
optim
基礎(chǔ)函數(shù)optim()作為許多其他求解器的包,可以方便地使用和比較。
# opm() 可以同時(shí)使用幾個(gè)方法
opm( ?f , method = c("Nelder-Mead", "BFGS"))
全局優(yōu)化
全局優(yōu)化與局部?jī)?yōu)化的理念完全不同(全局優(yōu)化求解器通常被稱為隨機(jī)求解器,試圖避免局部最優(yōu)點(diǎn))。
特定類別問(wèn)題的求解器
如果要解決的問(wèn)題屬于某一類問(wèn)題,如LS、LP、MILP、QP、SOCP或SDP,那么使用該類問(wèn)題的專用求解器會(huì)更好。
?
最小二乘法 (LS)
線性最小二乘法(LS)問(wèn)題是將
最小化,可能有界或線性約束。
線性規(guī)劃(LP)
函數(shù)solveLP(),可以方便地解決以下形式的LP:
最小化:
約束:
#> 加載所需軟件包
cvec <- c(1800, 600, 600) ?# 毛利率
bvec <- c(40, 90, 2500) ?# 捐贈(zèng)量
# 運(yùn)行求解器
solveLP(maximum = TRUE)
?
混合整數(shù)線性規(guī)劃?(MILP)
lpSolve(比linprog快得多,因?yàn)樗怯肅語(yǔ)言編碼的)可以解決線性混合整數(shù)問(wèn)題(可能帶有一些整數(shù)約束的LP)。
# 設(shè)置問(wèn)題:
# ? maximize ? ? ?x1 + 9 x2 + x3
# ? subject to ? ?x1 + 2 x2 + 3 x3 <= 9
# ? ? ? ? ? ? ? 3 x1 + 2 x2 + 2 x3 <= 15
# 運(yùn)行求解
res <- lp("max", f, con)
?
# 再次運(yùn)行,這次要求三個(gè)變量都是整數(shù)
lp( ?int.vec = 1:3)
solution
二次規(guī)劃 (QP)
可以方便地解決以下形式的QP
最小化:
約束:
# 設(shè)置問(wèn)題:
# ? minimize ? ?-(0 5 0) %*% x + 1/2 x^T x
# ? subject to ?A^T x >= b
# ? with b = (-8,2,0)^T
# ? ? ? (-4 2 ?0)
# ? A = (-3 1 -2)
# ? ? ? ( 0 0 ?1)
#運(yùn)行求解
solve(Dmat,...)
解決具有絕對(duì)值約束和目標(biāo)函數(shù)中的絕對(duì)值的二次規(guī)劃。
二階錐規(guī)劃 (SOCP)
有幾個(gè)包:
ECOSolveR提供了一個(gè)與嵌入式COnic Solver(ECOS)的接口,這是一個(gè)著名的、高效的、穩(wěn)健的C語(yǔ)言庫(kù),用于解決凸問(wèn)題。
CLSOCP提供了一個(gè)用于解決SOCP問(wèn)題的一步平滑牛頓方法的實(shí)現(xiàn)。
優(yōu)化基礎(chǔ)
我們已經(jīng)看到了兩個(gè)包,它們是許多其他求解器的包。
用于凸問(wèn)題、MIP和非凸問(wèn)題
ROI包為處理R中的優(yōu)化問(wèn)題提供了一個(gè)框架。它使用面向?qū)ο蟮姆椒▉?lái)定義和解決R中的各種優(yōu)化任務(wù),這些任務(wù)可以來(lái)自不同的問(wèn)題類別(例如,線性、二次、非線性規(guī)劃問(wèn)題)。
LP?– 考慮 LP:
最大化:
約束:
?
#> ROI: R 優(yōu)化基礎(chǔ)設(shè)施
#> 求解器插件: nlminb, ecos, lpsolve, scs.
#> 默認(rèn)求解器: auto.
OP(objective = L_objective(c(3, 7, -12)),...,
maximum = TRUE)
#> 投資回報(bào)率優(yōu)化問(wèn)題:
# 讓我們來(lái)看看可用的求解器
# solve it
res <- ROI_solve(prob)
res
?
MILP?– 考慮先前的LP,并通過(guò)添加約束條件x2,x3∈Z使其成為一個(gè)MILP.
# 只需修改之前的問(wèn)題
types(prob) <- c("C", "I", "I")
prob
?
BLP?– 考慮二元線性規(guī)劃?(BLP):
最小化:
約束:
?
OP(objective = L_objective,..., ,
types = rep("B", 5))
ROI_solve(prob)
#> Optimal solution found.
#> The objective value is: -1.01e+02
SOCP?– 考慮SOCP:
最大化:
約束:
并注意到SOC約束?
?可以寫(xiě)成
或?
,在代碼中實(shí)現(xiàn)為:
。
OP(objective = L_objective,...,
maximum = TRUE)
?
SDP--考慮SDP:
最小化:
約束:
并注意SDP約束
可以寫(xiě)成
(大小為3是因?yàn)樵谖覀兊膯?wèn)題中,矩陣為2×2,但vech()提取了3個(gè)獨(dú)立變量,因?yàn)榫仃囀菍?duì)稱的)。
OP(objective = L_objective,...,
rhs ))
NLP?– 考慮非線性規(guī)劃(NLP)
最大化
約束
OP(objective = F_objective,..., bounds ,
maximum = TRUE)
?
凸優(yōu)化
R為凸優(yōu)化提供了一種面向?qū)ο蟮慕UZ(yǔ)言。它允許用戶用自然的數(shù)學(xué)語(yǔ)法來(lái)制定凸優(yōu)化問(wèn)題,而不是大多數(shù)求解器所要求的限制性標(biāo)準(zhǔn)形式。通過(guò)使用具有已知數(shù)學(xué)特性的函數(shù)庫(kù),結(jié)合常數(shù)、變量和參數(shù)來(lái)指定目標(biāo)和約束條件集?,F(xiàn)在讓我們看看幾個(gè)例子。
最小二乘法?– 讓我們從一個(gè)簡(jiǎn)單的LS例子開(kāi)始:最小化
當(dāng)然,我們可以使用R的基礎(chǔ)線性模型擬合函數(shù)lm()。
# 生成數(shù)據(jù)
m <- 100
n <- 10
beta_true <- c(-4:5)
# 生成數(shù)據(jù)
res <- lm(y ~ 0 + X) ? # 0表示我們的模型中沒(méi)有截距。
?
用CVXR來(lái)做
result <- solve(prob)
str(result)
?
??
我們現(xiàn)在可以很容易地添加一個(gè)限制條件來(lái)解決非負(fù)的LS。
Problem(Minimize(obj), constraints = list(beta >= 0))
solve(prob)
穩(wěn)健的Huber回歸?- 讓我們考慮穩(wěn)健回歸的簡(jiǎn)單例子:
最小化
其中
sum(huber(y - X %*% beta, M)
Problem(Minimize(obj))
solve(prob)
彈性網(wǎng)正則化?- 我們現(xiàn)在要解決的問(wèn)題是:最小化
# 定義正則化項(xiàng)
elastic<- function(beta) {
ridge <- (1 - alpha) * sum(beta^2)
lasso <- alpha * p_norm(beta, 1)
# 定義問(wèn)題并解決它
sum((y - X %*% beta)^2) + elastic(beta, lambda, alpha)
Problem(Minimize(obj))
solve(prob)
稀疏逆協(xié)方差矩陣--考慮矩陣值的凸問(wèn)題:最大化
,條件是
log_det(X) - matrix_trace(X %*% S)
list(sum(abs(X)) <= alpha)
協(xié)方差--考慮矩陣值的凸問(wèn)題:在
的條件下,最大化
。
constr <- list(Sigma[1,1] == 0.2, Sigma[1,2] >= 0, Sigma[1,3] >= 0,
Sigma[2,2] == 0.1, Sigma[2,3] <= 0, Sigma[2,4] <= 0,
Sigma[3,3] == 0.3, Sigma[3,4] >= 0, Sigma[4,4] == 0.1)
投資組合優(yōu)化--考慮馬科維茨投資組合設(shè)計(jì):最大化
,
Problem(Maximize(obj), constr)
solve(prob)
結(jié)論
R語(yǔ)言中可用的求解器的數(shù)量很多。建議采取以下步驟。
如果是凸優(yōu)化問(wèn)題,那么開(kāi)始進(jìn)行初步測(cè)試。
如果速度不夠快,使用ROI。
如果仍然需要更快的速度,那么如果問(wèn)題屬于定義好的類別之一,則使用該類別專用的求解器(例如,對(duì)于LP,推薦使用lpSolve,對(duì)于QP則使用quadprog)。
然而,如果問(wèn)題不屬于任何類別,那么就必須使用非線性優(yōu)化的一般求解器。在這個(gè)意義上,如果一個(gè)局部的解決方案就夠了,那么可以用許多求解器的包。如果需要全局求解器,那么軟件包gloptim是一個(gè)不錯(cuò)的選擇,它是許多全局求解器的包。
最受歡迎的見(jiàn)解
1.用R語(yǔ)言模擬混合制排隊(duì)隨機(jī)服務(wù)排隊(duì)系統(tǒng)
2.R語(yǔ)言中使用排隊(duì)論預(yù)測(cè)等待時(shí)間
3.R語(yǔ)言中實(shí)現(xiàn)馬爾可夫鏈蒙特卡羅MCMC模型
4.R語(yǔ)言中的馬爾科夫機(jī)制轉(zhuǎn)換(Markov regime switching)模型
5.matlab貝葉斯隱馬爾可夫hmm模型
6.用R語(yǔ)言模擬混合制排隊(duì)隨機(jī)服務(wù)排隊(duì)系統(tǒng)
7.Python基于粒子群優(yōu)化的投資組合優(yōu)化
8.R語(yǔ)言馬爾可夫轉(zhuǎn)換模型研究交通傷亡人數(shù)事故預(yù)測(cè)
9.用機(jī)器學(xué)習(xí)識(shí)別不斷變化的股市狀況——隱馬爾可夫模型的應(yīng)用