1  REM ****  HP BASIC PROGRAM LIBRARY  ******************************
2  REM
3  REM       GNMRVB: SECURITIES PORTFOLIO ANALYSIS AND DETERMINATION
4  REM
5  REM       36530 REV A, PART 1 OF 2
6  REM
7  REM ****  CONTRIBUTED PROGRAM  ***********************************
15  DIM C$[40]
16  C$="                                        "
20  DIM D$[40]
35  DIM C[500],D[500]
45  I3=0
50  DIM B[500],R[500],S[500]
60  PRINT "HAVE YOU ENTERED YOUR DATA";
61  DIM A$[10]
62  INPUT A$[1,1]
63  IF A$[1,1]="N" THEN 3000
100  REM -- MAIN ROUTINE
101  PRINT "STEP SIZE";
102  INPUT H1
105  PRINT LIN(2);" BETA  REL. NON-MKT RISK"
106  PRINT " ----  -----------------"
110  GOSUB 1500
112  GOSUB 1200
150  GOSUB 1600
160  GOSUB 1300
170  GOSUB 1400
180  GOTO 150
1200  REM -- FIND FIRST PORTFOLIO
1210  B9=1.E-37
1220  FOR I=1 TO N
1230  IF B[I] <= B9 THEN 1240
1232  B9=B[I]
1234  I9=I
1240  NEXT I
1241  D6=-1.E+37
1242  FOR I=1 TO N
1243  IF R[I] <= D6 THEN 1248
1244  D6=R[I]
1248  NEXT I
1250  FOR I=1 TO N
1252  S[I]=0
1254  NEXT I
1260  S[I9]=1
1280  L9=1.E+38
1281  FOR I=1 TO N
1282  D[I]=0
1283  NEXT I
1284  D[I9]=1
1285  V6=B[I9]
1287  H2=1+H1*INT((V6-1)/H1)
1290  RETURN 
1300  REM -- FIND NEXT CRITICAL VALUE OF LAMBDA
1310  L7=-1.E+37
1315  I8=I9
1320  FOR I=1 TO N
1321  IF I=I8 THEN 1350
1324  IF B[I]=S3 THEN 1350
1326  L8=-S4/(B[I]-S3)
1328  IF L8 >= L9 THEN 1350
1330  IF L8<L7 THEN 1350
1332  L7=L8
1334  I9=I
1350  NEXT I
1360  IF L7>-1.E+37 THEN 1370
1362  R1=1
1363  R2=0
1364  GOTO 4000
1370  REM -- VARIABLE IS I9, LAMBDA IS L7
1372  S[I9]=1-S[I9]
1374  L9=L7
1380  RETURN 
1400  REM -- COMPUTE PORTFOLIO
1401  I3=I3+1
1402  FOR I=1 TO N
1403  C[I]=D[I]
1404  NEXT I
1405  V6=B9
1410  B9=R9=0
1420  FOR I=1 TO N
1421  D[I]=0
1422  IF S[I]=0 THEN 1450
1430  F1=L9/(2*(R[I]*R[I]))
1432  F2=S4/(2*(R[I]*R[I]))
1434  X9=F1*(B[I]-S3)+F2
1440  B9=B9+(X9*B[I])
1442  R9=R9+((X9*X9)*(R[I]*R[I]))
1446  D[I]=X9
1450  NEXT I
1460  IF V6 >= H2 AND B9 <= H2 THEN 1465
1461  REM -- NOTHING INTERESTING IN THIS RANGE
1462  RETURN 
1465  V7=H2
1466  GOSUB 2000
1470  H2=H2-H1
1471  GOTO 1460
1480  RETURN 
1500  REM - READ DATA
1510  READ N
1520  FOR I=1 TO N
1530  READ B[I],R[I]
1540  NEXT I
1550  RETURN 
1600  REM -- FORM SUMS
1610  S1=S2=S3=S4=0
1620  FOR I=1 TO N
1630  IF S[I]=0 THEN 1650
1632  R9=2*(R[I]*R[I])
1640  S1=S1+(B[I]/R9)
1642  S2=S2+(1/R9)
1650  NEXT I
1660  S3=S1/S2
1662  S4=1/S2
1670  RETURN 
2000  REM -- COMPUTE AND PRINT PORTFOLIO
2030  IF B9 <> V6 THEN 2040
2031  R1=1
2032  R2=0
2033  GOTO 2050
2040  R1=(V7-V6)/(B9-V6)
2041  R2=(B9-V7)/(B9-V6)
2050  B3=R3=0
2055  FOR I=1 TO N
2060  X9=(R1*D[I])+(R2*C[I])
2062  B3=B3+(X9*B[I])
2063  R3=R3+((X9^2)*(R[I]^2))
2080  NEXT I
2090  PRINT  USING 2091;B3,SQR(R3)
2091  IMAGE #,2D.3D,4D.3D
2093  D7=40*SQR(R3)/D6
2094  D$=C$[1,D7]
2095  D$[D7,D7]="*"
2096  PRINT D$
2100  RETURN 
3000  REM -- GIVE INSTRUCTIONS
3010  PRINT 
3020  PRINT "ENTER DATA BEGINNING AT LINE 9000"
3022  PRINT "FIRST, THE NUMBER OF SECURITIES"
3024  PRINT "THEN, FOR EVERY SECURITY --"
3026  PRINT "  1) THE VALUE OF BETA"
3028  PRINT "  2) THE SECURITY'S RELATIVE NON-MARKET RISK"
3030  PRINT 
3040  PRINT "WHEN YOU HAVE ENTERED YOUR DATA STATEMENTS,"
3042  PRINT "RE-RUN THE PROGRAM"
3050  STOP 
4000  REM -- END REACHED
9999  END 
