10  COM A[100],B[100],Q[100],L[100],U[100],X[100],P[100]
11  COM N[100],S[100]
12  COM Z7,A9,Q9,L9,N9
13  COM S1,S2,S3,S4,S5,S6,S7,S8,S9
50  REM HP CONTRIBUTED LIBRARY, REV. B, 2/75
59  DIM R$[5]
61  R$="NO"
90  LET Z7=99999.
100  REM--SINGLE INDEX PORTFOLIO ANALYSIS ROUTINE
101  REM--COPYRIGHT 1968--W.F. SHARPE
200  REM--INPUT DATA
201  GOSUB 1000
250  REM--FIND FIRST (MAX-E) PORTFOLIO
251  GOSUB 2000
260  REM--CALCULATE SUMS
261  GOSUB 4000
270  CHAIN "$GDPA2"
1000  REM--INPUT DATA
1010  READ A9,Q9
1020  READ N9,L9,U9
1025  FOR I=1 TO N9
1026  LET L[I]=L9
1027  LET U[I]=U9
1030  READ A[I],B[I],Q[I]
1040  NEXT I
1045  PRINT ""
1050  RETURN 
2000  REM--ROUTINE TO FIND FIRST (MAX-E) PORTFOLIO
2005  LET L1=999999.
2006  LET K7=0
2008  REM  FIND SUM OF LOWER BOUNDS,UPPER BOUNDS, SET ALL DOWN
2009  LET X5=X6=0
2010  FOR I=1 TO N9
2011  LET X[I]=L[I]
2012  LET S[I]=0
2013  LET X5=X5+X[I]
2014  LET X6=X6+U[I]
2015  NEXT I
2016  IF X6 >= 1 THEN 2020
2017  PRINT "SUM OF UPPER BOUNDS PREVENTS FULL INVESTMENT--INCREASE UPPER"
2018  PRINT "BOUND OR ADD MORE SECURITIES (TOTAL UPPER BOUND="X6")"
2019  STOP 
2020  REM--CHECK FOR TERMINAL CONDITIONS
2021  IF X5<1 THEN 2035
2022  IF X5=1 THEN 2026
2023  REM--LOWER BOUNDS EXCEED L
2024  PRINT "NO FEASIBLE PORTFOLIOS--SUM OF LOWER BOUNDS IS",X5
2025  STOP 
2026  REM--ONLY ONE FEASIBLE PORTFOLIO
2027  PRINT "THE ONLY FEASIBLE PORTFOLIO HAS ALL SECURITIES AT LOWER BDS"
2028  PRINT 
2030  STOP 
2035  REM--RANK SECURITIES IN ORDER OF DESCENDING E
2036  REM--N(I) IS THE NUMBER OF THE I-TH RANKED SECURITY
2037  FOR I=1 TO N9
2038  LET N[I]=I
2039  NEXT I
2043  LET N8=N9-1
2045  LET K9=0
2046  FOR I=1 TO N8
2047  LET I1=N[I]
2048  LET I2=N[I+1]
2049  LET E1=A[I1]+(B[I1]*A9)
2050  LET E2=A[I2]+(B[I2]*A9)
2051  IF E1 >= E2 THEN 2060
2053  REM--SWITCH RANKS
2054  LET N5=N[I]
2055  LET N[I]=N[I+1]
2056  LET N[I+1]=N5
2057  LET K9=1
2060  NEXT I
2061  IF K9=0 THEN 2068
2062  LET N8=N8-1
2063  GOTO 2045
2068  REM--FIND SECURITIES TO BE UP AND IN
2070  FOR I=1 TO N9
2071  LET I1=N[I]
2075  LET D=U[I1]-L[I1]
2076  IF (X5+D)<1 THEN 2093
2077  REM--THIS SECURITY SHOULD BE IN
2078  LET X[I1]=(1-X5)+L[I1]
2079  LET S[I1]=1
2080  REM--MAKE ADJUSTMENTS IF REQUIRED
2081  IF I=N9 THEN 2098
2082  LET I2=N[I+1]
2083  LET E2=A[I2]+(B[I2]*A9)
2084  FOR J=1 TO I
2085  LET I1=N[J]
2086  LET E1=A[I1]+(B[I1]*A9)
2087  IF E1>E2 THEN 2090
2088  REM--ADJUST
2089  LET A[I1]=A[I1]+.000001
2090  NEXT J
2091  GOTO 2190
2093  REM--THIS SECURITY SHOULD BE UP
2094  LET X5=X5+D
2095  LET S[I1]=2
2096  LET X[I1]=U[I1]
2098  NEXT I
2190  RETURN 
4000  REM---ROUTINE TO CALCULATE SUMS
4001  LET S1=S2=S3=S4=S5=S6=S7=S8=S9=0
4020  FOR I=1 TO N9
4025  IF S[I]=0 THEN 4060
4026  IF S[I]=2 THEN 4070
4030  REM--SECURITY IS IN, ADD TO SUMS
4031  LET S1=S1+(A[I]/(2*Q[I]))
4032  LET S2=S2+(B[I]/(2*Q[I]))
4033  LET S3=S3+(1/(2*Q[I]))
4034  LET S4=S4+((A[I]*B[I])/(2*Q[I]))
4035  LET S5=S5+((B[I]^2)/(2*Q[I]))
4036  GOTO 4080
4060  REM--SECURITY IS DOWN
4061  LET S6=S6+L[I]
4062  LET S7=S7+(L[I]*B[I])
4063  GOTO 4080
4070  REM--SECURITY IS UP
4071  LET S8=S8+U[I]
4072  LET S9=S9+(U[I]*B[I])
4080  NEXT I
4090  RETURN 
5000  DATA .503,.089
5010  DATA 20,0,.1
5020  DATA 1.539,2.334,.297
5021  DATA 1.424,1.279,.088
5022  DATA 1.436,1.805,.15
5023  DATA 1.553,2.613,.349
5024  DATA 1.29,1.196,.064
5025  DATA 1.511,1.473,.143
5026  DATA 1.409,1.732,.103
5027  DATA 1.297,1.82,.12
5028  DATA 1.553,2.469,.202
5029  DATA 2.011,2.008,.529
5030  DATA 1.358,1.607,.139
5031  DATA 1.603,1.672,.184
5032  DATA 1.382,1.733,.136
5033  DATA 1.312,1.098,.055
5034  DATA 1.465,2.304,.167
5035  DATA 1.318,1.054,.058
5036  DATA 1.336,.84,.038
5037  DATA 1.326,1.16,.067
5038  DATA 1.304,1.103,.058
5039  DATA 1.494,3.09,.361
9999  END 
