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):
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"
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
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
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
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