# 0. Load các thư viện cần thiết
library(quantmod)
## Warning: package 'quantmod' was built under R version 4.3.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.3
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
library(tseries)    # adf.test, kpss.test
## Warning: package 'tseries' was built under R version 4.3.3
library(urca)       # nếu muốn ur.df
## Warning: package 'urca' was built under R version 4.3.3
library(lmtest)     # coeftest
## Warning: package 'lmtest' was built under R version 4.3.3
library(sandwich)   # vcovHC
## Warning: package 'sandwich' was built under R version 4.3.3
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.3
## corrplot 0.92 loaded
library(ggplot2)
library(DT)
## Warning: package 'DT' was built under R version 4.3.3

1 Giới thiệu Dữ liệu

ACB, BID, MBB, OCB, SSB cùng chỉ số VN-Index là những cổ phiếu ngân hàng tiêu biểu và thanh khoản tốt trên sàn HOSE, phản ánh rõ nét diễn biến ngành tài chính – ngân hàng. Các mã này có quy mô và mức độ biến động khác nhau: MBB và BID thường tăng nhanh hơn thị trường, ACB và OCB dao động tương đương chỉ số, trong khi SSB có tính “phòng thủ” với biến động thấp hơn. Sự đa dạng này giúp kiểm tra xem mô hình CAPM có vận hành ổn định với cổ phiếu có beta cao, beta thấp hay beta xấp xỉ 1. Đồng thời VN-Index được dùng làm proxy cho “toàn bộ thị trường” bởi nó bao quát hầu hết ngành và vốn hóa, nên khi lấy VN-Index làm biến số thị trường sẽ đảm bảo các hệ số beta, alpha tính ra có ý nghĩa cả về mặt thống kê lẫn thực tiễn. Nhờ vậy, nhóm mã ngân hàng này và VN-Index tạo thành một bộ dữ liệu vừa đủ đa dạng, vừa đủ đại diện, để từ đó tiến hành kiểm định tính dừng, ước lượng CAPM/SML, xây dựng ma trận hiệp phương sai và tính Value at Risk một cách tin cậy và dễ dàng so sánh kết quả.

file_path <- "C:/Users/ASUS/Downloads/Dữ liệu Lịch sử ACB.csv"
d <- read.csv(file_path,
              fileEncoding = "UTF-8-BOM",
              stringsAsFactors = FALSE)

# 1.2. Chuyển cột date sang Date
if(!"date" %in% names(d)) stop("Không tìm thấy cột 'date'.")
d$Date <- as.Date(d$date, format = "%d/%m/%Y")

# 1.3. Chọn 5 cổ phiếu + chỉ số VNI
tickers <- c("ACB","BID","MBB","OCB","SSB")
all_cols <- c(tickers, "VNI")
avail    <- intersect(all_cols, names(d))
if(length(avail) < length(all_cols)) {
  stop("Thiếu cột: ", paste(setdiff(all_cols, avail), collapse = ", "))
}

# 1.4. Chuyển sang xts và numeric
gclean <- function(x) as.numeric(gsub(",", "", x))
prices_xts <- xts(
  sapply(d[, avail], gclean),
  order.by = d$Date
)
colnames(prices_xts) <- avail
datatable(d)

2 Kiểm định Tính dừng của Chuỗi Giá

# ADL và KPSS
stationarity <- lapply(tickers, function(sym) {
  series <- na.omit(prices_xts[, sym])
  adf  <- adf.test(series, alternative = "stationary")
  kpss <- kpss.test(series, null = "Level")
  data.frame(
    Stock       = sym,
    ADF_stat    = unname(adf$statistic),
    ADF_pvalue  = adf$p.value,
    KPSS_stat   = unname(kpss$statistic),
    KPSS_pvalue = kpss$p.value
  )
})
## Warning in kpss.test(series, null = "Level"): p-value smaller than printed
## p-value

## Warning in kpss.test(series, null = "Level"): p-value smaller than printed
## p-value

## Warning in kpss.test(series, null = "Level"): p-value smaller than printed
## p-value

## Warning in kpss.test(series, null = "Level"): p-value smaller than printed
## p-value

## Warning in kpss.test(series, null = "Level"): p-value smaller than printed
## p-value
stat_df <- do.call(rbind, stationarity)
cat("\nKẾT QUẢ KIỂM ĐỊNH TÍNH DỪNG\n")
## 
## KẾT QUẢ KIỂM ĐỊNH TÍNH DỪNG
print(stat_df)
##   Stock   ADF_stat ADF_pvalue KPSS_stat KPSS_pvalue
## 1   ACB -0.6184079 0.97643654  7.047788        0.01
## 2   BID -1.5747252 0.75832059  4.244149        0.01
## 3   MBB -3.1980312 0.08826846  8.400770        0.01
## 4   OCB -2.4543095 0.38600516  3.252872        0.01
## 5   SSB -2.3096017 0.44725790  6.900643        0.01

Nhận xét

  • Đối với cổ phiếu ACB, kết quả kiểm định ADF cho thấy giá đóng cửa có thống kê –0.6185 với p-value ≈0.98, nghĩa là chúng ta không thể bác bỏ giả thuyết có unit-root, trong khi KPSS với thống kê khoảng 7.05 và p-value =0.01 lại bác bỏ giả thuyết tính dừng. Từ đó có thể khẳng định chuỗi giá ACB không dừng, phù hợp với kỳ vọng rằng giá cổ phiếu thường biến động giống “random walk”.

  • Ở cổ phiếu BID, ADF statistic là –1.5747 và p-value ≈0.76 cũng không cho thấy đủ bằng chứng để bác bỏ unit-root, đồng thời KPSS statistic =4.24 với p-value =0.01 cho thấy chuỗi giá này không dừng. Như vậy BID cũng nằm trong nhóm các tài sản có xu hướng không dừng, và việc chuyển sang phân tích lợi suất (returns) là bước cần thiết để đảm bảo tính ổn định của dữ liệu.

  • Cổ phiếu MBB cho kết quả ADF statistic khoảng –3.20 với p-value ≈0.088, vẫn lớn hơn ngưỡng 0.05 nên ta chưa thể coi là dừng, trong khi KPSS statistic =8.40 và p-value =0.01 tiếp tục bác bỏ tính dừng. Điều này cho thấy dù MBB có vẻ “gần” với tính dừng hơn một số mã khác, nhưng về cơ bản chuỗi giá của nó vẫn chứa unit-root và cần phân tích trên log-returns.

  • Với OCB, ADF statistic ghi nhận –2.4543 (p-value ≈0.39) không đủ điều kiện để bác bỏ unit-root, và KPSS statistic =3.25 (p-value =0.01) cũng cho thấy chuỗi không dừng. Điều này xác nhận rằng giá OCB không phù hợp để trực tiếp áp dụng các mô hình đòi hỏi dữ liệu dừng, mà nên tính toán lợi suất và sử dụng returns.

  • Cuối cùng, chuỗi giá SSB có ADF statistic –2.3096 với p-value ≈0.45, không bác bỏ được unit-root; đồng thời KPSS statistic =6.90 (p-value =0.01) cũng bác bỏ tính dừng. Như vậy chuỗi giá SSB cũng không dừng.

Nhìn chung, kết quả cho cả năm cổ phiếu đều nhất quán: giá đóng cửa không dừng, và việc chuyển sang phân tích log-returns trước khi ước lượng CAPM, vẽ SML, xây ma trận hiệp phương sai và tính VaR là hoàn toàn đúng đắn.

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

# 3.1. Tính log-returns hàng ngày
rets <- na.omit(Return.calculate(prices_xts, method = "log"))

# 3.2. Thiết lập lãi suất phi rủi ro
rf_annual <- 0.05
rf_daily  <- rf_annual / 252

# 3.3. Tính lợi suất kỳ vọng thị trường annualized
# Sử dụng VNI
mean_mkt_daily <- mean(rets[, "VNI"], na.rm = TRUE)
exp_ret_ann   <- mean_mkt_daily * 252

# 3.4. Ước lượng CAPM cho từng cổ phiếu với robust SE
capm_list <- lapply(tickers, function(sym) {
  y <- rets[, sym] - rf_daily
  x <- rets[, "VNI"] - rf_daily
  fit <- lm(y ~ x)
  rob <- coeftest(fit, vcov = vcovHC(fit, type = "HC1"))
  beta_val <- rob[2,1]
  alpha_val <- rob[1,1]
  er_capm   <- rf_annual + beta_val * (exp_ret_ann - rf_annual)
  data.frame(
    Stock   = sym,
    Alpha   = alpha_val,
    Beta    = beta_val,
    t_Beta  = rob[2,3],
    R2      = summary(fit)$r.squared,
    ER_CAPM = er_capm
  )
})
capm_df <- do.call(rbind, capm_list)
cat("\nKẾT QUẢ ƯỚC LƯỢNG CAPM\n")
## 
## KẾT QUẢ ƯỚC LƯỢNG CAPM
print(capm_df)
##   Stock         Alpha      Beta    t_Beta         R2    ER_CAPM
## 1   ACB -1.209237e-05 0.9168439 20.015343 0.42913967 0.10761036
## 2   BID -1.586367e-04 1.0330860 19.980704 0.48108450 0.11491450
## 3   MBB  6.495905e-04 1.0598410 28.690254 0.59211216 0.11659566
## 4   OCB -1.974294e-04 0.9985285 19.906264 0.38092637 0.11274306
## 5   SSB -7.621926e-04 0.3440817  4.267742 0.06656371 0.07162055

Nhận xét

  • Cổ phiếu ACB có hệ số \(\beta = 0.9168\) với giá trị \(t\)-Beta \(\approx 20.15\) (rất có ý nghĩa thống kê), cho thấy ACB biến động nhẹ hơn thị trường khoảng 8.3%. Hệ số \(\alpha \approx -1.2\times10^{-5}\) rất nhỏ và không khác biệt đáng kể so với 0, tức CAPM đã giải thích tốt kỳ vọng lợi suất của ACB. Giá trị \(R^2 = 0.429\) cho biết 42.9% biến động lợi suất ACB được giải thích qua biến động thị trường.

  • BID có \(\beta = 1.0331\)\(t\)-Beta \(\approx 19.98\), nghĩa là nhạy cảm hơn thị trường khoảng 3.3%. \(\alpha \approx -1.6\times10^{-4}\) cũng rất nhỏ, không khác biệt đáng kể so với 0. Với \(R^2 = 0.481\), gần 48.1% biến động BID được CAPM giải thích.

  • MBB có \(\beta = 1.0598\) với \(t\)-Beta \(\approx 28.69\), phản ánh độ biến động cao hơn thị trường gần 6%. \(\alpha = 6.5\times10^{-4}\) hơi dương nhưng nhỏ. \(R^2 = 0.592\) (59.2%) là cao nhất trong nhóm, cho thấy mối liên hệ MBB–thị trường bền vững nhất.

  • OCB gần như có \(\beta = 0.9985\) (gần 1) với \(t\)-Beta \(\approx 19.91\), tức biến động tương đương VN-Index. \(\alpha \approx -2.0\times10^{-4}\)\(R^2 = 0.381\) (38.1%) cho thấy phần lớn biến động OCB là do các yếu tố riêng ngoài thị trường.

  • SSB có \(\beta = 0.3441\)\(t\)-Beta \(\approx 4.27\), nghĩa là chỉ phản ứng yếu với biến động chung (khoảng 34%). \(\alpha \approx -7.6\times10^{-4}\)\(R^2 = 0.0666\) rất thấp, chỉ 6.7% biến động lợi suất được CAPM giải thích, còn lại chịu tác động từ yếu tố riêng.

4 Vẽ Đường Chứng khoán Thị trường (SML)

# 4.1. Thêm thư viện cần thiết
library(ggplot2)
library(RColorBrewer)
library(scales)

# 4.2. Chuẩn bị dữ liệu SML
# (capm_df phải đã có từ phần 3)
df_sml <- data.frame(
  Beta      = capm_df$Beta,
  ExpReturn = capm_df$ER_CAPM,
  Stock     = capm_df$Stock
)

# 4.3. Ước lượng đường SML
sml_fit <- lm(ExpReturn ~ Beta, data = df_sml)

# 4.4. Vẽ biểu đồ
ggplot(df_sml, aes(x = Beta, y = ExpReturn, color = Stock)) +
  geom_point(size = 4) +
  geom_text(aes(label = Stock),
            nudge_y = 0.002, size = 3, show.legend = FALSE) +
  geom_abline(intercept = coef(sml_fit)[1],
              slope     = coef(sml_fit)[2],
              color     = "#E69F00",       # màu cam nổi bật
              linetype  = "dashed",
              size      = 1.2) +
  scale_color_brewer(palette = "Dark2") +
  scale_y_continuous(labels = percent_format(accuracy = 0.01)) +
  labs(
    title    = "Security Market Line – các cổ phiếu ngành ngân hàng",
    x        = expression(beta),
    y        = "Lợi suất kỳ vọng (annualized)",
    color    = "Cổ phiếu"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title       = element_text(face = "bold", size = 16),
    plot.subtitle    = element_text(size = 12, color = "gray40"),
    legend.position  = "bottom",
    legend.title     = element_text(face = "bold"),
    panel.grid.minor = element_blank()
  )

Nhận xét

  • Cổ phiếu ACB có hệ số \(\beta \approx 0.92\), nghĩa là độ nhạy lợi suất của ACB chỉ bằng khoảng 92% mức biến động chung của VN-Index. Với lợi suất quan sát khoảng 10.2 % annualized, ACB nằm gần như chính xác trên đường SML, thể hiện không có giá chênh lệch so với dự báo của CAPM. Hệ số \(\alpha\) của ACB cũng rất gần bằng 0 và không có ý nghĩa thống kê, cho thấy toàn bộ lợi suất kỳ vọng của ACB gần như được giải thích hoàn toàn bởi rủi ro hệ thống.

  • BID có \(\beta \approx 1.03\), cao hơn một chút so với 1, cho thấy BID phản ứng mạnh hơn thị trường khoảng 3 %. Kỳ vọng lợi suất của BID khoảng 10.7 % nằm hơi trên đường SML (khoảng 10.6 % theo dự báo). Điều này ngụ ý rằng BID đang được định giá “hơi rẻ” so với mức rủi ro của nó vì lợi suất thực tế cao hơn một chút so với mô hình CAPM dự đoán.

  • MBB thể hiện mức độ nhạy nhất trong nhóm với \(\beta \approx 1.06\), tức cao hơn thị trường 6 %. Lợi suất quan sát của MBB vào khoảng 10.9 % annualized, nằm rõ ràng phía trên đường SML (khoảng 10.8 %). Sự chênh này cho thấy MBB mang lại lợi suất cao hơn đáng kể so với CAPM dự báo, cho thấy cổ phiếu này có tiềm năng vượt trội và có thể đang bị định giá dưới mức theo rủi ro hệ thống.

  • Với \(\beta \approx 1.00\), OCB có biến động gần như đồng bộ với VN-Index. Kỳ vọng lợi suất của OCB vào khoảng 10.5 % annualized trùng khớp rất sát với đường SML. Mức \(\alpha\) gần bằng 0 và \(R^2\) trung bình cho thấy OCB là một mã “trung tính” về mặt định giá và không có dấu hiệu lợi suất thực tế chênh lệch so với CAPM.

  • SSB có \(\beta \approx 0.34\), thấp nhất trong nhóm, thể hiện đặc tính phòng thủ và ít bị ảnh hưởng bởi biến động chung. Lợi suất kỳ vọng chỉ khoảng 7.0 %, cũng nằm chính xác trên đường SML tại điểm \(\beta = 0.34\). Điều này cho thấy SSB được định giá rất đúng mức theo CAPM và phù hợp với nhà đầu tư ưu tiên danh mục ít rủi ro.

5 Ma trận Hiệp phương sai và Biểu đồ Heatmap

# 5.1. Ma trận hiệp phương sai annualized
cov_mat <- cov(rets[, tickers]) * 252

# 5.2. Vẽ heatmap
corrplot(cov_mat,
         method      = "color",
         addCoef.col = "black",
         tl.col      = "black",
         tl.srt      = 45,
         title       = "Covariance Matrix (annualized)",
         mar         = c(0,0,2,0))

Nhận xét

  • Trong ma trận hiệp phương sai annualized, ta thấy OCB có phương sai lớn nhất (0.07), tương ứng với việc OCB có độ biến động lợi suất cao nhất trong nhóm. Tiếp theo là BID với phương sai khoảng 0.06 và MBB với 0.05, trong khi ACB và SSB cùng có phương sai xấp xỉ 0.05 nhưng SSB vẫn là mã ít biến động nhất (0.05).

  • Về hiệp phương sai giữa các cặp, quan hệ ACB–MBB có giá trị cao nhất (0.04), cho thấy lợi suất của ACB và MBB có xu hướng dao động cùng chiều mạnh hơn so với các cặp khác. Các cặp BID–MBB và ACB–OCB đều có hiệp phương sai khoảng 0.04–0.03, phản ánh mức độ liên kết trung bình giữa các mã ngân hàng. Ngược lại, SSB có hiệp phương sai thấp nhất với toàn bộ các mã còn lại (khoảng 0.01), khẳng định đây là cổ phiếu “phòng thủ” có rủi ro riêng biệt thấp và ít chịu ảnh hưởng từ biến động hệ thống chung.

  • Vậy, OCB và BID là hai mã có rủi ro hệ thống cao nhất (và có độ liên kết tương ứng với nhóm), trong khi SSB nổi bật với độ rủi ro rất thấp và gần như độc lập về động thái giá so với phần còn lại của danh mục.

6 Phân tích Value at Risk (VaR) 95%

# 6.1. VaR 95% cho từng cổ phiếu (Gaussian & Historical)
var_gauss <- sapply(rets[, tickers], function(x) VaR(x, p = 0.95, method = "gaussian"))
var_hist  <- sapply(rets[, tickers], function(x) VaR(x, p = 0.95, method = "historical"))

var_df <- data.frame(
  Stock     = tickers,
  VaR_Gauss = var_gauss,
  VaR_Hist  = var_hist,
  row.names = NULL
)
cat("\nVaR 95% Cá nhân\n")
## 
## VaR 95% Cá nhân
print(var_df)
##   Stock   VaR_Gauss    VaR_Hist
## 1   ACB -0.02370624 -0.01778149
## 2   BID -0.02537277 -0.02073944
## 3   MBB -0.02262557 -0.01927259
## 4   OCB -0.02763322 -0.02302745
## 5   SSB -0.02346302 -0.02187674

Nhận xét

  • Đối với ACB, VaR 95% theo phương pháp Gaussian là –2.37 % trong khi VaR historical chỉ –1.78 %. Sự chênh lệch này cho thấy phân phối lợi suất của ACB có đuôi dày hơn so với giả định chuẩn, khiến VaR Gaussian đánh giá mức lỗ tiềm ẩn nghiêm trọng hơn một chút.

  • BID lại có VaR Gaussian khoảng –2.53 % so với –2.07 % của historical. Khoảng cách 0.46 % giữa hai con số phản ánh rằng BID chịu những cú sốc lớn hơn thường xuyên hơn chuẩn tắc, nên phương pháp Gaussian có xu hướng “thắt an toàn” cao hơn.

  • MBB ghi nhận VaR Gaussian –2.26 % và VaR historical –1.93 %. Mức VaR tương đối cao do độ biến động của MBB, nhưng chênh lệch dưới 0.4 % cho thấy phân phối lợi suất của MBB không quá lệch so với phân phối chuẩn.

  • OCB có VaR Gaussian lên đến –2.76 % và VaR historical –2.30 %. Đây là con số VaR lớn nhất trong nhóm, tương ứng với việc OCB có phương sai lợi suất cao nhất; sự khác biệt 0.46 % giữa hai phương pháp cũng phản ánh đuôi phân phối dày.

  • SSB, dù có β thấp nhất, vẫn cho VaR Gaussian –2.46 % và VaR historical –2.19 %. Khoảng cách 0.27 % giữa hai phương pháp cho thấy SSB có độ lệch nhỏ hơn so với các mã khác, nhưng vẫn tồn tại rủi ro lỗ ngày lên đến khoảng 2.2–2.5 %.

# 6.2. VaR 95% cho danh mục cân bằng
wts         <- rep(1/length(tickers), length(tickers))
port_ret    <- Return.portfolio(rets[, tickers], weights = wts, geometric = FALSE)
var_port_gauss <- VaR(port_ret, p = 0.95, method = "gaussian")
var_port_hist  <- VaR(port_ret, p = 0.95, method = "historical")
cat("\nVaR 95% Danh mục\n")
## 
## VaR 95% Danh mục
print(data.frame(
  Method = c("Gaussian", "Historical"),
  VaR    = c(var_port_gauss, var_port_hist)
))
##       Method        VaR
## 1   Gaussian -0.0183124
## 2 Historical -0.0153378

Nhận xét

  • VaR 95% của danh mục theo Gaussian là –1.83 % và theo historical là –1.53 %. So sánh với VaR cá nhân, danh mục đã giảm lỗ tiềm ẩn nhờ đa dạng hóa: mức mất mát xấu nhất trong một ngày không vượt quá khoảng 1.5–1.8 % tổng giá trị. Điều này minh họa rõ lợi ích của phân bổ rủi ro qua nhiều cổ phiếu.

7 So sánh Lợi suất Dự báo (CAPM) và Lợi suất Thực tế

# 7.1. Tính actual returns annualized
actual_ann <- sapply(tickers, function(sym) {
  Return.annualized(rets[, sym], scale = 252)
})
actual_df <- data.frame(
  Stock     = tickers,
  Actual_ER = as.numeric(actual_ann),
  row.names = NULL,
  stringsAsFactors = FALSE
)
# Gộp với kết quả CAPM
cmp_df <- merge(
  capm_df[, c("Stock", "ER_CAPM")],
  actual_df,
  by = "Stock"
)
# Chuyển sang phần trăm và tính chênh lệch
cmp_df$ER_CAPM   <- cmp_df$ER_CAPM * 100
cmp_df$Actual_ER <- cmp_df$Actual_ER * 100
cmp_df$Diff      <- cmp_df$Actual_ER - cmp_df$ER_CAPM

knitr::kable(
  cmp_df,
  col.names = c("Mã", "E[R]_CAPM (%)", "E[R]_Thực tế (%)", "Chênh lệch (%)"),
  digits = 2,
  caption = "So sánh lợi suất kỳ vọng CAPM và thực tế"
)
So sánh lợi suất kỳ vọng CAPM và thực tế
E[R]_CAPM (%) E[R]_Thực tế (%) Chênh lệch (%)
ACB 10.76 7.96 -2.80
BID 11.49 4.52 -6.97
MBB 11.66 28.91 17.25
OCB 11.27 2.71 -8.57
SSB 7.16 -13.52 -20.68
for(i in seq_len(nrow(cmp_df))) {
  s   <- cmp_df$Stock[i]
  erc <- cmp_df$ER_CAPM[i]
  erh <- cmp_df$Actual_ER[i]
  diff <- cmp_df$Diff[i]
  tag <- if(diff > 0) {
    "undervalued"
  } else if(diff < 0) {
    "overvalued"
  } else {
    "fairly valued"
  }
  cat(sprintf("- %s: Actual = %.2f%%, CAPM = %.2f%% → %s\n",
              s, erh, erc, tag))
}
## - ACB: Actual = 7.96%, CAPM = 10.76% → overvalued
## - BID: Actual = 4.52%, CAPM = 11.49% → overvalued
## - MBB: Actual = 28.91%, CAPM = 11.66% → undervalued
## - OCB: Actual = 2.71%, CAPM = 11.27% → overvalued
## - SSB: Actual = -13.52%, CAPM = 7.16% → overvalued

Nhận xét

  • ACB cho thấy lợi nhuận thực tế annualized khoảng 7.96%, trong khi mức CAPM kỳ vọng là 10.76%. Việc Actual thấp hơn dự báo CAPM đến gần 3 điểm phần trăm cho thấy thị trường đã đánh giá ACB tương đối cao so với rủi ro của nó, tức là cổ phiếu này đang “định giá cao” và khó có khả năng đem lại lợi suất vượt trội so với mô hình.

  • BID chỉ đạt Actual khoảng 4.52% so với CAPM kỳ vọng 11.49%. Khoảng cách đến 7 điểm phần trăm khẳng định BID đang được định giá quá cao, khiến lợi nhuận thực tế không theo kịp mức rủi ro hệ thống mà CAPM dự báo.

  • Ngược lại, MBB có Actual lên tới 28.91%, gấp hơn hai lần mức CAPM 11.66%. Đây là dấu hiệu rõ ràng MBB đang bị định giá thấp: nhà đầu tư hưởng lợi suất thực tế lớn hơn rất nhiều so với mức rủi ro phải chịu, tức cổ phiếu này đang “định giá thấp” và đầy tiềm năng.

  • OCB có Actual chỉ 2.71% trong khi CAPM kỳ vọng 11.27%. Sự chênh lệch gần 9 điểm phần trăm cho thấy OCB đang ở mức định giá quá cao, mang lại lợi suất thực tế thấp hơn hẳn so với mức rủi ro mà CAPM gợi ý.

  • SSB thậm chí có Actual âm –13.52%, trái ngược hoàn toàn với CAPM kỳ vọng 7.16%. Đây là ví dụ điển hình của cổ phiếu “bị định giá quá cao”, bởi nhà đầu tư không chỉ không thu được lợi nhuận mà còn chịu lỗ, trong khi theo mô hình CAPM lợi suất dương là hoàn toàn hợp lý.