r - R最小方差投资组合:求解不可逆矩阵
问题描述
我想解决有关使用 R 的最小方差投资组合的优化问题,如本网站所述:http ://enricoschumann.net/R/minvar.htm
问题是:我要使用的矩阵的列 (=assets) 比行 (=observations) 多,这就是为什么它不是正定且不可逆的。
您可以通过使用与网站上的变量相反的值来重新创建此问题,这会导致以下结果:
nO <- 10L ## number of observations
nA <- 100L ## number of assets
mData <- array(rnorm(nO * nA, sd = 0.05),
dim = c(nO, nA)) #Creating sample stock observations
library("quadprog")
aMat <- array(1, dim = c(1,nA))
bVec <- 1
zeros <- array(0, dim = c(nA,1))
solQP <- solve.QP(cov(mData), zeros, t(aMat), bVec, meq = 1) #Minimize optimization
solQP$solution
这导致以下错误:
matrix D in quadratic function is not positive definite!
有没有人知道其他函数来解决 mData 的优化问题或使 mData 可逆而不丢失信息的方法?
期望的结果是最小方差投资组合中每种资产的权重。
解决方案
你可以试试:
library(Matrix)
Q = nearPD(cov(mData))$mat
然后使用Q
而不是cov(mData)
.
还有一个基于调整后收益的替代均值方差模型可以直接处理您的案例。见链接。不幸的是,使用 QuadProg (链接)实现这一点并不容易。
推荐阅读
- android - Ionic 5 + Angular + Capacitor + Motion 不会在真正的 Android 设备上触发监听器
- sql - 比较同一表中两列中的值并创建新列
- ios - 如何从 UIProgressView 中移除模糊效果/使 progressView 的背景完全透明?
- c++ - 将对象传递给 lambda std::thread (C++) 中的函数:尝试使用已删除的函数
- python - NameError:未定义名称“线程”将在终端中运行 Python 程序
- reactjs - React Leaflet:标记组件的自定义事件“onClick”
- c++ - 为什么新的 Visual Studio 将字符串文字作为指向常量的指针?
- php - PHP 将内容写入 javascript 脚本
- javascript - 如何使 am 数组不可变
- javascript - 基于javascript中的数组长度和数组值(日期格式)对数组进行排序?