MODEL: ! (Scenarios.lng);
!Generate scenarios so that the random variables
have a multivariate Normal distribution that statistically
match a given covariance matrix;
! Keywords: Cholesky factorization, Covariance matching,
Stochastic programming, Risk management, Scenario;
SETS:
ASSET: MEAN, SD;
TMAT( ASSET, ASSET): CORR, COVAR, LF;
SCENE;
SXA(SCENE,ASSET): U, DEMAND, SNORM;
ENDSETS
DATA:
! Assets or objects, each of which has an associated random
variable, e.g., demand, or return on investment;
ASSET = GMTRK HONDA TOYTRK GMCAR OTHER;
! The statistical features of available buyer contracts;
MEAN = 550000 680000 420000 800000 80000;
SD = 180000 100000 110000 250000 30000;
! Correlation matrix;
CORR =
!GMTRK; 1 -.53 -.45 .54 0
!HONDA; -.53 1 .31 -.28 0
!TOYTRK; -.45 .31 1 -.40 0
!GMCAR; .54 -.28 -.40 1 0
!AFTER; 0 0 0 0 1
SCENE = 1..16; ! Number of scenarios or samples;
NSEED = 23; ! Random number seed;
U = @QRAND(NSEED); ! Generate a matrix of uniforms;
ENDDATA
! Compute the covariance matrix from the correlation
matrix and the standard deviations;
@FOR(TMAT(i,j):
@FREE(COVAR(I,J));
COVAR(i,j)= CORR(i,j)*SD(i)*SD(j);
);
! Compute a lower triangular
Cholesky Factorization, LF, so LF*LF'= COVAR.
We assume all the random variables are
independent, or equivalently, that the
covariance matrix is full rank,
else we may get a divide by zero when dividing
by LF(J,J);
@FOR( ASSET( I):
@FOR( TMAT( I, J)| J #LT# I:
@FREE(LF(I,J));
LF(I,J) = ( COVAR( I, J) - @SUM( TMAT( I, K)|
K #LT# J: LF( I, K) * LF( J, K)))/ LF( J, J);
);
LF(I,I) = ( COVAR( I, I) - @SUM( TMAT( I, K)|
K #LT# I: LF( I, K) * LF( I, K)))^.5;
);
! Generate a matrix of standard Normals from the uniforms;
@FOR(SXA(s,j):
@FREE(SNORM(s,j));
U(s,j) = @PSN(SNORM(s,j));
);
! Compute the correlated random variables;
@FOR(SCENE(s):
@FOR(ASSET(j):
DEMAND(s,j) = MEAN(j) +
@SUM( ASSET(k)|k #LE# j: LF(j,k)*SNORM(s,k));
);
);
! In LINGO 10, the following will display results;
CALC:
@SOLVE();
@WRITE(@NEWLINE(1));
@FOR(ASSET(i):
@WRITE( ' ',ASSET(i),' ');
);
@WRITE(@NEWLINE(1));
@WRITE(' Covariance matrix is',@NEWLINE(1));
@FOR(ASSET(i):
@FOR(ASSET(j):
! Format types, e.g., f, should be lower case;
@WRITE(@FORMAT(COVAR(i,j),"#14.1f"), ' ');
);
@WRITE( @NEWLINE(1));
);
@WRITE(@NEWLINE(1));
@WRITE(' Cholesky Factor matrix is',@NEWLINE(1));
@FOR(ASSET(i):
@FOR(ASSET(j) | j #LT# i:
@WRITE(@FORMAT(LF(i,j),"#14.1f"), ' ');
);
@WRITE(@FORMAT(LF(i,i),"#14.1f"), @NEWLINE(1));
);
@WRITE(@NEWLINE(1),' Demands are', @NEWLINE(1));
@FOR(SCENE(s):
@FOR(ASSET(j):
@WRITE(@FORMAT(DEMAND(s,j),'#14.0f'));
);
@WRITE(@NEWLINE(1));
);
ENDCALC
END
|