% Simplified spot rate curve extraction (coupon stripping).
%
% This is a simplified example from the paper:
%
%   Analyzing the Indonesian Government Bond Market
%   with a New Coupon Stripping Model and Principal Components
%   by K. O. Kortanek and H. Yunianto
%   (see page 15 for the GP problem formulation)
%
% Performs the spot rate curve extraction (coupon stripping) from
% financial data that only include bonds with no coupon payments.
% This results in a GP that can be found on the page 15 of the paper.
%
% Almir Mutapcic 01/15/06

%********************************************************************
% problem data
%********************************************************************
% problem sizes
N = 2;   % number of bonds (length of PVhat)
L = 1;   % number of uniform perturbation intervals

% observed prices based on hypothetical bond data (this is made up data)
PVhat = [98.85; 96.25];
% maturity for each bond (in years)
T = [0.008; 0.015];

% problem constants (all made up)
RH    = 1; RL    = .5;
RHinf = 1; RLinf = .5;
WH    = 1; WL    = .5;

global beta gamma1 gamma2;
beta   = -0.1005;
gamma1 = 0.999*ones(N,1);
gamma2 = 0.999*ones(N,1);

%********************************************************************
% problem variables, objective function, and constraints
%********************************************************************
% GP variables
gpvar x(2*L+2+1)     % note: w_bar = exp(x_2*L+2+1)

% objective function
obj = inv(x(L+2+1)) + x(L+2+1);

% model prices
% denote P_k(T_k) as PV
PV = posynomial;
for k = 1:N
  PV(k,1) = 100*x(1)^ar(T(k))*x(2)^aalpha(T(k));
  PV(k,1) = PV(k)*x(3)^b(T(k)); % here b is the same as aalpha
end

% hard constraint on r
c1 = [ exp(-RH)*x(1) <= 1; exp(RL)*x(1)^(-1) <= 1];

% hard constraint on alpha/-beta
c2 = [ exp(RHinf*beta)*x(2) <= 1; exp(-RLinf*beta)*x(2)^(-1) <= 1];

% "driving" constraints
c_drive = [ exp(-WH)*x(3)*x(4)^-1*x(5)^-1 <= 1;
            exp(WL)*x(3)^-1*x(4)^-1*x(5)  <= 1 ];

% constraint set
constr = [ c_drive; c1; c2; PV <= PVhat ];

%********************************************************************
% solving the GP problem
%********************************************************************
% extract the spot rate curve from the observables
[oval sol status] = gpsolve(obj, constr);

% evaluate and display computed prices
disp(' ')
fprintf(1,'Estimate of PV(1) is %3.4f versus observed PV_hat(1) = %3.4f.\n',...
        eval(PV(1), sol), PVhat(1));
fprintf(1,'Estimate of PV(2) is %3.4f versus observed PV_hat(2) = %3.4f.\n',...
        eval(PV(2), sol), PVhat(2));
Problem succesfully solved.
 
Estimate of PV(1) is 98.5438 versus observed PV_hat(1) = 98.8500.
Estimate of PV(2) is 96.1782 versus observed PV_hat(2) = 96.2500.