Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Constraint function in optimize()

    Hello,

    I'm currently facing the following problem: I'm trying to minimize the variance of a portfolio by changing the weights of the assets, but under a constraint regarding a different parameters, specifically the risk contribution of each asset to the total volatility of the portfolio should be equal. Now I want to introduce two constraints:

    CoVarA = Covariance Matrix of Assets (4x4)
    b = weight vector of the 4 assets (4x1)

    1) All the weights add up to 1, which I managed with the "optimize_init_constraints" command as seen below (this one works):

    Code:
    mata:
    
     mata clear
     
     CoVarA =st_matrix("CoVarA")
     
     void i_VarPF(todo, b, VarPF,g,H)
    
     {
    
        external CoVarA
    
        b=abs(b)
    
        VarPF = b*CoVarA*b'
     
      }
    
    
    SumConstraint=1
    Unitvector=J(1,4,1)
    
    
     guess=J(1,4,0)
     
     S=optimize_init()
    
     optimize_init_evaluator(S, &i_VarPF())
     
     optimize_init_which(S, "min")
     
     optimize_init_evaluatortype(S,"d0")
     
     optimize_init_params(S, guess)
     
     optimize_init_conv_maxiter(S, 10000)
     
     optimize_init_constraints(S, (Unitvector,SumConstraint))
      
     p=optimize(S)
     p
       
     end
    Now to the actual problem:

    2) Now the second constraint I want to introduce is not directly on the weight vector b, but on a calculated matrix including b as the only changing variable, more specifically the RelativeRiskA. This should be that each of the assets is contributing the same risk to the final portfolio, which should look like (0.25,0.25,0.25,0.25). This is the code for the calculation of the RelativeRiskA:

    FactorL = Factor loading matrix (4x3)
    weights = weights of the assets --> should then here be replaced with the input from the optimization loop "b"

    Code:
    mata:
    
    
    mata clear
    FactorL = st_matrix("FactorL")
    CoVarA =st_matrix("CoVarA")
    weights =st_matrix("weights")
    
    VarPF=weights'*CoVarA*weights
    StdPF =sqrt(VarPF)
    StdPF
    
    MarginalRiskA=(CoVarA*weights)/(sqrt(weights'*CoVarA*weights))
    MarginalRiskA
    
    RiskContributionA=MarginalRiskA*weights'*weights
    RiskContributionA
    
    RelativeRiskA=RiskContributionA/StdPF
    RelativeRiskA
    
    
    
    end
    The problem now is to put this as a constraint into the optimization function. Does anyone have an idea how to solve this issue?

    Please let me know if you need any more information. I'm posting here for the first time and just been coding for a few days, so don't mind my "non-lean" code

    Thanks a lot for any input!!

    Best regards,
    Jérôme
Working...
X