All of the examples can be found in Jupyter notebook form here.

Worst case risk analysis

Generate data for worst-case risk analysis.

using Random

Random.seed!(2);
n = 5;
r = abs.(randn(n, 1)) / 15;
Sigma = 0.9 * rand(n, n) .- 0.15;
Sigma_nom = Sigma' * Sigma;
Sigma_nom .-= (maximum(Sigma_nom) - 0.9)
5×5 Matrix{Float64}:
 0.54178     0.45192   0.328892    0.0123621   0.400576
 0.45192     0.694173  0.416407   -0.237798    0.295939
 0.328892    0.416407  0.496781    0.0266768   0.31054
 0.0123621  -0.237798  0.0266768   0.414028   -0.181312
 0.400576    0.295939  0.31054    -0.181312    0.9

Form and solve portfolio optimization problem. Here we minimize risk while requiring a 0.1 return.

using Convex, SCS
w = Variable(n);
ret = dot(r, w);
risk = sum(quadform(w, Sigma_nom));
problem = minimize(risk, [sum(w) == 1, ret >= 0.1, norm(w, 1) <= 2])
solve!(problem, SCS.Optimizer; silent_solver = true)
wval = vec(evaluate(w))
5-element Vector{Float64}:
 -0.2586240295446913
  0.538979183077634
 -0.2414273928993483
  0.7513891854911889
  0.20968322678317122

Form and solve worst-case risk analysis problem.

Sigma = Semidefinite(n);
Delta = Variable(n, n);
risk = sum(quadform(wval, Sigma));
problem = maximize(
    risk,
    [
        Sigma == Sigma_nom + Delta,
        diag(Delta) == 0,
        abs(Delta) <= 0.2,
        Delta == Delta',
    ],
);
solve!(problem, SCS.Optimizer; silent_solver = true)
println(
    "standard deviation = ",
    round(sqrt(wval' * Sigma_nom * wval), sigdigits = 2),
);
println(
    "worst-case standard deviation = ",
    round(sqrt(evaluate(risk)), sigdigits = 2),
);
println("worst-case Delta = ");
println(round.(evaluate(Delta), sigdigits = 2));
standard deviation = 0.27
worst-case standard deviation = 0.82
worst-case Delta =
[-1.9e-8 -0.2 0.19 -0.2 -0.2; -0.2 2.6e-9 -0.2 0.2 0.2; 0.19 -0.2 -2.3e-8 -0.2 -0.2; -0.2 0.2 -0.2 5.3e-9 0.2; -0.2 0.2 -0.2 0.2 8.4e-10]

This page was generated using Literate.jl.