原文链接:http://tecdat.cn/?p=22853
原文出处:拓端数据部落公众号
本文将介绍R中可用于投资组合优化的不同求解器。
通用求解器
通用求解器可以处理任意的非线性优化问题,但代价可能是收敛速度慢。
默认包
包stats(默认安装的基本R包)提供了几个通用的优化程序。
optimize()。用于区间内的一维无约束函数优化(对于一维求根,使用uniroot())。
展开全文
optim()通用优化,有六种不同的优化方法。
Nelder-Mead:相对稳健的方法(默认),不需要导数。
CG:适用于高维无约束问题的低内存优化
BFGS:简单的无约束的准牛顿方法
L-BFGS-B:用于边界约束问题的优化
SANN: 模拟退火法
Brent: 用于一维问题(实际上是调用optimize())。
这个例子做了一个最小二乘法拟合:最小化
下一个例子说明了梯度的使用,著名的Rosenbrock香蕉函数:
,梯度
,无约束最小化问题
optim(c(-1.2, 1), f, gr, method = "BFGS")
下面的例子使用了界约束。
最小化
约束:
这个例子使用模拟退火法(用于全局优化)。
constrOptim()。使用自适应约束算法,在线性不等式约束下最小化一个函数(调用optim())。
nlm(): 这个函数使用牛顿式算法进行目标函数的最小化。
nlminb(): 进行无界约束优化。.
optim
基础函数optim()作为许多其他求解器的包,可以方便地使用和比较。
全局优化
全局优化与局部优化的理念完全不同(全局优化求解器通常被称为随机求解器,试图避免局部最优点)。
特定类别问题的求解器
如果要解决的问题属于某一类问题,如LS、LP、MILP、QP、SOCP或SDP,那么使用该类问题的专用求解器会更好。
最小二乘法 (LS)
线性最小二乘法(LS)问题是将最小化,可能有界或线性约束。
线性规划(LP)
函数solveLP(),可以方便地解决以下形式的LP:
最小化:
约束:
混合整数线性规划 (MILP)
lpSolve(比linprog快得多,因为它是用C语言编码的)可以解决线性混合整数问题(可能带有一些整数约束的LP)。
solution
二次规划 (QP)
可以方便地解决以下形式的QP
解决具有绝对值约束和目标函数中的绝对值的二次规划。
二阶锥规划 (SOCP)
有几个包:
ECOSolveR提供了一个与嵌入式COnic Solver(ECOS)的接口,这是一个著名的、高效的、稳健的C语言库,用于解决凸问题。
CLSOCP提供了一个用于解决SOCP问题的一步平滑牛顿方法的实现。
优化基础
我们已经看到了两个包,它们是许多其他求解器的包。
用于凸问题、MIP和非凸问题
ROI包为处理R中的优化问题提供了一个框架。它使用面向对象的方法来定义和解决R中的各种优化任务,这些任务可以来自不同的问题类别(例如,线性、二次、非线性规划问题)。
LP – 考虑 LP:
最大化:
约束:
MILP – 考虑先前的LP,并通过添加约束条件x2,x3∈Z使其成为一个MILP.
BLP – 考虑二元线性规划 (BLP):
最小化:
约束:
SOCP – 考虑SOCP:
最大化:
约束:
并注意到SOC约束 可以写成或 ,在代码中实现为:。
SDP--考虑SDP:
最小化:
约束:
并注意SDP约束可以写成(大小为3是因为在我们的问题中,矩阵为2×2,但vech()提取了3个独立变量,因为矩阵是对称的)。
NLP – 考虑非线性规划(NLP)
最大化
约束
凸优化
R为凸优化提供了一种面向对象的建模语言。它允许用户用自然的数学语法来制定凸优化问题,而不是大多数求解器所要求的限制性标准形式。通过使用具有已知数学特性的函数库,结合常数、变量和参数来指定目标和约束条件集。现在让我们看看几个例子。
最小二乘法 – 让我们从一个简单的LS例子开始:最小化
当然,我们可以使用R的基础线性模型拟合函数lm()。
用CVXR来做
我们现在可以很容易地添加一个限制条件来解决非负的LS。
稳健的Huber回归 - 让我们考虑稳健回归的简单例子:
最小化
其中
弹性网正则化 - 我们现在要解决的问题是:最小化
稀疏逆协方差矩阵--考虑矩阵值的凸问题:最大化,条件是
协方差--考虑矩阵值的凸问题:在的条件下,最大化。
投资组合优化--考虑马科维茨投资组合设计:最大化,
结论
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.用机器学习识别不断变化的股市状况——隐马尔可夫模型的应用