Giới thiệu

Trong bối cảnh thị trường tài chính năng động, việc ra quyết định đầu tư đòi hỏi sự kết hợp giữa lý thuyết tài chính hiện đại và phân tích dữ liệu thực tiễn. Nhà đầu tư luôn đối mặt với bài toán tối ưu hóa lợi nhuận trong một mức độ rủi ro có thể chấp nhận được. Báo cáo này tập trung vào việc áp dụng các mô hình tài chính định lượng để phân tích một danh mục đầu tư giả định gồm năm cổ phiếu ngành ngân hàng hàng đầu tại Việt Nam: BID, MBB, VCB, STB, và CTG. Dữ liệu được thu thập trong giai đoạn từ tháng 01/2022 đến tháng 12/2024.

Nghiên cứu này được thực hiện nhằm đạt được ba mục tiêu chính:

  1. Mô hình Định giá Tài sản Vốn (CAPM): Sử dụng chỉ số VN-Index làm đại diện cho danh mục thị trường để ước lượng rủi ro hệ thống (Beta) và suất sinh lời vượt trội (Alpha) của từng cổ phiếu.

  2. Đường Thị trường Chứng khoán (SML): Dựa trên kết quả CAPM để xác định suất sinh lời yêu cầu và đưa ra nhận xét về định giá (định giá cao/thấp) của các cổ phiếu.

  3. Ước lượng Rủi ro: Tính toán ma trận hiệp phương sai và Giá trị Rủi ro (Value at Risk - VaR) để lượng hóa rủi ro tiềm ẩn của từng cổ phiếu và của cả danh mục.

Chuẩn bị Dữ liệu

Tải thư viện và đọc dữ liệu

library(readxl)
data <- read_excel("D:/DEALINE/C5_TH.xlsx", sheet = 1)
Rf <- 0.00025  # Lãi suất phi rủi ro giả định/ngày
# Kiểm tra xem có cột R_VNI hay không, nếu không thì thay bằng cột tên khác
datatable(data)

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)
datatable(returns)

Kết quả nghiên cứu và phân tích

Kiểm định tính dừng chuỗi lợi suất

Hầu hết các mô hình tài chính, bao gồm cả hồi quy CAPM, đều yêu cầu các chuỗi thời gian phải có tính dừng (stationarity). Một chuỗi dừng có các đặc tính thống kê (như trung bình, phương sai) không thay đổi theo thời gian. Chuỗi giá cổ phiếu thường không dừng, nhưng chuỗi suất sinh lời của nó thì thường có. Kiểm định ADF được sử dụng để xác nhận giả thuyết này. Giả thuyết H0 của kiểm định ADF là “chuỗi có nghiệm đơn vị” (không dừng). Nếu giá trị thống kê của kiểm định nhỏ hơn giá trị tới hạn (hoặc p-value < 0.05), ta bác bỏ H0 và kết luận chuỗi là dừng.

# 4. Kiểm tra tính dừng (ADF test)
library(urca)
## Warning: package 'urca' was built under R version 4.4.3
adf_results <- lapply(returns, function(x) summary(ur.df(x, type = "drift", selectlags = "AIC")))

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.135404 -0.009092 -0.000456  0.010074  0.071370 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6.268e-06  7.815e-04  -0.008  0.99360    
## z.lag.1     -1.181e+00  5.334e-02 -22.133  < 2e-16 ***
## z.diff.lag   1.075e-01  3.651e-02   2.944  0.00334 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.02133 on 742 degrees of freedom
## Multiple R-squared:  0.5385, Adjusted R-squared:  0.5372 
## F-statistic: 432.9 on 2 and 742 DF,  p-value: < 2.2e-16
## 
## 
## Value of test-statistic is: -22.1328 244.9336 
## 
## Critical values for test statistics: 
##       1pct  5pct 10pct
## tau2 -3.43 -2.86 -2.57
## phi1  6.43  4.59  3.78

Kết quả kiểm định ADF cho cổ phiếu BID:

  • Giá trị thống kê của kiểm định (test-statistic) là -22.13. Giá trị này nhỏ hơn rất nhiều so với các giá trị tới hạn ở tất cả các mức ý nghĩa (1%: -3.43, 5%: -2.86, 10%: -2.57).

  • Kết luận: Ta bác bỏ giả thuyết H0. Chuỗi suất sinh lời của BID là dừng. Tương tự, tất cả các chuỗi suất sinh lời khác trong bộ dữ liệu đều vượt qua kiểm định tính dừng, do đó đủ điều kiện để đưa vào phân tích hồi quy.

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

CAPM là mô hình nền tảng trong tài chính hiện đại, mô tả mối quan hệ giữa rủi ro và suất sinh lời kỳ vọng. Mô hình cho rằng suất sinh lời kỳ vọng của một tài sản bằng lãi suất phi rủi ro cộng với một khoản bù đắp cho rủi ro hệ thống. \[ E(R_i)=R_f+\beta_i[E(R_m)-R_f] \]

  • Beta \((\beta)\): Đo lường rủi ro hệ thống, không thể đa dạng hóa được. \(\beta >1\) cho thấy tài sản có rủi ro cao hơn thị trường, và ngược lại.

  • Alpha \((\alpha)\): Là phần chênh lệch giữa suất sinh lời thực tế và suất sinh lời kỳ vọng theo CAPM. Alpha dương cho thấy tài sản hoạt động tốt hơn dự kiến và có thể bị định giá thấp.

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 -2.8895 -0.0026    0.0039          0.14        3.02
## MBB   MBB -6.5882 -0.0038    0.0083         -3.55        3.04
## VCB   VCB  1.8246 -0.0021    0.0048          4.84        3.02
## STB   STB  1.6517 -0.0053    0.0123          4.70        3.05
## CTG   CTG -0.2067 -0.0048    0.0137          2.84        3.04

Diễn giải kết quả:

  • Hệ số Beta \((\beta)\): Kết quả cho thấy tất cả các hệ số Beta đều âm và rất gần 0. Đây là một kết quả bất thường trong thực tế, vì nó ngụ ý rằng các cổ phiếu ngân hàng này có xu hướng đi ngược lại với thị trường một cách rất nhẹ. Thông thường, cổ phiếu ngân hàng sẽ có Beta dương và gần bằng 1. Kết quả này có thể do vấn đề trong dữ liệu hoặc phương pháp tính toán. Tuy nhiên, nếu chấp nhận kết quả này, nó có nghĩa là các cổ phiếu này có thể được xem là các tài sản “phòng thủ” (defensive assets).

  • Hệ số alpha \((\alpha)\):

  • VCB và STB có Alpha dương, cho thấy trong giai đoạn nghiên cứu, chúng đã hoạt động tốt hơn mức mà mô hình CAPM dự báo.

  • BID và đặc biệt là MBB có Alpha âm đáng kể, cho thấy hiệu suất hoạt động kém hơn kỳ vọng.

  • Hệ số R-squared \((R^2)\): các giá trị \(R^2\) đều rất thấp (cao nhất là 1.37% cho CTG). Điều này có nghĩa là biến động của VN-Index giải thích được rất ít sự biến động của các cổ phiếu này. Phần lớn rủi ro của chúng (trên 98%) là rủi ro phi hệ thống (rủi ro riêng của doanh nghiệp). Điều này cũng củng cố cho kết quả Beta gần bằng 0 ở trên.

# 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)

Phân tích đường thị trường chứng khoán (SML)

Đường SML được vẽ để trực quan hóa mối quan hệ giữa lợi suất kỳ vọng và rủi ro hệ thống. Các điểm nằm trên đường SML được cho là bị định giá thấp, và các điểm nằm dưới là bị định giá cao.

# 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)

Nhận xét biểu đồ đường thị trường chứng khoán (SML)

  • Biểu đồ Đường Thị trường Chứng khoán (SML) cho thấy sự phân hóa rõ rệt về hiệu suất của các cổ phiếu trong giai đoạn phân tích. Các cổ phiếu STB và VCB (ký hiệu “V”) nằm rõ rệt phía trên đường SML, cho thấy suất sinh lời thực tế của chúng đã vượt qua mức lợi nhuận yêu cầu mà mô hình CAPM dự báo. Điều này ngụ ý chúng đang được định giá thấp (undervalued) và là các lựa chọn đầu tư hiệu quả. Ngược lại, BID và đặc biệt là MBB nằm sâu bên dưới đường SML, thể hiện hiệu suất hoạt động kém hơn kỳ vọng và có dấu hiệu bị định giá cao (overvalued). Cổ phiếu CTG nằm gần đường SML, cho thấy mức định giá tương đối hợp lý.

  • Tuy nhiên, cần phân tích kết quả này một cách thận trọng do có những đặc điểm bất thường. Việc tất cả các cổ phiếu đều có hệ số Beta âm là một điểm khác biệt so với lý thuyết, cho thấy chúng có xu hướng biến động ngược chiều với VN-Index trong giai đoạn này. Kết hợp với hệ số R-squared rất thấp từ kết quả hồi quy, điều này ngụ ý rằng rủi ro thị trường chung chỉ giải thích được một phần rất nhỏ sự biến động của các cổ phiếu này. Do đó, mặc dù SML cho thấy sự khác biệt về hiệu suất, phần lớn rủi ro và lợi nhuận của các cổ phiếu này đến từ các yếu tố phi hệ thống (rủi ro riêng của từng doanh nghiệp), làm giảm độ tin cậy của mô hình CAPM trong trường hợp này.

Phân tích rủi ro danh mục đầu tư

# 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.06934052
## 
## $SD
## [1] 0.2633259
## 
## $VaR_95
## [1] 0.4331325

Diễn giải kết quả:

  • Độ lệch chuẩn (Rủi ro tổng thể): Danh mục có độ lệch chuẩn hàng năm là 26.33%, thể hiện mức độ biến động chung của danh mục.

  • Value at Risk (VaR): Với độ tin cậy 95%, khoản lỗ tối đa của danh mục trong một năm dự kiến sẽ không vượt quá 43.31% giá trị của danh mục. Đây là một con số quan trọng giúp nhà đầu tư lượng hóa được rủi ro thua lỗ trong những kịch bản xấu.

Kết luận và hạn chế

Tổng kết

  • Báo cáo đã tiến hành một phân tích định lượng toàn diện trên 5 cổ phiếu ngân hàng. Kết quả cho thấy:

  • Các chuỗi lợi suất đều có tính dừng, phù hợp cho việc phân tích hồi quy. Mô hình CAPM ước lượng được các hệ số Beta rất gần 0 và hệ số \(R^2\) rất thấp, cho thấy trong giai đoạn này, VN-Index không phải là yếu tố giải thích chính cho sự biến động của các cổ phiếu này.

  • Dựa trên SML, VCB và STB là các cổ phiếu có tiềm năng do bị định giá thấp, trong khi các cổ phiếu còn lại có dấu hiệu bị định giá cao.

  • Việc lượng hóa VaR cung cấp một thước đo rủi ro hữu ích cho nhà quản lý danh mục.

Hạn chế của nghiên cứu

  • Dữ liệu và Giả định: Kết quả Beta và \(R^2\) bất thường có thể đến từ chất lượng dữ liệu hoặc do giai đoạn phân tích (2022-2024) có những biến động đặc thù. Giả định lãi suất phi rủi ro không đổi cũng là một sự đơn giản hóa.

  • Mô hình một nhân tố: CAPM là mô hình một nhân tố, chỉ xem xét rủi ro thị trường. Các mô hình đa nhân tố (như Fama-French 3 nhân tố) có thể cung cấp một cái nhìn sâu sắc hơn.

  • Giả định Phân phối Chuẩn: VaR được tính dựa trên giả định suất sinh lời có phân phối chuẩn, điều này không phải lúc nào cũng đúng trong thực tế (hiện tượng “đuôi dày” - fat tails).

Hướng nghiên cứu tiếp theo

Các nghiên cứu trong tương lai có thể mở rộng bằng cách sử dụng các mô hình đa nhân tố, kiểm tra tính ổn định của Beta theo thời gian, và áp dụng các phương pháp tính VaR phi tham số (như Historical Simulation) để có kết quả chính xác hơn.