(!****************************************************** Xpress-SP Example ====================== `````````````````` FILE: ALM.mos DESCRIPTION: Stochastic 2-stage linear model TYPE: Finance: Asset liability management We consider one of the practically important instances of these problems - assets and liabilities management for pension funds. A typical pension fund has members that can be separated into two classes. The first class is “active members”, i.e., employees paying a certain fraction of their wages to the pension fund each month. The second class is “non-active” members, i.e., people who have retired and receive payments from the pension fund. At every time period the pension fund should have enough assets to be able to cover all the payments (liabilities). The problem the pension fund manager is faced with is minimizing the contribution rate (fraction of wages) paid by the active members while being able to cover the liabilities. The setup of the problem aims to ensure that the percentage of wages that the employees pay is small enough to attract new pension fund members. To cover the liabilities, assets owned by the fund are invested into stocks, whose returns are uncertain. Moreover, the amount of liabilities is also uncertain, since it depends on the inflation rate and demographic factors. Stochastic programming techniques allow one to parse the deterministic formulation of the model by using scenario data for uncertain parameters. MODEL: Parameters of the model A0 – the initial value of all assets owned by the fund. W0 – the total amount of wages of the active members at the initial moment. l0 – the payments made by the fund at the initial moment. r(n) – the rate of return of the stock # n, n = 1, … , N. L – the liability measure that should be exceeded by the total value of assets at the end of the period. ř – the parameter used to control the behavior of the fund. We want the total return to exceed the liabilities by a certain amount, for instance, if ř=1.3 then we want the total return to be at least 30% higher than the liabilities. Decision variables x(n) – the total amount of money invested in the stock # n, n = 1, … , N. y – the contribution rate (fraction of wages) that is added to the initial assets at the initial time moment FURTHER INFO: see Xpress-SP guide DATE: Oct 2006 (c) 2006 Dash Associates Author: Nitin Verma Dash Optimization Inc, NJ *******************************************************!) model ALM_sp uses 'mmsp' !use the stochastic programming module parameters psi=1.3 DIR="Data/" end-parameters declarations Stocks=1..12 !set of stocks Intial_Asset,A: real Initial_payment,l: real !payments at the initial time Total_wages,W: real !total amount of wages of active members of the fund end-declarations !initial (deterministic) parameters initializations from DIR+'ALM.dat' Intial_Asset Initial_payment Total_wages end-initializations A:=1 !scaled value of initial assets l:=Initial_payment/Intial_Asset !scaled value of initial payments W:=Total_wages/Intial_Asset !scaled value of wages setparam('xsp_disp_warnings',true) declarations Stages={"First","Second"} !two stages - one-period model !random parameters return:array(Stocks) of sprand !uncertain returns of the stocks L: sprand !uncertain liabilities !decision variables x:array(Stocks) of spvar !amount invested into each stock y:spvar !percentage of wages paid by active members !model objective and constraints fraction:splinctr inv_balance:splinctr minreturn:splinctr end-declarations y is_free !allow contribution rate to be both positive and negative !setting stages spsetstages(Stages) forall(p in Stocks) spsetstage(return(p),"Second") spsetstage(L,"Second") !scenarios declaration & generating scenario tree declarations S=500 Values:array(1..S, Stocks) of real Liab:array(1..S) of real end-declarations spcreatetree(S) forall(s in 1..S) prob(s):=1/S spsetprobcond(2,prob) initializations from DIR+'returns.dat' Values end-initializations initializations from DIR+'Liabilities.dat' Liab end-initializations forall(p in Stocks,s in 1..S) spsetrandatnode(return(p),s,Values(s,p)) forall(s in 1..S) spsetrandatnode(L,s,Liab(s)/Intial_Asset) spgentree !model definition fraction:= y inv_balance:=sum(p in Stocks) x(p) = A - l + W*y minreturn:=sum(p in Stocks)(1+return(p))*x(p) >= psi*L !assigning variables to stages forall(p in Stocks) spsetstage(x(p),"First") spsetstage(y,"First") !optimizing minimize(fraction) !solution output writeln("psi = ", psi) writeln("contribution rate = ", getobjval) forall(p in Stocks) writeln("x(", p, ") = ", getsol(x(p))) end-model