I. MỞ ĐẦU

  • Thị trường chứng khoán được biết đến là một trong những kênh đầu tư quan trọng của các nhà đầu tư ở Việt Nam cũng như trên toàn thế giới. Khi đầu tư vào các tài sản hay các danh mục, các nhà đầu tư đặc biệt quan tâm đến tỷ suất sinh lợi của các loại tài sản đó. Do đó, các lý thuyết cũng như mô hình phân tích và định giá tài sản tài chính ra đời và ngày càng phát triển để đáp ứng nhu cầu của các nhà đầu tư. Một trong những mô hình phổ biến nhất là mô hình APT (Arbitrage Pricing Theory).

  • Do còn nhiều hạn chế về thời gian và trình độ nên nhóm chúng em sẽ tập trung vào ước lượng và phân tích mô hình Fama - French ba nhân tố và mở rộng mô hình thành Fama - French năm nhân tố với số liệu ở trên sàn giao dịch chứng khoán Hà Nội năm 2022.

II. PHƯƠNG PHÁP ƯỚC LƯỢNG VÀ THU THẬP DỮ LIỆU

1. Phương pháp ước lượng

  • Dùng phương pháp hồi quy tuyến tính OLS

2. Thu thập dữ liệu

III. XỬ LÝ DỮ LIỆU

1. Tính chuỗi lợi suất

library(readxl)
X50_CP_HNX=read_excel("D:/Term 5/ĐG1/50 CP HNX.xlsx")
returns = data.frame(X50_CP_HNX$`Ngày giao dịch`, matrix(rep(0,249*50), nrow = 249, ncol = 50))
colnames(returns) = colnames(X50_CP_HNX)

for(j in 2:ncol(X50_CP_HNX)) {
  for(i in 2:nrow(X50_CP_HNX)) {
    a = X50_CP_HNX[[i,j]]
    b = X50_CP_HNX[[i-1,j]]
    returns[[i,j]] = log(a/b)
  }
}

returns = returns[-1,]
head(returns[,1:5])
##   Ngày giao dịch         MAC         KSF          NSH          IVS
## 2     05/01/2022  0.06637507  0.03320867  0.007604599 -0.016620881
## 3     06/01/2022 -0.01851905  0.09462470  0.093931820 -0.005602256
## 4     07/01/2022  0.04567004  0.02817088 -0.035091320  0.005602256
## 5     10/01/2022 -0.01801851 -0.10289442  0.000000000 -0.016901811
## 6     11/01/2022 -0.02765153 -0.02115823 -0.014388737 -0.034685558
## 7     12/01/2022 -0.04785602 -0.02161559 -0.007272759  0.017493157
  • Từ chuỗi giá đóng cửa ban đầu của 50 mã cổ phiếu trên sàn HNX, ta tính chuỗi lợi suất theo công thức: \[ r_t = ln(\frac{S_t}{S_{t-1}}) \]
  • \(r_t\) khá nhỏ nên sẽ xấp xỉ công thức trên.

2. Tính chỉ số vốn hóa thị trường (SMB)

Tính quy mô vốn hóa của mỗi cổ phiếu (Stock - Size): Giá cuối tháng 6 \(\times\) Số cổ phiếu lưu hành

CS=read_excel("D:/Term 5/ĐG1/CS.xlsx")
head(CS[,1:6])
## # A tibble: 6 × 6
##   Stock `Khối lượng CP lưu hành`  `Vốn CSH` `Tài sản vô hình` `Giá cuối tháng 6`
##   <chr>                    <dbl>      <dbl>             <dbl>              <dbl>
## 1 TTH                   37374846    4.07e11                 0               3100
## 2 FID                   24715958    2.48e11                 0               3200
## 3 SRA                   43199974    6.30e11                 0               6900
## 4 DL1                  106236094    1.33e12         333801182               5000
## 5 ITQ                   31843305    3.30e11        6660196800               4300
## 6 CTC                   15799926    1.24e11        1101142284               4200
## # ℹ 1 more variable: Market <dbl>
CSVH<-CS$`Khối lượng CP lưu hành`*CS$`Giá cuối tháng 6`
CS1<-data.frame(CS[,1:6],CSVH)
head(CS1)
##   Stock Khối.lượng.CP.lưu.hành      Vốn.CSH Tài.sản.vô.hình Giá.cuối.tháng.6
## 1   TTH               37374846 4.068710e+11               0             3100
## 2   FID               24715958 2.483844e+11               0             3200
## 3   SRA               43199974 6.299223e+11               0             6900
## 4   DL1              106236094 1.326969e+12       333801182             5000
## 5   ITQ               31843305 3.300238e+11      6660196800             4300
## 6   CTC               15799926 1.241249e+11      1101142284             4200
##   Market         CSVH
## 1   1800 115862022600
## 2   1700  79091065600
## 3   3000 298079820600
## 4   3000 531180470000
## 5   2600 136926211500
## 6   2000  66359689200

Chia 50 mã cổ phiếu thành hai nhóm, nhóm “Lớn” (Big Size) sẽ chứa các mã cổ phiếu có chỉ số vốn hoá thị trường lớn hơn trung vị (median) của dãy và nhóm “Nhỏ” (Small Size) chứa các mã cổ phiếu có chỉ số vốn hóa thị trường nhỏ hơn trung vị của dãy.

VHL = c() # tạo vector để lưu các mã chứng khoán
VHN = c()

for (i in 1:length(CSVH)){
  if(CSVH[i]>median(CSVH)) {
    VHL<-c(VHL,i)
  }
  if (CSVH[i]<median(CSVH)) {
    VHN <-c(VHN,i)
  }
}
por_Big = c()
por_Small = c()
for ( i in VHL){
  por_Big<-c(por_Big,CS$Stock[i])
}
for ( i in VHN){
  por_Small<-c(por_Small,CS$Stock[i])
}
cbind(por_Big,por_Small)
##       por_Big por_Small
##  [1,] "NRC"   "TTH"    
##  [2,] "BCC"   "FID"    
##  [3,] "TIG"   "SRA"    
##  [4,] "LAS"   "DL1"    
##  [5,] "EVS"   "ITQ"    
##  [6,] "BVS"   "CTC"    
##  [7,] "IDJ"   "AMV"    
##  [8,] "SHS"   "LIG"    
##  [9,] "API"   "HAD"    
## [10,] "TNG"   "MST"    
## [11,] "VNR"   "HOM"    
## [12,] "MBS"   "DXP"    
## [13,] "TAR"   "AAV"    
## [14,] "CSC"   "NSH"    
## [15,] "PVS"   "IVS"    
## [16,] "HUT"   "CMS"    
## [17,] "NTP"   "TVD"    
## [18,] "VCS"   "VGS"    
## [19,] "THD"   "VC7"    
## [20,] "VC3"   "BNA"    
## [21,] "VFS"   "PVB"    
## [22,] "DDG"   "APS"    
## [23,] "KSF"   "PVC"    
## [24,] "L14"   "MAC"    
## [25,] "SCG"   "IDV"

Tính lợi suất của hai nhóm sau đó tính \(SMB = r_{small} - r_{big}\)

attach(returns)
dataB = data.frame(NRC,BCC,TIG,HUT,LAS,EVS,BVS,IDJ,SHS,API,TNG,VNR,MBS,TAR,CSC,PVS,NTP,VCS,THD,VC3,VFS,DDG,KSF,L14,SCG)
#head(dataB)
r_Big<-rowMeans(dataB)
dataS = data.frame(TTH,FID,SRA,DL1,ITQ,CTC,AMV,LIG,HAD,MST,HOM,DXP,AAV,NSH,IVS,CMS,VGS,VC7,BNA,PVB,APS,PVC,MAC,IDV,TVD)
r_Small<-rowMeans(dataS)
SMB=r_Small-r_Big
head(SMB)
## [1] -0.0009873598  0.0037899561  0.0088614668  0.0283514508 -0.0191950446
## [6] -0.0228536953

3. Tính chỉ số giá trị sổ sách/giá trị thị trường (Book to Market)

\(Giá \ trị \ sổ \ sách = \frac{Vốn \ chủ \ sở \ hữu - Tài \ sản \ vô \ hình}{Khối \ lượng \ cổ \ phiếu \ lưu \ hành}\)

Book = (CS$`Vốn CSH`-CS$`Tài sản vô hình`)/CS$`Khối lượng CP lưu hành`
BtM =Book/CS$Market
head(BtM)
## [1] 6.047903 5.911503 4.860514 4.162536 3.905707 3.893175

Sắp xếp toàn bộ các công ty có mặt trên thị trường theo thứ tự từ cao xuống thấp của chỉ số Book - to - Market.

BtM <- BtM[order(BtM,decreasing = TRUE)]
BtM
##  [1] 6.0479031 5.9115032 4.8605142 4.1625361 3.9057074 3.8931750 3.7883268
##  [8] 3.7384395 3.4103695 3.3660004 3.0714236 2.9943514 2.8964604 2.7257549
## [15] 2.7188822 2.0913181 1.9297522 1.8446815 1.8378748 1.7992619 1.7720356
## [22] 1.6215150 1.5873430 1.5500130 1.4984998 1.4717724 1.4636957 1.4340959
## [29] 1.3809078 1.3622458 1.3563329 1.3553092 1.2946851 1.2310490 1.0915296
## [36] 1.0595316 1.0518449 1.0395641 0.8944534 0.8194743 0.7582239 0.6809499
## [43] 0.5411027 0.4779424 0.4750028 0.4555115 0.3238457 0.3143654 0.2538102
## [50] 0.1985538

Chia thành hai nhóm, \(\frac13\) số công ty ở tốp đầu gọi là nhóm “Cao” (High - Ratio), \(\frac13\) số công ty ở nhóm cuối gọi là nhóm “Thấp” (Low - Ratio)

por_high = c()
por_low = c()
for ( i in 1:length(BtM)){
  if ( i <18){
    por_high= c(por_high,CS$Stock[i])
  }
  if(i>33){
    por_low = c(por_low,CS$Stock[i])
  }
}
cbind(por_high,por_low)
##       por_high por_low
##  [1,] "TTH"    "VNR"  
##  [2,] "FID"    "MBS"  
##  [3,] "SRA"    "TAR"  
##  [4,] "DL1"    "MAC"  
##  [5,] "ITQ"    "CSC"  
##  [6,] "CTC"    "IDV"  
##  [7,] "AMV"    "PVS"  
##  [8,] "LIG"    "HUT"  
##  [9,] "HAD"    "NTP"  
## [10,] "MST"    "VCS"  
## [11,] "NRC"    "THD"  
## [12,] "HOM"    "VC3"  
## [13,] "DXP"    "VFS"  
## [14,] "AAV"    "DDG"  
## [15,] "NSH"    "KSF"  
## [16,] "BCC"    "L14"  
## [17,] "IVS"    "SCG"
  • Tính chỉ số thị trường của từng nhóm, sau đó tính lợi suất của các chỉ số: \(r_{High}\), \(r_{Low}\)
  • Tính \(HML = r_{High} - r_{Low}\)
dataH = data.frame(TTH,FID,SRA,DL1,ITQ,CTC,AMV,LIG,HAD,MST,NRC,HOM,DXP,AAV,NSH,BCC,IVS)
dataL = data.frame(VNR,MBS,TAR,MAC,CSC,IDV,PVS,HUT,NTP,VCS,THD,VC3,VFS,DDG,KSF,L14,SCG)
r_High = rowMeans(dataH)
r_Low = rowMeans(dataL)
HML=r_High-r_Low
head(HML)
## [1] -0.0136731846  0.0073648837 -0.0006314481  0.0222186140 -0.0288844024
## [6] -0.0409233582

4. Nhân tố thị trường (Market Factor)

Nhân tố thị trường tính bằng: \(r_{MarketIndex} - r_{f}\)

X50_CP_HNX_ff=read_excel("D:/Term 5/ĐG1/50-CP-HNX_ff.xlsx")

Market_Factor = X50_CP_HNX_ff$`r_HNX-Index`- X50_CP_HNX_ff$r_f
head(Market_Factor)
## [1]  0.013027275  0.009295961  0.018199239 -0.022512971 -0.002744504
## [6] -0.016777396

Tổng hợp các nhân tố

X50_CP_HNX_ff<-data.frame(X50_CP_HNX_ff,Market_Factor,SMB,HML)
head(X50_CP_HNX_ff)
##         Date  r_HNX.Index          r_f Market_Factor           SMB
## 1 05/01/2022  0.013117553 9.027778e-05   0.013027275 -0.0009873598
## 2 06/01/2022  0.009386238 9.027778e-05   0.009295961  0.0037899561
## 3 07/01/2022  0.018289517 9.027778e-05   0.018199239  0.0088614668
## 4 10/01/2022 -0.022422694 9.027778e-05  -0.022512971  0.0283514508
## 5 11/01/2022 -0.002654227 9.027778e-05  -0.002744504 -0.0191950446
## 6 12/01/2022 -0.016687118 9.027778e-05  -0.016777396 -0.0228536953
##             HML
## 1 -0.0136731846
## 2  0.0073648837
## 3 -0.0006314481
## 4  0.0222186140
## 5 -0.0288844024
## 6 -0.0409233582

IV. TRỰC QUAN HÓA DỮ LIỆU

1. Vẽ đồ thị 50 chuỗi lợi suất

time=seq(1,248,length=248)

for(j in 2:ncol(returns)) {
  if (j==2) {
    plot(time,returns[,j],type="l",main="Đồ thị chuỗi lợi suất của 50 mã cổ phiếu trên sàn HNX",
         xlab="",ylab="Lợi suất")
  } else {
    lines(time,returns[,j],type="l",col=j)
  }
}

Như có thể thấy ở đồ thị trên, chuỗi lợi suất có xu hướng dao động quanh giá trị trung bình bằng \(0\) và có biên độ dao động nằm trong khoảng \((-0.1, 0.1)\).

2. Vẽ đồ thị 5 chuỗi lợi suất đầu tiên

Để dễ nhìn hơn, ta vẽ chuỗi lợi suất của \(5\) mã cổ phiếu đầu tiên

for(j in 2:6) {
  if (j==2) {
    plot(time,returns[,j],type="l",main="Đồ thị chuỗi lợi suất của 5 mã cổ phiếu trên sàn HNX",
         xlab="",ylab="Lợi suất",
         col=c("midnightblue","lightskyblue","dodgerblue","blue","slateblue"))
  } else {
    lines(time,returns[,j],type="l",col=j)
  }
}

V. MÔ HÌNH FAMA - FRENCH BA NHÂN TỐ

1. Ước lượng mô hình

Ma trận tương quan giữa các nhân tố

cor(X50_CP_HNX_ff[,4:6])
##               Market_Factor       SMB       HML
## Market_Factor     1.0000000 0.2316264 0.3936433
## SMB               0.2316264 1.0000000 0.7992975
## HML               0.3936433 0.7992975 1.0000000
par(mfrow=c(1,3), pch=20)
plot(X50_CP_HNX_ff[,4],X50_CP_HNX_ff[,5], xlab = "Market_Factor", ylab = "SMB", col="skyblue")
plot(X50_CP_HNX_ff[,4],X50_CP_HNX_ff[,6], xlab = "Market_Factor", ylab = "HML", col="salmon")
plot(X50_CP_HNX_ff[,6],X50_CP_HNX_ff[,5], xlab = "HML", ylab = "SMB", col="seagreen")

Kết quả cho thấy hệ số tương quan giữa các nhân tố nằm trong khoảng \((0.2, 0.8)\). Tuy nhiên, theo các giả thiết của mô hình đa nhân tố thì các nhân tố không có tương quan với nhau. Vậy với dữ liệu của sàn giao dịch chứng khoán Hà Nội, các nhân tố có giải thích được cho tỷ suất sinh lời không?

Ước lượng mô hình với từng biến phụ thuộc:

\[r_{it}=\alpha_i+\beta_{i,MF}(r_{(MarketIndex)t}-r_f)+\beta_{i,SMB}SMB_t+\beta_{i,HML}HML_t+\varepsilon_i\]

library(latex2exp)
library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(lmtest)
library(stargazer)
## 
## Please cite as:
##  Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
library(ggplot2)
datanew<-data.frame(X50_CP_HNX_ff,returns[,-1]) #Xóa cột ngày giao dịch để dễ tính toán

coef_table=data.frame() #Tạo 1 bảng dữ liệu để lưu trữ các hệ số ước lượng
dependent=c(datanew[,7:56])
for (return in dependent){
  model <- lm(return~Market_Factor+SMB+HML,data = datanew)
  coef_values<-coef(model)
  coef_table<-rbind(coef_table,coef_values)
  
}
colnames(coef_table)=c("alpha_i","beta_MarketFactor","beta_SMB","beta_HML")
#Sử dụng tập dữ liệu "coef_table" để ước lượng phần bù rủi ro nhân tố và các phần sau
head(coef_table)
##         alpha_i beta_MarketFactor     beta_SMB   beta_HML
## 1  0.0023837866         0.8890376  2.561450620 -1.2369677
## 2 -0.0002519259         0.2378145 -0.197886483 -0.1611583
## 3  0.0032167972         1.1374048  0.286267020  1.1095737
## 4  0.0007700349         0.9377463  0.001018681  0.7741092
## 5  0.0012399375         0.4534594  0.061792257  0.0482609
## 6  0.0010181358         1.1878662  0.660325590  0.8672210

Tập dữ liệu “coef_table” là các vector \(\hat{\beta}_{ik}\) sẽ được dùng để ước lượng phần bù rủi ro nhân tố và các phần sau

2. Hồi quy mô hình với các biến phụ thuộc lần lượt lợi suất của 4 danh mục đại diện (SL;SH;BL;BH)

Vì khó để đánh giá tác động của các nhân tố tới từng tài sản nên ta phân tích thông qua 4 danh mục đại diện là SL, SH, BL và BH

# Nhập dữ liệu 4 danh mục đại diện
por=read_excel("D:/Term 5/ĐG1/por.xlsx")

datapor=data.frame(X50_CP_HNX_ff,por[5:8])
head(datapor)
##         Date  r_HNX.Index          r_f Market_Factor           SMB
## 1 05/01/2022  0.013117553 9.027778e-05   0.013027275 -0.0009873598
## 2 06/01/2022  0.009386238 9.027778e-05   0.009295961  0.0037899561
## 3 07/01/2022  0.018289517 9.027778e-05   0.018199239  0.0088614668
## 4 10/01/2022 -0.022422694 9.027778e-05  -0.022512971  0.0283514508
## 5 11/01/2022 -0.002654227 9.027778e-05  -0.002744504 -0.0191950446
## 6 12/01/2022 -0.016687118 9.027778e-05  -0.016777396 -0.0228536953
##             HML       r_porSH     r_porSL      r_porBL      r_porBH
## 1 -0.0136731846 -0.0001211915  0.02961111  0.009858372 -0.011764231
## 2  0.0073648837  0.0202402821 -0.01578573  0.010795469 -0.024020322
## 3 -0.0006314481  0.0121611951  0.03293765  0.008088600 -0.002974119
## 4  0.0222186140  0.0083387033  0.01742997 -0.021929202 -0.020721105
## 5 -0.0288844024 -0.0330514934 -0.01382577 -0.001514839 -0.022818280
## 6 -0.0409233582 -0.0391855123 -0.03766522  0.008032499 -0.031378685
reg11=lm(data = datapor,r_porBH~Market_Factor)
reg21=lm(data = datapor,r_porBL~Market_Factor)
reg31=lm(data = datapor,r_porSH~Market_Factor)
reg41=lm(data = datapor,r_porSL~Market_Factor)
stargazer(reg11,reg21,reg31,reg41,type = "text")
## 
## ===========================================================================
##                                            Dependent variable:             
##                                --------------------------------------------
##                                 r_porBH     r_porBL     r_porSH    r_porSL 
##                                   (1)         (2)         (3)        (4)   
## ---------------------------------------------------------------------------
## Market_Factor                   1.161***    0.996***    1.334***  0.700*** 
##                                 (0.086)     (0.029)     (0.063)    (0.079) 
##                                                                            
## Constant                         -0.002      0.001*      -0.001     0.001  
##                                 (0.002)     (0.001)     (0.001)    (0.002) 
##                                                                            
## ---------------------------------------------------------------------------
## Observations                      248         248         248        248   
## R2                               0.426       0.831       0.642      0.241  
## Adjusted R2                      0.424       0.830       0.641      0.238  
## Residual Std. Error (df = 246)   0.026       0.009       0.019      0.024  
## F Statistic (df = 1; 246)      182.603*** 1,210.149*** 441.911*** 77.954***
## ===========================================================================
## Note:                                           *p<0.1; **p<0.05; ***p<0.01
reg12=lm(data = datapor,r_porBH~Market_Factor+SMB)
reg22=lm(data = datapor,r_porBL~Market_Factor+SMB)
reg32=lm(data = datapor,r_porSH~Market_Factor+SMB)
reg42=lm(data = datapor,r_porSL~Market_Factor+SMB)
stargazer(reg12,reg22,reg32,reg42,type = "text")
## 
## =========================================================================
##                                           Dependent variable:            
##                                ------------------------------------------
##                                 r_porBH    r_porBL    r_porSH    r_porSL 
##                                   (1)        (2)        (3)        (4)   
## -------------------------------------------------------------------------
## Market_Factor                   1.085***   0.998***   1.154***  0.578*** 
##                                 (0.086)    (0.029)    (0.042)    (0.074) 
##                                                                          
## SMB                             0.526***    -0.012    1.247***  0.849*** 
##                                 (0.138)    (0.047)    (0.068)    (0.119) 
##                                                                          
## Constant                         -0.001     0.001*     0.0003     0.002  
##                                 (0.002)    (0.001)    (0.001)    (0.001) 
##                                                                          
## -------------------------------------------------------------------------
## Observations                      248        248        248        248   
## R2                               0.458      0.831      0.850      0.371  
## Adjusted R2                      0.454      0.830      0.848      0.366  
## Residual Std. Error (df = 245)   0.026      0.009      0.013      0.022  
## F Statistic (df = 2; 245)      103.641*** 602.821*** 691.499*** 72.256***
## =========================================================================
## Note:                                         *p<0.1; **p<0.05; ***p<0.01
reg13=lm(data = datapor,r_porBH~Market_Factor+HML)
reg23=lm(data = datapor,r_porBL~Market_Factor+HML)
reg33=lm(data = datapor,r_porSH~Market_Factor+HML)
reg43=lm(data = datapor,r_porSL~Market_Factor+HML)
stargazer(reg13,reg23,reg33,reg43,type = "text")
## 
## ===========================================================================
##                                            Dependent variable:             
##                                --------------------------------------------
##                                 r_porBH    r_porBL     r_porSH     r_porSL 
##                                   (1)        (2)         (3)         (4)   
## ---------------------------------------------------------------------------
## Market_Factor                   0.827***   0.988***    0.959***   0.611*** 
##                                 (0.076)    (0.031)     (0.033)     (0.085) 
##                                                                            
## HML                             0.947***    0.023      1.064***   0.254*** 
##                                 (0.085)    (0.035)     (0.037)     (0.095) 
##                                                                            
## Constant                        -0.00003    0.001*     0.001**      0.001  
##                                 (0.001)    (0.001)     (0.001)     (0.002) 
##                                                                            
## ---------------------------------------------------------------------------
## Observations                      248        248         248         248   
## R2                               0.618      0.831       0.919       0.262  
## Adjusted R2                      0.615      0.830       0.919       0.256  
## Residual Std. Error (df = 245)   0.021      0.009       0.009       0.024  
## F Statistic (df = 2; 245)      198.427*** 603.862*** 1,393.322*** 43.517***
## ===========================================================================
## Note:                                           *p<0.1; **p<0.05; ***p<0.01
reg14=lm(data = datapor,r_porBH~SMB+HML)
reg24=lm(data = datapor,r_porBL~SMB+HML)
reg34=lm(data = datapor,r_porSH~SMB+HML)
reg44=lm(data = datapor,r_porSL~SMB+HML)
stargazer(reg14,reg24,reg34,reg44,type = "text")
## 
## ========================================================================
##                                           Dependent variable:           
##                                -----------------------------------------
##                                 r_porBH    r_porBL   r_porSH    r_porSL 
##                                   (1)        (2)       (3)        (4)   
## ------------------------------------------------------------------------
## SMB                            -1.590***  -0.460***   -0.077   1.284*** 
##                                 (0.204)    (0.170)   (0.170)    (0.214) 
##                                                                         
## HML                             2.197***  0.713***   1.528***   -0.193  
##                                 (0.142)    (0.118)   (0.119)    (0.150) 
##                                                                         
## Constant                         -0.001    -0.001     -0.001    -0.0004 
##                                 (0.002)    (0.001)   (0.001)    (0.002) 
##                                                                         
## ------------------------------------------------------------------------
## Observations                      248        248       248        248   
## R2                               0.548      0.165     0.639      0.221  
## Adjusted R2                      0.544      0.158     0.636      0.215  
## Residual Std. Error (df = 245)   0.023      0.019     0.020      0.025  
## F Statistic (df = 2; 245)      148.626*** 24.244*** 216.757*** 34.835***
## ========================================================================
## Note:                                        *p<0.1; **p<0.05; ***p<0.01
reg1=lm(data = datapor,r_porBH~Market_Factor+SMB+HML)
reg2=lm(data = datapor,r_porBL~Market_Factor+SMB+HML)
reg3=lm(data = datapor,r_porSH~Market_Factor+SMB+HML)
reg4=lm(data = datapor,r_porSL~Market_Factor+SMB+HML)

Kết quả tại bảng cho ta thấy sự tác động của từng nhân tố giải thích lên tỷ suất sinh lợi như sau:

  • Nhóm ba yếu tố bao gồm yếu tố thị trường, yếu tố quy mô và yếu tố Book to Market (yếu tố giá trị) có ảnh hưởng đến tỷ suất sinh lợi của 50 mã cổ phiếu tại HNX. Kết quả chạy hồi quy mô hình gồm ba yếu tố trên cho hệ số xác định hiệu chỉnh \(\bar{R^2}\) có giá trị trung bình là \(0,715\). Đây là giá trị \(\bar{R^2}\) cao nhất khi so sánh với mô hình thiếu một trong các yếu tố này. Các hệ số hồi quy của mô hình ba nhân tố gần như là có ý nghĩa ở mức 5%. Như vậy, ta cũng có thể nói rằng tỷ suất sinh lợi của cổ phiếu tại HNX ngoài việc chịu tác động khách quan của nhân tố thị trường còn bị tác động bởi những yếu tố thuộc về đặc tính của doanh nghiệp niêm yết như quy mô và tỷ số B/M. 

  • Trong ba yếu tố tác động đến tỷ suất sinh lợi thì yếu tố thị trường giữ vai trò quan trọng hơn cả. Điều này được thể hiện qua việc kết quả chạy hồi quy mô hình chỉ gồm một biến thị trường cho giá trị hiệu chỉnh \(\bar{R^2}\) là 0.534 cao hơn so với 0.388 là giá trị hiệu chỉnh \(\bar{R^2}\) của mô hình hồi quy gồm hai biến SMB (thể hiện quy mô) và HML (thể hiện tỷ số B/M). Mặt khác, tất cả các hệ số hồi quy của biến thị trường cho bốn danh mục đầu tư đều có ý nghĩa về mặt thống kê ở mức \(5\%\).

  • Khi kết hợp biến thị trường và biến SMB hoặc biến HML đã làm tăng đáng kể giá trị hiệu chỉnh \(\bar{R^2}\) so với khi chỉ có một biến thị trường. Điều này được thể hiện qua việc giá trị hiệu chỉnh \(\bar{R^2}\) từ 0.534 cho một biến thị trường đã tăng lên thành 0.623 và 0.655 cho trường hợp kết hợp cả hai biến thị trường và biến SMB hoặc HML. Như vậy, ta cũng có thể thấy rằng yếu tố quy mô và yếu tố giá trị đã giữ một vai trò không nhỏ trong việc giải thích sự thay đổi tỷ suất sinh lợi tại sàn HNX trong khoảng thời gian nghiên cứu từ tháng 1/2022 - 12/2022.

VI. ƯỚC LƯỢNG PHẦN BÙ RỦI RO NHÂN TỐ

Ta có phương trình APT: \[\mathbb{E}({r}_{i}) = r_f + {\beta_{i,MF}}\lambda_{MF} + {\beta_{i,HML}}\lambda_{HML} + {\beta_{i,SMB}}\lambda_{SMB}\] Với các ước lượng của hệ số \(\beta_{iK}\), và \(\bar{r}_{i} \ (i=1\div N)\) đối với các tài sản, để ước lượng phần bù rủi ro nhân tố \(\lambda_k\) ta lập và ước lượng hàm hồi quy sau: \[\bar{r_i}= \gamma+λ_{MF}β_{i,MF}+λ_{HML}β_{i,HML}+λ_{SMB}β_{i,SMB}+v_i\] Trong đó:

\(\lambda_k\) là các hệ số hồi quy

\(\beta_k\) là các biến độc lập

\(i=1\div N\) là các quan sát

1. Tính trung bình lợi suất của từng cổ phiếu

data1 = returns[-1,-1]
#head(data1)
r_tb = colMeans(data1)
head(data.frame(r_tb))
##              r_tb
## MAC -0.0006427060
## KSF -0.0004344803
## NSH -0.0046361632
## IVS -0.0048518290
## SCG -0.0005436108
## FID -0.0067920897

2. Hồi quy lợi suất trung bình của từng cổ phiếu với \(\mathbf{\hat{\beta}_{ik}}\)

Ta gộp dữ liệu về trung bình từng cổ phiếu vừa tính được ở bước 1 với dữ liệu về ước lượng hệ số các nhân tố thành 1 bảng rồi hồi quy và ước lượng mô hình.

attach(coef_table)
datanew1 = as.data.frame(cbind(r_tb, coef_table))
head(datanew1)
##              r_tb       alpha_i beta_MarketFactor     beta_SMB   beta_HML
## MAC -0.0006427060  0.0023837866         0.8890376  2.561450620 -1.2369677
## KSF -0.0004344803 -0.0002519259         0.2378145 -0.197886483 -0.1611583
## NSH -0.0046361632  0.0032167972         1.1374048  0.286267020  1.1095737
## IVS -0.0048518290  0.0007700349         0.9377463  0.001018681  0.7741092
## SCG -0.0005436108  0.0012399375         0.4534594  0.061792257  0.0482609
## FID -0.0067920897  0.0010181358         1.1878662  0.660325590  0.8672210
attach(datanew1)
## The following object is masked _by_ .GlobalEnv:
## 
##     r_tb
## The following objects are masked from coef_table:
## 
##     alpha_i, beta_HML, beta_MarketFactor, beta_SMB
reg=lm(r_tb~beta_MarketFactor+beta_HML+beta_SMB, data=datanew1)
summary(reg)
## 
## Call:
## lm(formula = r_tb ~ beta_MarketFactor + beta_HML + beta_SMB, 
##     data = datanew1)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0062482 -0.0004967  0.0000891  0.0008021  0.0026090 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -0.0012881  0.0005580  -2.309  0.02551 *  
## beta_MarketFactor -0.0013482  0.0004465  -3.020  0.00412 ** 
## beta_HML          -0.0027043  0.0004308  -6.277 1.11e-07 ***
## beta_SMB          -0.0010386  0.0003860  -2.690  0.00991 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.001533 on 46 degrees of freedom
## Multiple R-squared:  0.5451, Adjusted R-squared:  0.5154 
## F-statistic: 18.37 on 3 and 46 DF,  p-value: 5.599e-08

Từ kết quả ước lượng trên, với mức ý nghĩa \(5\%\), ta thấy các hệ số nhân tố đều có ý nghĩa thống kê.

Mô hình ước lượng được: \[\bar{r} = -0.0012881 -0.0013482{\beta_{MF}} -0.0027043{\beta_{HML}} -0.0010386{\beta_{SMB}}\]

Ta thấy, phần bù rủi ro của 3 nhân tố đều ước lượng được đều mang dấu âm. Vậy có thể đưa ra nhận xét trong trường hợp 50 cổ phiếu trên sàn HNX rằng: Đối với 3 nhân tố: nhân tố thị trường, nhân tố quy mô vốn hóa, nhân tố chỉ số giá thị trường/giá trị thị trường; các nhà đầu tư sẵn sàng bớt đi một phần trong lợi suất để hạn chế bớt tác động của nhân tố này.

VII. TÍNH MA TRẬN HIỆP PHƯƠNG SAI CỦA 5 MÃ CỔ PHIẾU

Chọn 5 mã cổ phiếu trong bảng dữ liệu để lập ma trận hiệp phương sai dựa vào mô hình nhân tố.

Ta có công thức ước lượng ma trận hiệp phương sai như sau: \[ Cov(r_i,r_j)=\sum_{k=1}^{K} \beta_{ik}\beta_{jk}V(F_k)+Cov(\varepsilon_i,\varepsilon_j) \]

Trong đó:

\(Cov(r_i,r_j)\): Hiệp phương sai giữa lợi suất tài sản \(i\) và tài sản \(j\).

\(\beta_{ik}\): Hệ số nhân tố \(k\) trong phương trình APT của tài sản \(i\).

\(\beta_{jk}\): Hệ số nhân tố \(k\) trong phương trình APT của tài sản \(j\).

\(V(F_k)\): Phương sai của nhân tố \(k\).

\(Cov(\varepsilon_i,\varepsilon_j)\): Hiệp phương sai của sai số trong phương trình APT của tài sản \(i\) và tài sản \(j\).

Ta có thể viết gọn công thức trên lại dưới dạng ma trận như sau \[ V=\beta V_F \beta'+ V_{\varepsilon} \] Trong đó:

\(V\): Là ma trận hiệp phương sai lợi suất.

\(\beta\): Là ma trận hệ số của các nhân tố trong các phương trình APT.

\(V_F\): Là ma trận đường chéo, trong đó các phân tử nằm trên đường chéo chính là phương sai của các nhân tố.

\(V_{\varepsilon}\): Là ma trận hiệp phương sai sai số trong các phương trình APT. Do các giả thiết của mô hình đa nhân tố nên đây là một ma trận đường chéo.

1. Ước tính các tham số đầu vào từ dữ liệu đã cho

Từ mô hình APT ở câu 2 rút ra được ma trận các hệ số \(\beta\) và đặt tên ma trận là beta1, tính được phương sai của các nhân tố và phương sai sai số của 5 phương trình APT của 5 mã cổ phiếu đã chọn.

#Chọn 5 mã cổ phiếu bất kỳ
datanewx<-datanew[,7:56]
set.seed(6)
dependent1<-c(datanewx[,sample(ncol(datanewx), size=5) ])
#In ra tên 5 mã cổ phiếu được chọn
names(dependent1)
## [1] "AAV" "BVS" "API" "THD" "NSH"
#Tính ma trận beta
beta=data.frame()
for (rate in dependent1){
  model1 <- lm(rate~Market_Factor+SMB+HML,data = datanew)
  beta_values<-coef(model1)
  beta<-rbind(beta,beta_values)
}
print(beta)
##   X0.000879420207492548 X1.15834800342899 X0.13261940399178 X1.16033366417414
## 1          0.0008794202         1.1583480         0.1326194         1.1603337
## 2          0.0030233633         1.3248679        -0.5162082         0.5619946
## 3          0.0021497416         1.3208396        -0.5581179         1.2646876
## 4         -0.0056440873         0.9580014        -0.1241377        -0.3497691
## 5          0.0032167972         1.1374048         0.2862670         1.1095737
betamf=beta[,2]
betasmb=beta[,3]
betahml=beta[,4]
beta1=cbind(betamf,betasmb,betahml)
print(beta1)
##         betamf    betasmb    betahml
## [1,] 1.1583480  0.1326194  1.1603337
## [2,] 1.3248679 -0.5162082  0.5619946
## [3,] 1.3208396 -0.5581179  1.2646876
## [4,] 0.9580014 -0.1241377 -0.3497691
## [5,] 1.1374048  0.2862670  1.1095737

Tính phương sai các nhân tố

vmf=var(X50_CP_HNX_ff$Market_Factor)
vsmb=var(X50_CP_HNX_ff$SMB)
vhml=var(X50_CP_HNX_ff$HML)

varf<-matrix(c(c(vmf,0,0),c(0,vsmb,0),c(0,0,vhml)),nrow=3)
print(varf)
##              [,1]         [,2]        [,3]
## [1,] 0.0003784597 0.0000000000 0.000000000
## [2,] 0.0000000000 0.0001475463 0.000000000
## [3,] 0.0000000000 0.0000000000 0.000303545

Các phần tử ngoài đường chéo chính bằng 0 do giả thiết mô hình là đa nhân tố là: \(Cov(F_s,F_r)=0\) \(∀s≠r\)

2. Ước lượng phương sai sai số của các cổ phiếu

resid_table=data.frame()
for (rate in dependent1){
  model1 <- lm(rate~Market_Factor+SMB+HML,data = datanew)
  resid_values<-resid(model1)
  resid_table<-rbind(resid_table,resid_values)
}
#View(resid_table)
re=as.data.frame(t(resid_table))
covei<-matrix(c(c(var(re$V1),0,0,0,0),c(0,var(re$V2),0,0,0),c(0,0,var(re$V3),0,0),c(0,0,0,var(re$V4),0),c(0,0,0,0,var(re$V5))),nrow=5)
print(covei)
##              [,1]         [,2]       [,3]         [,4]        [,5]
## [1,] 0.0007631438 0.0000000000 0.00000000 0.0000000000 0.000000000
## [2,] 0.0000000000 0.0007554389 0.00000000 0.0000000000 0.000000000
## [3,] 0.0000000000 0.0000000000 0.00135118 0.0000000000 0.000000000
## [4,] 0.0000000000 0.0000000000 0.00000000 0.0008132001 0.000000000
## [5,] 0.0000000000 0.0000000000 0.00000000 0.0000000000 0.001172745

Các phần tử ngoài đường chéo chính bằng 0 do giả thiết mô hình đa nhân tố là: \(Cov(\varepsilon_i,\varepsilon_j)=0\) \(∀i≠j\)

Sau khi tạo được ba ma trận đầu vào, ta dừng công thức thứ hai (công thức có dạng ma trận) để tính ma trận hiệp phương sai của 5 mã cổ phiếu.

3. Tính ma trận cov của 5 mã cổ phiếu

v=beta1%*%varf%*%t(beta1)+covei
print(v)
##              [,1]         [,2]         [,3]         [,4]         [,5]
## [1,] 0.0016822299 0.0007686474 0.0010135593 0.0002943540 0.0008950330
## [2,] 0.0007686474 0.0015549276 0.0009205338 0.0004301382 0.0007377846
## [3,] 0.0010135593 0.0009205338 0.0025429080 0.0003548400 0.0009709513
## [4,] 0.0002943540 0.0004301382 0.0003548400 0.0011999467 0.0002893357
## [5,] 0.0008950330 0.0007377846 0.0009709513 0.0002893357 0.0020481565

Ta kiểm tra lại bằng cách tính trực tiếp ma trận covarian trên chuỗi lợi suất và được kết quả như sau:

datar=data.frame(dependent1 )
# Tính ma trận hiệp phương sai
cov_matrix <- cov(datar)

# In ma trận hiệp phương sai
print(cov_matrix)
##             AAV          BVS          API          THD          NSH
## AAV 0.002109761 0.0011421785 0.0016647038 0.0002816540 0.0014796964
## BVS 0.001142179 0.0015805973 0.0012338021 0.0003160955 0.0011210314
## API 0.001664704 0.0012338021 0.0026691611 0.0003358027 0.0014845131
## THD 0.000281654 0.0003160955 0.0003358027 0.0011122042 0.0002977306
## NSH 0.001479696 0.0011210314 0.0014845131 0.0002977306 0.0025280224

Nhận xét: Có sự chênh lệch giữa ma trận covarian lợi suât tính trực tiếp và tính qua mô hình đa nhân tố do số liệu được lấy không thoả mãn các giả thiết của mô hình đa nhân tố.

VIII. PHÂN TÍCH RỦI RO DANH MỤC CỦA 5 CỔ PHIẾU VỚI TRỌNG SỐ BẰNG NHAU

Danh mục \(P\) có 5 cổ phiếu như đã chọn ở câu 4 có trọng số đều bằng 0.2. Ta cần phân tích rủi ro cho danh mục \(P\) này.

#Xây dựng vector trọng số
w<-matrix(rep(0.2,5), nrow=1)

Từ câu 4 ta có ma trận hiệp phương sai của 5 cổ phiếu là v.

Tổng rủi ro tài sản được tính theo công thức sau:

  • Tổng rủi ro tài sản = Rủi ro nhân tố của tài sản + Rủi ro riêng \[\sigma_i=V(r_i)=\sum_{k=1}^{K}\beta_{ik}^2V(F_k)+V(\varepsilon_i) \]

  • Rủi ro nhân tố của tài sản = \(\sum_{k=1}^{K}\beta_{ik}^2V(F_k)\)

  • Rủi ro riêng của tài sản = \(V(\varepsilon_i)\)

#Rủi ro nhân tố của cổ phiếu 1 
rrnt1=(beta1[1,1])^2*vmf+(beta1[1,2])^2*vsmb+(beta1[1,3]^2*vhml)
#Rủi ro riêng của cổ phiếu 1 
rrr1=var(re$V1)
#Tổng rủi ro cổ phiếu 1 
trr1=rrnt1+rrr1
print(trr1)
##     betamf 
## 0.00168223
# Tổng rủi ro cổ phiếu 1 
trr1_1=v[1,1]
print (trr1_1)
## [1] 0.00168223

Kiểm tra lại: Ta thấy tổng rủi ro của cổ phiếu đầu tiên tính bằng công thức bằng với phần tử tương ứng trên hiệp phương sai ở câu 4.

Phương trình nhân tố đối với danh mục P \[r_P=\alpha_P+\sum_{k=1}^{K}\beta_{Pk}V(F_k)+\varepsilon_P \] Trong đó:

  • \(\alpha_P =\sum_{i=1}^{N}w_i\alpha_i\)
  • \(\beta_{Pk}=\sum_{i=1}^{N}{w_i}\beta_{ik}\)
  • \(\varepsilon_P=\sum_{i=1}^{N}w_i\varepsilon_i\)

Tổng rủi ro danh mục được tính theo công thức sau:

  • Tổng rủi ro danh mục = Rủi ro nhân tố của danh mục + Rủi ro riêng \[\sigma_P=V(r_P)=\sum_{k=1}^{K}\beta_{Pk}^2V(F_k)+\sum_{i=1}^{N}w_i^2V(\varepsilon_i) \]

  • Rủi ro nhân tố của danh mục = \(\sum_{k=1}^{K}\beta_{Pk}^2V(F_k)\)

  • Rủi ro riêng của danh mục= \(\sum_{i=1}^{N}w_i^2V(\varepsilon_i)\)

#Tính các tham số đầu vào còn thiếu
#Tạo vector phương sai nhân tố
vf1<-c(vmf,vsmb,vhml)
vf<-matrix(vf1, nrow=1)
#Tính vector beta_p
beta_p=w%*%beta1
print(beta_p)
##        betamf    betasmb   betahml
## [1,] 1.179892 -0.1559155 0.7493641
#Xây dựng vecto phương sai sai số
re=as.data.frame(t(resid_table))
ve=matrix(c(var(re$V1),var(re$V2),var(re$V3),var(re$V4),var(re$V5)),nrow=1)
#Rủi ro nhân tố của danh mục
rrnt=(beta_p)^2%*%t(vf)
print(rrnt)
##              [,1]
## [1,] 0.0007009126
#Rủi ro riêng của danh mục
rrr=w^2%*%t(ve)
print(rrr)
##              [,1]
## [1,] 0.0001942283
#Tổng rủi ro danh mục
trr=rrnt+rrr
print(trr)
##              [,1]
## [1,] 0.0008951409

Từ kết quả trên ta có được rủi ro nhân tố của danh mục = rrnt; rủi ro riêng của danh mục = rrr và tổng rủi ro danh mục = trr.

IX. KIỂM ĐỊNH SỰ PHÙ HỢP CỦA PHƯƠNG TRÌNH ƯỚc LƯỢNG APT

Ta có phương trình ước lượng APT như sau: \[\bar{r_i}= γ+λ_{MF}β_{i,MF}+λ_{HML}β_{i,HML}+λ_{SMB}β_{i,SMB}+v_i\]

1. Kiểm định nếu tài sản \(i\) có các hệ số nhân tố = 0 thì \(\mathbb{E}(r_i)=r_f\) hay không

  • Điều này có nghĩa là chúng ta cần phải thực hiện kiểm định T-test rằng \(\gamma=r_f\) hay là hệ số chặn ước lượng từ câu 3 có bằng \(r_f\) hay không? Tuy nhiên, để thực hiện được kiểm định T, hệ số chặn ước lượng này phải là hệ số góc ước lượng của một biến, do vậy, chúng ta sẽ tạo một biến a có giá trị bằng 1 để kết quả sau khi ước lượng lại mô hình vẫn sẽ được như ở câu 3.

  • Vì mẫu lớn nên tính chuẩn và phương sai sai số không ảnh hưởng đến độ tin cậy của các suy diễn thống kê nên nhóm mình không kiểm định 2 phần trên mà dùng luôn T-test để kiểm định hệ số chặn.

library(car)
## Loading required package: carData
a=c(rep(1,50))
print(a)
##  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [39] 1 1 1 1 1 1 1 1 1 1 1 1
datanew2 = cbind(datanew1,a)
print(datanew2)
##              r_tb       alpha_i beta_MarketFactor     beta_SMB    beta_HML a
## MAC -0.0006427060  0.0023837866         0.8890376  2.561450620 -1.23696766 1
## KSF -0.0004344803 -0.0002519259         0.2378145 -0.197886483 -0.16115832 1
## NSH -0.0046361632  0.0032167972         1.1374048  0.286267020  1.10957372 1
## IVS -0.0048518290  0.0007700349         0.9377463  0.001018681  0.77410925 1
## SCG -0.0005436108  0.0012399375         0.4534594  0.061792257  0.04826090 1
## FID -0.0067920897  0.0010181358         1.1878662  0.660325590  0.86722102 1
## BNA -0.0041795262 -0.0012203880         0.6336904  0.845027005 -0.11565334 1
## NRC -0.0074166607 -0.0025047358         0.3048595 -1.649048557  1.96309367 1
## VGS -0.0053677968  0.0023137401         1.6513345  0.978961657  0.20397619 1
## AAV -0.0069219640  0.0008794202         1.1583480  0.132619404  1.16033366 1
## VFS  0.0002793234  0.0022766973         0.4563539 -0.151200583  0.21571992 1
## EVS -0.0047270664 -0.0015949293         0.5410575 -1.242785967  0.96202984 1
## LIG -0.0065728559  0.0015673865         1.3925633  0.603221612  0.77909178 1
## API -0.0053541246  0.0021497416         1.3208396 -0.558117925  1.26468759 1
## ITQ -0.0054130498  0.0026839229         1.1206533  0.265336501  1.23728594 1
## TTH -0.0060893822  0.0016458199         1.0351835  0.370580848  1.17171138 1
## IDJ -0.0050977164  0.0040080280         2.0327429 -0.135647946  0.75326193 1
## HOM -0.0029390162  0.0017131006         0.6581199  0.085327799  0.73134931 1
## HAD -0.0040500586 -0.0002597773         0.5577853  0.629804365  0.31514246 1
## MST -0.0063082309 -0.0011401867         0.6143793  0.241633911  0.83713428 1
## CSC -0.0045411580  0.0023643849         1.5045302 -0.555577525  0.78676080 1
## VNR -0.0017448270  0.0009347249         0.7956411 -0.502838242  0.20358310 1
## L14 -0.0066527783  0.0027920485         2.3812324  0.076608987  0.21671979 1
## AMV -0.0058091824  0.0010128781         0.9796951  0.024351482  1.06982354 1
## SRA -0.0055786482  0.0003673596         0.8441155  0.187535424  0.92988770 1
## LAS -0.0040511412  0.0009940508         1.3104956  0.022650552  0.18362367 1
## VC7 -0.0053472078  0.0020371395         1.2031890  0.629019633  0.76935840 1
## VCS -0.0026299467  0.0005776182         0.6911626 -0.331247755  0.39558439 1
## IDV -0.0027083377 -0.0003737913         0.5217549  0.526295305 -0.05852678 1
## CMS -0.0066723713 -0.0022121961         0.9075758  1.334993834 -0.28809639 1
## PVB -0.0022502668  0.0019633593         1.3702777  1.545013619 -0.83147191 1
## CTC -0.0062654353  0.0005829586         0.9404881  0.214169573  1.01828488 1
## DXP -0.0037645232  0.0010242183         0.8842160  0.464412753  0.29462554 1
## MBS -0.0038012619  0.0029473789         1.6328262 -0.791531037  0.68817925 1
## DDG  0.0010915156  0.0013070636         0.1036981  0.097430610 -0.09191386 1
## THD -0.0077531220 -0.0056440873         0.9580014 -0.124137678 -0.34976909 1
## TVD -0.0018560764  0.0028548564         1.1617822  1.075107936 -0.26809303 1
## TNG -0.0033109052  0.0018660395         1.4808869 -0.836233066  0.34207630 1
## TIG -0.0041764351  0.0023984067         1.0806185 -0.570173984  1.14795826 1
## PVC -0.0012668960  0.0033182062         1.8433303  2.302174443 -1.55876091 1
## PVS -0.0009838845  0.0021749785         1.4041410  1.056617692 -1.01482701 1
## SHS -0.0047976048  0.0022922226         1.6548986 -0.864376004  0.79522147 1
## NTP -0.0019113718 -0.0001474411         0.6698952  0.172207266 -0.25911430 1
## APS -0.0059548654  0.0031738325         2.1384429  0.151100287  0.55354108 1
## BVS -0.0025706569  0.0030233633         1.3248679 -0.516208158  0.56199462 1
## BCC -0.0042353216  0.0030605445         1.1875407 -0.982060061  1.46838510 1
## DL1 -0.0062366196  0.0017211294         1.1959815  0.075689207  1.17906603 1
## HUT -0.0015348837  0.0040005955         1.4755270 -0.273312438  0.27912829 1
## VC3 -0.0017144165  0.0000616807         0.4683619 -0.015086787  0.04240335 1
## TAR -0.0052636302  0.0007153573         1.4935091  0.001601341  0.20205649 1
reg1=lm(r_tb~a+beta_MarketFactor+beta_HML+beta_SMB+0, data=datanew2)
summary(reg1)
## 
## Call:
## lm(formula = r_tb ~ a + beta_MarketFactor + beta_HML + beta_SMB + 
##     0, data = datanew2)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0062482 -0.0004967  0.0000891  0.0008021  0.0026090 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## a                 -0.0012881  0.0005580  -2.309  0.02551 *  
## beta_MarketFactor -0.0013482  0.0004465  -3.020  0.00412 ** 
## beta_HML          -0.0027043  0.0004308  -6.277 1.11e-07 ***
## beta_SMB          -0.0010386  0.0003860  -2.690  0.00991 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.001533 on 46 degrees of freedom
## Multiple R-squared:  0.8977, Adjusted R-squared:  0.8888 
## F-statistic: 100.9 on 4 and 46 DF,  p-value: < 2.2e-16
x=X50_CP_HNX_ff[1,3]
x1 = as.numeric(x)
print(x1)
## [1] 9.027778e-05
linearHypothesis(reg1,c("a=0.00009027778"))
## Linear hypothesis test
## 
## Hypothesis:
## a = 9.027778e - 05
## 
## Model 1: restricted model
## Model 2: r_tb ~ a + beta_MarketFactor + beta_HML + beta_SMB + 0
## 
##   Res.Df        RSS Df  Sum of Sq      F  Pr(>F)  
## 1     47 0.00012245                               
## 2     46 0.00010811  1 1.4343e-05 6.1029 0.01726 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Với cặp giả thuyết: \[ \begin{cases} H_0: \gamma=r_f \\ H_1: \gamma≠r_f \end{cases} \]

Từ kết quả chúng ta thấy: với mức ý nghĩa 5%, \(p-value = 0.01726 < 0.05\), do đó bác bỏ \(H_0\), hay là \(\gamma≠r_f\). Vậy, chúng ta có kết luận như sau: với mức ý nghĩa 5%, nếu tài sản \(i\) có các hệ số nhân tố bằng 0 thì lợi suất kỳ vọng của tài sản \(i\) khác với lợi suất phi rủi ro.

2. Kiểm định dạng hàm đúng (dạng tuyến tính)

Để thực hiện kiểm định này, chúng ta sẽ dùng kiểm định Reset Test với cặp giả thuyết như sau:

library(lmtest)
resettest(reg)
## 
##  RESET test
## 
## data:  reg
## RESET = 0.33623, df1 = 2, df2 = 44, p-value = 0.7163

\[ \begin{cases} H_0: Dạng\ hàm \ đúng \\ H_1: Dạng\ hàm \ sai \end{cases} \] Từ kết quả chúng ta thấy, với mức ý nghĩa 5%, $p-value = 0.7163> 0.05$, do đó chưa có cơ sở bác bỏ

\(H_0\), hay là dạng hàm đúng. Như vậy, chúng ta có kết luận như sau: với mức ý nghĩa 5%, dạng phương trình hồi quy là đúng, hay là lợi suất kỳ vọng của các tài sản có liên hệ tuyến tính với các hệ số nhân tố và chỉ có các hệ số nhân tố là biến giải thích trong phương trình APT.

X. LỌC 50 MÃ CỔ PHIẾU

1. Ước lượng mô hình Fama - French

Dùng vòng lặp for để ước lượng mô hình với từng biến phụ thuộc

library(latex2exp)
library(zoo)
library(lmtest)
library(stargazer)
library(ggplot2)
datanew<-data.frame(X50_CP_HNX_ff,returns[,-1]) #Xóa cột ngày giao dịch để dễ tính toán
coef_table=data.frame() # tạo 1 bảng dữ liệu để lưu trữ các hệ số ước lượng
p_value= data.frame()
dependent=c(datanew[,7:56])
for (return in dependent){
  model <- lm(return~Market_Factor+SMB+HML,data = datanew)
  P=summary(model)$coefficients[,4]
  p_value=rbind(p_value,P)
  coef_values<-coef(model)
  coef_table<-rbind(coef_table,coef_values)
  
}
colnames(coef_table)=c("alpha_i","beta_MarketFactor","beta_SMB","beta_HML")

# Sử dụng tập dữ liệu "coef_table" để ước lượng phần bù rủi ro nhân tố và các phần sau
head(coef_table)
##         alpha_i beta_MarketFactor     beta_SMB   beta_HML
## 1  0.0023837866         0.8890376  2.561450620 -1.2369677
## 2 -0.0002519259         0.2378145 -0.197886483 -0.1611583
## 3  0.0032167972         1.1374048  0.286267020  1.1095737
## 4  0.0007700349         0.9377463  0.001018681  0.7741092
## 5  0.0012399375         0.4534594  0.061792257  0.0482609
## 6  0.0010181358         1.1878662  0.660325590  0.8672210

Lọc các giá trị beta không có ý nghĩa thống kê ở mức 5%

X=t(returns)[-1,0]
data_p=cbind(X,p_value)
colnames(data_p)=c("Intercept","beta_MF","beta_SMB","beta_HML")
head(data_p)
##     Intercept      beta_MF     beta_SMB     beta_HML
## MAC 0.3130565 7.670611e-11 4.855613e-14 3.478137e-07
## KSF 0.8691913 5.359155e-03 3.408648e-01 2.931996e-01
## NSH 0.1520428 1.999308e-17 3.469627e-01 1.382173e-06
## IVS 0.6557624 2.247304e-19 9.965318e-01 1.139511e-05
## SCG 0.3703190 1.050027e-08 7.419640e-01 7.274377e-01
## FID 0.5750617 8.319537e-26 7.792924e-03 3.085625e-06
data_pond=cbind()
for(i in 1:nrow(data_p)) {
   
    a = data_p[i,2]
    b = data_p[i,3]
    c= data_p[i,4]
    if (a<0.05 & b< 0.05 & c<0.05){
      data_pond=rbind(data_pond,data_p[i,])
    }
}
data_pond
##      Intercept      beta_MF     beta_SMB     beta_HML
## MAC 0.31305648 7.670611e-11 4.855613e-14 3.478137e-07
## FID 0.57506170 8.319537e-26 7.792924e-03 3.085625e-06
## NRC 0.21610587 6.889704e-03 6.460998e-09 4.721950e-19
## EVS 0.49687684 4.277400e-05 1.209185e-04 5.641428e-05
## LIG 0.32641529 4.060884e-39 5.704800e-03 1.897503e-06
## VC7 0.30369103 4.301893e-23 1.980634e-02 1.302274e-04
## PVB 0.40564749 1.633013e-21 2.402825e-06 5.078910e-04
## DXP 0.47924560 2.889414e-23 1.867211e-02 4.282813e-02
## MBS 0.12357843 4.902237e-38 2.474460e-03 3.799718e-04
## TIG 0.23643335 6.902293e-19 3.863030e-02 3.934520e-08
## PVC 0.21773580 1.089719e-27 1.243942e-09 2.062685e-08
## PVS 0.31232984 9.979818e-26 3.520663e-04 4.003115e-06
## SHS 0.20346057 5.291284e-42 4.727442e-04 1.493843e-05
## BVS 0.09373308 9.219284e-31 3.525898e-02 1.999304e-03
## BCC 0.06616106 1.782504e-29 1.883971e-05 1.885955e-16

2. Ước lượng phần bù rủi ro

#Trích xuất ra bảng hệ số ước lượng của 15 cổ phiếu sau khi đã loại bỏ 
data_bnew=cbind(X,coef_table)
data_15bnew = data.frame(data_bnew[c(1,6,8,12,13,27,31,33,34,39,40,41,42,45,46),])
# Tính r_tb của 15 cổ phiếu sau khi đã loại bỏ 
data_r = data.frame(MAC,FID,NRC,EVS,LIG,VC7,PVB,DXP,MBS,TIG,PVC,PVS,SHS,BVS,BCC)
r_tb= colMeans(data_r)
# Kết hợp r_tb và bảng hệ số ước lượng 
data_UL=cbind(r_tb,data_15bnew)
# UL phần bù rủi ro
attach(data_UL)
## The following object is masked _by_ .GlobalEnv:
## 
##     r_tb
## The following objects are masked from datanew1:
## 
##     alpha_i, beta_HML, beta_MarketFactor, beta_SMB, r_tb
## The following objects are masked from coef_table:
## 
##     alpha_i, beta_HML, beta_MarketFactor, beta_SMB
reg=lm(r_tb~beta_MarketFactor+beta_HML+beta_SMB,data=data_UL)
summary(reg)
## 
## Call:
## lm(formula = r_tb ~ beta_MarketFactor + beta_HML + beta_SMB, 
##     data = data_UL)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0010396 -0.0007885 -0.0001909  0.0006986  0.0015827 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       -0.0022751  0.0010351  -2.198 0.050263 .  
## beta_MarketFactor -0.0002651  0.0007405  -0.358 0.727140    
## beta_HML          -0.0029521  0.0005877  -5.023 0.000388 ***
## beta_SMB          -0.0010767  0.0004571  -2.355 0.038136 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.001018 on 11 degrees of freedom
## Multiple R-squared:  0.8181, Adjusted R-squared:  0.7685 
## F-statistic: 16.49 on 3 and 11 DF,  p-value: 0.0002204

3. Kiểm định sự phù hợp của mô hình

Do mẫu bé nên phải kiểm định tính chuẩn của sai số và phương sai sai số không đổi để đảm bảo các suy diễn thống kê đáng tin cậy

# Tạo biến a gồm các giá trị bằng 1 
a=c(rep(1,15))
data_eri = cbind(data_UL,a)
#UL lại mô hình sau khi thêm biến a 
reg1=lm(r_tb~a+beta_MarketFactor+beta_HML+beta_SMB+0, data=data_eri)
summary(reg1)
## 
## Call:
## lm(formula = r_tb ~ a + beta_MarketFactor + beta_HML + beta_SMB + 
##     0, data = data_eri)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0010396 -0.0007885 -0.0001909  0.0006986  0.0015827 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## a                 -0.0022751  0.0010351  -2.198 0.050263 .  
## beta_MarketFactor -0.0002651  0.0007405  -0.358 0.727140    
## beta_HML          -0.0029521  0.0005877  -5.023 0.000388 ***
## beta_SMB          -0.0010767  0.0004571  -2.355 0.038136 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.001018 on 11 degrees of freedom
## Multiple R-squared:  0.9613, Adjusted R-squared:  0.9473 
## F-statistic: 68.39 on 4 and 11 DF,  p-value: 1.067e-07
# KD tính chuẩn của sai số
resid = residuals(reg1)
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
jarque.bera.test(resid)
## 
##  Jarque Bera Test
## 
## data:  resid
## X-squared = 1.5442, df = 2, p-value = 0.462
# KD PSSS thay đổi
bptest(reg1)
## 
##  studentized Breusch-Pagan test
## 
## data:  reg1
## BP = 2.0613, df = 3, p-value = 0.5598
# KD E(ri)=rf
x=X50_CP_HNX_ff[1,3]
rf = as.numeric(x)
rf
## [1] 9.027778e-05
library(car)
linearHypothesis(reg1,c("a=0.00009027778"))
## Linear hypothesis test
## 
## Hypothesis:
## a = 9.027778e - 05
## 
## Model 1: restricted model
## Model 2: r_tb ~ a + beta_MarketFactor + beta_HML + beta_SMB + 0
## 
##   Res.Df        RSS Df  Sum of Sq      F  Pr(>F)  
## 1     12 1.6810e-05                               
## 2     11 1.1399e-05  1 5.4114e-06 5.2221 0.04314 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
resettest(reg)
## 
##  RESET test
## 
## data:  reg
## RESET = 0.28976, df1 = 2, df2 = 9, p-value = 0.7552

Sau khi điều chỉnh mô hình

#UL lại phần bủ rủi ro 
reggg = lm(r_tb~beta_HML+beta_SMB, data=data_UL)
summary(reggg)
## 
## Call:
## lm(formula = r_tb ~ beta_HML + beta_SMB, data = data_UL)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0010140 -0.0007782 -0.0001732  0.0007220  0.0015332 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.0026168  0.0003856  -6.787 1.94e-05 ***
## beta_HML    -0.0028918  0.0005422  -5.333 0.000178 ***
## beta_SMB    -0.0010644  0.0004390  -2.425 0.032042 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.0009803 on 12 degrees of freedom
## Multiple R-squared:  0.816,  Adjusted R-squared:  0.7853 
## F-statistic: 26.61 on 2 and 12 DF,  p-value: 3.883e-05
#UL sau khi điều chỉnh và thêm a 
reg2=lm(r_tb~a+beta_HML+beta_SMB+0, data=data_eri)
summary(reg2)
## 
## Call:
## lm(formula = r_tb ~ a + beta_HML + beta_SMB + 0, data = data_eri)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0010140 -0.0007782 -0.0001732  0.0007220  0.0015332 
## 
## Coefficients:
##            Estimate Std. Error t value Pr(>|t|)    
## a        -0.0026168  0.0003856  -6.787 1.94e-05 ***
## beta_HML -0.0028918  0.0005422  -5.333 0.000178 ***
## beta_SMB -0.0010644  0.0004390  -2.425 0.032042 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.0009803 on 12 degrees of freedom
## Multiple R-squared:  0.9609, Adjusted R-squared:  0.9511 
## F-statistic: 98.28 on 3 and 12 DF,  p-value: 1.031e-08
# KD tính chuẩn của sai số
resid = residuals(reg2)
library(tseries)
jarque.bera.test(resid)
## 
##  Jarque Bera Test
## 
## data:  resid
## X-squared = 1.6377, df = 2, p-value = 0.4409
# KD PSSS thay đổi
bptest(reg2)
## 
##  studentized Breusch-Pagan test
## 
## data:  reg2
## BP = 1.212, df = 2, p-value = 0.5455
# KD E(ri)=rf
x=X50_CP_HNX_ff[1,3]
rf = as.numeric(x)
rf
## [1] 9.027778e-05
library(car)
linearHypothesis(reg2,c("a=0.00009027778"))
## Linear hypothesis test
## 
## Hypothesis:
## a = 9.027778e - 05
## 
## Model 1: restricted model
## Model 2: r_tb ~ a + beta_HML + beta_SMB + 0
## 
##   Res.Df        RSS Df Sum of Sq      F    Pr(>F)    
## 1     13 5.8901e-05                                  
## 2     12 1.1532e-05  1 4.737e-05 49.294 1.393e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
resettest(reggg)
## 
##  RESET test
## 
## data:  reggg
## RESET = 0.41572, df1 = 2, df2 = 10, p-value = 0.6708

XI. MÔ HÌNH FAMA - FRENCH NĂM NHÂN TỐ

\[ r_i = \alpha_i + \beta_{i1}MF + \beta_{i2}SMB+\beta_{i3}HML+\beta_{i4}RMW +\beta_{i5}CMA +\varepsilon_i \]

-MF (Market Factor) = \(r_M-r_f\)

-HML (high minus low): Là chênh lệch giữa tỷ suất lợi tức của danh mục có tỷ số B/M cao và tỷ suất lợi tức của danh mục có tỷ số B/M thấp. \(\rightarrow\) Tính tỷ số B/M \(\rightarrow\) So sánh median của dãy \(\rightarrow\) Chia 2 danh mục H và L

-RMW (Robust minus weak): Là chênh lệch giữa tỷ suất lợi tức của danh mục có lợi nhuận cao và tỷ suất lợi tức của danh mục có lợi nhuận thấp. \(\rightarrow\) Tính chỉ số ROA \(\rightarrow\) So sánh median của dãy \(\rightarrow\) Chia 2 danh mục R và W

-CMA(Conservative minus Aggressive): Là chênh lệch giữa tỷ suất lợi tức của danh mục các công ty có xu hướng đầu tư ít và tỷ suất lợi tức của danh mục các công ty có xu hướng đầu tư nhiều. \(\rightarrow\) Tính chỉ số \(Inv\ = \frac{Tổng\ tài\ sản_t - Tổng\ tài\ sản_{t-1}}{Tổng\ tài\ sản_{t-1}}\) \(\rightarrow\) So sánh median của dãy \(\rightarrow\) Chia 2 danh mục C và A

-SMB (small minus big): Là chênh lệch giữa tỷ suất lợi tức của danh mục có quy mô nhỏ và tỷ suất lợi tức của danh mục có quy mô lớn. \(\rightarrow\) Tính chỉ số quy mô vốn hoá \(\rightarrow\) So sánh median của dãy \(\rightarrow\) Chia 2 danh mục S và B

Kết hợp 6 danh mục từ 3 nhân tố HML,RMW,CMA với 2 danh mục của nhân tố SMB được 12 danh mục:{SH;SL;SR;SW;SC;SA;BH;BL;BR;BW;BC;BA} \(\rightarrow\) Tính lợi suất của 12 danh mục

\(HML= \frac{(r_{SH}+r_{BH})-(r_{SL}+r_{BL})}{2}\)

\(RMW = \frac{(r_{SR}+r_{BR})-(r_{SW}+r_{BW})}{2}\)

\(CMA= \frac{(r_{SC}+r_{BC})-(r_{BA}+r_{SA})}{2}\)

\(SMB = \frac{(r_{SH}+r_{SL}+r_{SR}+r_{SW}+r_{SC}+r_{SA})-(r_{BH}+r_{BL}+r_{BR}+r_{BW}+r_{BC}+r_{BA})}{6}\)

1. Tính các chỉ số

library(readxl)
CS <- read_excel("D:/Term 5/ĐG1/CS.xlsx")
attach(CS)
head(CS)
## # A tibble: 6 × 10
##   Stock `Khối lượng CP lưu hành`  `Vốn CSH` `Tài sản vô hình` `Giá cuối tháng 6`
##   <chr>                    <dbl>      <dbl>             <dbl>              <dbl>
## 1 TTH                   37374846    4.07e11                 0               3100
## 2 FID                   24715958    2.48e11                 0               3200
## 3 SRA                   43199974    6.30e11                 0               6900
## 4 DL1                  106236094    1.33e12         333801182               5000
## 5 ITQ                   31843305    3.30e11        6660196800               4300
## 6 CTC                   15799926    1.24e11        1101142284               4200
## # ℹ 5 more variables: Market <dbl>, `Lợi nhuận từ hoạt động kinh doanh` <dbl>,
## #   `Lợi nhuận sau thuế` <dbl>, `Tổng tài sản năm 2022` <dbl>,
## #   `Tổng tài sản năm 2021` <dbl>

Tính chỉ số vốn hoá thị trường = Khối lượng cổ phiếu đang lưu hành \(\times\) Giá cuối tháng 6

CSVH<-CS$`Khối lượng CP lưu hành`*CS$`Giá cuối tháng 6`
CS1<-data.frame(CS,CSVH)
head(CS1)
##   Stock Khối.lượng.CP.lưu.hành      Vốn.CSH Tài.sản.vô.hình Giá.cuối.tháng.6
## 1   TTH               37374846 4.068710e+11               0             3100
## 2   FID               24715958 2.483844e+11               0             3200
## 3   SRA               43199974 6.299223e+11               0             6900
## 4   DL1              106236094 1.326969e+12       333801182             5000
## 5   ITQ               31843305 3.300238e+11      6660196800             4300
## 6   CTC               15799926 1.241249e+11      1101142284             4200
##   Market Lợi.nhuận.từ.hoạt.động.kinh.doanh Lợi.nhuận.sau.thuế
## 1   1800                       -2857608092        -1803630495
## 2   1700                         142812441           63606736
## 3   3000                          59308271           42033648
## 4   3000                       69051102735        66872289676
## 5   2600                      -18614384372       -17742069331
## 6   2000                       -7899642925        -9138472155
##   Tổng.tài.sản.năm.2022 Tổng.tài.sản.năm.2021         CSVH
## 1          7.865229e+11          6.849032e+11 115862022600
## 2          2.485389e+11          2.529269e+11  79091065600
## 3          4.916960e+10          4.926278e+10 298079820600
## 4          2.936584e+12          2.010699e+12 531180470000
## 5          5.502879e+11          5.056306e+11 136926211500
## 6          3.078030e+11          3.133754e+11  66359689200
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
## 
##     recode
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
#CS1<-arrange(CS1,desc(CSVH))
#View(CS1)

Chia 2 danh mục B và S

B = c()
S = c()

for (i in 1:length(CSVH)){
  if(CSVH[i]>median(CSVH)) {
    B<-c(B,i)
  }
  else {
    S <-c(S,i)
  }
}
por_Big = c()
por_Small = c()
for ( i in VHL){
  por_Big<-c(por_Big,CS1$Stock[i])
}
for ( i in VHN){
  por_Small<-c(por_Small,CS1$Stock[i])
}
cbind(por_Big,por_Small)
##       por_Big por_Small
##  [1,] "NRC"   "TTH"    
##  [2,] "BCC"   "FID"    
##  [3,] "TIG"   "SRA"    
##  [4,] "LAS"   "DL1"    
##  [5,] "EVS"   "ITQ"    
##  [6,] "BVS"   "CTC"    
##  [7,] "IDJ"   "AMV"    
##  [8,] "SHS"   "LIG"    
##  [9,] "API"   "HAD"    
## [10,] "TNG"   "MST"    
## [11,] "VNR"   "HOM"    
## [12,] "MBS"   "DXP"    
## [13,] "TAR"   "AAV"    
## [14,] "CSC"   "NSH"    
## [15,] "PVS"   "IVS"    
## [16,] "HUT"   "CMS"    
## [17,] "NTP"   "TVD"    
## [18,] "VCS"   "VGS"    
## [19,] "THD"   "VC7"    
## [20,] "VC3"   "BNA"    
## [21,] "VFS"   "PVB"    
## [22,] "DDG"   "APS"    
## [23,] "KSF"   "PVC"    
## [24,] "L14"   "MAC"    
## [25,] "SCG"   "IDV"

Tính chỉ số giá trị sổ sách/giá trị thị trường (Book to Market)

Book = (CS$`Vốn CSH`-CS$`Tài sản vô hình`)/CS$`Khối lượng CP lưu hành`
BtM =Book/CS$Market
median(BtM)
## [1] 1.485136

Chia 2 danh mục H và L

H = c()
L = c()

for (i in 1:length(BtM)){
  if(BtM[i]>median(BtM)) {
    H<-c(H,i)
  }
  else {
    L <-c(L,i)
  }
}
por_high = c()
por_low = c()
for ( i in H){
  por_high<-c(por_high,CS$Stock[i])
}
for ( i in L){
  por_low<-c(por_low,CS$Stock[i])
}
cbind(por_high,por_low)
##       por_high por_low
##  [1,] "TTH"    "EVS"  
##  [2,] "FID"    "BVS"  
##  [3,] "SRA"    "IDJ"  
##  [4,] "DL1"    "SHS"  
##  [5,] "ITQ"    "API"  
##  [6,] "CTC"    "APS"  
##  [7,] "AMV"    "PVC"  
##  [8,] "LIG"    "TNG"  
##  [9,] "HAD"    "VNR"  
## [10,] "MST"    "MBS"  
## [11,] "NRC"    "TAR"  
## [12,] "HOM"    "MAC"  
## [13,] "DXP"    "CSC"  
## [14,] "AAV"    "IDV"  
## [15,] "NSH"    "PVS"  
## [16,] "BCC"    "HUT"  
## [17,] "IVS"    "NTP"  
## [18,] "TIG"    "VCS"  
## [19,] "CMS"    "THD"  
## [20,] "TVD"    "VC3"  
## [21,] "VGS"    "VFS"  
## [22,] "VC7"    "DDG"  
## [23,] "LAS"    "KSF"  
## [24,] "BNA"    "L14"  
## [25,] "PVB"    "SCG"
por_SH=intersect(por_Small,por_high)
por_SL=intersect(por_Small,por_low)
por_BH=intersect(por_Big,por_high)
por_BL=intersect(por_Big,por_low)

Tính HML

dataSH = data.frame(TTH,FID,SRA,DL1,ITQ,CTC,AMV,LIG,HAD,MST,HOM,DXP,AAV,NSH,IVS,CMS,TVD,VGS,VC7,BNA,PVB)
dataSL = data.frame(APS,PVC,MAC,IDV)
dataBH = data.frame(NRC,BCC,TIG,LAS)
dataBL = data.frame(EVS,BVS,IDJ,SHS,API,TNG,VNR,MBS,TAR,CSC,PVS,HUT,NTP,VCS,THD,VC3,VFS,DDG,KSF,L14,SCG)

r_SH = rowMeans(dataSH)
r_SL = rowMeans(dataSL)
r_BH = rowMeans(dataBH)
r_BL = rowMeans(dataBL)
HML=(r_SH+r_BH)/2-(r_SL+r_BL)/2
head(HML)
## [1] -0.003295445  0.008404416 -0.019465557  0.001974940 -0.013904485
## [6] -0.021082593

\(RMW_i\) (Robust minus weak): Là chênh lệch giữa tỷ suất sinh lợi của danh mục có lợi nhuận cao và tỷ suất sinh lợi của danh mục có lợi nhuận thấp.

Tính \(ROA = \frac{Lợi\ nhuận\ sau\ thuế}{Tổng\ tài\ sản}\)

ROA = CS$`Lợi nhuận sau thuế`/CS$`Tổng tài sản năm 2022`
#ROA <- ROA[order(ROA,decreasing = TRUE)]
median(ROA)
## [1] 0.03106162
R = c()
W = c()

for (i in 1:length(ROA)){
  if(ROA[i]>median(ROA)) {
    R<-c(R,i)
  }
  else {
    W <-c(W,i)
  }
}
por_robust = c()
por_weak = c()
for ( i in R){
  por_robust<-c(por_robust,CS$Stock[i])
}
for ( i in W){
  por_weak<-c(por_weak,CS$Stock[i])
}
cbind(por_robust,por_weak)
##       por_robust por_weak
##  [1,] "HAD"      "TTH"   
##  [2,] "MST"      "FID"   
##  [3,] "DXP"      "SRA"   
##  [4,] "TIG"      "DL1"   
##  [5,] "TVD"      "ITQ"   
##  [6,] "VGS"      "CTC"   
##  [7,] "LAS"      "AMV"   
##  [8,] "BNA"      "LIG"   
##  [9,] "BVS"      "NRC"   
## [10,] "IDJ"      "HOM"   
## [11,] "API"      "AAV"   
## [12,] "APS"      "NSH"   
## [13,] "TNG"      "BCC"   
## [14,] "VNR"      "IVS"   
## [15,] "MBS"      "CMS"   
## [16,] "MAC"      "VC7"   
## [17,] "CSC"      "PVB"   
## [18,] "IDV"      "EVS"   
## [19,] "PVS"      "SHS"   
## [20,] "NTP"      "PVC"   
## [21,] "VCS"      "TAR"   
## [22,] "THD"      "HUT"   
## [23,] "VFS"      "VC3"   
## [24,] "KSF"      "DDG"   
## [25,] "L14"      "SCG"
por_SR=intersect(por_Small,por_robust)
por_SW=intersect(por_Small,por_weak)
por_BR=intersect(por_Big,por_robust)
por_BW=intersect(por_Big,por_weak)
dataSR = data.frame(HAD,MST,DXP,TVD,VGS,BNA,APS,MAC,IDV)
dataSW = data.frame(TTH,FID,SRA,DL1,ITQ,CTC,AMV,LIG,HOM,AAV,NSH,IVS,CMS,VC7,PVB,PVC)
dataBW = data.frame(BCC,EVS,SHS,TAR,HUT,VC3,DDG,SCG)
dataBR = data.frame(TIG,LAS,EVS,BVS,IDJ,API,TNG,VNR,MBS,CSC,PVS,NTP,VCS,THD,VFS,KSF,L14)

r_SR = rowMeans(dataSR)
r_SW = rowMeans(dataSW)
r_BR = rowMeans(dataBR)
r_BW = rowMeans(dataBW)
RMW=(r_SR+r_BR)/2-(r_SW+r_BW)/2
head(RMW)
## [1]  0.002400354 -0.008433167  0.008682997 -0.022315526  0.009259703
## [6] -0.006793330

\(CMA_i\) (Conservative minus Aggressive): Là chênh lệch giữa tỷ suất lợi tức của danh mục các công ty có xu hướng đầu tư ít và tỷ suất lợi tức của danh mục các công ty có xu hướng đầu tư nhiều

\(Inv\ = \frac{Tổng\ tài\ sản_t - Tổng\ tài\ sản_{t-1}}{Tổng\ tài\ sản_{t-1}}\)

Inv = (CS$`Tổng tài sản năm 2022`-CS$`Tổng tài sản năm 2021`)/CS$`Tổng tài sản năm 2021`
#Inv <- Inv[order(Inv,decreasing = TRUE)]
median(Inv)
## [1] 0.0478117
C = c()
A = c()

for (i in 1:length(Inv)){
  if(Inv[i]>median(Inv)) {
    C<-c(C,i)
  }
  else {
    A <-c(A,i)
  }
}
por_cons = c()
por_aggr = c()
for ( i in C){
  por_cons<-c(por_cons,CS$Stock[i])
}
for ( i in A){
  por_aggr<-c(por_aggr,CS$Stock[i])
}
cbind(por_cons,por_aggr)
##       por_cons por_aggr
##  [1,] "TTH"    "FID"   
##  [2,] "DL1"    "SRA"   
##  [3,] "ITQ"    "CTC"   
##  [4,] "AMV"    "MST"   
##  [5,] "LIG"    "NSH"   
##  [6,] "HAD"    "BCC"   
##  [7,] "NRC"    "IVS"   
##  [8,] "HOM"    "VGS"   
##  [9,] "DXP"    "LAS"   
## [10,] "AAV"    "PVB"   
## [11,] "TIG"    "EVS"   
## [12,] "CMS"    "BVS"   
## [13,] "TVD"    "SHS"   
## [14,] "VC7"    "API"   
## [15,] "BNA"    "APS"   
## [16,] "IDJ"    "VNR"   
## [17,] "PVC"    "MBS"   
## [18,] "TNG"    "MAC"   
## [19,] "TAR"    "CSC"   
## [20,] "IDV"    "PVS"   
## [21,] "HUT"    "NTP"   
## [22,] "VC3"    "VCS"   
## [23,] "DDG"    "THD"   
## [24,] "KSF"    "VFS"   
## [25,] "SCG"    "L14"
por_SC=intersect(por_Small,por_cons)
por_SA=intersect(por_Small,por_aggr)
por_BC=intersect(por_Big,por_cons)
por_BA=intersect(por_Big,por_aggr)
dataSC = data.frame(TTH,DL1,ITQ,AMV,LIG,HAD,HOM,DXP,AAV,CMS,TVD,VC7,BNA,PVC,IDV)
dataSA = data.frame(FID,SRA,CTC,MST,NSH,IVS,VGS,PVB,APS,MAC)
dataBC = data.frame(NRC,TIG,IDJ,TNG,TAR,HUT,VC3,DDG,KSF,SCG)
dataBA = data.frame(BCC,LAS,EVS,BVS,SHS,API,VNR,MBS,CSC,PVS,NTP,VCS,THD,VFS,L14)

r_SC = rowMeans(dataSC)
r_SA = rowMeans(dataSA)
r_BC = rowMeans(dataBC)
r_BA = rowMeans(dataBA)
CMA=(r_SC+r_BC)/2-(r_SA+r_BA)/2
head(CMA)
## [1]  0.005907476 -0.006621665  0.002792596 -0.002070312  0.003268113
## [6] -0.012328862

Tính SMB

SMB = (r_SH+r_SL+r_SR+r_SW+r_SC+r_SA)/6-(r_BH+r_BL+r_BR+r_BW+r_BC+r_BA)/6
head(SMB)
## [1] -0.0003461458  0.0014894755  0.0140469289  0.0257407030 -0.0154604049
## [6] -0.0194430397

2. Ước lượng mô hình Fama - French năm nhân tố

MF=X50_CP_HNX_ff$`r_HNX.Index`- X50_CP_HNX_ff$r_f
FF5F=data.frame(X50_CP_HNX_ff[,1:3],MF,SMB,HML,RMW,CMA,returns[,-1])
attach(FF5F)
## The following objects are masked _by_ .GlobalEnv:
## 
##     CMA, HML, MF, RMW, SMB
## The following objects are masked from returns:
## 
##     AAV, AMV, API, APS, BCC, BNA, BVS, CMS, CSC, CTC, DDG, DL1, DXP,
##     EVS, FID, HAD, HOM, HUT, IDJ, IDV, ITQ, IVS, KSF, L14, LAS, LIG,
##     MAC, MBS, MST, NRC, NSH, NTP, PVB, PVC, PVS, SCG, SHS, SRA, TAR,
##     THD, TIG, TNG, TTH, TVD, VC3, VC7, VCS, VFS, VGS, VNR
coef_vl=data.frame()
coef_tab=data.frame() # tạo 1 bảng dữ liệu để lưu trữ các hệ số ước lượng
dependent2=c(FF5F[,9:58])
for (return1 in dependent2){
  model1 <- lm(return1~MF+SMB+HML+RMW+CMA,data = FF5F)
  #print(summary(model))
  #stargazer(model,type = "text")
  coef_vl<-coef(model1)
  coef_tab<-rbind(coef_tab,coef_vl)
  
}
colnames(coef_tab)=c("alpha_i","beta_MF","beta_SMB","beta_HML","beta_RMW","beta_CMA")
head(coef_tab)
##         alpha_i   beta_MF    beta_SMB    beta_HML   beta_RMW   beta_CMA
## 1  0.0021677336 0.5542231  1.70091164 -0.44291074  0.3754275 -0.2147434
## 2 -0.0000276172 0.3364324 -0.30458817 -0.07779497  0.3646295  0.5925747
## 3  0.0029714525 1.0436987  1.09384518  0.86732734 -0.6452277 -1.4535451
## 4  0.0002009902 0.8491883  0.66426043  0.34848057 -0.5123126 -1.1037851
## 5  0.0010403741 0.4915995  0.08774623 -0.10078547 -0.4551272  0.1608757
## 6  0.0005464711 1.2368892  1.36053245  0.54217927 -0.8085354 -0.4826860

3. Ước lượng phần bù rủi ro

data11 = FF5F[,9:58]
r_tb = colMeans(data11)
#View(data.frame(r_tb))
datanew11=as.data.frame(cbind(r_tb,coef_tab))
#View(datanew1)
attach(datanew11)
## The following object is masked _by_ .GlobalEnv:
## 
##     r_tb
## The following objects are masked from data_UL:
## 
##     alpha_i, beta_HML, beta_SMB, r_tb
## The following objects are masked from datanew1:
## 
##     alpha_i, beta_HML, beta_SMB, r_tb
## The following objects are masked from coef_table:
## 
##     alpha_i, beta_HML, beta_SMB
reg5=lm(r_tb~beta_MF+beta_HML+beta_SMB+beta_CMA+beta_RMW, data=datanew11)
summary(reg5)
## 
## Call:
## lm(formula = r_tb ~ beta_MF + beta_HML + beta_SMB + beta_CMA + 
##     beta_RMW, data = datanew11)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0056955 -0.0008106  0.0001640  0.0007493  0.0025583 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.0006778  0.0005646  -1.201    0.236    
## beta_MF     -0.0021365  0.0004809  -4.442 5.93e-05 ***
## beta_HML    -0.0025164  0.0004691  -5.365 2.87e-06 ***
## beta_SMB    -0.0005180  0.0003818  -1.357    0.182    
## beta_CMA    -0.0001184  0.0003576  -0.331    0.742    
## beta_RMW     0.0005374  0.0003648   1.473    0.148    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.001501 on 44 degrees of freedom
## Multiple R-squared:  0.5799, Adjusted R-squared:  0.5322 
## F-statistic: 12.15 on 5 and 44 DF,  p-value: 2.019e-07

Hiệu chỉnh mô hình

reg6=lm(r_tb~beta_MF+beta_HML, data=datanew11)
summary(reg6)
## 
## Call:
## lm(formula = r_tb ~ beta_MF + beta_HML, data = datanew11)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0051151 -0.0007252  0.0001460  0.0010110  0.0027545 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.0007617  0.0005702  -1.336    0.188    
## beta_MF     -0.0023515  0.0004662  -5.043 7.26e-06 ***
## beta_HML    -0.0024978  0.0004506  -5.543 1.31e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.001525 on 47 degrees of freedom
## Multiple R-squared:  0.5368, Adjusted R-squared:  0.5171 
## F-statistic: 27.23 on 2 and 47 DF,  p-value: 1.4e-08

4. Tính ma trận hiệp phương sai của 5 mã cổ phiếu

Tính ma trận cov cho 5 mã cổ phiếu bất kỳ. 5 mã cổ phiếu được chọn vẫn là 5 mã cổ phiếu được chọn ở mô hình 3 nhân tố. Các ước lượng còn lại được thực hiện như sau:

#Tính ma trận beta
betaa=data.frame()
for (rate in dependent1){
  model1a <- lm(rate~Market_Factor+SMB+HML+RMW+CMA,data = FF5F)
  betaa_values<-coef(model1a)
  betaa<-rbind(betaa,betaa_values)
}
beta_MaF=betaa[,2]
beta_SMB=betaa[,3]
beta_HML=betaa[,4]
beta_RMW=betaa[,5]
beta_CMA=betaa[,6]
beta1a<- cbind(beta_MaF,beta_SMB,beta_HML, beta_RMW, beta_CMA)
print(beta1a)
##       beta_MaF    beta_SMB    beta_HML    beta_RMW    beta_CMA
## [1,] 1.3599393  1.18946058  0.52158448 -0.49692038 -0.05401328
## [2,] 1.2014449  0.03641959  0.16961951  0.07586154 -1.12252316
## [3,] 1.3946507  0.83817841  0.18552728  0.14331556 -0.76932073
## [4,] 0.8808616 -0.47712938 -0.09977253  0.09306636 -0.06819338
## [5,] 1.0436987  1.09384518  0.86732734 -0.64522773 -1.45354514
#Tính phương sai các nhân tố
v_MaF=var(FF5F$MF)
v_SMB=var(FF5F$SMB)
v_HML=var(FF5F$HML)
v_RMW=var(FF5F$RMW)
v_CMA=var(FF5F$CMA)
varf1<-matrix(c(c(v_MaF,0,0,0,0),c(0,v_SMB,0,0,0),c(0,0,v_HML,0,0),c(0,0,0,v_RMW,0),c(0,0,0,0,v_CMA)),nrow=5)
#Ước lượng phương sai sai số của các cổ phiếu
resid_ta=data.frame()
for (rate in dependent1){
  model1b <- lm(rate~Market_Factor+SMB+HML+RMW+CMA,data = FF5F)
  model1b
  resid_value<-resid(model1b)
  resid_ta<-rbind(resid_ta,resid_value)
}
res=as.data.frame(t(resid_ta))
covei1<-matrix(c(c(var(res$V1),0,0,0,0),c(0,var(res$V2),0,0,0),c(0,0,var(res$V3),0,0),c(0,0,0,var(res$V4),0),c(0,0,0,0,var(res$V5))),nrow=5)
#Tính ma trận cov của 5 mã cổ phiếu
v1=beta1a%*%varf1%*%t(beta1a)+covei1
print(v1)
##              [,1]         [,2]         [,3]         [,4]         [,5]
## [1,] 0.0018321297 0.0006443776 0.0008671946 0.0003621497 0.0008477831
## [2,] 0.0006443776 0.0013607535 0.0007268936 0.0004025781 0.0006583897
## [3,] 0.0008671946 0.0007268936 0.0023350431 0.0004141168 0.0008016544
## [4,] 0.0003621497 0.0004025781 0.0004141168 0.0011537257 0.0002629815
## [5,] 0.0008477831 0.0006583897 0.0008016544 0.0002629815 0.0020345355

5. Phân tích rủi ro

5 mã cổ phiếu được chọn vẫn là 5 mã cổ phiếu được chọn ở mô hình Fama-French 3 nhân tố. Thực hiện phân tích rủi ro tương tự như ở mô hình Fama-French 3 nhân tố.

#Tính vector beta_p
beta_p5=w%*%beta1a
print(beta_p5)
##      beta_MaF  beta_SMB  beta_HML   beta_RMW   beta_CMA
## [1,] 1.176119 0.5361549 0.3288572 -0.1659809 -0.6935191
#Tạo vector phương sai nhân tố
vf1a<-c(v_MaF,v_SMB,v_HML,v_RMW,v_CMA)
vfa<-matrix(vf1a, nrow=1)
ves=matrix(c(var(res$V1),var(res$V2),var(res$V3),var(res$V4),var(res$V5)),nrow=1)
#Rủi ro nhân tố của danh mục
rrnt5=(beta_p5)^2%*%t(vfa)
print(rrnt5)
##              [,1]
## [1,] 0.0006326035
#Rủi ro riêng của danh mục
rrr5=w^2%*%t(ves)
print(rrr5)
##              [,1]
## [1,] 0.0001950935
#Tổng rủi ro danh mục
trr5=rrnt5+rrr5
print(trr5)
##             [,1]
## [1,] 0.000827697

Từ kết quả trên ta có được rủi ro nhân tố của danh mục = rrnt5; rủi ro riêng của danh mục = rrr5 và tổng rủi ro danh mục = trr5

6. Kiểm định sự phù hơp của mô hình

Kiểm định nếu tài sản i có các hệ số nhân tố = 0 thì \(\mathbb{E}(r_i) = r_f\)

#Tạo biến a là một vecto có các giá trị bằng 1 
a=c(rep(1,50))
datanew2 = cbind(datanew11,a)
#View(datanew2)

#Ước lượng lại phần bù rủi ro khi xem hệ số của biến a như hệ số chặn 
reg11=lm(r_tb~a+beta_MF+beta_HML+0, data=datanew2)
summary(reg11)
## 
## Call:
## lm(formula = r_tb ~ a + beta_MF + beta_HML + 0, data = datanew2)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0051151 -0.0007252  0.0001460  0.0010110  0.0027545 
## 
## Coefficients:
##            Estimate Std. Error t value Pr(>|t|)    
## a        -0.0007617  0.0005702  -1.336    0.188    
## beta_MF  -0.0023515  0.0004662  -5.043 7.26e-06 ***
## beta_HML -0.0024978  0.0004506  -5.543 1.31e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.001525 on 47 degrees of freedom
## Multiple R-squared:  0.8957, Adjusted R-squared:  0.8891 
## F-statistic: 134.6 on 3 and 47 DF,  p-value: < 2.2e-16
#Kiểm tra lại giá trị r_f 
x=X50_CP_HNX_ff[1,3]
x1 = as.numeric(x)
x1
## [1] 9.027778e-05
#Kiểm định 
library(car)
linearHypothesis(reg11,c("a=0.00009027778"))
## Linear hypothesis test
## 
## Hypothesis:
## a = 9.027778e - 05
## 
## Model 1: restricted model
## Model 2: r_tb ~ a + beta_MF + beta_HML + 0
## 
##   Res.Df        RSS Df  Sum of Sq     F Pr(>F)
## 1     48 0.00011444                           
## 2     47 0.00010925  1 5.1906e-06 2.233 0.1418

Kiểm định dạng hàm đúng (dạng tuyến tính)

library(lmtest)
resettest(reg6)
## 
##  RESET test
## 
## data:  reg6
## RESET = 2.9463, df1 = 2, df2 = 45, p-value = 0.06274

7. Lọc 50 mã cổ phiếu

MF=X50_CP_HNX_ff$`r_HNX.Index`- X50_CP_HNX_ff$r_f
FF5F=data.frame(X50_CP_HNX_ff[,1:3],MF,SMB,HML,RMW,CMA,returns[,-1])
attach(FF5F)
## The following objects are masked _by_ .GlobalEnv:
## 
##     CMA, HML, MF, RMW, SMB
## The following objects are masked from FF5F (pos = 4):
## 
##     AAV, AMV, API, APS, BCC, BNA, BVS, CMA, CMS, CSC, CTC, Date, DDG,
##     DL1, DXP, EVS, FID, HAD, HML, HOM, HUT, IDJ, IDV, ITQ, IVS, KSF,
##     L14, LAS, LIG, MAC, MBS, MF, MST, NRC, NSH, NTP, PVB, PVC, PVS,
##     r_f, r_HNX.Index, RMW, SCG, SHS, SMB, SRA, TAR, THD, TIG, TNG, TTH,
##     TVD, VC3, VC7, VCS, VFS, VGS, VNR
## The following objects are masked from returns:
## 
##     AAV, AMV, API, APS, BCC, BNA, BVS, CMS, CSC, CTC, DDG, DL1, DXP,
##     EVS, FID, HAD, HOM, HUT, IDJ, IDV, ITQ, IVS, KSF, L14, LAS, LIG,
##     MAC, MBS, MST, NRC, NSH, NTP, PVB, PVC, PVS, SCG, SHS, SRA, TAR,
##     THD, TIG, TNG, TTH, TVD, VC3, VC7, VCS, VFS, VGS, VNR
coef_vl=data.frame()
coef_tab=data.frame() # tạo 1 bảng dữ liệu để lưu trữ các hệ số ước lượng
p_value1= data.frame()
dependent2=c(FF5F[,9:58])
for (return1 in dependent2){
  model1 <- lm(return1~MF+SMB+HML+RMW+CMA,data = FF5F)
  #print(summary(model))
  #stargazer(model,type = "text")
  P1=summary(model1)$coefficients[,4]
  p_value1=rbind(p_value1,P1)
  coef_vl<-coef(model1)
  coef_tab<-rbind(coef_tab,coef_vl)
  
}
colnames(coef_tab)=c("alpha_i","beta_MF","beta_SMB","beta_HML","beta_RMW","beta_CMA")
head(coef_tab)
##         alpha_i   beta_MF    beta_SMB    beta_HML   beta_RMW   beta_CMA
## 1  0.0021677336 0.5542231  1.70091164 -0.44291074  0.3754275 -0.2147434
## 2 -0.0000276172 0.3364324 -0.30458817 -0.07779497  0.3646295  0.5925747
## 3  0.0029714525 1.0436987  1.09384518  0.86732734 -0.6452277 -1.4535451
## 4  0.0002009902 0.8491883  0.66426043  0.34848057 -0.5123126 -1.1037851
## 5  0.0010403741 0.4915995  0.08774623 -0.10078547 -0.4551272  0.1608757
## 6  0.0005464711 1.2368892  1.36053245  0.54217927 -0.8085354 -0.4826860
X=t(returns)[-1,0]
data_p1=cbind(X,p_value1)
coef_tab=cbind(X,coef_tab)
colnames(data_p1)=c("Intercept","beta_MF","beta_SMB","beta_HML","beta_RMW","beta_CMA")
head(coef_tab)
##           alpha_i   beta_MF    beta_SMB    beta_HML   beta_RMW   beta_CMA
## MAC  0.0021677336 0.5542231  1.70091164 -0.44291074  0.3754275 -0.2147434
## KSF -0.0000276172 0.3364324 -0.30458817 -0.07779497  0.3646295  0.5925747
## NSH  0.0029714525 1.0436987  1.09384518  0.86732734 -0.6452277 -1.4535451
## IVS  0.0002009902 0.8491883  0.66426043  0.34848057 -0.5123126 -1.1037851
## SCG  0.0010403741 0.4915995  0.08774623 -0.10078547 -0.4551272  0.1608757
## FID  0.0005464711 1.2368892  1.36053245  0.54217927 -0.8085354 -0.4826860
head(data_p1)
##     Intercept      beta_MF     beta_SMB     beta_HML     beta_RMW     beta_CMA
## MAC 0.3476207 3.380352e-05 4.610550e-15 8.099150e-03 1.045576e-01 4.183204e-01
## KSF 0.9852752 1.015164e-04 2.172779e-02 4.705772e-01 1.547023e-02 6.672776e-04
## NSH 0.1673821 1.485648e-15 2.297391e-08 5.429344e-08 2.925070e-03 1.276822e-08
## IVS 0.9044497 1.200762e-16 1.044355e-05 4.160678e-03 2.446588e-03 2.833922e-08
## SCG 0.4439295 9.785435e-10 4.641236e-01 3.033042e-01 9.258856e-04 3.034686e-01
## FID 0.7644082 4.232029e-26 2.422849e-15 4.923912e-05 1.381368e-05 2.202934e-02
data_pond1=rbind()
coef_table1=rbind()
for(i in 1:nrow(data_p)) {
   
    a1 = data_p1[i,2]
    b1 = data_p1[i,3]
    c1 = data_p1[i,4]
    d1 = data_p1[i,5]
    e1 = data_p1[i,6]  
    if (a1<0.05 && b1< 0.05 && c1<0.05 && d1<0.05 && e1 <0.05){
      data_pond1=rbind(data_pond1,data_p1[i,])
      coef_table1=rbind(coef_table1,coef_tab[i,])
    }
}
data_pond1 # bảng giá trị p_value
##     Intercept      beta_MF     beta_SMB     beta_HML     beta_RMW     beta_CMA
## NSH 0.1673821 1.485648e-15 2.297391e-08 5.429344e-08 2.925070e-03 1.276822e-08
## IVS 0.9044497 1.200762e-16 1.044355e-05 4.160678e-03 2.446588e-03 2.833922e-08
## FID 0.7644082 4.232029e-26 2.422849e-15 4.923912e-05 1.381368e-05 2.202934e-02
## BNA 0.7307303 2.382709e-11 6.846500e-06 1.290833e-03 1.031703e-07 5.636210e-03
## ITQ 0.2403665 1.136520e-22 4.056481e-12 2.911534e-08 4.205808e-04 2.088532e-03
## HAD 0.9407023 1.691780e-10 8.959442e-09 4.609607e-03 3.487876e-10 1.801963e-04
## SRA 0.8699400 1.224984e-19 5.310515e-11 1.559248e-11 1.020834e-03 9.148318e-09
## PVB 0.4625086 1.050411e-13 2.486374e-04 1.221757e-02 1.104341e-04 1.013196e-02
## CTC 0.9765728 9.580963e-13 1.713015e-07 1.573473e-04 3.196159e-09 6.804631e-07
## DL1 0.4505778 4.085944e-30 3.779578e-10 7.615554e-08 5.104992e-04 2.692356e-02
coef_table1 # bảng giá trị hệ số ước lượng sau khi lọc
##           alpha_i   beta_MF  beta_SMB   beta_HML   beta_RMW   beta_CMA
## NSH  2.971453e-03 1.0436987 1.0938452  0.8673273 -0.6452277 -1.4535451
## IVS  2.009902e-04 0.8491883 0.6642604  0.3484806 -0.5123126 -1.1037851
## FID  5.464711e-04 1.2368892 1.3605324  0.5421793 -0.8085354 -0.4826860
## BNA -6.367945e-04 0.7375290 0.7497276  0.4333721  1.0143249  0.5936059
## ITQ  2.292277e-03 1.2054080 1.2545265  0.8042087 -0.6967681 -0.6967058
## HAD -1.585008e-04 0.8087917 1.1185819  0.4383524  1.3939509  0.9311076
## SRA  2.365459e-04 0.8140078 0.8748411  0.7357478 -0.4800275 -0.9880303
## PVB  1.696764e-03 1.0356949 0.7563536 -0.4192175 -0.9066888 -0.6871247
## CTC  5.985199e-05 0.8738191 0.9670948  0.5629796 -1.2523610 -1.1943969
## DL1  1.338877e-03 1.3252253 1.0209083  0.7076871 -0.6243375 -0.4535396
  • Sau khi lọc, ta được 10 mã cổ phiếu có tất cả các hệ số nhân tố đều có ý nghĩa thống kê ở mức ý nghĩa \(5\%\).
  • Vì mẫu quá bé nên các suy diễn thống kê có thể không đáng tin cậy dẫn đến sai lệch trong kết quả phân tích và tính toán.
  • Do đó, để tiết kiệm thời gian, nhóm mình xin phép dừng ở đây. Nếu bạn nào quan tâm thì có thể tham khảo phần tương tự ở mô hình Fama - French 3 nhân tố.

XII. SO SÁNH FAMA-FRENCH BA NHÂN TỐ VÀ FAMA-FRENCH NĂM NHÂN TỐ

So với mô hình ba nhân tố, Fama-French năm nhân tố cho kết quả cụ thể như sau. Với mức ý nghĩa \(5\%\):

  • Chỉ có hệ số ước phượng phần bù rủi ro nhân tố MF và HML có ý nghĩa thống kê
  • Rủi ro nhân tố và tổng rủi ro đều bé hơn
  • Rủi ro riêng lớn hơn nhưng không đáng kể
  • Kiểm định hệ số chặn bằng \(r_f\)
  • Dạng hàm tuyến tính là đúng

Cho nên chưa thể kết luận mô hình Fama - French năm nhân tố tốt hơn mô hình ba nhân tố với dữ liệu ở sàn HNX.

XIII. KẾT LUẬN

  • Mô hình Fama-French 3 nhân tố và 5 nhân tố là những công cụ quan trọng trong việc giải thích lợi tức cổ phiếu.

  • Mô hình 3 nhân tố, mở rộng từ Mô hình Giá cổ phiếu tài sản (CAPM), bổ sung hai yếu tố vào CAPM để giải thích lợi tức tài sản: SMB (Small Minus Big), đại diện cho sự lan rộng lợi tức giữa cổ phiếu nhỏ và lớn, và HML (High Minus Low), đo lường sự lan rộng lợi tức giữa cổ phiếu có giá trị ghi sổ đến thị trường cao và thấp.

  • Mô hình 5 nhân tố của Fama và French thêm hai yếu tố nữa để nắm bắt thêm lợi tức tài sản: RMW (Robust Minus Weak), so sánh lợi tức của các công ty có lợi nhuận hoạt động cao (robust) và những công ty có lợi nhuận hoạt động thấp (weak); và CMA (Conservative Minus Aggressive), đánh giá sự khác biệt giữa các công ty đầu tư mạnh mẽ và những công ty đầu tư một cách bảo thủ.

  • Tuy nhiên, cả hai mô hình đều có nhược điểm. Mô hình 3 nhân tố không thể tạo ra kết quả có ý nghĩa khi có khủng hoảng tài chính. Mặt khác, mô hình 5 nhân tố, mặc dù giải thích được nhiều hơn về lợi tức cổ phiếu so với mô hình 3 nhân tố, nhưng chỉ có một yếu tố duy nhất thực sự duy trì được qua tất cả các giai đoạn thời gian là RMW (Robust Minus Weak).

  • Nhìn chung, cả hai mô hình đều cung cấp cái nhìn sâu sắc về lợi tức cổ phiếu và có thể được sử dụng như những công cụ hữu ích trong việc đánh giá và quản lý danh mục đầu tư.

XIV. TÀI LIỆU THAM KHẢO

  1. PGS.TS. Hoàng Đình Tuấn (2010), Mô hình phân tích và định giá tài sản tài chính, Nhà xuất bản Khoa học và Kỹ thuật, Hà Nội.
  2. Zvi Bodie, Alex Kane & Alan J.Marcus (2018), Investments, eleventh edition, Mc Graw Hill Education, USA.

DANH SÁCH THÀNH VIÊN VÀ BẢNG PHÂN CHIA CÔNG VIỆC

1.Nguyễn Quỳnh Trang

2.Trương Ngọc Thuỳ Trang

3.Trịnh Thu Huyền

4.Nguyễn Kim Anh

5.Bùi Thu Hà

6.Nguyễn Thị An Chinh