原文链接:http://tecdat.cn/?p=22853
本文将介绍 R 中可用于投资组合优化的不同求解器。
通用求解器
通用求解器能够解决任意的非线性优化问题,但代价可能是收敛速度慢。
默认 包
包 stats(默认装置的根本 R 包)提供了几个通用的优化程序。
- optimize()。用于区间内的一维无约束函数优化(对于一维求根,应用 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()通用优化,有六种不同的优化办法。
Nelder-Mead:绝对持重的办法(默认),不须要导数。
CG:实用于高维无约束问题的低内存优化
BFGS:简略的无约束的准牛顿办法
L-BFGS-B:用于边界束缚问题的优化
SANN
: 模拟退火法Brent
: 用于一维问题(实际上是调用 optimize())。
这个例子做了一个最小二乘法拟合:最小化
# 要拟合的数据点
# 线性拟合的 l2-norm 误差平方 y ~ par\[1\] + par\[2\]*x
# 调用求解器(初始值为 c(0, 1),默认办法为 "Nelder-Mead")。optim(par = c(0, 1), f, data = dat)
# 绘制线性回归图
# 与 R 中内置的线性回归进行比拟
lm(y ~ x, data = dat)
下一个例子阐明了梯度的应用,驰名的 Rosenbrock 香蕉函数:
,梯度
,无约束最小化问题
``````
# Rosenbrock 香蕉函数及其梯度
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
这个例子应用模拟退火法(用于全局优化)。
# 全局最小值在 -15 左右
res <- optim(50, f, method = "SANN")
# 当初进行部分改良(通常只改良了一小部分)
optim(res$par, f , method = "BFGS")
- constrOptim()。应用自适应束缚算法,在线性不等式束缚下最小化一个函数(调用 optim())。
``````
# 不等式束缚(ui %*% theta >= ci): x <= 0.9, y - x > 0.1
constrOptim(c(.5, 0)
nlm()
: 这个函数应用牛顿式算法进行指标函数的最小化。
nlm(f, c(10,10))
nlminb()
: 进行无界束缚优化。.
nlminb(c(-1.2, 1), f)
nlminb(c(-1.2, 1), f, gr)
optim
根底函数 optim()作为许多其余求解器的包,能够不便地应用和比拟。
# opm() 能够同时应用几个办法
opm(f , method = c("Nelder-Mead", "BFGS"))
全局优化
全局优化与局部优化的理念齐全不同(全局优化求解器通常被称为随机求解器,试图防止部分最长处)。
特定类别问题的求解器
如果要解决的问题属于某一类问题,如 LS、LP、MILP、QP、SOCP 或 SDP,那么应用该类问题的专用求解器会更好。
最小二乘法 (LS)
线性最小二乘法(LS)问题是将 最小化,可能有界或线性束缚。
线性规划(LP)
函数 solveLP(),能够不便地解决以下模式的 LP:
最小化:
束缚:
``````
#> 加载所需软件包
cvec <- c(1800, 600, 600) # 毛利率
bvec <- c(40, 90, 2500) # 捐献量
# 运行求解器
solveLP(maximum = TRUE)
混合整数线性规划 (MILP)
lpSolve(比 linprog 快得多,因为它是用 C 语言编码的)能够解决线性混合整数问题(可能带有一些整数束缚的 LP)。
# 设置问题:
# maximize x1 + 9 x2 + x3
# subject to x1 + 2 x2 + 3 x3 <= 9
# 3 x1 + 2 x2 + 2 x3 <= 15
# 运行求解
res <- lp("max", f, con)
# 再次运行,这次要求三个变量都是整数
lp(int.vec = 1:3)
solution
二次布局 (QP)
能够不便地解决以下模式的 QP
最小化:束缚:
# 设置问题:
# 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)
#运行求解
solve(Dmat,...)
解决具备绝对值束缚和指标函数中的绝对值的二次布局。
二阶锥布局 (SOCP)
有几个包:
- ECOSolveR 提供了一个与嵌入式 COnic Solver(ECOS)的接口,这是一个驰名的、高效的、持重的 C 语言库,用于解决凸问题。
- CLSOCP 提供了一个用于解决 SOCP 问题的一步平滑牛顿办法的实现。
优化根底
咱们曾经看到了两个包,它们是许多其余求解器的包。
用于凸问题、MIP 和非凸问题
ROI 包为解决 R 中的优化问题提供了一个框架。它应用面向对象的办法来定义和解决 R 中的各种优化工作,这些工作能够来自不同的问题类别(例如,线性、二次、非线性布局问题)。
LP – 思考 LP:
最大化:
束缚:
#> ROI: R 优化基础设施
#> 求解器插件: nlminb, ecos, lpsolve, scs.
#> 默认求解器: auto.
OP(objective = L_objective(c(3, 7, -12)),...,
maximum = TRUE)
#> 投资回报率优化问题:
# 让咱们来看看可用的求解器
# solve it
res <- ROI_solve(prob)
res
MILP – 思考先前的 LP,并通过增加约束条件 x2,x3∈Z 使其成为一个 MILP.
# 只需批改之前的问题
types(prob) <- c("C", "I", "I")
prob
BLP – 思考二元线性规划 (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 束缚 能够写成 或 ,在代码中实现为:。
OP(objective = L_objective,...,
maximum = TRUE)
SDP– 思考 SDP:
最小化:
束缚:
并留神 SDP 束缚 能够写成 (大小为 3 是因为在咱们的问题中,矩阵为 2×2,但 vech() 提取了 3 个独立变量,因为矩阵是对称的)。
OP(objective = L_objective,...,
rhs ))
NLP – 思考非线性布局(NLP)
最大化
束缚
``````
OP(objective = F_objective,..., bounds ,
maximum = TRUE)
凸优化
R 为凸优化提供了一种面向对象的建模语言。它容许用户用天然的数学语法来制订凸优化问题,而不是大多数求解器所要求的限制性规范模式。通过应用具备已知数学个性的函数库,联合常数、变量和参数来指定指标和约束条件集。当初让咱们看看几个例子。
最小二乘法 – 让咱们从一个简略的 LS 例子开始:最小化
当然,咱们能够应用 R 的根底线性模型拟合函数 lm()。
# 生成数据
m <- 100
n <- 10
beta_true <- c(-4:5)
# 生成数据
res <- lm(y ~ 0 + X) # 0 示意咱们的模型中没有截距。
用 CVXR 来做
result <- solve(prob)
str(result)
咱们当初能够很容易地增加一个限度条件来解决非负的 LS。
Problem(Minimize(obj), constraints = list(beta >= 0))
solve(prob)
持重的 Huber 回归 – 让咱们思考持重回归的简略例子:
最小化
其中
``````
sum(huber(y - X %*% beta, M)
Problem(Minimize(obj))
solve(prob)
弹性网正则化 – 咱们当初要解决的问题是:最小化
# 定义正则化项
elastic<- function(beta) {ridge <- (1 - alpha) * sum(beta^2)
lasso <- alpha * p_norm(beta, 1)
# 定义问题并解决它
sum((y - X %*% beta)^2) + elastic(beta, lambda, alpha)
Problem(Minimize(obj))
solve(prob)
稠密逆协方差矩阵 – 思考矩阵值的凸问题:最大化,条件是
log\_det(X) - matrix\_trace(X %*% S)
list(sum(abs(X)) <= alpha)
协方差 – 思考矩阵值的凸问题 :在 的条件下,最大化。
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)
投资组合优化– 思考马科维茨投资组合设计:最大化,
Problem(Maximize(obj), constr)
solve(prob)
论断
R 语言中可用的求解器的数量很多。倡议采取以下步骤。
- 如果是凸优化问题,那么开始进行初步测试。
- 如果速度不够快,应用 ROI。
- 如果依然须要更快的速度,那么如果问题属于定义好的类别之一,则应用该类别专用的求解器(例如,对于 LP,举荐应用 lpSolve,对于 QP 则应用 quadprog)。
- 然而,如果问题不属于任何类别,那么就必须应用非线性优化的个别求解器。在这个意义上,如果一个部分的解决方案就够了,那么能够用许多求解器的包。如果须要全局求解器,那么软件包 gloptim 是一个不错的抉择,它是许多全局求解器的包。
最受欢迎的见解
1.用 R 语言模仿混合制排队随机服务排队零碎
2. R 语言中应用排队论预测等待时间
3. R 语言中实现马尔可夫链蒙特卡罗 MCMC 模型
4. R 语言中的马尔科夫机制转换 (Markov regime switching) 模型
5.matlab 贝叶斯隐马尔可夫 hmm 模型
6.用 R 语言模仿混合制排队随机服务排队零碎
7.Python 基于粒子群优化的投资组合优化
8. R 语言马尔可夫转换模型钻研交通伤亡人数事变预测
9.用机器学习辨认一直变动的股市情况——隐马尔可夫模型的利用