gpt4 book ai didi

r - 平均方差优化

转载 作者:行者123 更新时间:2023-12-03 16:01:52 26 4
gpt4 key购买 nike

我正在做平均方差优化来解决投资组合优化问题。我想要做的是最小化关于两个约束的差异:

  • x1m1+x2m2+...+xnmn=m
  • x1+x2+...+xn=1

  • 所以这是我做的代码:
    ################ Simulation for n=3 ################
    ################ Parameters ################
    mu<-50 ## Mean of the portfolio
    n<-3 ## Number of asset
    m1<-30000 ## Size of the simulation
    ########### 3 Assets ############
    x<- rnorm(m1,2,1)
    y<- rnorm(m1,0.5,1.5)
    z<- rnorm(m1,3.75,1)
    d<-data.frame(x,y,z)

    ################ Solution Directe ################
    Sol<-function(m1) {
    A = matrix(nrow=n+2, ncol=n+2)
    for (i in 1:n){
    for (j in 1:n)
    if(i==j) {
    A[i,j] <- (2*var(d[,i]))
    } else {
    A[i,j] <- cov(d[,i],d[,j])
    }
    }

    for (i in 1:n){
    A[i,n+1] <- -mean(d[,i])
    A[i,n+2] <- -1
    }
    for (j in 1:n){
    A[n+1,j] <- mean(d[,j])
    A[n+2,j] <- 1
    }

    for (i in 2:n+2){
    for (j in 2:n+2)
    if(i==j) {
    A[i,j] <- 0
    } else {
    A[i,j] <- 0
    }
    }
    A
    Inv=solve(A)
    Sol=Inv%*%c(0,0,0,m1,1)
    result=list(x=Sol,A=A,Inv=Inv)
    return(result)
    }
    Sol(mu)
    Sol(mu)$x ## The solution
    Sol(mu)$A

    我知道,我对 R 使用了很多不好的东西,但我想不出更好的解决方案。所以我的问题是正确的吗?

    任何改进此过程的更正和建议!请随时在 R 中分享您现有的代码。

    非常感谢!

    最佳答案

    一种方法是通过 solnp() 在数值上最小化来自 Rsolnp包裹。这也提供了一种添加更多限制(杠杆限制等)的方法:

    muVec <- colMeans(d) #mean-vector of assets
    Sigma <- cov(d) #covariance-matrix
    fmin <- function(x) as.numeric(t(x) %*% Sigma %*% x) #variance of portfolio to min.
    eqn <- function(x) c(t(x) %*% muVec, sum(x)) #equality restriction
    sol <- function(mu) Rsolnp::solnp(rep(0.5, 3), fun=fmin, eqfun=eqn, eqB=c(mu,1))
    x <- sol(50)

    求解后,我们现在可以打印参数和投资组合方差:
    > x$par
    [1] -5.490106 -11.270906 17.761012
    > x$vscale[1]
    [1] 630.4916

    在您的简单情况下,存在一个封闭的解决方案,可以归结为:
    S <- solve(Sigma)
    A <- matrix( c(t(muVec) %*% S %*% muVec,
    rep( t(muVec) %*% S %*% rep(1,3), 2),
    t(rep(1,3)) %*% S %*% rep(1,3)), ncol=2
    )
    sol2 <- function(mu) S %*% cbind(muVec,1) %*% solve(A) %*% c(mu,1)

    “幸运的是”给出了相同的结果:
    > sol2(50)
    [,1]
    x -5.490106
    y -11.270906
    z 17.761012
    > fmin(sol2(50))
    [1] 630.4916

    关于r - 平均方差优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27966437/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com