1  REM ****  HP BASIC PROGRAM LIBRARY  ****************************
2  REM
3  REM       GDAPI:  ABNORMAL PERFORMANCE INDEX
4  REM
5  REM       36507 REV A
6  REM
7  REM ****  CONTRIBUTED PROGRAM  *******************************
10  DIM C$[60],R$[10],T$[10],X$[10],Y$[10]
11  DIM X[100],Y[100]
12  DIM C[366]
20  LET X$="DAY :"
30  LET Y$="INDEX (%)"
55  Q3=0
60  REM
120  REM
130  REM        ****** WRITTEN BY J. ANDREW DANVER , JANUARY 31, 1972
131  REM     *** MODIFIED BY W.F. SHARPE, FEB. 1972 ******
140  REM
150  DIM A$[40],D$[40],E$[40],F$[40],L$[40]
160  DIM D[12],E[12],P[25],R[100]
200  FILES $GSP5,*
220  PRINT LIN(3)
240  PRINT "ARE YOU USING 'FILES' OR 'DATA' STATEMENTS ";
250  INPUT F$
260  IF F$[1,1]="D" THEN 330
270  IF F$[1,1]="F" THEN 300
280  PRINT "PLEASE ENTER ONLY 'FILE' OR 'DATA' ";
290  GOTO 250
300  PRINT "NAME OF FILE CONTAINING STOCK DATA ";
310  INPUT A$
320  ASSIGN A$,2,Z9
330  PRINT "HOW MANY EVENTS DO YOU HAVE IN ALL";
331  INPUT P2
332  PRINT "DO YOU WISH TO ANALYZE THEM ALL";
333  INPUT L$
334  IF L$[1,1]="Y" THEN 344
335  PRINT "HOW MANY EVENTS DO YOU WISH TO ANALYZE IN THIS RUN";
336  INPUT P5
340  PRINT "PLEASE LIST THEIR NUMBERS (E.G. 1,2,5) BELOW"
341  PRINT "NUMBERS";
342  MAT  INPUT P[P5]
343  GOTO 348
344  P5=P2
345  FOR K9=1 TO P5
346  P[K9]=K9
347  NEXT K9
348  PRINT "HOW MANY DAYS ARE THERE PER PERIOD (E.G. 1 FOR"
349  PRINT "DAILY DATA, 7 FOR WEEKLY DATA). NUMBER OF DAYS";
350  INPUT Z5
351  PRINT "FOR HOW MANY PERIODS PRIOR TO EACH EVENT DO YOU"
352  PRINT "HAVE PRICES";
360  INPUT P3
370  PRINT "FOR HOW MANY PERIODS AFTER EACH EVENT DO YOU"
371  PRINT "HAVE PRICES";
380  INPUT P4
390  N=P3+P4
400  MAT R=ZER[N]
410  MAT X=ZER[N]
420  MAT Y=ZER[N]
600  LET D$="JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
610  LET E$="1234567890,"
620  REM -- INITIALIZE DATES
630  FOR K=1 TO 12
640  LET D[K]=31
650  NEXT K
660  LET D[2]=28
670  LET D[4]=D[6]=D[9]=D[11]=30
680  LET A=0
690  FOR K=2 TO 12
700  LET A=A+D[K-1]
710  LET E[K]=A
720  NEXT K
730  LET E[1]=0
740  REM BEGIN READING IN THE DATA
750  PRINT LIN(2);SPA(1);"#";SPA(6);" EVENT DATE";SPA(8);"EVENT"
760  PRINT "--";SPA(2);"--------------------";SPA(3);"-------"
770  LET P6=1
780  FOR P1=1 TO P2
790  READ L$,A$,B
800  IF P6>P5 THEN 2050
810  IF P1=P[P6] THEN 880
820  IF F$[1,1]="F" THEN 2040
830  READ R1
840  MAT  READ Y
850  GOTO 2040
860  REM TO CONVERT THE DATE FROM STRING TO NUMERIC VALUES IN DAYS
870  REM CONVERT MONTHS TO DAYS
880  FOR K=1 TO 34 STEP 3
890  IF A$[1,3]=D$[K,K+2] THEN 930
900  NEXT K
905  PRINT "MO"
910  PRINT LIN(1);A$;" IS INCORRECTLY STATED - PLEASE EDIT AND RERUN."
920  STOP 
930  LET D2=E[1+(K-1)/3]
940  LET C8=D[1+(K-1)/3]
950  LET A=C7=C9=D=D1=0
960  REM CONVERT YEAR THEN DAY TO NUMERIC VALUES
970  FOR J=LEN(A$) TO 1 STEP -1
980  LET D=D+1
990  FOR I=1 TO 11
1000  IF E$[I,I]#A$[J,J] THEN 1120
1010  GOTO I-9 OF 1140,1080
1020  LET A=I
1030  FOR K=1 TO D-1
1040  LET A=A*10
1050  NEXT K
1060  LET D1=D1+A
1070  GOTO 1140
1080  LET C9=-99999.
1090  LET Y9=D1
1100  LET D1=D=0
1110  GOTO 1140
1120  NEXT I
1130  LET D=D-1
1140  NEXT J
1150  REM TOTAL DAYS PAST THIS YEAR
1160  LET D2=D2+D1
1170  REM CHECK IF NO DAY INPUTED
1180  IF C9=0 THEN 910
1190  REM CHECK IF YEAR IS LESS THAN 1964
1200  IF Y9<1964 THEN 910
1210  LET Y9=Y9-1900
1220  IF Y9#(4*INT(Y9/4)) THEN 1270
1230  IF D2 <= 59 THEN 1270
1240  LET D2=D2+1
1250  LET C7=1
1260  REM TO CHECK DAYS THIS MONTH
1270  IF D1<1 OR D1>C7+C8 THEN 910
1280  REM -- Y9 = YEAR (E.G. 71), D2 = JULIAN DATE
1300  REM -- READ APPROPRIATE YEAR
1310  R9=1+3*(Y9-64)
1320  READ #1,R9
1330  FOR K9=1 TO 366
1340  READ #1;C[K9]
1350  NEXT K9
1360  IF C[D2]#-999 THEN 1400
1370  PRINT "THE MARKET WAS CLOSED ON ";A$
1371  PRINT "PLEASE CORRECT YOUR DATA"
1372  STOP 
1400  REM -- OK
1570  PRINT 
1580  PRINT  USING 1590;P1,A$
1590  IMAGE #,2D,5X,17A,3X
1591  PRINT L$
1600  REM -- GET INDEX VALUES
1610  K8=0
1620  K5=D2
1622  Y8=Y9
1630  LET K5=K5-Z5
1632  IF K5 <= 0 THEN 1650
1634  IF C[K5]=-999 THEN 1630
1636  REM -- GOOD PRICE FOUND, COUNT IT
1638  K8=K8+1
1640  IF K8=P3 THEN 1700
1642  GOTO 1630
1650  REM -- GO TO PRIOR YEAR
1652  Y8=Y8-1
1654  R9=1+3*(Y8-64)
1656  READ #1,R9
1658  FOR K9=1 TO 366
1660  READ #1;C[K9]
1662  NEXT K9
1663  LET K6=367
1664  FOR I1=1 TO 2
1665  LET K6=K6-1
1666  IF C[K6]#-999 THEN 1670
1667  NEXT I1
1670  LET K5=K5+K6
1672  GOTO 1632
1700  REM -- FIRST DATA IS DATE K5 IN YEAR Y8 (IN C)
1702  R1=C[K5]
1703  I=0
1705  GOTO 1720
1710  IF C[K5]=-999 THEN 1720
1712  I=I+1
1714  X[I]=C[K5]
1716  IF I=N THEN 1800
1720  LET K5=K5+Z5
1725  IF K5<367 THEN 1710
1730  REM -- READ ANOTHER YEAR
1732  Y8=Y8+1
1734  R9=1+3*(Y8-64)
1736  READ #1,R9
1740  FOR K9=1 TO 366
1742  READ #1;C[K9]
1744  NEXT K9
1745  IF Y8-1=(4*INT((Y8-1)/4)) THEN 1750
1746  LET K5=K5-365
1747  GOTO 1710
1750  LET K5=K5-366
1760  GOTO 1710
1800  REM -- VALUES IN Y, COMPUTE RATIOS
1810  FOR I=1 TO N
1815  R2=X[I]
1820  X[I]=(X[I]-R1)/R1
1821  R1=R2
1822  NEXT I
1825  REM -- LOAD STOCK DATA AND CALCULATE PERCENT CHANGES
1830  IF F$[1,1]="F" THEN 1860
1840  READ R1
1850  GOTO 1880
1860  READ #2,P[P6];R1
1870  MAT  READ #2;Y
1880  FOR I=1 TO N
1890  IF F$[1,1]="F" THEN 1920
1900  READ R2
1910  GOTO 1930
1920  LET R2=Y[I]
1930  LET Y[I]=(R2-R1)/R1
1940  LET R1=R2
1950  NEXT I
1960  REM TO CALCULATE THE API
1970  MAT X=(B)*X
1980  MAT X=Y-X
1990  MAT R=R+X
2030  LET P6=P6+1
2040  NEXT P1
2050  MAT R=(1/P5)*R
2060  LET Y=1
2065  S1=S2=100
2070  FOR J=1 TO N
2080  LET Y=Y*(1+R[J])
2090  LET Y[J]=100*Y
2091  IF Y[J]<S2 THEN 2093
2092  S2=Y[J]
2093  IF Y[J]>S1 THEN 2100
2094  S1=Y[J]
2100  LET X[J]=J-P3-1
2110  NEXT J
2120  GOTO 3000
3000  REM ------------------
3001  REM -- PLOT VALUES
3003  FOR K9=1 TO N
3004  X[K9]=X[K9]+1
3005  NEXT K9
3010  PRINT LIN(3)
3012  PRINT  USING 3014;S1,S2
3014  IMAGE "MINIMUM API = ",4D.5D,"  MAXIMUM API = ",4D.5D
3020  PRINT "DO YOU WANT TO CHOOSE THE SCALE";
3022  INPUT A$
3024  IF A$[1,1]="N" THEN 3100
3030  PRINT "MINIMUM VALUE ";
3032  INPUT S1
3040  PRINT "MAXIMUM VALUE ";
3042  INPUT S2
3100  S3=(S2-S1)/50
3102  PRINT LIN(2)
3110  FOR I9=1 TO 50
3112  IF (S1+I9*S3)>100 THEN 3120
3114  NEXT I9
3120  REM -- I9 IS LOCATION OF THE AXIS (100)
3130  C$="                                                       "
3150  PRINT  USING 3152;S1
3152  IMAGE #,"PERIOD","  API  ",5D.3D
3153  IF 15+I9<23 THEN 3158
3154  IF 15+I9>60 THEN 3158
3156  PRINT TAB(15+I9);100;
3158  PRINT TAB(61);
3159  PRINT  USING 3160;S2
3160  IMAGE 5D.3D
3170  FOR K9=1 TO 50
3171  C$[K9,K9]="-"
3172  NEXT K9
3173  C$[I9,I9]="+"
3174  C$[1,1]="+"
3175  C$[50,50]="+"
3180  PRINT  USING 3182;C$
3182  IMAGE "------","  ---  ",5X,50A
3185  FOR K9=1 TO 50
3186  C$[K9,K9]=" "
3187  NEXT K9
3190  C$[I9,I9]="*"
3191  PRINT  USING 3192;X[1]-1,100,C$
3192  IMAGE 5D,5D.3D,4X,50A
3193  C$[I9,I9]=" "
3200  FOR J=1 TO N
3202  IF X[J]#0 THEN 3210
3204  FOR K9=1 TO 50
3205  C$[K9,K9]="-"
3206  NEXT K9
3207  C$[I9,I9]="+"
3208  GOTO 3220
3210  C$[I9,I9]="!"
3220  Y=Y[J]
3230  FOR I8=1 TO 50
3232  IF (S1+I8*S3)>Y THEN 3240
3234  NEXT I8
3240  REM -- I8 IS LOCATION OF POINT
3250  C$[I8,I8]="*"
3255  I7=I8 MAX I9
3256  IF X[J]#0 THEN 3260
3257  I7=50
3260  PRINT  USING 3262;X[J],Y[J]
3262  IMAGE #,5D,5D.3D,4X
3264  PRINT C$[1,I7]
3270  C$[I8,I8]=" "
3280  IF X[J]#0 THEN 3290
3282  FOR K9=1 TO 50
3283  C$[K9,K9]=" "
3284  NEXT K9
3290  NEXT J
3900  STOP 
