# 1. Cài đặt và nạp gói
library(readxl)
library(urca)
library(PerformanceAnalytics)
library(DT)
# 2. Đọc dữ liệu
data <- read_excel("D:/HK2_MHDGTSTC2_VALD/dl1.xlsx", sheet = 1)
colnames(data) <- c("Date", "BID", "MBB", "ACB", "CTG", "SHB", "VNI") # chuẩn hóa tên cột
datatable(data,options = list(scrollX = TRUE))
# 3. Tính log return
returns <- as.data.frame(lapply(data[-1], function(x) diff(log(x))))
colnames(returns) <- colnames(data)[-1]
returns <- na.omit(returns)
Trước khi tiến hành ước lượng mô hình CAPM, nghiên cứu tiến hành kiểm định tính dừng của các chuỗi lợi suất logarit của năm cổ phiếu đại diện trong ngành ngân hàng gồm: BID, MBB, ACB, CTG, SHB, và chỉ số thị trường VNI.
Việc kiểm định tính dừng là rất quan trọng trong phân tích chuỗi thời gian, nhằm đảm bảo rằng các chuỗi lợi suất không chứa nghiệm đơn vị – điều này có thể gây sai lệch trong kết quả hồi quy. Nếu chuỗi không dừng, các mô hình ước lượng như CAPM sẽ không còn đảm bảo tính hiệu lực trong suy luận thống kê.
Trong nghiên cứu này, nhóm tác giả đã áp dụng kiểm định Augmented Dickey-Fuller (ADF), sử dụng mô hình có thành phần trôi (drift) và chọn độ trễ tối ưu theo tiêu chí AIC. Trước khi thực hiện kiểm định, các chuỗi dữ liệu đã được xử lý để loại bỏ các giá trị không xác định (NA, NaN, Inf) nhằm đảm bảo tính toàn vẹn của chuỗi đầu vào.
# 4. Kiểm tra tính dừng (ADF test)
adf_results <- lapply(returns, function(x) {
x_clean <- x[is.finite(x)] # lọc bỏ NA, NaN, Inf
if (length(x_clean) > 10) {
return(summary(ur.df(x_clean, type = "drift", selectlags = "AIC")))
} else {
return(NA) # chuỗi quá ngắn sau khi lọc sẽ bị bỏ qua
}
})
print(adf_results$BID)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.073948 -0.007662 -0.000569 0.006908 0.067783
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.153e-05 7.866e-04 0.027 0.978
## z.lag.1 -9.419e-01 7.073e-02 -13.317 <2e-16 ***
## z.diff.lag 2.700e-02 5.215e-02 0.518 0.605
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01511 on 366 degrees of freedom
## Multiple R-squared: 0.459, Adjusted R-squared: 0.456
## F-statistic: 155.3 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -13.317 88.6714
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
Kết quả kiểm định Augmented Dickey-Fuller (ADF) đối với chuỗi lợi suất log của cổ phiếu BID, sử dụng phương trình hồi quy có thành phần trôi (drift) và độ trễ tối ưu theo tiêu chí AIC, được trình bày như sau:
Giá trị thống kê kiểm định (ADF test statistic): -13.317
Giá trị tới hạn (critical values) tại các mức ý nghĩa:
1%: -3.44
5%: -2.87
10%: -2.57
So sánh giá trị thống kê kiểm định với các mức tới hạn cho thấy:
-13.317 < -3.44 Giá trị kiểm định nhỏ hơn tất cả các mức tới hạn. ⟶ Bác bỏ giả thuyết rỗng (H₀) về sự tồn tại của nghiệm đơn vị.
⟶ Kết luận: Chuỗi lợi suất log của cổ phiếu BID là chuỗi dừng tại mức ý nghĩa 1%.
Điều này cho thấy chuỗi dữ liệu đã ổn định quanh giá trị trung bình và không tồn tại xu hướng tăng hoặc giảm lâu dài. Như vậy, chuỗi BID hoàn toàn phù hợp để đưa vào mô hình hồi quy CAPM trong các bước tiếp theo mà không cần biến đổi bậc I khác.
print(adf_results$CTG)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.073150 -0.007290 0.000316 0.007115 0.070429
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0009888 0.0008731 1.133 0.258
## z.lag.1 -0.9412139 0.0729932 -12.895 <2e-16 ***
## z.diff.lag -0.0534138 0.0518643 -1.030 0.304
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01669 on 366 degrees of freedom
## Multiple R-squared: 0.5012, Adjusted R-squared: 0.4985
## F-statistic: 183.9 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -12.8945 83.1406
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
print(adf_results$SHB)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.100207 -0.005366 -0.000443 0.007203 0.067206
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.0004713 0.0008205 0.574 0.566
## z.lag.1 -1.0200797 0.0739730 -13.790 <2e-16 ***
## z.diff.lag 0.0070456 0.0520003 0.135 0.892
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01574 on 366 degrees of freedom
## Multiple R-squared: 0.5073, Adjusted R-squared: 0.5046
## F-statistic: 188.4 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -13.7899 95.0835
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
print(adf_results$MBB)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.073090 -0.007440 -0.000723 0.006646 0.064228
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.001079 0.000792 1.363 0.174
## z.lag.1 -0.959857 0.070715 -13.574 <2e-16 ***
## z.diff.lag 0.012987 0.051550 0.252 0.801
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01511 on 366 degrees of freedom
## Multiple R-squared: 0.4804, Adjusted R-squared: 0.4776
## F-statistic: 169.2 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -13.5736 92.1422
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
print(adf_results$ACB)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.177697 -0.004760 0.000090 0.005669 0.063812
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.484e-05 8.224e-04 -0.091 0.928
## z.lag.1 -1.058e+00 7.367e-02 -14.366 <2e-16 ***
## z.diff.lag 5.513e-02 5.202e-02 1.060 0.290
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.0158 on 366 degrees of freedom
## Multiple R-squared: 0.5034, Adjusted R-squared: 0.5007
## F-statistic: 185.5 on 2 and 366 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -14.3656 103.1864
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.44 -2.87 -2.57
## phi1 6.47 4.61 3.79
Các biến còn lại tương tự, và tất cả điều dừng.
###2.2. Ước lượng mô hình CAPM
Mô hình CAPM được ước lượng cho từng cổ phiếu theo phương trình:
\[ R_{it} - R_f = \alpha_i + \beta_i (R_{mt} - R_f) + \varepsilon_{it} \]
Trong đó:
# 5. Ước lượng mô hình CAPM
rf <- 0.03 / 252 # lãi suất phi rủi ro theo ngày
stocks <- colnames(returns)[colnames(returns) != "VNI"]
CAPM_models <- lapply(stocks, function(stock) {
Ri_excess <- returns[[stock]] - rf
Rm_excess <- returns$VNI - rf
df <- na.omit(data.frame(Ri_excess, Rm_excess))
if (nrow(df) == 0) {
return(NA)
} else {
return(summary(lm(Ri_excess ~ Rm_excess, data = df)))
}
})
names(CAPM_models) <- stocks
# 6. Trích xuất kết quả từ CAPM_models hợp lệ
valid_CAPM <- CAPM_models[!sapply(CAPM_models, function(x) any(is.na(x)))]
# Tính các đại lượng
beta_vals <- sapply(valid_CAPM, function(x) coef(x)[2])
alpha_vals <- sapply(valid_CAPM, function(x) coef(x)[1])
rsq_vals <- sapply(valid_CAPM, function(x) x$r.squared)
# Lợi suất thực tế trung bình (%/năm)
mean_returns <- colMeans(returns[, names(valid_CAPM)], na.rm = TRUE) * 252 * 100
# Lợi suất kỳ vọng theo CAPM (%/năm)
market_return <- mean(returns$VNI, na.rm = TRUE) * 252
expected_returns <- (rf * 252 + beta_vals * (market_return - rf * 252)) * 100
# Tạo bảng kết quả
CAPM_results <- data.frame(
Stock = names(valid_CAPM),
Alpha = round(alpha_vals * 252 * 100, 4), # annualized %
Beta = round(beta_vals, 4),
R_Squared = round(rsq_vals, 4),
Return_Actual = round(mean_returns, 2),
Return_CAPM = round(expected_returns, 2)
)
# In kết quả
print(CAPM_results)
## Stock Alpha Beta R_Squared Return_Actual Return_CAPM
## BID BID -12.6728 1.0616 0.5384 1.54 14.21
## MBB MBB 17.9963 1.1071 0.5737 32.69 14.69
## ACB ACB -12.7868 0.9688 0.4109 0.44 13.23
## CTG CTG 13.9585 1.2269 0.5865 29.91 15.95
## SHB SHB 2.7264 0.8390 0.3099 14.58 11.86
| Cột | Ý nghĩa |
|---|---|
| Stock | Mã cổ phiếu |
| Alpha | Sai số lợi suất (alpha), phản ánh hiệu suất vượt trội nếu > 0 |
| Beta | Hệ số nhạy cảm với thị trường – càng cao, càng biến động mạnh |
| R_Squared | Độ phù hợp của mô hình (giải thích bao nhiêu % biến thiên lợi suất) |
| Return_Actual | Lợi suất trung bình thực tế (%/năm) |
| Return_CAPM | Lợi suất kỳ vọng theo mô hình CAPM (%/năm) |
Hệ số BBeta Tất cả các cổ phiếu đều có β > 0.8, cho thấy các cổ phiếu có mối quan hệ đồng biến với thị trường.
Đặc biệt, CTG có hệ số beta cao nhất (1.2269), phản ánh mức độ rủi ro hệ thống cao hơn so với thị trường → lợi suất kỳ vọng cao hơn.
SHB có beta thấp nhất (0.8390), thể hiện mức độ nhạy cảm với biến động thị trường thấp nhất trong nhóm.
Hệ số Alpha
MBB và CTG có alpha dương lớn (17.99% và 13.96% tương ứng), hàm ý rằng các cổ phiếu này mang lại lợi suất thực tế cao hơn kỳ vọng theo CAPM, có thể đang bị định giá thấp (underpriced) → cơ hội đầu tư tốt.
Ngược lại, BID và ACB có alpha âm khá lớn (-12.67% và -12.79%) → lợi suất thực tế thấp hơn mức kỳ vọng → có dấu hiệu bị định giá cao (overpriced).
SHB có alpha dương nhẹ (2.73%), cho thấy cổ phiếu có thể được định giá hợp lý hoặc hơi thấp.
R-squared (R²)
Hệ số R² dao động từ 0.31 đến 0.59, nghĩa là mô hình CAPM giải thích được khoảng 31% đến 59% biến động lợi suất cổ phiếu.
Các cổ phiếu như CTG, MBB, BID có R² > 0.5 → CAPM phù hợp tốt.
Ngược lại, SHB và ACB có R² thấp hơn 0.4 → CAPM không giải thích nhiều sự biến động, có thể bị ảnh hưởng bởi các yếu tố riêng khác ngoài thị trường chung.
So sánh lợi suất thực tế và lợi suất kỳ vọng theo CAPM
MBB và CTG: lợi suất thực tế cao vượt trội so với lợi suất kỳ vọng → hiệu suất vượt trội.
ACB và BID: lợi suất thực tế rất thấp, thậm chí gần 0 → không đạt kỳ vọng đầu tư.
SHB: lợi suất thực tế và kỳ vọng khá gần nhau → định giá tương đối hợp lý.
# 6. Lọc mô hình hợp lệ
valid_CAPM <- CAPM_models[!sapply(CAPM_models, function(x) any(is.na(x)))]
betas <- sapply(valid_CAPM, function(x) coef(x)[2])
means <- colMeans(returns[, names(betas)], na.rm = TRUE) * 252
market_return <- mean(returns$VNI, na.rm = TRUE) * 252
expected_return_CAPM <- rf * 252 + betas * (market_return - rf * 252)
expected_return_CAPM
## BID MBB ACB CTG SHB
## 0.1420926 0.1468970 0.1322946 0.1595465 0.1185823
Nhận xét
Mô hình CAPM dự báo rằng cổ phiếu có rủi ro hệ thống (Beta) càng cao thì lợi suất kỳ vọng càng lớn.
Kết quả này phù hợp với lý thuyết CAPM:
CTG có Beta cao nhất (1.2269) nên có lợi suất kỳ vọng cao nhất (15.95%).
SHB có Beta thấp nhất (0.8390) nên có lợi suất kỳ vọng thấp nhất (11.86%).
Tất cả các cổ phiếu đều có lợi suất kỳ vọng cao hơn lãi suất phi rủi ro (3%), dao động từ 11.86% đến 15.95%/năm.
Các cổ phiếu như CTG, MBB và BID có mức lợi suất kỳ vọng > 14%/năm, cho thấy mức độ bù đắp rủi ro cao được yêu cầu từ nhà đầu tư.
ACB và SHB có lợi suất kỳ vọng thấp hơn tương đối, phù hợp với mức beta thấp hơn → phù hợp hơn với nhà đầu tư ưa thích rủi ro thấp.
Dựa trên kết quả mô hình CAPM, nghiên cứu tiến hành xây dựng đường thị trường chứng khoán (Security Market Line – SML), thể hiện mối quan hệ giữa beta và lợi suất kỳ vọng của các cổ phiếu.
Đường SML được xác định theo công thức:
\[ E(R_i) = R_f + \beta_i (E(R_m) - R_f) \]
Biểu đồ trên minh họa Security Market Line (SML) – đường biểu diễn mối quan hệ tuyến tính giữa rủi ro hệ thống (Beta) và lợi suất kỳ vọng của các cổ phiếu theo mô hình định giá tài sản vốn CAPM.
Trục hoành thể hiện hệ số Beta của từng cổ phiếu, đại diện cho mức độ nhạy cảm của cổ phiếu đó với biến động của thị trường. Trục tung biểu diễn lợi suất trung bình hàng năm hóa thực tế (Average Return Annualized) của từng cổ phiếu trong giai đoạn nghiên cứu.
Đường màu đỏ là đường SML – biểu diễn lợi suất kỳ vọng lý thuyết theo CAPM với độ dốc phản ánh phần bù rủi ro thị trường.
# 7. Vẽ đường SML
plot(betas, means, pch = 19, col = "blue",
main = "Security Market Line (SML)",
xlab = "Beta", ylab = "Average Return (Annualized)")
abline(a = rf * 252, b = (market_return - rf * 252), col = "red", lwd = 2)
text(betas, means, labels = names(betas), pos = 4)
🔹CTG : Có hệ số Beta cao nhất (~1.23) và nằm trên đường SML.
Lợi suất thực tế cao hơn đáng kể lợi suất kỳ vọng theo CAPM.
→ Cổ phiếu đang bị định giá thấp (undervalued) → Nhà đầu tư được nhận lợi suất vượt mức bù đắp rủi ro → gợi ý nên đầu tư.
🔹 MBB:
Có hệ số Beta khoảng 1.11, cũng nằm rõ ràng trên đường SML.
Lợi suất thực tế lên đến hơn 32%/năm, vượt xa lợi suất kỳ vọng (~14.7%).
→ Cổ phiếu mang lại hiệu suất vượt trội, cho thấy khả năng tạo giá trị vượt ngoài rủi ro hệ thống.
→ Rất hấp dẫn trong mắt nhà đầu tư tìm kiếm alpha dương.
🔹 SHB:
Beta thấp nhất trong nhóm (~0.84).
Lợi suất thực tế (~14.6%) hơi cao hơn lợi suất kỳ vọng (~11.9%).
→ Nằm sát đường SML → định giá gần đúng theo CAPM → ổn định và phù hợp với nhà đầu tư ưa rủi ro thấp.
🔹 ACB:
Có Beta ≈ 0.97, nhưng lợi suất thực tế gần bằng 0%, nằm dưới đường SML.
→ Cho thấy cổ phiếu không tạo ra lợi suất tương xứng với rủi ro.
→ Bị định giá cao (overvalued) hoặc hoạt động yếu trong giai đoạn nghiên cứu.
🔹 BID:
Có hệ số Beta > 1, nhưng vẫn nằm dưới đường SML và có lợi suất thực tế thấp hơn kỳ vọng rất nhiều (chỉ ~1.5% so với ~14.2% theo CAPM).
→ BID không mang lại phần bù rủi ro thỏa đáng, có thể đang bị định giá quá cao, hoặc gặp vấn đề về hiệu quả hoạt động, quản trị, hoặc rủi ro phi hệ thống.
Từ dữ liệu log-return, ma trận hiệp phương sai hàng năm giữa các cổ phiếu được tính toán, từ đó ước lượng rủi ro tổng thể của danh mục đầu tư gồm các cổ phiếu trên với tỷ trọng bằng nhau.
# 8. Tính ma trận hiệp phương sai & VaR danh mục
cov_matrix <- cov(returns[, names(betas)]) * 252
w <- rep(1 / length(betas), length(betas)) # tỷ trọng đều
var_p <- as.numeric(t(w) %*% cov_matrix %*% w)
sd_p <- sqrt(var_p)
VaR_95 <- qnorm(0.95) * sd_p
list(Var = var_p, SD = sd_p, VaR_95 = VaR_95)
## $Var
## [1] 0.04128751
##
## $SD
## [1] 0.2031933
##
## $VaR_95
## [1] 0.3342232
Ý nghĩa: Với mức độ tin cậy 95%, danh mục có thể lỗ tối đa khoảng 33.42% giá trị trong một năm trong điều kiện thị trường bình thường.
Phân tích cho thấy mô hình CAPM tương thích với dữ liệu cổ phiếu ngân hàng giai đoạn nghiên cứu. Các hệ số beta cho thấy sự khác biệt trong độ nhạy với thị trường giữa các mã cổ phiếu. Đồng thời, việc so sánh lợi suất thực tế và kỳ vọng cùng với VaR giúp nhà đầu tư có cái nhìn đầy đủ hơn về cả rủi ro và kỳ vọng lợi suất.
Cổ phiếu MBB là lựa chọn đầu tư ưu tiên hàng đầu trong danh mục nghiên cứu, với hiệu suất vượt trội rõ rệt so với các cổ phiếu còn lại. Cụ thể, hệ số alpha đạt +17.99%, cho thấy MBB mang lại mức sinh lời thực tế vượt xa kỳ vọng theo mô hình CAPM. Hệ số beta ở mức 1.11 phản ánh mức độ rủi ro hệ thống cao hơn một chút so với thị trường, nhưng vẫn nằm trong ngưỡng chấp nhận được đối với nhà đầu tư ưa thích rủi ro trung bình đến cao. Đồng thời, lợi suất thực tế lên tới 32.69%/năm – cao nhất trong danh mục – cho thấy hiệu suất sinh lời ấn tượng. Trong biểu đồ SML, MBB nằm cao hơn rõ rệt so với đường thị trường, cho thấy cổ phiếu đang bị định giá thấp (undervalued). Ngoài ra, hệ số R-squared đạt 0.5737 khẳng định rằng mô hình CAPM giải thích khá tốt biến động lợi suất của cổ phiếu này. Với những đặc điểm trên, MBB được đánh giá là cổ phiếu tiềm năng, rất đáng để cân nhắc đầu tư trong bối cảnh thị trường hiện tại.