Worst case risk analysis

Generate data for worst-case risk analysis.

using Random
using LinearAlgebra
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)
Sigma_nom .+= (1e-4 - eigmin(Sigma_nom)) * I(n) # ensure positive-definite
5×5 Matrix{Float64}:
 0.815627  0.810538  0.552307  0.705074  0.305739
 0.810538  0.900299  0.503982  0.653689  0.264473
 0.552307  0.503982  0.520053  0.555206  0.239068
 0.705074  0.653689  0.555206  0.65939   0.30417
 0.305739  0.264473  0.239068  0.30417   0.253124

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 = true)
Problem statistics
  problem is DCP         : true
  number of variables    : 1 (5 scalar elements)
  number of constraints  : 3 (3 scalar elements)
  number of coefficients : 35
  number of atoms        : 13

Solution summary
  termination status : OPTIMAL
  primal status      : FEASIBLE_POINT
  dual status        : FEASIBLE_POINT
  objective value    : 0.2666

Expression graph
  minimize
   └─ sum (convex; positive)
      └─ * (convex; positive)
         ├─ [1;;]
         └─ qol_elem (convex; positive)
            ├─ …
            └─ …
  subject to
   ├─ == constraint (affine)
   │  └─ + (affine; real)
   │     ├─ sum (affine; real)
   │     │  └─ …
   │     └─ [-1;;]
   ├─ ≥ constraint (affine)
   │  └─ + (affine; real)
   │     ├─ sum (affine; real)
   │     │  └─ …
   │     └─ [-0.1;;]
   └─ ≤ constraint (convex)
      └─ + (convex; real)
         ├─ sum (convex; positive)
         │  └─ …
         └─ [-2;;]
wval = vec(evaluate(w))
5-element Vector{Float64}:
 -0.5000121289959703
  0.525728210844552
  0.340754030857417
  1.273230184000672e-7
  0.6335297535662603

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 = true)
Problem statistics
  problem is DCP         : true
  number of variables    : 2 (50 scalar elements)
  number of constraints  : 5 (105 scalar elements)
  number of coefficients : 92
  number of atoms        : 19

Solution summary
  termination status : OPTIMAL
  primal status      : FEASIBLE_POINT
  dual status        : FEASIBLE_POINT
  objective value    : 0.7635

Expression graph
  maximize
   └─ sum (affine; real)
      └─ * (affine; real)
         ├─ * (affine; real)
         │  ├─ …
         │  └─ …
         └─ 5×1 Matrix{Float64}
  subject to
   ├─ == constraint (affine)
   │  └─ + (affine; real)
   │     ├─ 5×5 real variable (id: 100…712)
   │     └─ Convex.NegateAtom (affine; real)
   │        └─ …
   ├─ == constraint (affine)
   │  └─ + (affine; real)
   │     ├─ diag (affine; real)
   │     │  └─ …
   │     └─ Convex.NegateAtom (constant; negative)
   │        └─ …
   ├─ ≤ constraint (convex)
   │  └─ + (convex; real)
   │     ├─ abs (convex; positive)
   │     │  └─ …
   │     └─ Convex.NegateAtom (constant; negative)
   │        └─ …
   ⋮
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.52
worst-case standard deviation = 0.87
worst-case Delta =
[3.2e-9 -0.2 -0.2 -0.085 -0.2; -0.2 2.5e-8 0.16 -0.016 0.14; -0.2 0.16 1.1e-8 -0.13 0.1; -0.085 -0.016 -0.13 -1.5e-10 -0.096; -0.2 0.14 0.1 -0.096 -2.1e-8]

This page was generated using Literate.jl.