R语言下的frontcon函数,由mean-variance画有效前沿。

来源:互联网 发布:js单选框选中事件 编辑:程序博客网 时间:2024/05/08 08:08

第一次发博文,以后就在CSDN安家落地了,markdown编辑器感觉还很不错╮(╯▽╰)╭,就是我完全不会用。
研究马科维茨的均值方差模型时,试图用稳健的方法求出稳健均值和稳健协方差矩阵,发现R语言下居然没有像资产组合有效前沿的解和最优解(MATLAB语言) 一文中所说的frontcon函数。
于是我便尝试着自己写frontcon。

有效前沿实际上就是在给定期望回报率下,求风险最小;或者给定风险的情况下,求回报率最大。这样就能得到一个 (return,risk)的点。

公式如下图:
这里写图片描述
这个公式用到了二次规划,实在给定的期望下,求风险最小。

按照资产组合有效前沿的解和最优解(MATLAB语言) 一文中的例子,我写了如下代码。

install.packages("quadprog")library(quadprog)ExpReturn=c(0.405533,0.49012,0.507552,0.620121,0.438577)ExpCovariance=matrix(c(0.000603,0.000565,0.000644,0.000589,0.000512,0.000565,0.000596,0.000656,0.000612,0.000537,0.000644,0.000656,0.000839,0.00071,0.000648,0.000589,0.000612,0.00071,0.000716,0.000643,0.000512,0.000537,0.000648,0.000643,0.000712),nrow = 5)frontcon <- function(ExpReturn, ExpCovariance, Numports = 10, float = 4){  size = length(ExpReturn);  if(dim(ExpCovariance)[1] != size | dim(ExpCovariance)[2] != size    )    stop("Fucking size!");  minReturn = round(range(ExpReturn)[1], float) + 1/10^4  maxReturn = round(range(ExpReturn)[2], float);  ## 获得期望回报率的区间  seqReturn = seq(minReturn, maxReturn, length.out = Numports);  risks = 0; risks = risks[-1];  for(i in 1:Numports){    ###  二次规划求一个(return,risk)的点    A <- cbind(rep(1, size), ExpReturn,diag(rep(1, size))) #约束系数    D <- ExpCovariance # 协方差矩阵    x <- ExpReturn # 期望收益    b <- c(1, seqReturn[i], rep(0, size)) #约束的右侧值    res <- solve.QP(2*D, x, A, b, meq = 2 )  ##   meq 指的是限制条件中,前meq个条件为"="    risks = c(risks,t(res$solution) %*% ExpCovariance %*% res$solution);  }  output = data.frame(PortRisk = risks, PortReturn = round(seqReturn,float));  output}frontcon(ExpReturn,ExpCovariance, 30)
1 0
原创粉丝点击