9000  REM  ****  hp basic program library  ****************************
9001  REM
9002  REM        markow:  securities portfolio using markowitz model
9003  REM
9004  REM        36092  rev b  --  10/73
9005  REM
9006  REM  THIS PROGRAM COMPUTES THE EFFICIENT PORTFOLIOS ACCORDING TO THE
9008  REM  FULL COVARIANCE MATRIX MARKOWITZ MODEL.
9010  REM
9012  REM    INPUT DATA IS NEEDED IN THE FOLLOWING ORDER:
9014  REM     1) THE NUMBER OF SECURITIES
9016  REM     2) THE LENDING RATE
9018  REM     3) THE BORROWING RATE
9020  REM     4) THE EXPECTED RETURNS FOR EACH SECURITY, LISTED IN ORDER
9022  REM     5) THE FULL COVARIANCE MATRIX,LISTED ROW BY ROW
9024  REM
9026  REM     (THERE EXISTS A STORAGE PROBLEM, BUT MARKOW SHOULD HANDLE
9028  REM      UP TO 75 SECURITIES.)
9030  REM
9032  PRINT "*  SECURITIES PORTFOLIOS USING MARKOW CHAINS  *"
9034  PRINT 
9036  READ N,I1,I2
9037  PRINT "AS INPUT WE HAVE:";N;"SECURITIES"
9038  PRINT "                 ";I1*100;"PERCENT AS THE LENDING RATE"
9040  PRINT "                 ";I2*100;"PERCENT AS THE BORROWING RATE"
9042  PRINT 
9044  PRINT "************************************************************************"
9046  LET Z9=1
9047  L4=9999
9048  LET N9=1
9050  DIM E[20],A[15,15],B[15,15],R[15],H[15],G[80]
9051  LET G9=80
9052  LET E9=20
9054  LET A9=R9=H9=15
9055  MAT B=ZER[N+1,N+1]
9056  MAT G=ZER[G9]
9058  READ E[E9]
9060  LET Z=E[E9]
9062  LET K=0
9064  FOR I=1 TO N-1
9066  READ E[I]
9068  IF E[I]<Z THEN 9074
9070  LET K=I
9072  LET Z=E[I]
9074  NEXT I
9076  LET G[G9]=-1
9078  LET G[N+1]=1
9080  FOR I=1 TO N
9081  LET G[I]=-1
9082  LET G[I+N+1]=1
9083  NEXT I
9086  LET Z=K
9087  IF Z>0 THEN 9089
9088  LET Z=G9
9089  LET G[Z]=1
9090  LET G[K+N+2]=-1
9092  LET K2=1
9094  GOSUB 9272
9096  GOSUB 9319
9098  LET L3=-99999.
9100  IF H[1] <= 0 THEN 9108
9102  IF L3>-R[R9]/H[1] THEN 9108
9104  LET L3=-R[R9]/H[1]
9106  LET L1=0
9108  FOR I=1 TO N
9110  IF H[I+1] <= 0 THEN 9118
9112  IF L3>-R[I]/H[I+1] THEN 9118
9113  IF L4<-R[I]/H[I+1] THEN 9118
9114  LET L3=-R[I]/H[I+1]
9116  LET L1=I
9118  NEXT I
9120  IF L3 <> -99999. THEN 9126
9122  PRINT "THIS SOLUTION IS GOOD FOR ALL SMALLER SLOPES"
9123  PRINT 
9124  PRINT "*********************************************************************"
9125  STOP 
9126  LET L=L3
9127  L4=L3
9128  GOSUB 9352
9130  GOTO Z9 OF 9132,9156,9242
9132  IF I3>I2 THEN 9242
9134  FOR L6=L TO L+20 STEP .001
9136  GOSUB 9182
9138  IF ABS(L6-(2*V1/(E1-I2)))<.005 THEN 9144
9140  NEXT L6
9141  PRINT 
9142  PRINT "*********************************************************************"
9143  STOP 
9144  PRINT "BORROWING PORTFOLIO"
9146  LET I9=I2
9148  GOSUB 9214
9150  GOSUB 9406
9152  GOSUB 9232
9154  LET Z9=2
9156  IF I3>I1 THEN 9242
9158  FOR L6=L TO L+20 STEP .001
9160  GOSUB 9182
9162  IF ABS(L6-(2*V1/(E1-I1)))<.005 THEN 9168
9164  NEXT L6
9166  GOTO 9141
9168  LET I9=I1
9170  GOSUB 9214
9172  PRINT "LENDING PORTFOLIO"
9174  GOSUB 9406
9176  GOSUB 9232
9178  LET Z9=3
9180  GOTO 9242
9182  RESTORE 
9184  FOR I=0 TO N+2
9186  READ X
9188  NEXT I
9190  LET E1=V1=0
9191  FOR I=0 TO N-1
9192  LET Z=W=U=I
9193  FOR J=0 TO N-1
9194  LET Y=J
9195  IF Z>0 THEN 9199
9196  LET Z=G9
9197  LET W=R9
9198  LET U=E9
9199  IF Y>0 THEN 9201
9200  LET Y=R9
9201  READ X
9202  IF G[Z]=-1 THEN 9205
9203  IF G[Y]=-1 THEN 9205
9204  LET V1=V1+(R[W]+L6*H[I+1])*(R[Y]+L6*H[J+1])*X
9205  NEXT J
9206  IF G[Z]=-1 THEN 9210
9208  LET E1=E1+(R[W]+L6*H[I+1])*E[U]
9210  NEXT I
9212  RETURN 
9214  LET E2=E
9216  LET V2=V
9218  LET L5=L
9220  LET I4=I3
9222  LET L=L6
9224  LET E=E1
9226  LET V=V1
9228  LET I3=I9
9230  RETURN 
9232  LET E=E2
9234  LET V=V2
9236  LET I3=I4
9238  LET L=L5
9240  RETURN 
9242  GOSUB 9406
9244  IF L>.001 THEN 9250
9245  PRINT 
9246  PRINT "*******************************************************************"
9248  STOP 
9250  LET G[L1]=G[L1]*(-1)
9252  IF L1=N THEN 9260
9254  IF L1=N+1 THEN 9264
9256  LET G[L1+N+2]=G[L1+N+2]*(-1)
9258  GOTO 9266
9260  LET K2=-1
9262  GOTO 9266
9264  LET K2=-1
9266  GOSUB 9272
9268  LET N9=N9+1
9270  GOTO 9096
9272  MAT A=ZER[N+1,N+1]
9274  RESTORE 
9276  LET A[1,N+1]=K2
9277  IF G[G9]=-1 THEN 9279
9278  LET A[N+1,1]=1
9279  FOR I=1 TO N-1
9280  LET A[I+1,N+1]=K2
9281  IF G[I]=-1 THEN 9284
9282  LET A[N+1,I+1]=1
9284  NEXT I
9287  FOR I=0 TO N+2
9288  READ X
9290  NEXT I
9292  FOR I=0 TO N-1
9294  FOR J=0 TO N-1
9296  LET Z=J
9298  IF Z>0 THEN 9302
9300  LET Z=G9
9302  READ X
9304  IF G[Z]=-1 THEN 9310
9306  LET A[I+1,J+1]=2*X
9308  GOTO 9314
9310  IF I <> J THEN 9314
9312  LET A[I+1,J+1]=-1
9314  NEXT J
9315  NEXT I
9318  RETURN 
9319  MAT B=INV(A)
9320  MAT A=B
9321  FOR I=0 TO N
9322  LET Z=I
9324  IF Z>0 THEN 9328
9326  LET Z=R9
9328  LET R[Z]=A[I+1,N+1]
9330  NEXT I
9332  MAT H=ZER[N+1]
9334  FOR I=1 TO N-1
9336  FOR J=0 TO N-1
9338  LET Z=J
9340  IF Z>0 THEN 9344
9342  LET Z=E9
9344  LET H[I+1]=H[I+1]+A[I+1,J+1]*E[Z]
9346  NEXT J
9348  NEXT I
9350  RETURN 
9352  LET E=0
9354  LET V=0
9356  RESTORE 
9358  FOR I=0 TO N+2
9360  READ X
9362  NEXT I
9364  FOR I=0 TO N-1
9366  LET Z=W=U=I
9368  FOR J=0 TO N-1
9370  LET Y=J
9372  REM
9374  LET Z=G9
9376  LET W=R9
9378  LET U=E9
9380  IF Y>0 THEN 9384
9382  LET Y=R9
9384  READ X
9386  IF G[Z]=-1 THEN 9392
9388  IF G[Y]=-1 THEN 9392
9390  LET V=V+(R[W]+L*H[I+1])*(R[Y]+L*H[J+1])*X
9392  NEXT J
9394  IF G[Z]=-1 THEN 9398
9396  LET E=E+(R[W]+L*H[I+1])*E[U]
9398  NEXT I
9400  LET I3=E-(2*V/L)
9401  IF V>0 THEN 9403
9402  LET V=-V
9403  LET L8=L/(2*SQR(V))
9404  RETURN 
9406  PRINT 
9407  PRINT "                        PORTFOLIO NUMBER";N9
9408  PRINT 
9409  PRINT "EXP RETURN:";E;TAB(17);"STD DEV:";SQR(V);TAB(36);"ASS INT:";I3
9410  PRINT "          SLOPE OF THE E-V CURVE IS:";L
9412  PRINT 
9414  PRINT "STOCK NO","PERCENT","R","H"
9415  IF G[G9]=-1 THEN 9417
9416  PRINT 1,100*(R[R9]+L*H[1]),R[R9],H[1]
9417  FOR I=1 TO N-1
9418  IF G[I]=-1 THEN 9422
9420  PRINT I+1,100*(R[I]+L*H[I+1]),R[I],H[I+1]
9422  NEXT I
9424  PRINT 
9426  PRINT 
9428  PRINT "                           ----------"
9430  RETURN 
9900  DATA 9
9901  DATA .045,.065
9910  DATA .0284022,.110011,.00477284,.0633756,.0614846,.0305807
9920  DATA -.00712097,-.00532422,.260657
9930  REM EXAMPLE COVARIANCE MATRIX FOLLOWS:
9950  DATA .0288445,.00904635,.0131019,.0170099
9951  DATA .0157015,.0185585,.0278296,.0310865
9952  DATA .0114316,.00904635,.00675625,.000464437
9953  DATA .0137025,.00890057,.0051941,.000464437
9954  DATA .00964282,.000430107,.00205413,.010148
9955  DATA .0155908,.00931176,.00403761,.0170099
9956  DATA .0137025,.000430107,.0286772,.0155314
9957  DATA .0114319,.0128415,.0295581,-.0045765
9958  DATA .0157015,.00890057,.00205413,.0155314
9959  DATA .0188851,.00427909,.00907786,.0220021
9960  DATA .0185585,.099266,.0051941,.010148
9961  DATA .0114319,.00427909,.0163099,.021356
9962  DATA .0193458,-.0056284,.0278296,.00643849
9963  DATA .0155908,.0128415,.00907786,.021356
9964  DATA .0304166,.0270716,.0028313,.0310865
9965  DATA .0149714,.00931176,.0295581,.0220021
9966  DATA .093458,.0270716,.0404682,.00828133
9967  DATA .0114316,.000978117,.00403761,-.0045765
9968  DATA .0199266,-.00568284,.0028313,.00828133
9969  DATA .00643849,.0149714,.000978117,.0131019
9970  DATA .0486656
9999  END 
