immun.gms : Financial Optimization: Risk Management

Description

Several different models have been developed during the seventies
to manage financial risks. Immunization, dedication and combination
models of various flavors are presented. The presentation of the
models follows closely chapter one of the book Financial Optimization.

The models are designed to capture the essential features using a small
data set derived from U.S.Treasury Quotes for 6/23/89 from the Wall Street
Journal.

The family of models presented in this file are

IMMUN1  Dollar Duration Immunization Model
IMMUN2  Gain Oriented Immunization Model
IMMUN3  Dollar Convexity Immunization Model
FACTOR1 Factor Immunization Model
FACTOR2 Factor Immunization Model
DEDIC   Bond Dedication Model
COMB1   Combination Matching Model
COMB2   Horizon Matching Model
COMB3   Factor Horizon Matching Model
SIGMA   Minimum Cashflow Variance Model

All share the same liability and security data. Common formulations
are exploited to better show the relationship between these models

Reference

  • Dahl, H, Meeraus, A, and Zenios, S A, Some Financial Optimization Models: Risk Management. In Zenios, S A, Ed, Financial Optimization. Cambridge University Press, New York, NY, 1993.

Small Model of Types : QCP lp


Category : GAMS Model library


Main file : immun.gms

$Title Financial Optimization: Risk Management (IMMUN,SEQ=110)

$Ontext

   Several different models have been developed during the seventies
   to manage financial risks. Immunization, dedication and combination
   models of various flavors are presented. The presentation of the
   models follows closely chapter one of the book Financial Optimization.

   The models are designed to capture the essential features using a small
   data set derived from U.S.Treasury Quotes for 6/23/89 from the Wall Street
   Journal.

   The family of models presented in this file are

   IMMUN1  Dollar Duration Immunization Model
   IMMUN2  Gain Oriented Immunization Model
   IMMUN3  Dollar Convexity Immunization Model
   FACTOR1 Factor Immunization Model
   FACTOR2 Factor Immunization Model
   DEDIC   Bond Dedication Model
   COMB1   Combination Matching Model
   COMB2   Horizon Matching Model
   COMB3   Factor Horizon Matching Model
   SIGMA   Minimum Cashflow Variance Model

   All share the same liability and security data. Common formulations
   are exploited to better show the relationship between these models


Dahl, H, Meeraus, A, and Zenios, S A, Some Financial Optimization
Models: Risk Management. In Zenios, S A, Ed, Financial Optimization.
Cambridge University Press, New York, NY, 1993.

$Offtext

$Stitle  Liability Information


Set   tl liability time  / tl0*tl5 /


Table  liab(tl,*)  liability data

        month   day    year   liability    liabrate
  tl0     6      23    1989           0    0.092370
  tl1     9       1    1989       50000    0.092281
  tl2     6      15    1990       42000    0.090367
  tl3    12       1    1990       40000    0.088643
  tl4    12       1    1991       40000    0.085649
  tl5     6       1    1993       45000    0.086548  ;

Scalar basedate earliest liability date;

basedate = smin(tl, jdate(liab(tl,'year'),liab(tl,'month'),liab(tl,'day')));

liab(tl,'days') = jdate(liab(tl,'year'),liab(tl,'month'),liab(tl,'day')) - basedate;
liab(tl,'term') = liab(tl,'days')/365;


Parameters
  rl(tl)    interest rate of liability
  pl        present value of liability
  kl        dollar duration of liability
  ql        dollar convexity of liability;

rl(tl) =  liab(tl,"liabrate");
pl     =  sum( tl, liab(tl,'liability')
                 * exp(-rl(tl)*liab(tl,'term')) );
kl     = -sum( tl, liab(tl,'liability')
                 * exp(-rl(tl)*liab(tl,'term'))
                 * liab(tl,'term')  );
ql     =  sum( tl, liab(tl,'liability')
                 * exp(-rl(tl)*liab(tl,'term'))
                 * sqr(liab(tl,'term')) );

* note: (1) liability interest rate fitted from cubic spline prototype.
*       (2) continuous compounding used for liabilities.

Display  pl, kl, ql;

$Stitle  security information

Sets  i   securities      / bond-1*bond-8 /
      ts  time points     / 89-07, 89-08, 90-02, 90-08, 91-02
                            91-08, 92-02, 92-08, 93-02, 93-08 /


Table  stime(ts,*)  time information for securities

            month  day   year
  89-07       7     15   1989
  89-08       8     15   1989
  90-02       2     15   1990
  90-08       8     15   1990
  91-02       2     15   1991
  91-08       8     15   1991
  92-02       2     15   1992
  92-08       8     15   1992
  93-02       2     15   1993
  93-08       8     15   1993  ;

stime(ts,'days') = jdate(stime(ts,'year'),stime(ts,'month'),stime(ts,'day'))
                 - basedate;
stime(ts,'term') = stime(ts,'days') / 365;


Table  sdata(*,i)  security data

           bond-1     bond-2     bond-3    bond-4
  89-07  103.8125   107.2500
  89-08                          7.4375    3.6250
  90-02                          7.4375    3.6250
  90-08                          7.4375    3.6250
  91-02                          7.4375    3.6250
  91-08                        107.4375    3.6250
  92-02                                    3.6250
  92-08                                  103.6250

  yield    8.35       8.56       8.08      8.29
  price   99.9063   100.2812   113.0625   97.1563
  accr     3.3491     6.3688     5.2597    2.5635


+          bond-5     bond-6     bond-7    bond-8
  89-08    4.1250     4.3125     4.375     5.9375
  90-02    4.1250     4.3125     4.375     5.9375
  90-08    4.1250     4.3125     4.375     5.9375
  91-02    4.1250     4.3125     4.375     5.9375
  91-08    4.1250     4.3125     4.375     5.9375
  92-02    4.1250     4.3125     4.375     5.9375
  92-08  104.1250     4.3125     4.375     5.9375
  93-02               4.3125     4.375     5.9375
  93-08             104.3125   104.375   105.9375

  yield    8.37       8.35       8.35      8.36
  price   99.6563   100.9375   101.3750  112.0625
  accr     2.9171     3.0497     3.0939    4.1989   ;

* note: (3) accr is interest accrued in the current coupon period
*           to date.


Parameters
  r(i)       current yield of security
  cf(ts,i)   cash flow of security
  p(i)       present value of security (current price)
  pv(i)      present value of cashflows of security
  k(i)       dollar duration of security
  q(i)       dollar convexity of security;

cf(ts,i) =  sdata(ts,i) * 10;
r(i)     =  sdata('yield',i) / 100;
p(i)     =  (sdata('price',i) + sdata('accr',i)) * 10;
pv(i)    =  sum( ts, cf(ts,i) * (1+r(i)/2)**(-2*stime(ts,'term')-1) );
k(i)     = -sum( ts, cf(ts,i) *
             stime(ts,'term') * (1+r(i)/2)**(-2*stime(ts,'term')-1) );
q(i)     =  sum( ts, cf(ts,i) * (stime(ts,'term')+1) *
             stime(ts,'term') * (1+r(i)/2)**(-2*stime(ts,'term')-2) );

* note: (4) dollar amounts scaled by 10 to indicate par value.
*       (5) current price used to indicate present value.
*       (6) dollar duration and dollar convexity uses semiannual
*            compounding.

Display  k, q;

$Stitle  immunization model equations

Variables
  omega        objective value
  x(i)         security ;

Positive Variable  x;


Equations
    objdef1   objective definition immun1
    objdef2   objective definition immun2
    objdef3   objective definition immun3
    pvm       present value match
    ddm       dollar duration match
    dcm       dollar convexity constraint;


  objdef1..  omega =e= sum(i, k(i)*r(i)*x(i));

  objdef2..  omega =e= sum(i, (p(i)-pv(i))*x(i));

  objdef3..  omega =e= sum(i, q(i)*x(i));

  pvm..      sum(i, p(i)*x(i)) =e= pl;

  ddm..      sum(i, k(i)*x(i)) =e= kl;

  dcm..      sum(i, q(i)*x(i)) =g= ql;


 Model immun1 dollar duration immunization model  / objdef1,pvm,ddm    /
       immun2 gain oriented immunization model    / objdef2,pvm,ddm    /
       immun3 dollar convexity immunization model / objdef3,pvm,ddm,dcm/;

 Solve immun1 maximizing omega using lp ;

 Solve immun2 minimizing omega using lp ;

 Solve immun3 minimizing omega using lp ;

$Stitle  factor loading model

Set  tf     factor dates in years from 6-23-89  / tf0  * tf10 /
     j      factors                             / shift, tilt, curve /
     ja(j)  active factors ;

* shape risk factors
*   shift   parallel shifts to term structure curve
*   tilt    changes in steepness of term structure curve
*   curve   changes in overall curvature of the term structure curve


Table  a(tf,*)  factor loading array for yearly time intervals

           term   shift    tilt  curve
  tf0         0      42     -25     -6
  tf1         1      43     -22     -4
  tf2         2      44     -16     -2
  tf3         3      45     -12      0
  tf4         4      46      -6      4
  tf5         5      47       0      8
  tf6         6      47       2      8
  tf7         7      46       4      6
  tf8         8      45       6      4
  tf9         9      44       8      2
  tf10       10      43      10      0 ;


Parameters
  sfac(ts,j)    interpolated factor loadings on term of securities
  lfac(tl,j)    interpolated factor loadings on term of liabilities
  f(i,j)        factor sensitivities of securities
  fl(j)         factor sensitivities of liabilities ;


Loop( (ts,tf)$(a(tf,"term") eq trunc(stime(ts,"term"))),
  sfac(ts,j) = ( a(tf,j) +
                 (a(tf+1,j)-a(tf,j)) * (stime(ts,"term")-a(tf,"term")) )
                   / 100 );

Loop( (tl,tf)$(a(tf,"term") eq trunc(liab(tl,"term"))),
  lfac(tl,j) = ( a(tf,j) +
                 (a(tf+1,j)-a(tf,j)) * (liab(tl,"term")-a(tf,"term")) )
                   / 100 );


f(i,j) = - sum( ts, sfac(ts,j) * cf(ts,i) *
             stime(ts,"term") * (1+r(i)/2)**(-2*stime(ts,'term')-1) );

fl(j)  = - sum( tl, lfac(tl,j) * liab(tl,"liability") *
             liab(tl,"term")  * exp(-rl(tl)*liab(tl,"term")) );


Positive Variable
    dif(j)  elastic difference in factor match (surplus);

* note:  nonzero solution values of dif(j) indicate infeasibilities.


Equations
    objdef4       objective definition
    fm(j)         factor match
    diffm(j)      difference between factor match when infeasible ;


  objdef4..     omega =e= sum(i, k(i)*r(i)*x(i)) - sum(ja, dif(ja)) ;

  fm(ja)..      sum(i, f(i,ja)*x(i)) =e= fl(ja) ;

  diffm(ja)..   sum(i, f(i,ja)*x(i)) - fl(ja)  =e=  dif(ja) ;


 Model factor1 factor immunization model  / objdef1, pvm, fm /
       factor2 factor immunization model  / objdef4, pvm, diffm /;

 ja(j) = yes;

 Solve factor1 maximizing omega using lp;
 Solve factor2 maximizing omega using lp;

$Stitle  bond dedication model

Parameters
  rr        reinvestment rate
  del(tl)   interval between liability payments
  d(tl,i)   reinvested value of bond cashflow between liability dates;

  rr      = .05;
  del(tl) = liab(tl,"term") - liab(tl-1,"term");

  d(tl,i) = sum( ts$(liab(tl-1,"term") lt stime(ts,"term")
                  and stime(ts,"term") le liab(tl,"term")),
            cf(ts,i) * (1+rr)**(liab(tl,"term")-stime(ts,"term")) );


Variable
  s(tl)      cash holdings (surplus) at time tl
  l(tl)      funded liability ;

Positive Variable  s, l;

l.lo(tl) = liab(tl,"liability");


Equations  objdef5    objective definition for cost
           cbal(tl)   cashflow balance ;

objdef5..  omega =e= sum(i, p(i)*x(i)) + s("tl0");

cbal(tl).. sum(i, d(tl,i)*x(i)) + s(tl-1)*(1+rr)**del(tl) =e= l(tl) + s(tl) ;

Model dedic bond dedication model / objdef5, cbal /;

 Solve dedic minimizing omega using lp;

$Stitle  combination matching (horizon matching)

l.lo(tl)$(liab(tl,"year") gt 1992) =0;

Equation  hm  horizon matching ;

  hm..  kl*(sum(i, p(i)*x(i)) + s("tl0")) =e=  pl*sum(i, k(i)*x(i)) ;


 Model comb1 combination matching model     / objdef5, cbal, hm  /
       comb2 horizon matching model         / objdef5, cbal, ddm /
       comb3 factor horizon matching model  / objdef5, cbal, fm  /

 Solve comb1 minimizing omega using lp;
 Solve comb2 minimizing omega using lp;
 ja(j) = yes;
 Solve comb3 minimizing omega using lp;

$Stitle  minimum cashflow variance model

Variable
  variance     variance of cashflows ;

omega.up = pl;
l.lo(tl) = 0;


Equation
    objdef6    cashflow variance ;

  objdef6..   variance =e= sum(tl, sqr( liab(tl,"liability")-l(tl)) );


Model sigma  minimum cashflow variance model  / objdef6, cbal, objdef2 /;

Solve sigma  minimizing variance using qcp;