Lindo Systems

 MODEL:
! Generic Markowitz portfolio model that takes into account
  bid/ask spread and taxes.  (PORTAX)
  Keywords: Downside Risk / Financial / Markowitz / Portfolio / Stocks / Taxes / Transaction Costs;
 SETS:
  ASSET: RET, START, BUY, SEL, APRICE, BUYAT, SELAT, DVPS, STD, X;
 ENDSETS
 DATA:
! Data based on original Markowitz example; 
 ASSET =  ATT        GMC      USX;
! The expected returns as growth factors;
   RET  =  1.089083 1.21367  1.23458;
! S. D. in return for each asset;
   STD = .103959  .241644  .306964;
! Starting composition of the portfolio in shares;
   START = 100       70       100;
! Price per share at acquisition;
   APRICE = 80       89        21;
! Current price per share;
   BUYAT  = 87       86        27;
   SELAT  = 86       85        26;
! Dividends per share(estimated);
   DVPS =   0         0         0;
! Tax rate;
   TAXR = .32;
! The desired growth factor;
   TARGET = 1.15;
 ENDDATA
 SETS:
  TMAT( ASSET, ASSET) | &1 #GE# &2: CORR;
 ENDSETS
 DATA:
! Correlation matrix;
   CORR= 1.000000 
         0.4938961  1.000000 
         0.4097276  0.7472293 1.000000 ;
 ENDDATA
!---------------------------------------------------------------;
!  Min the var in portfolio return;
 [OBJ] MIN =
      @SUM( ASSET( I):  ( X( I)*SELAT( I)* STD( I))^2) +
        2 * @SUM( TMAT( I, J) | I #NE# J:
            CORR( I, J) * X( I)* SELAT( I) * STD( I) 
                        * X( J)* SELAT( J) * STD( J)) ;

! Budget constraint, sales must cover purchases + taxes;
 [BUDC] @SUM( ASSET( I):
          SELAT( I) * SEL( I) - BUYAT( I) * BUY( I)) >= TAXES; 
 [TAXC]  TAXES >= TAXR * @SUM( ASSET( I):
                  DVPS( I) + SEL( I) * ( SELAT( I) - APRICE( I)));

! After tax return requirement.  This assumes we do not pay
   tax on appreciation until we sell;
 [RETC] @SUM( ASSET( I): 
         RET( I)* X(I)* SELAT( I)) - TAXES >=
         TARGET * @SUM( ASSET(I): START( I) * SELAT( I));

! Inventory balance for each asset;
  @FOR( ASSET( I):
    [BAL] X( I) = START( I) + BUY( I) - SEL( I);  );
 END