PROGRAM TestStockPorts ! ---------------------------------------------------------------------------- ! This program is designed to test if portfolio theory is worth anything. ! The Matt Factor is defined as M(i)=SQRT((R-Ri)^2+(S-Si)^2), where R is ! the optimal return I want, Ri, is the return that is calculated from the ! "stock" data, S is risk that I optimized for, and Si, is the actual ! calculated risk. ! ---------------------------------------------------------------------------- ! Created by Matthew S. Norton ! Last Updated ! February 21, 2008 ! ---------------------------------------------------------------------------- ! NOTE: This is in FORTRAN 90 and you will need a FORTRAN 90 complier to run this code ! ---------------------------------------------------------------------------- ! IMPLICIT NONE INTEGER, PARAMETER :: NMAT = 3, NumTrials = 10000 REAL*8, DIMENSION(NMAT) :: Weights, Returns, PerR REAL*8, DIMENSION(NMAT, NMAT) :: QMat, PerQ REAL*8 :: QOUT(NMAT,NMAT),ROUT(NMAT), RETURNI = 0.0d0, Riski = 0.0d0, Risks = 0.0d0 REAL*8 :: Returnss(2) = 0.0d0, Risk(2) = 0.0d0, Mattian = 0.0d0, Com1 = 0.0d0 REAL*8 :: Com2 = 0.0d0, Mattians = 0.0d0, Coms1 = 0.0d0, Coms2 = 0.0d0, Comz1 = 0.0d0, Comz2 = 0.0d0 INTEGER :: I, J, Count = 1, Now(8), L OPEN(UNIT = 10, FILE = "RiskRet.txt", STATUS = "UNKNOWN") OPEN(UNIT = 20, FILE = "Mattian.txt", STATUS = "UNKNOWN") !DO I = 1, NMAT ! PRINT *, "Please input value for return for stock", I ! READ *, Returns(I) !END DO Returns(1) = 0.01d0 *100. Returns(2) = 0.02d0 *100. Returns(3) = 0.04d0 *100. DO I = 1, NMAT PerR(I) = Returns(I) END DO !PRINT *, (Returns(I), I = 1, NMAT) !DO I = 1, NMAT ! DO J = 1, NMAT ! WRITE(*, 100) "Please input value of covarience matrix Q(",I,",",J,")" ! READ*, QMAT(I,J) ! END DO !END DO QMAT(1,1)=0.1**2 *100.**2 QMAT(2,2)=0.2**2 *100.**2 QMAT(3,3)=0.4**2 *100.**2 QMAT(1,2)=SQRT(QMAT(1,1))*SQRT(QMAT(2,2)) * 0.1 QMAT(2,1)=QMAT(1,2) QMAT(1,3)=SQRT(QMAT(1,1))*SQRT(QMAT(3,3)) * (-0.1) QMAT(3,1)=QMAT(1,3) QMAT(2,3)=SQRT(QMAT(2,2))*SQRT(QMAT(3,3)) * (0.0) QMAT(3,2)=QMAT(2,3) DO I = 1, NMAT DO J = 1, NMAT PerQ(I,J) = QMAT(I,J) END DO END DO !PRINT *, "Covarience matrix is:" !DO I = 1, NMAT ! DO J = 1, NMAT ! WRITE(*,105, ADVANCE = 'NO') QMat(I,J) ! END DO ! WRITE(*,*) !END DO !DO I = 1, NMAT ! WRITE(*, 110) "Please input value for weight ", I ! READ *, Weights(I) !END DO Weights(1) = 0.4425659182603772d0 Weights(2) = 0.33267029746624077d0 Weights(3) = 0.2247637842733821d0 !PRINT *, (Weights(I), I = 1, NMAT) DO I = 1, NMAT Returnss(1) = Weights(I) * PerR(I) END DO DO I = 1, NMAT DO J = 1, NMAT Risk(1) = Risk(1) + QMAT(I,J) * Weights(I) * Weights(J) END DO END DO Risks = DSQRT(Risk(1)) CALL date_and_time(values=now) CALL random_seed(put=now(5:8)) DO L = 1, NumTrials !PRINT *, L ! CALL ResetValues() CALL AdjustValues(RETURNS,QMAT,ROUT,QOUT) ! CALL AdjustValues() RETURNSS=0.0d0 RETURNI=0.0d0 DO I = 1, NMAT RETURNI = RETURNI+Weights(I) * ROUT(I) END DO RISKI=0. DO I = 1, NMAT DO J = 1, NMAT RiskI = RiskI + Weights(I)*QOUT(I,J)*Weights(J) END DO END DO RISKI=SQRT(RISKI) IF (MOD(L,500) == 0) THEN WRITE(*,*) L, RETURNI,RISKI ENDIF WRITE(10,*) L, RETURNI,RISKI Mattian = Matt(Returni, returnss(1), Riski, Risks) Com1 = Compare(Returni, Returnss(1)) Com2 = Compare(Riski, Risks) Mattians = Mattians + Mattian Coms1 = Coms1 + RETURNI Coms2 = Coms2 + RISKI Comz1 = Comz1 + Com1 Comz2 = Comz2 + Com2 WRITE(20,*) L, Mattian, Com1, Com2 !PRINT *, Mattian, Com1, Com2 ! IF (MOD(L,500) == 0) PRINT *, L END DO Mattians = Mattians / REAL(NumTrials) Coms1 = Coms1 / REAL(NumTrials) Coms2 = Coms2 / REAL(NumTrials) Comz1 = Comz1 / REAL(NumTrials) Comz2 = Comz2 / REAL(NumTrials) PRINT *, "Mattian = ", Mattians, "Return = ", Coms1, "Risks = ", Coms2 PRINT *, "Comparison of Returns = ", Comz1, "Comparison of Risks = ", Comz2 100 FORMAT(1X, A42, I1, A1, I1, A1) 105 FORMAT(1X, F7.5) 110 FORMAT(1X, A30, I1) ! ---------------------------------------------------------------------------- CONTAINS ! ---------------------------------------------------------------------------- SUBROUTINE AdjustValues(RIN,QIN,ROUT,QOUT) REAL*8 :: X, Signs, RIN(NMAT), Y, QIN(NMAT, NMAT) REAL*8 :: ROUT(NMAT), QOUT(NMAT, NMAT) REAL*8 :: R(NMAT,2), Q(NMAT, NMAT,2) REAL*8, PARAMETER :: Ad = 0.01d0 INTEGER :: I, J DO I=1,NMAT CALL Random_Number(X) ROUT(I)=RIN(I)+ (2.*X-1.) * 1. END DO DO I=1,NMAT DO J=I,NMAT CALL Random_Number(X) QOUT(I,J)=QIN(I,J)+ (2.*X-1.) * ( 10. )**2 QOUT(J,I)=QOUT(I,J) END DO END DO END SUBROUTINE ! ---------------------------------------------------------------------------- FUNCTION Signed(Y) REAL*8, INTENT(IN) :: Y REAL*8 :: Signed Signed = NINT(ABS(Y) / Y) END FUNCTION Signed ! ---------------------------------------------------------------------------- FUNCTION Matt(ReId, ReMe, RiId, RiMe) REAL*8 :: Matt REAL*8 :: ReId, ReMe, RiId, RiMe Matt = DSQRT((ReId - ReMe) ** 2 + (RiId - RiMe) ** 2) END FUNCTION ! ---------------------------------------------------------------------------- FUNCTION Compare(Idiot, Me) REAL*8 :: Compare REAL*8 :: Idiot, Me Compare = Idiot - Me END FUNCTION ! ---------------------------------------------------------------------------- END PROGRAM