worst.gms : Financial Optimization: Risk Management
The need for analyzing option portfolios arises because risk/return
tradeoffs grow increasingly more complex as more options are included
in a portfolio. This model evaluates the worst-case scenario for
an option portfolio.
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 Type: NLP
$Title Financial Optimization: Risk Management (WORST,SEQ=111)
$Ontext
The need for analyzing option portfolios arises because risk/return
tradeoffs grow increasingly more complex as more options are included
in a portfolio. This model evaluates the worst-case scenario for
an option portfolio.
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
Set t expiration date / jun, oct, jan /
i underlying issue / 9000011, 9020063 /
j options / 1*5 / ;
Table tdata(t,*) time related data
term r0 rmax rmin qmax qmin
jun 0.09167 0.0697 0.08570 0.05245 0.0788 0.0388
oct 0.33889 0.0790 0.09500 0.06175 0.0768 0.0368
jan 0.58889 0.0779 0.09390 0.06190 0.0768 0.0368 ;
* notation:
* term time in years to maturing
* r0 current estimated risk free rate
* rmax maximum risk free rate
* rmin minimum risk free rate
* qmax maximum volatility move
* qmin minimum volatility move
Table f0(i,t) adjusted spot price
jun oct jan
9000011 95.54 93.27 91.03
9020063 95.54 93.27 91.03 ;
Acronym future, call, puto;
Table pdata(i,t,j,*) portfolio data
type strike nom price
9000011.jun.1 future -35000 96.60
9000011.oct.1 future 15000 96.60
9020063.jun.1 future 74000 96.15
9020063.oct.1 future 20000 95.80
9020063.oct.2 call 95 -30000 3.00
9020063.oct.3 call 97 -30000 1.50
9020063.oct.4 puto 95 5000 0.25
9020063.oct.5 puto 97 15000 1.20
9020063.jan.1 future -290000 95.80
9020063.jan.2 call 95 25000 0.90
9020063.jan.3 call 97 -50000 0.90
9020063.jan.4 call 99 25000 0.90
9020063.jan.5 puto 99 50000 0.90 ;
* notation:
* type type of instrument (futures, call option, put option)
* strike strike price for call and put options
* nom nominal units of issue (ref. parameters x, y, and z)
* price price of futures or options premium
Variables
pval portfolio objective function value
d1(i,t,j) black d1
d2(i,t,j) black d2;
Positive Variables
f(i,t) futures price
c(i,j,t) call price
p(i,j,t) put price
r(t) risk free rate
q(t) volatility ;
r.lo(t) = tdata(t,"rmin") ;
r.up(t) = tdata(t,"rmax") ;
q.lo(t) = tdata(t,"qmin") ;
q.up(t) = tdata(t,"qmax") ;
f.lo(i,t) = .001 ;
f.l(i,t) = f0(i,t) * exp(tdata(t,"r0")*tdata(t,"term")) ;
r.l(t) = (r.lo(t) + r.up(t))/2 ;
q.l(t) = (q.lo(t) + q.up(t))/2 ;
Equations
tpv total portfolio value
futval(i,t,j) futures value
callval(i,t,j) call value
putval(i,t,j) put value
dd1(i,t,j) d1 in black model
dd2(i,t,j) d2 in black model;
tpv.. pval =e= sum((i,t,j)$pdata(i,t,j,"nom"),
(f(i,t) - pdata(i,t,j,"price")
* pdata(i,t,j,"nom"))$(pdata(i,t,j,"type") eq future)
+ (c(i,j,t) * pdata(i,t,j,"nom"))$(pdata(i,t,j,"type") eq call)
+ (p(i,j,t) * pdata(i,t,j,"nom"))$(pdata(i,t,j,"type") eq puto));
futval(i,t,j)$(pdata(i,t,j,"type") eq future)..
f(i,t) =e= f0(i,t) * exp(r(t)*tdata(t,"term")) ;
callval(i,t,j)$(pdata(i,t,j,"type") eq call)..
c(i,j,t) =e= exp(-r(t)*tdata(t,"term")) *
(f(i,t)*errorf(d1(i,t,j))
- pdata(i,t,j,"strike")*errorf(d2(i,t,j))) ;
putval(i,t,j)$(pdata(i,t,j,"type") eq puto)..
p(i,j,t) =e= exp(-r(t)*tdata(t,"term")) *
(pdata(i,t,j,"strike")*errorf(-d2(i,t,j))
- f(i,t)*errorf(-d1(i,t,j))) ;
dd1(i,t,j)$pdata(i,t,j,"strike")..
d1(i,t,j) =e= ( log(f(i,t)/pdata(i,t,j,"strike"))
+ 0.5*sqr(q(t))*tdata(t,"term"))
/ ( q(t)*sqrt(tdata(t,"term")) ) ;
dd2(i,t,j)$pdata(i,t,j,"strike")..
d2(i,t,j) =e= d1(i,t,j) - q(t)*sqrt(tdata(t,"term")) ;
Model riskmod / all /;
* worst case
Solve riskmod using nlp minimizing pval;
* best case
Solve riskmod using nlp maximizing pval;