1  REM ****  HP BASIC PROGRAM LIBRARY  ******************************
2  REM
3  REM       GCHLIN: RATING INVESTMENT FUNDS
4  REM
5  REM       36503 REV A
6  REM
7  REM ****  CONTRIBUTED PROGRAM  ***********************************
100  DIM A[40],B[40],P[40],X[40],Y[40],Z[40]
102  DIM A$[72],D$[72],X$[50],Y$[50]
200  FILES *
202  GOTO 400
300  REM -- SUBROUTINE FOR ACCESS TO DATA
302  PRINT "  FUND, INDEX, PORTFOLIO OR STOCK";
304  INPUT A$[1,1]
310  PRINT "NUMBER";
312  INPUT N9
320  IF A$[1,1]="P" THEN 330
322  D$="$GPDQ"
324  D$[6,6]=A$[1,1]
326  GOTO 340
330  D$="PDQP"
340  ASSIGN D$,1,X1
342  READ #1,N9
346  FOR I=1 TO 40
350  READ #1;O,D,C
351  IF (O=-999) OR (D=-999) OR (C=-999) THEN 354
352  Z[I]=100*((C+D-O)/O)
353  GOTO 356
354  Z[I]=-999
356  NEXT I
365  IF D$="PDQP" THEN 390
370  READ #1;N8
374  READ #1;A$
378  PRINT A$
380  PRINT 
390  RETURN 
400  PRINT "Y-VARIABLE (VERTICAL AXIS)"
402  GOSUB 300
404  MAT A=Z
410  PRINT "X-VARIABLE (HORIZONTAL AXIS)"
412  GOSUB 300
414  MAT B=Z
420  PRINT "DO YOU WANT THE TREASURY BILL RATE SUBTRACTED FROM EACH RETURN";
422  INPUT A$[1,1]
430  IF A$[1,1]="N" THEN 500
440  ASSIGN "$GPDQI",1,X1
442  READ #1,99
450  FOR I=1 TO 40
452  READ #1;O,D,C
454  IF (O=-999) OR (D=-999) OR (C=-999) THEN 460
456  P[I]=100*((C+D-O)/O)
457  GOTO 461
460  P[I]=-999
461  NEXT I
470  FOR I=1 TO 40
472  IF (A[I]=-999) OR (B[I]=-999) OR (P[I]=-999) THEN 488
480  A[I]=A[I]-P[I]
482  B[I]=B[I]-P[I]
484  GOTO 490
488  A[I]=B[I]=-999
490  NEXT I
500  PRINT 
510  PRINT "FIRST QUARTER --"
512  PRINT "  YEAR";
514  INPUT F6
516  IF (F6 >= 1963) AND (F6 <= 1972) THEN 530
520  PRINT "THE YEAR MUST BE BETWEEN 1963 AND 1972 INCLUSIVE"
521  GOTO 512
530  PRINT "  QUARTER";
532  INPUT F7
534  F8=4*(F6-1963)+F7
540  PRINT 
542  PRINT "LAST QUARTER--"
544  PRINT "  YEAR";
546  INPUT T6
548  IF (T6 >= 1963) AND (T6 <= 1972) THEN 560
550  PRINT "THE YEAR MUST BE BETWEEN 1963 AND 1972 INCLUSIVE"
552  GOTO 544
560  PRINT "  QUARTER";
562  INPUT T7
564  T8=4*(T6-1963)+T7
565  F5=T8
600  REM -- LOAD X AND Y
610  N=0
620  FOR I=F8 TO T8
622  IF (A[I]=-999) OR (B[I]=-999) THEN 630
624  N=N+1
626  Y[N]=A[I]
628  X[N]=B[I]
630  NEXT I
632  IF N >= 3 THEN 640
634  PRINT "TOO FEW POINTS FOR MEANINGFUL RESULTS"
636  PRINT " -- PROGRAM STOPPED"
638  STOP 
640  REM -- CONTINUE
700  REM -- DO REGRESSION
710  GOSUB 4000
800  REM -- DO RESIDUALS
802  T8=F5
810  PRINT LIN(3);"DIFFERENTIAL RETURNS (Y - B*X) -- "
814  PRINT 
816  PRINT "YEAR QTR VALUE";TAB(29);"- 0 +"
817  PRINT 
818  N3=0
820  FOR I=F8 TO T8
822  IF (A[I]=-999) OR (B[I]=-999) THEN 860
830  N3=N3+1
834  Y3=B9*B[I]
836  D3=ABS(A[I]-Y3)
840  IF N3>1 THEN 850
842  M1=D3
844  GOTO 860
850  IF D3 <= M1 THEN 860
852  M1=D3
860  NEXT I
900  FOR I=F8 TO T8
910  IF (A[I]=-999) OR (B[I]=-999) THEN 950
920  Y3=B9*B[I]
922  D3=(A[I]-Y3)/M1
924  D3=(10*D3)+11
926  A$="                     "
928  A$[11,11]="!"
930  A$[D3,D3]="*"
940  PRINT  USING 942;F6,F7,A[I]-Y3,A$
942  IMAGE 4D,1X,D,1X,4D.3D,6X,21A
944  GOTO 960
950  PRINT  USING 951;F6,F7
951  IMAGE 4D,1X,D,"  NOT AVAILABLE"
952  GOTO 960
960  F7=F7+1
962  IF F7 <= 4 THEN 980
964  F7=1
966  F6=F6+1
980  NEXT I
990  STOP 
3999  REM -------------------------------
4000  REM -- SUBROUTINE TO DO SIMPLE REGRESSION WITH PLOT
4010  REM -- INPUTS ARE N X(I),Y(I) VALUES
4050  PRINT 
4053  Y$="  Y"
4056  X$="  X"
4100  REM -- FIND MIN X (M1) AND MAX X(M2)
4102  M1=X[1]
4103  M2=X[1]
4104  FOR I=2 TO N
4105  IF X[I]>M1 THEN 4107
4106  M1=X[I]
4107  IF X[I]<M2 THEN 4110
4108  M2=X[I]
4110  NEXT I
4120  REM -- FIND MIN Y(M3) AND MAX Y(M4)
4121  M3=Y[1]
4122  M4=Y[1]
4123  FOR I=2 TO N
4124  IF Y[I]>M3 THEN 4126
4125  M3=Y[I]
4126  IF Y[I]<M4 THEN 4130
4127  M4=Y[I]
4130  NEXT I
4200  REM -- FIND AVERAGES AND STANDARD DEVIATIONS
4205  REM -- A1 IS AVERAGE OF X, A2 IS AVERAGE OF Y
4206  REM -- S1 IS STD DEV OF X, S2 IS STD DEV OF Y
4210  A1=0
4211  A2=0
4212  FOR I=1 TO N
4214  A1=A1+X[I]
4216  A2=A2+Y[I]
4218  NEXT I
4220  A1=A1/N
4222  A2=A2/N
4250  REM -- FIND STANDARD DEVIATIONS AND COVARIANCE (C1)
4252  S1=0
4254  S2=0
4256  C1=0
4260  FOR I=1 TO N
4262  S1=S1+((X[I]-A1)^2)
4264  S2=S2+((Y[I]-A2)^2)
4266  C1=C1+((X[I]-A1)*(Y[I]-A2))
4270  NEXT I
4272  S1=SQR(S1/N)
4274  S2=SQR(S2/N)
4276  C1=C1/N
4280  REM -FIND SUMS
4281  T1=T2=T3=T4=T5=0
4285  FOR I=1 TO N
4286  T1=T1+X[I]
4287  T2=T2+Y[I]
4288  T3=T3+(X[I]*Y[I])
4289  T4=T4+(X[I]^2)
4290  T5=T5+(Y[I]^2)
4292  NEXT I
4300  REM -- FIND EQUATION OF REGRESSION LINE
4310  REM -- LINE IS Y = A9 + B9*X
4320  B9=C1/(S1^2)
4330  A9=A2-(B9*A1)
4340  REM -- FIND COEFFICIENT OF DETERMINATION (R2)
4350  R2=((B9^2)*(S1^2))/(S2^2)
4500  REM -- GET INFORMATION FOR GRAPH
4505  REM
4506  A$="Y"
4507  A5=1
4508  IF A$[1,1]="Y" THEN 4510
4509  A5=0
4510  IF A5=0 THEN 4700
4513  A$="N"
4514  A6=1
4516  IF A$[1,1]="Y" THEN 4518
4517  A6=0
4518  IF A6=1 THEN 4600
4522  REM
4524  A$="Y"
4526  IF A$[1,1]="Y" THEN 4550
4530  X1=M1
4531  X2=M2
4532  Y1=M3
4533  Y2=M4
4538  GOTO 4600
4550  X1=M1
4551  IF M3>M1 THEN 4553
4552  X1=M3
4553  Y1=X1
4554  X2=M2
4555  IF M4<M2 THEN 4557
4556  X2=M4
4557  Y2=X2
4600  REM -- FIND SIZE
4612  A5=6
4614  IF A5 <= 7 THEN 4620
4616  A5=7
4620  X9=INT(10*A5+.001)
4622  Y9=INT(6*A5++.001)
4700  REM -- PRINT RESULTS
4713  PRINT 
4720  PRINT 
4722  PRINT " ",Y$,X$
4724  PRINT 
4725  IMAGE 15A,4D.3D,3X,4D.3D
4726  A$=" MAXIMUM"
4727  PRINT  USING 4725;A$,M4,M2
4728  A$=" MINIMUM"
4729  PRINT  USING 4725;A$,M3,M1
4730  A$=" AVERAGE"
4731  PRINT  USING 4725;A$,A2,A1
4732  A$=" STD DEV"
4733  PRINT  USING 4725;A$,S2,S1
4734  A$=" AVG/STD DEV"
4735  PRINT  USING 4725;A$,A2/S2,A1/S1
4736  PRINT LIN(1);"REGRESSION LINE --"
4737  S$="+"
4738  IF B9 >= 0 THEN 4740
4739  S$=" "
4740  PRINT  USING 4741;Y$,A9,S$,B9,X$
4741  IMAGE 5X,15A," = ",6D.5D,X,A,6D.5D,"*",15A
4744  PRINT 
4745  GOSUB 6500
4750  IF A5>0 THEN 4760
4752  STOP 
4760  PRINT 
4800  PRINT 
4805  IF A6=1 THEN 4900
4810  PRINT "EACH AXIS RUNS FROM ";Y1;" TO ";Y2
4830  PRINT 
4840  GOTO 4990
4900  PRINT "Y-AXIS -- BOTTOM";
4901  INPUT Y1
4902  PRINT "             TOP";
4903  INPUT Y2
4910  PRINT "X-AXIS --   LEFT";
4911  INPUT X1
4912  PRINT "           RIGHT";
4913  INPUT X2
4990  FOR I=1 TO 3
4991  PRINT 
4992  NEXT I
5000  REM -- DO GRAPH
5001  REM -- CHAINS FROM: REGPLT
5009  DIM C$[10]
5010  C$="*23456789"
5020  DIM L$[72]
5100  REM -- RESET ALL VALUES TO INTERVALS
5102  A6=A9+(B9*X1)
5103  Z1=INT((X9*(0-X1)/(X2-X1))+1.001)
5104  Z2=INT((Y9*(0-Y1)/(Y2-Y1))+1.001)
5105  A2=INT((Y9*(A2-Y1)/(Y2-Y1))+1.001)
5106  A1=INT((X9*(A1-X1)/(X2-X1))+1.001)
5107  A6=INT((Y9*(A6-Y1)/(Y2-Y1))+1.001)
5108  A8=(Y1-A9)/B9
5109  A8=INT((X9*(A8-X1)/(X2-X1))+1.001)
5110  FOR I=1 TO N
5120  Y[I]=INT((Y9*(Y[I]-Y1)/(Y2-Y1))+1.001)
5121  IF Y[I] <= Y9 THEN 5130
5122  Y[I]=Y9
5130  X[I]=INT((X9*(X[I]-X1)/(X2-X1))+1.001)
5131  IF X[I] <= X9 THEN 5140
5132  X[I]=X9
5140  NEXT I
5150  REM -- SORT ROWS
5160  N9=N
5170  N9=N9-1
5180  N8=0
5190  FOR I=1 TO N9
5200  IF Y[I]>Y[I+1] THEN 5320
5210  IF Y[I]<Y[I+1] THEN 5250
5220  REM -- YS ARE EQUAL
5230  IF X[I] <= X[I+1] THEN 5320
5240  GOTO 5290
5250  REM -- SWITCH
5255  N8=1
5260  Y3=Y[I]
5270  Y[I]=Y[I+1]
5280  Y[I+1]=Y3
5290  X3=X[I]
5300  X[I]=X[I+1]
5310  X[I+1]=X3
5320  NEXT I
5330  IF N8=1 THEN 5170
5340  REM -- PRINT
5350  R1=1
5356  PRINT 
5360  FOR Y3=Y9 TO 1 STEP -1
5370  L9=0
5371  IF Y3=A6 THEN 5375
5372  IF Y3 <> A2 THEN 5380
5373  L$[1,1]="M"
5374  GOTO 5390
5375  L$[1,1]="L"
5376  GOTO 5390
5380  L$[1,1]=" "
5390  REM -- PROCEED
5400  FOR C1=1 TO X9
5410  REM -- SET UP AXIS SYMBOL OR SPACE
5412  IF Y3=Z2 THEN 5426
5416  IF C1=Z1 THEN 5422
5418  P$=" "
5420  GOTO 5500
5422  P$="!"
5423  L9=C1
5424  GOTO 5500
5426  IF C1=Z1 THEN 5432
5428  P$="-"
5429  L9=C1
5430  GOTO 5500
5432  P$="+"
5433  L9=C1
5500  REM -- FIND ENTRIES
5510  C9=0
5511  IF R1>N THEN 5600
5512  IF Y[R1]>Y3 THEN 5524
5513  IF Y[R1]<Y3 THEN 5600
5516  IF X[R1]<C1 THEN 5524
5517  IF X[R1]>C1 THEN 5600
5520  REM -- ROW CONTAINS AN ITEM
5522  C9=C9+1
5524  REM -- GO TO NEXT ROW
5525  R1=R1+1
5526  GOTO 5511
5600  REM -- PRINT CHARACTER
5610  IF C9=0 THEN 5630
5612  IF C9 <= 9 THEN 5620
5614  C9=9
5620  P$=C$[C9,C9]
5622  L9=C1
5630  L$[C1+1,C1+1]=P$
5650  NEXT C1
5660  L$=L$[1,L9+1]
5665  PRINT L$
5710  NEXT Y3
5720  REM -- PRINT HORIZONTAL AXIS
5730  PRINT 
5740  L$[1,1]=" "
5750  FOR I=1 TO X9
5751  IF I=A8 THEN 5756
5752  IF I <> A1 THEN 5760
5753  L$[I+1,I+1]="M"
5754  GOTO 5770
5756  L$[I+1,I+1]="L"
5757  GOTO 5770
5760  L$[I+1,I+1]=" "
5770  NEXT I
5785  PRINT L$
5790  FOR I=1 TO 5
5795  PRINT 
5796  NEXT I
6000  RETURN 
6500  REM - SUBROUTINE TO COMPUTE ADJ. R2 AND STD ERRORS
6510  IF N<3 THEN 6690
6520  T6=T4-T1*T1/N
6530  T7=(T3-T1*T2/N)/T6
6540  T8=(T2-T7*T1)/N
6550  T9=T5-T2*T2/N
6560  U1=T9-T7*T7*T6
6570  T9=T9/(N-1)
6580  U1=U1/(N-2)
6590  U2=(T9-U1)/T9
6600  U3=U1/T6
6610  U3=SQR(U3)
6620  U4=U1*T4/(T6*N)
6630  U4=SQR(U4)
6640  PRINT  USING 6650;U4,U3
6650  IMAGE "STANDARD ERRORS:",7X,6D.5D,2X,6D.5D
6653  IMAGE "T-VALUES:",14X,6D.5D,2X,6D.5D
6660  PRINT 
6670  PRINT "R-SQUARED : ";R2
6680  PRINT 
6690  RETURN 
9999  END 
