retdata <- read.csv("m-fac9003.csv")
head(retdata)
##       AA    AGE    CAT     F    FDX    GM   HPQ    KMB    MEL    NYT    PG
## 1 -16.40 -12.17  -4.44 -0.06  -2.28 -2.12 -6.19 -11.01 -10.77  -6.30 -8.89
## 2   4.04   4.95   8.84  6.02  10.47  8.97 -4.01  -5.20   0.34  -4.62 -0.84
## 3   0.12  13.08   0.17  2.06  10.84  1.57  5.67   3.21  -0.17  -0.66  5.41
## 4  -4.28 -11.06   0.25 -5.67  -2.44 -4.19 -5.29  -0.65  -2.20 -10.60  4.26
## 5   5.81  19.70   8.52  3.89 -16.17 10.94  8.81   8.83  11.85  11.59 16.35
## 6  -4.05  -1.44 -22.10 -5.79  -2.81 -2.70 -1.47   1.55  -7.76  -0.12  4.80
##      TRB   TXN SP500
## 1 -13.04 -7.61 -7.52
## 2  -0.37  4.97  0.21
## 3   2.36  2.69  1.77
## 4  -7.98 -6.85 -3.34
## 5   8.82 22.88  8.55
## 6  -0.64 -5.87 -1.53
retdata <- retdata / 100
head(retdata)
##        AA     AGE     CAT       F     FDX      GM     HPQ     KMB     MEL
## 1 -0.1640 -0.1217 -0.0444 -0.0006 -0.0228 -0.0212 -0.0619 -0.1101 -0.1077
## 2  0.0404  0.0495  0.0884  0.0602  0.1047  0.0897 -0.0401 -0.0520  0.0034
## 3  0.0012  0.1308  0.0017  0.0206  0.1084  0.0157  0.0567  0.0321 -0.0017
## 4 -0.0428 -0.1106  0.0025 -0.0567 -0.0244 -0.0419 -0.0529 -0.0065 -0.0220
## 5  0.0581  0.1970  0.0852  0.0389 -0.1617  0.1094  0.0881  0.0883  0.1185
## 6 -0.0405 -0.0144 -0.2210 -0.0579 -0.0281 -0.0270 -0.0147  0.0155 -0.0776
##       NYT      PG     TRB     TXN   SP500
## 1 -0.0630 -0.0889 -0.1304 -0.0761 -0.0752
## 2 -0.0462 -0.0084 -0.0037  0.0497  0.0021
## 3 -0.0066  0.0541  0.0236  0.0269  0.0177
## 4 -0.1060  0.0426 -0.0798 -0.0685 -0.0334
## 5  0.1159  0.1635  0.0882  0.2288  0.0855
## 6 -0.0012  0.0480 -0.0064 -0.0587 -0.0153
# Method 1: Using lm function to estimate regression ----
stockret <- as.matrix(retdata[, 1:13])
mktret <- as.matrix(retdata[, 14])
TT <- dim(stockret)[1]

fit <- lm(formula = stockret ~ mktret)
fit
## 
## Call:
## lm(formula = stockret ~ mktret)
## 
## Coefficients:
##              AA        AGE       CAT       F         FDX       GM      
## (Intercept)  0.005491  0.007218  0.008394  0.004544  0.007996  0.001982
## mktret       1.291591  1.514136  0.940693  1.219245  0.805117  1.045702
##              HPQ       KMB       MEL       NYT       PG        TRB     
## (Intercept)  0.006836  0.005463  0.008849  0.004904  0.008881  0.006512
## mktret       1.627951  0.549805  1.122871  0.770649  0.468803  0.717881
##              TXN     
## (Intercept)  0.014389
## mktret       1.796412
sigF = as.numeric(var(mktret))
bbeta = as.matrix(fit$coefficients)
bbeta = as.matrix(bbeta[-1,])
bbeta
##          [,1]
## AA  1.2915911
## AGE 1.5141359
## CAT 0.9406928
## F   1.2192453
## FDX 0.8051166
## GM  1.0457019
## HPQ 1.6279512
## KMB 0.5498052
## MEL 1.1228708
## NYT 0.7706495
## PG  0.4688034
## TRB 0.7178808
## TXN 1.7964117
sigeps = crossprod(fit$residuals)/(TT-2)

# Method to compute sigeps:
# sigeps.1 = as.matrix(var(fit$residuals))   
sigeps = diag(diag(sigeps))
sigeps
##              [,1]        [,2]        [,3]        [,4]        [,5]        [,6]
##  [1,] 0.005919846 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
##  [2,] 0.000000000 0.006095651 0.000000000 0.000000000 0.000000000 0.000000000
##  [3,] 0.000000000 0.000000000 0.005966741 0.000000000 0.000000000 0.000000000
##  [4,] 0.000000000 0.000000000 0.000000000 0.006791031 0.000000000 0.000000000
##  [5,] 0.000000000 0.000000000 0.000000000 0.000000000 0.007839072 0.000000000
##  [6,] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.006609876
##  [7,] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
##  [8,] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
##  [9,] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
## [10,] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
## [11,] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
## [12,] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
## [13,] 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
##              [,7]       [,8]        [,9]      [,10]       [,11]       [,12]
##  [1,] 0.000000000 0.00000000 0.000000000 0.00000000 0.000000000 0.000000000
##  [2,] 0.000000000 0.00000000 0.000000000 0.00000000 0.000000000 0.000000000
##  [3,] 0.000000000 0.00000000 0.000000000 0.00000000 0.000000000 0.000000000
##  [4,] 0.000000000 0.00000000 0.000000000 0.00000000 0.000000000 0.000000000
##  [5,] 0.000000000 0.00000000 0.000000000 0.00000000 0.000000000 0.000000000
##  [6,] 0.000000000 0.00000000 0.000000000 0.00000000 0.000000000 0.000000000
##  [7,] 0.008966712 0.00000000 0.000000000 0.00000000 0.000000000 0.000000000
##  [8,] 0.000000000 0.00368461 0.000000000 0.00000000 0.000000000 0.000000000
##  [9,] 0.000000000 0.00000000 0.003745483 0.00000000 0.000000000 0.000000000
## [10,] 0.000000000 0.00000000 0.000000000 0.00434329 0.000000000 0.000000000
## [11,] 0.000000000 0.00000000 0.000000000 0.00000000 0.004171711 0.000000000
## [12,] 0.000000000 0.00000000 0.000000000 0.00000000 0.000000000 0.005205835
## [13,] 0.000000000 0.00000000 0.000000000 0.00000000 0.000000000 0.000000000
##            [,13]
##  [1,] 0.00000000
##  [2,] 0.00000000
##  [3,] 0.00000000
##  [4,] 0.00000000
##  [5,] 0.00000000
##  [6,] 0.00000000
##  [7,] 0.00000000
##  [8,] 0.00000000
##  [9,] 0.00000000
## [10,] 0.00000000
## [11,] 0.00000000
## [12,] 0.00000000
## [13,] 0.01316524
# Covariance matrix by single factor model 
cov_1f = sigF*bbeta%*%t(bbeta)+sigeps
cov_1f
##              AA         AGE          CAT           F          FDX          GM
## AA  0.009046736 0.003665662 0.0022773795 0.002951744 0.0019491551 0.002531602
## AGE 0.003665662 0.010392918 0.0026697784 0.003460338 0.0022850000 0.002967804
## CAT 0.002277380 0.002669778 0.0076254044 0.002149817 0.0014196104 0.001843819
## F   0.002951744 0.003460338 0.0021498168 0.009577439 0.0018399772 0.002389800
## FDX 0.001949155 0.002285000 0.0014196104 0.001839977 0.0090540833 0.001578081
## GM  0.002531602 0.002967804 0.0018438188 0.002389800 0.0015780808 0.008659520
## HPQ 0.003941205 0.004620285 0.0028704615 0.003720446 0.0024567600 0.003190890
## KMB 0.001331056 0.001560401 0.0009694362 0.001256500 0.0008297174 0.001077654
## MEL 0.002718425 0.003186817 0.0019798858 0.002566158 0.0016945373 0.002200899
## NYT 0.001865711 0.002187179 0.0013588366 0.001761207 0.0011629960 0.001510523
## PG  0.001134954 0.001330510 0.0008266108 0.001071382 0.0007074766 0.000918885
## TRB 0.001737961 0.002037416 0.0012657930 0.001640612 0.0010833622 0.001407093
## TXN 0.004349041 0.005098393 0.0031674972 0.004105438 0.0027109857 0.003521083
##             HPQ          KMB          MEL          NYT           PG
## AA  0.003941205 0.0013310564 0.0027184251 0.0018657114 0.0011349541
## AGE 0.004620285 0.0015604012 0.0031868174 0.0021871787 0.0013305099
## CAT 0.002870462 0.0009694362 0.0019798858 0.0013588366 0.0008266108
## F   0.003720446 0.0012565001 0.0025661582 0.0017612075 0.0010713820
## FDX 0.002456760 0.0008297174 0.0016945373 0.0011629960 0.0007074766
## GM  0.003190890 0.0010776539 0.0022008995 0.0015105229 0.0009188850
## HPQ 0.013934297 0.0016776942 0.0034263656 0.0023515856 0.0014305223
## KMB 0.001677694 0.0042512149 0.0011571807 0.0007941971 0.0004831279
## MEL 0.003426366 0.0011571807 0.0061088004 0.0016219938 0.0009866952
## NYT 0.002351586 0.0007941971 0.0016219938 0.0054564979 0.0006771894
## PG  0.001430522 0.0004831279 0.0009866952 0.0006771894 0.0045836602
## TRB 0.002190566 0.0007398161 0.0015109311 0.0010369833 0.0006308202
## TXN 0.005481631 0.0018513021 0.0037809262 0.0025949280 0.0015785529
##              TRB         TXN
## AA  0.0017379606 0.004349041
## AGE 0.0020374161 0.005098393
## CAT 0.0012657930 0.003167497
## F   0.0016406124 0.004105438
## FDX 0.0010833622 0.002710986
## GM  0.0014070929 0.003521083
## HPQ 0.0021905656 0.005481631
## KMB 0.0007398161 0.001851302
## MEL 0.0015109311 0.003780926
## NYT 0.0010369833 0.002594928
## PG  0.0006308202 0.001578553
## TRB 0.0061718134 0.002417246
## TXN 0.0024172455 0.019214110
# Method 2: Use formula "inv(X'X)*X'Y" ----
ones = rep(1, TT)
X = as.matrix(cbind(ones, mktret))
Y = stockret
b_hat = solve(t(X)%*%X)%*%t(X) %*% stockret
E_hat = Y - X %*% b_hat
# Excluding constant term
b_hat = as.matrix(b_hat[-1,])
diagD_hat = diag(t(E_hat) %*% E_hat)/(TT-2)
# Covariance matrix by single factor model 
cov_1f.1 = as.numeric(var(mktret))*b_hat%*%t(b_hat) + diag(diagD_hat); 
cov_1f.1
##              AA         AGE          CAT           F          FDX          GM
## AA  0.009046736 0.003665662 0.0022773795 0.002951744 0.0019491551 0.002531602
## AGE 0.003665662 0.010392918 0.0026697784 0.003460338 0.0022850000 0.002967804
## CAT 0.002277380 0.002669778 0.0076254044 0.002149817 0.0014196104 0.001843819
## F   0.002951744 0.003460338 0.0021498168 0.009577439 0.0018399772 0.002389800
## FDX 0.001949155 0.002285000 0.0014196104 0.001839977 0.0090540833 0.001578081
## GM  0.002531602 0.002967804 0.0018438188 0.002389800 0.0015780808 0.008659520
## HPQ 0.003941205 0.004620285 0.0028704615 0.003720446 0.0024567600 0.003190890
## KMB 0.001331056 0.001560401 0.0009694362 0.001256500 0.0008297174 0.001077654
## MEL 0.002718425 0.003186817 0.0019798858 0.002566158 0.0016945373 0.002200899
## NYT 0.001865711 0.002187179 0.0013588366 0.001761207 0.0011629960 0.001510523
## PG  0.001134954 0.001330510 0.0008266108 0.001071382 0.0007074766 0.000918885
## TRB 0.001737961 0.002037416 0.0012657930 0.001640612 0.0010833622 0.001407093
## TXN 0.004349041 0.005098393 0.0031674972 0.004105438 0.0027109857 0.003521083
##             HPQ          KMB          MEL          NYT           PG
## AA  0.003941205 0.0013310564 0.0027184251 0.0018657114 0.0011349541
## AGE 0.004620285 0.0015604012 0.0031868174 0.0021871787 0.0013305099
## CAT 0.002870462 0.0009694362 0.0019798858 0.0013588366 0.0008266108
## F   0.003720446 0.0012565001 0.0025661582 0.0017612075 0.0010713820
## FDX 0.002456760 0.0008297174 0.0016945373 0.0011629960 0.0007074766
## GM  0.003190890 0.0010776539 0.0022008995 0.0015105229 0.0009188850
## HPQ 0.013934297 0.0016776942 0.0034263656 0.0023515856 0.0014305223
## KMB 0.001677694 0.0042512149 0.0011571807 0.0007941971 0.0004831279
## MEL 0.003426366 0.0011571807 0.0061088004 0.0016219938 0.0009866952
## NYT 0.002351586 0.0007941971 0.0016219938 0.0054564979 0.0006771894
## PG  0.001430522 0.0004831279 0.0009866952 0.0006771894 0.0045836602
## TRB 0.002190566 0.0007398161 0.0015109311 0.0010369833 0.0006308202
## TXN 0.005481631 0.0018513021 0.0037809262 0.0025949280 0.0015785529
##              TRB         TXN
## AA  0.0017379606 0.004349041
## AGE 0.0020374161 0.005098393
## CAT 0.0012657930 0.003167497
## F   0.0016406124 0.004105438
## FDX 0.0010833622 0.002710986
## GM  0.0014070929 0.003521083
## HPQ 0.0021905656 0.005481631
## KMB 0.0007398161 0.001851302
## MEL 0.0015109311 0.003780926
## NYT 0.0010369833 0.002594928
## PG  0.0006308202 0.001578553
## TRB 0.0061718134 0.002417246
## TXN 0.0024172455 0.019214110