CHƯƠNG 1. TỔNG QUAN VÀ MÔ TẢ DỮ LIỆU (OVERVIEW & DATA DESCRIPTION)

1.1. Tổng quan về Dữ liệu (Dataset Overview)

1.1.1. Giới thiệu chung và mục tiêu tiểu luận (Introduction & Objectives)

Trong bối cảnh nền kinh tế toàn cầu ngày càng phụ thuộc vào dữ liệu, việc phân tích và khai thác dữ liệu tài chính trở thành một kỹ năng không thể thiếu đối với các nhà phân tích và nhà đầu tư. Ngôn ngữ R được xem là một trong những công cụ mạnh mẽ nhất cho phân tích dữ liệu, nhờ khả năng xử lý linh hoạt, tích hợp thống kê, và hỗ trợ trực quan hóa ở cấp độ chuyên sâu.

Đề tài của tiểu luận này là:

“Phân tích dữ liệu đầu tư và chỉ số tài chính của các công ty niêm yết trên sàn NYSE bằng ngôn ngữ R”

Bộ dữ liệu được sử dụng trong tiểu luận có tên “400K NYSE Random Investments + Financial Ratios”, bao gồm 405.258 quan sát và 25 biến. Dữ liệu mô phỏng các khoản đầu tư ngẫu nhiên trên sàn NYSE (New York Stock Exchange), kết hợp với các chỉ tiêu tài chính (financial ratios) của các công ty. Bộ dữ liệu giúp mô phỏng hoạt động đầu tư, đo lường hiệu quả sinh lời, và đánh giá rủi ro theo các chỉ số định lượng.

Mục tiêu chính của việc phân tích bộ dữ liệu này là áp dụng tuần tự các bước trong Roadmap R for Data Analysis, từ thao tác dữ liệu, trực quan hoá, đến phân tích thống kê và xây dựng mô hình. Xác định và định lượng mức độ tác động của các yếu tố tài chính, rủi ro, và chiến lược đầu tư lên hiệu suất lợi suất thực tế và khả năng phân loại kết quả đầu tư trên thị trường chứng khoán NYSE.

1.1.2. Cấu trúc và đặc điểm bộ dữ liệu (Structure and Characteristics)

Tên bộ dữ liệu: 400K NYSE Random Investments + Financial Ratios Dataset.

Nguồn dữ liệu: dữ liệu giả lập dựa trên các chỉ số, giá trị đầu tư và thông tin tài chính của doanh nghiệp niêm yết tại sàn NYSE trên Kaggle.

Đặc điểm:

  • Số lượng quan sát: 405.258 dòng

  • Số lượng biến: 25 biến

  • Dạng dữ liệu: hỗn hợp giữa định tính (factor) và định lượng (numeric)

  • Khoảng thời gian: các giao dịch diễn ra trong giai đoạn từ 2013 đến 2018

  • Một số biến tiêu biểu:

# Xem toàn bộ tên cột
colnames(nyse)
##  [1] "X"                        "company"                 
##  [3] "sector"                   "horizon..days."          
##  [5] "amount"                   "date_BUY_fix"            
##  [7] "date_SELL_fix"            "price_BUY"               
##  [9] "price_SELL"               "Volatility_Buy"          
## [11] "Volatility_sell"          "Sharpe.Ratio"            
## [13] "expected_return..yearly." "inflation"               
## [15] "nominal_return"           "investment"              
## [17] "ESG_ranking"              "PE_ratio"                
## [19] "EPS_ratio"                "PS_ratio"                
## [21] "PB_ratio"                 "NetProfitMargin_ratio"   
## [23] "current_ratio"            "roa_ratio"               
## [25] "roe_ratio"

Bộ dữ liệu bao gồm 25 biến phản ánh thông tin về công ty, giao dịch đầu tư và các chỉ tiêu tài chính. Dưới đây là tóm tắt một số nhóm biến chính:

  • Biến định danh:
    • X: chỉ số dòng dữ liệu.
    • company: mã công ty (ví dụ: BAC, JPM, FB…).
    • sector: lĩnh vực hoạt động (BANK, TECH, FMCG, RETAIL…).
  • Biến giao dịch:
    • horizon..days.: số ngày nắm giữ đầu tư.
    • amount: số tiền đầu tư.
    • date_BUY_fix, date_SELL_fix: ngày mua và ngày bán.
    • price_BUY, price_SELL: giá mua và giá bán cổ phiếu.
  • Biến lợi suất và rủi ro:
    • nominal_return: tỷ suất lợi nhuận danh nghĩa.
    • expected_return..yearly.: lợi suất kỳ vọng hàng năm.
    • Volatility_Buy, Volatility_sell: độ biến động giá.
    • Sharpe.Ratio: tỷ suất lợi nhuận điều chỉnh rủi ro.
  • Biến tài chính của doanh nghiệp:
    • PE_ratio, PB_ratio, EPS_ratio, PS_ratio: các tỷ số định giá cơ bản.
    • current_ratio, roa_ratio, roe_ratio: chỉ tiêu thanh khoản và hiệu quả sinh lời.
    • NetProfitMargin_ratio: tỷ suất lợi nhuận ròng.
    • ESG_ranking: xếp hạng bền vững ESG.
    • investment: phân loại kết quả đầu tư (GOOD/BAD).

1.1.3. Tóm tắt cấu trúc tiểu luận (Report Structure Summary)

Bài tiểu luận được chia thành 10 chương tương ứng với 10 node trong Roadmap “R for Data Analysis”, bao gồm:

  1. R Fundamentals – Làm quen cú pháp, cấu trúc dữ liệu, và thao tác cơ bản.

  2. Data Manipulation – Biến đổi, gộp nhóm, lọc và xử lý dữ liệu.

  3. Data Visualization – Trực quan hóa bằng biểu đồ cơ bản và ggplot2.

  4. Statistical Analysis – Phân tích thống kê mô tả và suy luận.

  5. Machine Learning – Xây dựng và đánh giá mô hình học máy cơ bản.

  6. Working with Big Data – Ứng dụng data.table và SparkR.

  7. Reporting and Communication – Tạo báo cáo và dashboard bằng R Markdown.

  8. Advanced R Programming – Viết hàm, vòng lặp, xử lý logic nâng cao.

  9. Specialized Packages and Techniques – Áp dụng các gói mở rộng (lubridate, stringr, caret, …).

  10. Case Studies and Applications – Phân tích tình huống thực tế từ bộ dữ liệu NYSE.

1.2. Tóm tắt cấu trúc dữ liệu và chất lượng dữ liệu (Data Structure & Quality Check)

# Tóm tắt nhanh dữ liệu
skim(nyse)
Data summary
Name nyse
Number of rows 405258
Number of columns 25
_______________________
Column type frequency:
factor 5
numeric 20
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
company 0 1 FALSE 27 AMZ: 16270, M: 16161, PG: 16103, BAC: 16101
sector 0 1 FALSE 5 RET: 96269, TEC: 92401, BAN: 84757, AUT: 79836
date_BUY_fix 0 1 FALSE 1248 201: 590, 201: 587, 201: 573, 201: 562
date_SELL_fix 0 1 FALSE 1729 201: 571, 201: 554, 201: 546, 201: 545
investment 0 1 FALSE 2 BAD: 264440, GOO: 140818

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
X 0 1 249935.85 144239.75 0.00 125063.25 249937.50 374754.75 499999.00 ▇▇▇▇▇
horizon..days. 0 1 187.08 210.70 1.00 15.00 90.00 300.00 720.00 ▇▂▂▁▁
amount 0 1 8108.47 12774.43 50.00 400.00 2000.00 10000.00 50000.00 ▇▁▁▁▁
price_BUY 0 1 105.26 217.18 7.14 28.30 46.22 76.29 2039.51 ▇▁▁▁▁
price_SELL 0 1 116.73 250.14 4.01 28.39 48.02 81.65 3450.96 ▇▁▁▁▁
Volatility_Buy 0 1 0.25 0.10 0.09 0.19 0.23 0.31 0.70 ▇▇▃▁▁
Volatility_sell 0 1 0.26 0.10 0.09 0.19 0.24 0.32 0.92 ▇▅▁▁▁
Sharpe.Ratio 0 1 0.25 0.10 0.09 0.19 0.23 0.31 0.70 ▇▇▃▁▁
expected_return..yearly. 0 1 0.07 0.14 -0.28 0.00 0.01 0.08 1.02 ▁▇▁▁▁
inflation 0 1 0.58 1.04 -0.50 -0.20 -0.15 1.68 1.96 ▇▁▁▁▅
nominal_return 0 1 0.07 0.30 -0.87 -0.03 0.01 0.11 8.85 ▇▁▁▁▁
ESG_ranking 0 1 22.57 6.51 12.00 16.30 25.10 27.90 31.60 ▇▅▂▇▇
PE_ratio 0 1 30.33 84.74 0.00 9.82 13.71 23.49 1116.57 ▇▁▁▁▁
EPS_ratio 0 1 3.44 4.39 -6.56 1.46 2.96 4.56 29.87 ▂▇▁▁▁
PS_ratio 0 1 2.72 3.60 0.16 0.47 1.71 3.18 24.49 ▇▁▁▁▁
PB_ratio 0 1 4.69 5.91 0.00 1.22 3.05 5.23 47.62 ▇▁▁▁▁
NetProfitMargin_ratio 0 1 9.21 10.41 -24.63 2.62 7.70 15.77 62.00 ▁▇▆▁▁
current_ratio 0 1 2.17 2.56 0.61 0.98 1.22 1.79 13.56 ▇▁▁▁▁
roa_ratio 0 1 5.60 5.98 -12.99 1.74 5.71 7.99 38.13 ▁▇▃▁▁
roe_ratio 0 1 15.64 17.48 -99.49 8.83 16.10 26.03 57.25 ▁▁▁▇▃

Nhận xét:

  • Quy mô và xấu trúc: Bộ dữ liệu chứa 405.258 quan sát và 25 biến, được phân loại thành 5 factor (như company, sector, investment) và 15 biến numeric (như price_BUY, nominal_return, PE_ratio).

  • Giá trị khuyết thiếu (Missing Values): Tất cả 25 biến đều có n_missing=0. Điều này có nghĩa là tập dữ liệu hoàn toàn không có giá trị khuyết thiếu (NA) ở bất kỳ cột nào.

1.3. Thống kê mô tả (Descriptive Statistics)

1.3.1. Thống kê mô tả cho biến định lượng

1.3.1.1. Thống kê mô tả biến giao dịch

# I. Thống kê mô tả biến giao dịch cơ bản
cat("\n I. Thống kê Mô tả Biến Giao dịch Cơ bản \n")
## 
##  I. Thống kê Mô tả Biến Giao dịch Cơ bản
nyse %>%
  select(price_BUY, price_SELL, amount) %>%
  summary()
##    price_BUY          price_SELL          amount     
##  Min.   :   7.137   Min.   :   4.01   Min.   :   50  
##  1st Qu.:  28.303   1st Qu.:  28.39   1st Qu.:  400  
##  Median :  46.218   Median :  48.02   Median : 2000  
##  Mean   : 105.256   Mean   : 116.73   Mean   : 8108  
##  3rd Qu.:  76.289   3rd Qu.:  81.65   3rd Qu.:10000  
##  Max.   :2039.510   Max.   :3450.96   Max.   :50000

Về các biến giao dịch, giá mua (price_BUY) dao động mạnh, từ 7.14 đến 2,039.51 USD, trong khi giá bán (price_SELL) trải rộng từ 4.01 đến 3,450.96 USD, cho thấy sự khác biệt lớn giữa các loại cổ phiếu trên thị trường. Số tiền đầu tư (amount) có giá trị trung bình khoảng 8,108 USD, nhưng độ phân tán khá cao (cao nhất đến 50,000 USD), phản ánh mức độ đa dạng trong quy mô đầu tư.

1.3.1.2. Thống kê mô tả biến hiệu suất và rủi ro

# II. Mô tả biến hiệu suất và rủi ro 
cat("\n II. Thống kê Mô tả Biến Hiệu suất và Rủi ro \n")
## 
##  II. Thống kê Mô tả Biến Hiệu suất và Rủi ro
nyse %>%
  select(nominal_return, 
         `expected_return..yearly.`, 
         Volatility_Buy, 
         Volatility_sell, 
         ESG_ranking,
         inflation) %>%
  summary()
##  nominal_return     expected_return..yearly. Volatility_Buy   
##  Min.   :-0.87222   Min.   :-0.278002        Min.   :0.09042  
##  1st Qu.:-0.02837   1st Qu.: 0.001059        1st Qu.:0.18536  
##  Median : 0.01410   Median : 0.012843        Median :0.23220  
##  Mean   : 0.07102   Mean   : 0.070825        Mean   :0.25414  
##  3rd Qu.: 0.11124   3rd Qu.: 0.082635        3rd Qu.:0.30673  
##  Max.   : 8.84703   Max.   : 1.017344        Max.   :0.69756  
##  Volatility_sell    ESG_ranking      inflation      
##  Min.   :0.09042   Min.   :12.00   Min.   :-0.5000  
##  1st Qu.:0.18900   1st Qu.:16.30   1st Qu.:-0.2000  
##  Median :0.23813   Median :25.10   Median :-0.1500  
##  Mean   :0.25969   Mean   :22.57   Mean   : 0.5777  
##  3rd Qu.:0.31648   3rd Qu.:27.90   3rd Qu.: 1.6800  
##  Max.   :0.92253   Max.   :31.60   Max.   : 1.9600

Các biến về hiệu suất đầu tư và rủi ro cho thấy sự chênh lệch đáng kể:

  • Lợi suất danh nghĩa (nominal_return) dao động từ -87.2% đến +884.7%, thể hiện sự tồn tại của cả khoản đầu tư thua lỗ lẫn siêu lợi nhuận.
  • Lợi suất kỳ vọng hàng năm (expected_return..yearly.) trung bình 7.08%, với biên độ khá rộng, cho thấy rủi ro và cơ hội cao trong thị trường.
  • Độ biến động giá (Volatility_BuyVolatility_sell) trung bình khoảng 0.25, nhưng có giá trị cực đại trên 0.9, phản ánh sự khác biệt về rủi ro giữa các cổ phiếu.
  • Biến ESG_ranking (xếp hạng bền vững) dao động từ 12.0 đến 31.6, trung bình 22.6, thể hiện rằng đa phần các công ty trong tập dữ liệu có mức độ phát triển bền vững trung bình.
  • Biến inflation có giá trị trung bình 0.58%, chủ yếu dao động quanh 0%, phù hợp với môi trường kinh tế ổn định của Mỹ trong giai đoạn mô phỏng.

1.3.1.3. Thống kê mô tả các biến tỷ số tài chính

# III. Mô tả biến tỷ số tài chính
cat("\n III. Thống kê mô tả biến tỷ số tài chính \n")
## 
##  III. Thống kê mô tả biến tỷ số tài chính
nyse %>%
  select(PE_ratio, 
         EPS_ratio, 
         PB_ratio, 
         roa_ratio, 
         roe_ratio, 
         NetProfitMargin_ratio) %>% 
  summary()
##     PE_ratio         EPS_ratio         PB_ratio        roa_ratio      
##  Min.   :   0.00   Min.   :-6.560   Min.   : 0.000   Min.   :-12.990  
##  1st Qu.:   9.82   1st Qu.: 1.460   1st Qu.: 1.220   1st Qu.:  1.740  
##  Median :  13.71   Median : 2.960   Median : 3.050   Median :  5.710  
##  Mean   :  30.33   Mean   : 3.443   Mean   : 4.688   Mean   :  5.596  
##  3rd Qu.:  23.49   3rd Qu.: 4.560   3rd Qu.: 5.230   3rd Qu.:  7.990  
##  Max.   :1116.57   Max.   :29.870   Max.   :47.620   Max.   : 38.130  
##    roe_ratio      NetProfitMargin_ratio
##  Min.   :-99.49   Min.   :-24.630      
##  1st Qu.:  8.83   1st Qu.:  2.620      
##  Median : 16.10   Median :  7.700      
##  Mean   : 15.64   Mean   :  9.205      
##  3rd Qu.: 26.03   3rd Qu.: 15.770      
##  Max.   : 57.25   Max.   : 62.000

Đối với các chỉ số tài chính (financial ratios), phân bố cũng khá đa dạng:

  • PE ratio (Price to Earnings) có giá trị trung bình 30.33, với một số cổ phiếu có PE rất cao (tối đa hơn 1100), biểu thị khả năng định giá cao vượt trội hoặc biến động bất thường.
  • EPS ratio (Earnings per Share) trung bình 3.44, nằm trong vùng hợp lý, nhưng xuất hiện một vài giá trị âm thể hiện doanh nghiệp lỗ.
  • PB ratio (Price to Book) có giá trị trung bình 4.69, với cực đại 47.62, cho thấy có một số công ty được thị trường định giá cao hơn nhiều so với giá trị sổ sách.
  • Net Profit Margin trung bình 9.20%, dao động từ -24.6% đến 62%, chứng tỏ sự khác biệt rõ giữa các doanh nghiệp hiệu quả và doanh nghiệp yếu kém.
  • ROA (Return on Assets)ROE (Return on Equity) có giá trị trung bình lần lượt là 5.6%15.6%, phản ánh hiệu quả sinh lời ở mức trung bình khá.

1.3.2. Phân bổ tần suất biến định tính

1.3.2.1. Tần suất giao dịch theo Ngành nghề (sector)

# Tính toán số lượng và tỷ lệ phần trăm theo Sector
total_rows <- nrow(nyse)

sector_frequency <- nyse %>%
  count(sector, name = "So_luong_giao_dich") %>%
  mutate(
    Ty_le_phan_tram = (So_luong_giao_dich / total_rows) * 100
  ) %>%
  arrange(desc(So_luong_giao_dich))

print(sector_frequency)
##   sector So_luong_giao_dich Ty_le_phan_tram
## 1 RETAIL              96269        23.75499
## 2   TECH              92401        22.80054
## 3   BANK              84757        20.91433
## 4   AUTO              79836        19.70004
## 5   FMCG              51995        12.83010

Nhận xét:

  • Sự chiếm ưu thế: Ngành RETAIL (Bán lẻ) chiếm tỷ trọng cao nhất (∼23.7%), tiếp theo là TECH (∼22.8%) và BANK (∼20.9%). Ba ngành này chiếm gần 67.4% tổng số giao dịch.

  • Mặc dù có sự chênh lệch, các ngành khác như AUTO (Công nghiệp ô tô) và FMCG (hàng tiêu dùng nhanh) vẫn có số lượng giao dịch đáng kể (∼19.7% và ∼12.8%). Điều này khẳng định bộ dữ liệu là mẫu đại diện cho nhiều lĩnh vực kinh tế, hỗ trợ cho phân tích so sánh liên ngành sau này.

1.3.2.2. Tần suất kết quả đầu tư (investment)

# Tính toán số lượng và tỷ lệ phần trăm theo Investment (GOOD/BAD)
investment_frequency <- nyse %>%
  count(investment, name = "So_luong_giao_dich") %>%
  mutate(
    Ty_le_phan_tram = (So_luong_giao_dich / total_rows) * 100
  ) %>%
  arrange(desc(Ty_le_phan_tram))

print(investment_frequency)
##   investment So_luong_giao_dich Ty_le_phan_tram
## 1        BAD             264440        65.25226
## 2       GOOD             140818        34.74774

Nhận xét:

  • Biến investment cho thấy sự mất cân bằng lớp rõ rệt:

    • Khoản đầu tư Thua lỗ/Xấu (BAD) chiếm tỷ trọng áp đảo: 65.25% tổng số giao dịch.

    • Khoản đầu tư Sinh lời/Tốt (GOOD) chỉ chiếm khoảng 34.75%.

Kết quả này phản ánh tính chất thực tế của đầu tư: việc đạt được lợi nhuận thực tế (tức là Real_Return vượt qua một ngưỡng nhất định) là khó hơn so với việc không đạt được.

1.4. Trực quan hóa phân bố cơ bản (Basic Distribution Visualization)

1.4.1. Phân tích phân bố tỷ suất Lợi nhuận (nominal_return Distribution)

# Biểu đồ histogram lợi suất danh nghĩa
ggplot(nyse, aes(x = nominal_return)) +
  geom_histogram(bins = 60, fill = "#0073C2FF", color = "white", alpha = 0.8) +
  labs(title = "Hình 1.4.1. Phân bố tỷ suất lợi nhuận danh nghĩa",
       x = "Tỷ suất lợi nhuận (%)",
       y = "Tần suất (Số lượng quan sát)") +
  theme_minimal(base_size = 12)

# Tính các thống kê cơ bản
summary(nyse$nominal_return)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -0.87222 -0.02837  0.01410  0.07102  0.11124  8.84703

Nhận xét: Phân bố có dạng lệch phải (right-skewed), tập trung dày đặc ở các giá trị gần 0% (khu vực lỗ nhẹ đến lãi nhẹ). Sự tồn tại của một đuôi dài kéo về phía phải thể hiện tồn tại một số ít các trường hợp đầu tư đạt mức sinh lời rất cao (tỷ suất lợi nhuận đột biến - siêu lợi nhuận), điều này khiến giá trị trung bình lớn hơn giá trị trung vị.

1.4.2. Tần suất giao dịch theo ngành nghề (sector Frequency)

# Đếm số lượng quan sát theo ngành nghề và sắp xếp
nyse_sector_count <- nyse %>%
 count(sector, name = "So_luong_giao_dich") %>%
 arrange(desc(So_luong_giao_dich))

# Vẽ Biểu đồ Thanh
ggplot(nyse_sector_count, aes(x = reorder(sector, So_luong_giao_dich), y = So_luong_giao_dich, fill = sector)) +
 geom_col(show.legend = FALSE) +
 # Thêm nhãn số lượng trên đỉnh mỗi thanh
  geom_text(aes(label = comma(So_luong_giao_dich)), vjust = -0.5, size = 3.5) +
 coord_flip() +
 labs(title = "Hình 1.4.2. Tần suất Giao dịch theo ngành nghề", 
       x = "Ngành nghề (Sector)", 
       y = "Số lượng Giao dịch (Tần suất)") +
 scale_y_continuous(labels = comma) +
 theme_minimal(base_size = 12)

Nhận xét:

  • Sự chiếm ưu thế:

Ngành RETAIL (Bán lẻ) chiếm tỷ trọng lớn nhất với 96,269 giao dịch, vượt qua TECH (92,401) và BANK (84,757). RETAIL là ngành có nhiều giao dịch nhất, chứng tỏ đây là một khu vực hoạt động đầu tư rất sôi nổi trong bộ dữ liệu.

  • Phân bổ tương đối:

Ba ngành dẫn đầu (RETAIL, TECH, BANK) có số lượng giao dịch tương đương nhau, sau đó là AUTO (79,836). Ngành FMCG (Hàng tiêu dùng nhanh) có tần suất thấp nhất trong nhóm này (51,995). Bộ dữ liệu có tính đại diện tốt cho sự đa dạng đầu tư, đặc biệt là sự cạnh tranh về quy mô giao dịch giữa các lĩnh vực dịch vụ, công nghệ và tài chính.

1.4.3. Tần suất giao dịch theo kết quả đầu tư (investment Frequency)

# Biểu đồ Thanh cho Investment (GOOD/BAD)
nyse_investment_count <- nyse %>%
  count(investment, name = "So_luong_giao_dich")

ggplot(nyse_investment_count, aes(x = investment, y = So_luong_giao_dich, fill = investment)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = comma(So_luong_giao_dich)), vjust = -0.5, size = 4) +
  labs(title = "Hình 1.4.3. Tần suất Kết quả Đầu tư (GOOD/BAD)",
       x = "Kết quả Đầu tư",
       y = "Số lượng Giao dịch") +
  scale_y_continuous(labels = comma) +
  theme_minimal(base_size = 12)

Nhận xét: Biểu đồ hiển thị sự khác biệt rõ ràng giữa hai lớp. Lớp BAD cao hơn đáng kể so với lớp GOOD, trực quan xác nhận tỷ lệ mất cân bằng ∼65/35 đã được tìm thấy ở Mục 1.3.2.2.

CHƯƠNG 2: NỀN TẢNG R VÀ CÚ PHÁP CƠ BẢN (R FUNDAMENTALS & BASE R SYNTAX)

2.1. Đọc và kiểm tra dữ liệu ban đầu (Data Loading & Initial Check)

2.1.1. Đọc dữ liệu (Data Loading and Import)

# Đọc dữ liệu
nyse <- read.csv("C:/Users/Admin/Documents/NGÔN NGỮ R/final_transactions_dataset.csv", stringsAsFactors = TRUE, header = TRUE, na.strings = c("", "NA"))

2.1.2. Kiểm tra kích thước và tổng quan (Dimension and Head Check)

# Kiểm tra kích thước dữ liệu
cat("Số quan sát:", nrow(nyse), "\n")
## Số quan sát: 405258
cat("Số biến:", ncol(nyse), "\n")
## Số biến: 25
# Kiểm tra cấu trúc và 6 dòng đầu
str(nyse)
## 'data.frame':    405258 obs. of  25 variables:
##  $ X                       : int  0 1 2 3 4 5 7 8 9 10 ...
##  $ company                 : Factor w/ 27 levels "AAPL","AMZN",..: 5 4 3 16 14 21 9 26 4 14 ...
##  $ sector                  : Factor w/ 5 levels "AUTO","BANK",..: 4 2 2 4 2 3 5 2 2 2 ...
##  $ horizon..days.          : int  2 330 7 5 360 15 720 600 30 6 ...
##  $ amount                  : int  100 15000 3000 20000 15000 50000 1500 300 50000 400 ...
##  $ date_BUY_fix            : Factor w/ 1248 levels "2013-10-10","2013-10-11",..: 905 779 741 750 353 729 272 593 440 582 ...
##  $ date_SELL_fix           : Factor w/ 1729 levels "2013-10-11","2013-10-15",..: 905 1004 745 753 598 738 764 1004 460 584 ...
##  $ price_BUY               : num  55.6 18.6 59.9 38.2 51.9 ...
##  $ price_SELL              : num  53.5 24.7 59.5 36 52 ...
##  $ Volatility_Buy          : num  0.384 0.323 0.239 0.429 0.195 ...
##  $ Volatility_sell         : num  0.386 0.236 0.235 0.429 0.254 ...
##  $ Sharpe.Ratio            : num  0.384 0.323 0.239 0.429 0.195 ...
##  $ expected_return..yearly.: num  1.44e-03 1.71e-01 2.82e-03 9.39e-05 1.50e-01 ...
##  $ inflation               : num  1.96 -0.2 -0.2 -0.2 -0.5 -0.2 -0.15 -0.2 -0.5 -0.2 ...
##  $ nominal_return          : num  -0.03722 0.32432 -0.00576 -0.05839 0.00344 ...
##  $ investment              : Factor w/ 2 levels "BAD","GOOD": 1 2 1 1 2 2 2 2 1 2 ...
##  $ ESG_ranking             : num  12 26.3 19.8 12.9 27.9 17.6 31.6 24.8 26.3 27.9 ...
##  $ PE_ratio                : num  12.58 11.39 10.58 11.09 9.38 ...
##  $ EPS_ratio               : num  3.73 1.26 5.64 3.27 5.46 4.56 1.05 1.71 0.96 5.99 ...
##  $ PS_ratio                : num  0.38 1.71 1.67 0.36 1.87 ...
##  $ PB_ratio                : num  3.19 0.54 2.6 1.25 0.81 ...
##  $ NetProfitMargin_ratio   : num  3.01 15.7 15.68 3.17 19.91 ...
##  $ current_ratio           : num  1.49 0.92 1.91 1.6 0.99 ...
##  $ roa_ratio               : num  8.69 0.67 3.39 4.41 0.81 ...
##  $ roe_ratio               : num  26.69 5.54 25.78 11.35 8.91 ...
head(nyse)

2.2. Các cấu trúc dữ liệu cơ bản (Fundamental Data Structures)

2.2.1 Cấu trúc Vector và truy cập phần tử (Vector Structure and Indexing)

# Tạo vector
financial_ratios_to_analyze <- c("nominal_return", "roe_ratio", "PE_ratio", "Sharpe.Ratio")

cat("Chỉ số thứ 2 trong danh sách:", financial_ratios_to_analyze[2], "\n")
## Chỉ số thứ 2 trong danh sách: roe_ratio

2.2.2 Làm việc với dữ liệu nhân tố (Factors) (Working with Factor Data)

# Liệt kê các cấp độ (levels) của biến Factor
nyse$sector <- as.factor(nyse$sector)
sector_levels <- levels(nyse$sector)

cat("Các ngành nghề trong bộ dữ liệu:", sector_levels, "\n")
## Các ngành nghề trong bộ dữ liệu: AUTO BANK FMCG RETAIL TECH

2.3. Thao tác và tính toán cơ bản (Basic Data Manipulation and Calculation)

2.3.1. Truy cập dữ liệu theo tên cột (Column Access by Name)

# Truy cập cột bằng ký hiệu $ và tính tổng
total_investment_amount <- sum(nyse$amount, na.rm = TRUE)

cat("Tổng số tiền đầu tư trong bộ dữ liệu mẫu:", total_investment_amount, "USD\n")
## Tổng số tiền đầu tư trong bộ dữ liệu mẫu: 3286024300 USD

2.3.2. Sử dụng các toán tử Logic/So sánh (Logic/Comparison Operators)

# Áp dụng toán tử so sánh logic
is_low_volatility <- nyse$Volatility_Buy < 0.25

# Đếm số lượng quan sát có rủi ro thấp
num_low_vol <- sum(is_low_volatility, na.rm = TRUE)

cat("Số lượng khoản đầu tư rủi ro thấp (< 0.25):", num_low_vol, "\n")
## Số lượng khoản đầu tư rủi ro thấp (< 0.25): 236573

2.3.3. Lọc dữ liệu (Data Filtering)

# Lọc dữ liệu bằng Base R
positive_returns <- nyse[nyse$nominal_return > 0 & !is.na(nyse$nominal_return), ]

cat("Số lượng khoản đầu tư có lợi nhuận dương:", nrow(positive_returns), "\n")
## Số lượng khoản đầu tư có lợi nhuận dương: 241064

2.4. Ứng dụng hàm thống kê và Biến đổi kiểu dữ liệu (Statistical Functions & Data Type Conversion)

2.4.1 Sử dụng các hàm thống kê cơ bản (Basic Statistical Functions)

# Sử dụng các hàm thống kê cơ bản
median_return <- median(nyse$nominal_return, na.rm = TRUE)
sd_return <- sd(nyse$nominal_return, na.rm = TRUE)

cat("Trung vị Lợi suất danh nghĩa:", round(median_return, 4), "\n")
## Trung vị Lợi suất danh nghĩa: 0.0141
cat("Độ lệch chuẩn Lợi suất danh nghĩa:", round(sd_return, 4), "\n")
## Độ lệch chuẩn Lợi suất danh nghĩa: 0.2988

2.4.2 Thao tác và chuyển đổi dữ liệu thời gian (Time Data Manipulation and Conversion)

# Chuyển cột thành Date
nyse$date_BUY_fix_DATE <- as.Date(as.character(nyse$date_BUY_fix), format = "%Y-%m-%d")
nyse$date_SELL_fix_DATE <- as.Date(as.character(nyse$date_SELL_fix), format = "%Y-%m-%d")

# Kiểm tra kiểu dữ liệu mới và phạm vi ngày
cat("Kiểu dữ liệu mới (Mua):", class(nyse$date_BUY_fix_DATE), "\n")
## Kiểu dữ liệu mới (Mua): Date
cat("Phạm vi ngày mua:", as.character(range(nyse$date_BUY_fix_DATE, na.rm = TRUE)), "\n")
## Phạm vi ngày mua: 2013-10-10 2018-10-09
# Tính khoảng thời gian nắm giữ (Holding Period) theo ngày
nyse$holding_period_days <- difftime(nyse$date_SELL_fix_DATE, 
                                     nyse$date_BUY_fix_DATE, 
                                     units = "days")

cat("Trung bình số ngày nắm giữ (Holding Period):", round(mean(nyse$holding_period_days, na.rm = TRUE), 1), "ngày\n")
## Trung bình số ngày nắm giữ (Holding Period): 187.1 ngày

2.5. Kiểm tra chất lượng dữ liệu cơ bản (Basic Data Quality Check)

2.5.1 Kiểm tra bản ghi trùng lặp (Duplicate Records Check)

# Kiểm tra Trùng lặp
duplicated_records <- sum(duplicated(nyse))
cat("Số lượng bản ghi trùng lặp:", duplicated_records, "\n")
## Số lượng bản ghi trùng lặp: 0

2.5.2 Kiểm tra giá trị Khuyết thiếu (NA) (Missing Value (NA) Check)

# Kiểm tra NA
na_count_per_column <- colSums(is.na(nyse))
total_na_count <- sum(na_count_per_column)

cat("Tổng số giá trị NA trong toàn bộ dữ liệu:", total_na_count, "\n")
## Tổng số giá trị NA trong toàn bộ dữ liệu: 0
print(na_count_per_column[na_count_per_column > 0])
## named numeric(0)

CHƯƠNG 3: THAO TÁC VÀ CHUẨN BỊ DỮ LIỆU (DATA MANIPULATION & PREPARATION)

3.1. Làm sạch và chọn lọc tập dữ liệu chính (Cleaning and Core Selection)

Dù không cần xử lý trùng lặp hay NA, ta vẫn cần loại bỏ các biến không cần thiết như biến định danh tự động (X) và chọn lọc các cột chính để tối ưu trước khi xử lý lớn.

# Loại bỏ biến thừa và chọn lọc biến phân tích
nyse_clean <- nyse %>%
  # Loại bỏ các biến thừa và không dùng (X và date_SELL_fix)
  select(-X, -date_SELL_fix) %>%
  # Đảm bảo các biến quan trọng đã được chuyển kiểu dữ liệu
  mutate(
    date_BUY_fix_DATE = as.Date(date_BUY_fix),
    sector = as.factor(sector),
    investment = as.factor(investment)
  )
cat("Số biến sau khi loại bỏ:", ncol(nyse_clean), "\n")
## Số biến sau khi loại bỏ: 26

** Lý do Loại bỏ Biến date_SELL_fix**

Biến date_SELL_fix được loại bỏ vì nó là thông tin trùng lặp, có thể dẫn đến đa cộng tuyến. Thông tin thời gian bán đã được mã hóa trong hai biến độc lập khác là date_BUY_fix (ngày mua) và horizon..days. (số ngày nắm giữ), giúp mô hình tập trung vào điểm quyết định (ngày mua) và chiến lược (thời gian nắm giữ).

3.2. Chuẩn hóa và tạo biến giá trị (Normalization and Feature Engineering)

3.2.1. Chuẩn hóa tỷ suất định giá (Log_PE)

Sử dụng phép biến đổi logarit để chuẩn hóa PE_ratio, giảm thiểu ảnh hưởng của các giá trị ngoại lai lớn.

nyse_clean <- nyse_clean %>%
  mutate(
    # Giữ lại tất cả các giá trị PE dương, sau đó mới lấy log.
    # Các giá trị PE âm (<0) hoặc NA sẽ thành NA
    PE_positive = if_else(PE_ratio > 0, PE_ratio, NA_real_),
    log_PE = log(PE_positive)
  )
# So sánh phân bố trước và sau chuẩn hóa
summary(nyse_clean$PE_ratio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    9.82   13.71   30.33   23.49 1116.57
summary(nyse_clean$log_PE)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    1.13    2.38    2.69    2.88    3.21    7.02   39751

Kết quả thống kê mô tả cho thấy sự thay đổi đáng kể về phân bố sau khi áp dụng phép biến đổi logarit, xác nhận mục tiêu chuẩn hóa đã đạt được.

  1. Phân bố ban đầu (PE_ratio)

Dữ liệu gốc thể hiện tính lệch rất rõ rệt:

Chỉ số Giá trị Nhận xét
Giá trị Lớn nhất (Max) 1116.57 Giá trị cực kỳ cao, cho thấy sự tồn tại của các giá trị ngoại lai (outliers) lớn, gây ra hiện tượng lệch phải mạnh.
Giá trị Trung bình (Mean) 30.33
Giá trị Trung vị (Median) 13.71
Sự chênh lệch Mean (30.33) \(\gg\) Median (13.71) Sự chênh lệch lớn giữa Mean và Median xác nhận phân bố của PE_ratiocực kỳ lệch phải (positively skewed). Phân bố này không phù hợp với giả định cơ bản của hầu hết các mô hình thống kê và hồi quy tuyến tính.
  1. Phân bố sau khi chuẩn hóa (log_PE)

Sau khi biến đổi logarit tự nhiên, phân bố đã được cải thiện đáng kể:

Chỉ số Giá trị Nhận xét
Giá trị Lớn nhất (Max) 7.018 Giá trị Max đã được nén đáng kể, làm giảm ảnh hưởng của các outliers cực lớn lên mô hình.
Giá trị Trung bình (Mean) 2.879
Giá trị Trung vị (Median) 2.686
Sự chênh lệch Mean (2.879) \(\approx\) Median (2.686) Giá trị Mean và Median đã tiệm cận nhau, cho thấy phân bố đã trở nên đối xứng hơn và tiến gần đến phân bố chuẩn (Normal Distribution).
NA’s 39,751 Đây là số lượng quan sát có PE_ratio bằng 0 hoặc âm (không hợp lý về mặt kinh tế hoặc do lỗi dữ liệu) hoặc có giá trị quá nhỏ (dưới 1) đã bị loại bỏ/gán NA để tránh lỗi logarit, đây là một bước làm sạch cần thiết.

3.2.2. Tạo biến đòn bẩy tài chính (Leverage_Ratio)

Sử dụng ROA và ROE để ước tính tỷ số đòn bẩy tài chính (gần với hệ số nhân vốn chủ sở hữu trong phân tích DuPont).

Ta sử dụng một biến thể đơn giản của hệ thống DuPont Analysis để ước tính tỷ lệ Đòn bẩy (Leverage Ratio). Về mặt lý thuyết, trong phân tích DuPont: ROE≈ROA×Equity.Multiplier. Trong đó, Equity.Multiplier phản ánh đòn bẩy.

Sử dụng mutate() để tạo biến Leverage_Ratio (≈roe_ratio/roa_ratio). Xử lý các trường hợp ROA rất nhỏ (gần 0) để tránh lỗi chia cho 0 và các kết quả ngoại lai không hợp lý.

# Tạo biến đòn bẩy tài chính
nyse_clean <- nyse_clean %>%
  mutate(
    # Sử dụng if_else để kiểm soát lỗi chia cho 0 hoặc các giá trị âm không hợp lý.
    # yêu cầu ROA phải lớn hơn 0.001 (0.1%) để tính Leverage Ratio.
    Leverage_Ratio = if_else(
      abs(roa_ratio) > 0.001,
      roe_ratio / roa_ratio,
      NA_real_ # Gán NA cho các trường hợp ROA quá nhỏ
    )
  )

# Thống kê nhanh biến mới để kiểm tra phân bố
summary(nyse_clean$Leverage_Ratio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.103   2.486   3.439   5.212   6.692  34.545    2468

Nhận xét phân tích kết quả

  1. Mức độ Sử dụng Đòn bẩy (Min > 1):
  • Giá trị nhỏ nhất (Min.) là 1.103. Điều này quan trọng vì nó xác nhận rằng tất cả các quan sát hợp lệ đều có Leverage_Ratio>1, ngụ ý ROE>ROA. Về mặt tài chính, điều này chứng tỏ các công ty được phân tích đang sử dụng đòn bẩy tài chính một cách hiệu quả, vì lợi nhuận trên tài sản tạo ra đã đủ để trang trải chi phí nợ và khuếch đại lợi nhuận cho cổ đông.

  • Sự tồn tại của các giá trị Leverage Ratio âm (do công ty thua lỗ hoặc ROA/ROE trái dấu) hoặc các giá trị cực lớn bất thường (do ROA→0) trong dữ liệu ban đầu đã được xử lý thành NA thông qua điều kiện abs(roa_ratio)>0.001, giúp loại bỏ các trường hợp đòn bẩy không hợp lý và làm sạch phân bố.

  1. Phân bố Đòn bẩy:
  • Giá trị trung vị (Median) là 3.439. Điều này có nghĩa là 50% số công ty sử dụng đòn bẩy gấp khoảng 3.4 lần, cho thấy một mức độ sử dụng nợ khá cao và phổ biến trong các giao dịch trên sàn NYSE.

  • Giá trị trung bình (Mean) là 5.212 lớn hơn đáng kể so với Median (3.439). Điều này cho thấy phân bố của Leverage_Ratio vẫn bị lệch phải do sự tồn tại của các giá trị đòn bẩy cao (tối đa là 34.545), nhưng sự lệch này đã được kiểm soát tốt hơn so với phân bố gốc.

  1. Giá trị Ngoại lai (Outliers) và Giá trị khuyết thiếu (NA’s):
  • Giá trị Max (34.545) là ngưỡng đòn bẩy tối đa được giữ lại. Đây là một giá trị lớn nhưng hợp lý hơn so với các giá trị hàng trăm hoặc hàng nghìn trong kết quả trước, cho thấy việc kiểm soát outliers đã thành công.

  • Số lượng NA’s (2,468) là số lượng bản ghi bị loại trừ do ROA quá nhỏ hoặc không hợp lệ, đảm bảo chỉ những công ty có hoạt động kinh doanh ổn định mới được đưa vào phân tích về đòn bẩy.

3.3. Thao tác với dữ liệu thời gian và phân loại chiến lược (Time & Strategy Feature Engineering)

3.3.1. Phân loại khoản đầu tư theo thời gian nắm giữ (Holding_Period)

Chuyển biến liên tục horizon..days. sang biến định tính Holding_Period (Ngắn/Trung/Dài hạn).

# Phân loại thời gian nắm giữ
nyse_clean <- nyse_clean %>%
  mutate(
    Holding_Period = cut(horizon..days.,
                         # Thiết lập các điểm cắt (breaks)
                         breaks = c(0, 30, 180, Inf),
                         # Gán nhãn cho từng khoảng
                         labels = c("Short-term (<=30 days)", "Mid-term (31-180 days)", "Long-term (>180 days)"),
                         right = TRUE,
                         include.lowest = TRUE)
  )

# Tính toán số lượng và tỷ lệ phần trăm của từng nhóm
total_rows <- nrow(nyse_clean)

holding_period_count <- nyse_clean %>%
  group_by(Holding_Period) %>%
  summarise(
    Count = n(),
    Percentage = (Count / total_rows) * 100, # Tính tỷ lệ phần trăm
    .groups = 'drop'
  )

print(holding_period_count)
## # A tibble: 3 × 3
##   Holding_Period          Count Percentage
##   <fct>                   <int>      <dbl>
## 1 Short-term (<=30 days) 135001       33.3
## 2 Mid-term (31-180 days) 122731       30.3
## 3 Long-term (>180 days)  147526       36.4

Nhận xét

Chiến lược Dài hạn (>180 ngày) chiếm tỷ trọng cao nhất (36.40%), khẳng định tính phổ biến của chiến lược Buy and Hold, nhưng sự phân bổ tương đối đồng đều giữa các nhóm (mỗi nhóm ≈1/3) cho phép phân tích so sánh đa dạng.

3.3.2. Trích xuất chu kỳ thời gian (Quý và Năm)

Sử dụng gói lubridate để trích xuất năm và quý từ ngày mua, hỗ trợ phân tích xu hướng và tính thời vụ.

nyse_clean <- nyse_clean %>%
  mutate(
    date_BUY_fix_DATE = as.Date(date_BUY_fix),
    Buy_Year = lubridate::year(date_BUY_fix_DATE),
    Buy_Quarter_Num = lubridate::quarter(date_BUY_fix_DATE),
    Buy_Quarter = lubridate::quarter(date_BUY_fix_DATE, with_year = TRUE) 
  )

# Xem 5 kết quả đầu tiên của biến Quý và Năm
nyse_clean %>%
  select(date_BUY_fix_DATE, Buy_Year, Buy_Quarter) %>%
  head(5)
cat("Phạm vi Năm mua:", range(nyse_clean$Buy_Year, na.rm = TRUE), "\n")
## Phạm vi Năm mua: 2013 2018

Nhận xét

  1. Ý nghĩa của Buy_Year: Biến này sẽ được sử dụng để phân tích xu hướng dài hạn của thị trường, cho phép ta so sánh lợi suất trung bìnhrủi ro giữa các năm. Ví dụ, ta có thể đánh giá sự khác biệt về hiệu suất đầu tư trước và sau các sự kiện kinh tế lớn (như khủng hoảng 2020).

  2. Ý nghĩa của Buy_Quarter: Biến này là công cụ mạnh mẽ cho việc phân tích tính thời vụ. Trong tài chính, hiệu suất thị trường thường bị ảnh hưởng bởi các chu kỳ báo cáo thu nhập hàng quý hoặc các hiệu ứng lịch (ví dụ: Hiệu ứng tháng Giêng). Việc sử dụng định dạng Năm.Quý giúp ta dễ dàng sắp xếp dữ liệu theo chuỗi thời gian liên tục và chính xác.

3.3.3. Ghép dữ liệu lạm phát và tính lợi suất thực tế (Real_Return)

Việc phân tích hiệu suất đầu tư không thể thiếu việc điều chỉnh theo lạm phát. Lợi suất danh nghĩa (nominal_return) chỉ phản ánh sự tăng trưởng về mặt tiền tệ, trong khi Lợi suất thực tế (Real_Return) phản ánh sự tăng trưởng về sức mua thực tế. Để tính Lợi suất thực tế, ta cần dựa vào dữ liệu lạm phát.

nyse_clean <- nyse_clean %>%
 mutate(
  # Công thức tính Lợi suất Thực tế chính xác (Fisher Equation)
  # Real_Return = (1 + Nominal_Return) / (1 + Inflation) - 1
   Real_Return = ((1 + nominal_return) / (1 + inflation)) - 1
  )

# Kiểm tra kết quả (10 hàng đầu tiên)
cat("Kiểm tra kết quả tính Real_Return bằng biến inflation:\n")
## Kiểm tra kết quả tính Real_Return bằng biến inflation:
nyse_clean %>%
 select(nominal_return, inflation, Real_Return) %>%
 head(10)
cat("\nThống kê Lợi suất thực tế (Real_Return):\n")
## 
## Thống kê Lợi suất thực tế (Real_Return):
summary(nyse_clean$Real_Return)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -0.95232 -0.62084  0.16733  0.08676  0.48586 16.35331

Nhận xét

  • Phân tích thống kê (Real_Return):

Giá trị trung vị (Median = 16.73%) và Giá trị Trung bình (Mean = 8.68%) đều dương. Điều này cho thấy, mặc dù đã điều chỉnh lạm phát, hơn một nửa số giao dịch trong bộ dữ liệu vẫn tạo ra lợi nhuận thực tế (tức là tăng sức mua cho nhà đầu tư).

Sự chênh lệch giữa Median (cao hơn) và Mean (thấp hơn) cho thấy Real_Return có phân bố lệch trái mạnh ở phần dưới (1st Quartile≈−62%), với một số lượng nhỏ các giao dịch thua lỗ cực kỳ nặng nề đã kéo giá trị trung bình xuống.

  • Phân tích phạm vi:

Phạm vi cực đoan: Giá trị Min (−0.952 tương đương −95.2%) và Max (16.353 tương đương +1635.3%) cho thấy mức độ rủi ro và lợi nhuận tiềm năng cực lớn của các khoản đầu tư, phản ánh sự biến động của thị trường cổ phiếu.

  • Kiểm tra Logic Lạm phát (Dựa trên 10 hàng đầu):

Quan sát giá trị inflation trong bảng cho thấy các giá trị này là số âm (ví dụ: −0.20, −0.50, −0.15). Về mặt kinh tế, lạm phát âm có nghĩa là giảm phát (Deflation).

Vì inflation là số âm, Real_Return có xu hướng lớn hơn nominal_return (ví dụ: nominal_return=0.0316 và inflation=−0.20 cho Real_Return≈0.289). Điều này là hợp lý về mặt toán học và kinh tế: trong môi trường giảm phát, sức mua của lợi nhuận tăng lên đáng kể.

3.4. Tổng hợp, lọc và tạo biến trễ (Aggregation, Filtering & Lagged Variables)

3.4.1. Lọc và sắp xếp dữ liệu theo nhiều tiêu chí

Mô phỏng chiến lược đầu tư giá trị (Value Investing).

Tìm kiếm các khoản đầu tư đã được phân loại là Tốt (GOOD), đạt lợi nhuận cao (danh nghĩa trên 10%), và có định giá thấp (chỉ số PE_ratio<20). Sau đó, sắp xếp kết quả theo lợi nhuận giảm dần.

# Lọc và sắp xếp theo nhiều tiêu chí
value_investment_candidates <- nyse_clean %>%
  filter(
    investment == "GOOD",         # Điều kiện 1: Kết quả đầu tư tốt
    nominal_return > 0.10,        # Điều kiện 2: Lợi nhuận danh nghĩa trên 10%
    PE_ratio < 20                 # Điều kiện 3: Định giá thấp (PE Ratio dưới 20)
  ) %>%
  arrange(desc(nominal_return)) # Sắp xếp theo lợi nhuận giảm dần

# Xem 10 ứng viên đầu tiên đáp ứng tiêu chí (Đầu tư giá trị, sinh lời cao)
print(head(value_investment_candidates, 10))
##    company sector horizon..days. amount date_BUY_fix price_BUY price_SELL
## 1     NVDA   TECH            720    400   2015-06-26  20.13152   150.8678
## 2     TSLA   AUTO            720   4000   2018-10-02  60.20400   449.3900
## 3     TSLA   AUTO            720   3000   2018-10-01  62.14000   449.3900
## 4     NVDA   TECH            720    200   2015-06-15  20.45184   146.5508
## 5     NVDA   TECH            720   1500   2015-06-16  20.70421   146.5508
## 6     TSLA   AUTO            720  15000   2018-09-24  59.93600   419.6200
## 7     NVDA   TECH            720   4000   2015-06-12  20.49067   142.9368
## 8     NVDA   TECH            720  10000   2015-06-17  20.94688   145.8874
## 9     NVDA   TECH            720   1500   2015-06-10  20.84011   143.4418
## 10    NVDA   TECH            720    100   2015-05-27  21.19925   135.3187
##    Volatility_Buy Volatility_sell Sharpe.Ratio expected_return..yearly.
## 1       0.2810847       0.4749833    0.2810847                0.9727243
## 2       0.5227019       0.8762335    0.5227019                1.0173441
## 3       0.5217680       0.8762335    0.5217680                1.0173441
## 4       0.2803311       0.4664966    0.2803311                0.9727243
## 5       0.2805653       0.4664966    0.2805653                0.9727243
## 6       0.4729003       0.8724491    0.4729003                1.0173441
## 7       0.2803233       0.4660826    0.2803233                0.9727243
## 8       0.2807224       0.4664835    0.2807224                0.9727243
## 9       0.2790765       0.4661851    0.2790765                0.9727243
## 10      0.2755349       0.4581479    0.2755349                0.9727243
##    inflation nominal_return investment ESG_ranking PE_ratio EPS_ratio PS_ratio
## 1      -0.50       6.494110       GOOD        12.9    19.17      1.12     2.56
## 2       1.68       6.464455       GOOD        31.1     0.00     -2.13     2.60
## 3       1.68       6.231896       GOOD        31.1     0.00     -2.13     2.60
## 4      -0.50       6.165654       GOOD        12.9    19.17      1.12     2.56
## 5      -0.50       6.078309       GOOD        12.9    19.17      1.12     2.56
## 6       1.68       6.001134       GOOD        31.1     0.00     -2.13     2.60
## 7      -0.50       5.975701       GOOD        12.9    19.17      1.12     2.56
## 8      -0.50       5.964636       GOOD        12.9    19.17      1.12     2.56
## 9      -0.50       5.882967       GOOD        12.9    19.17      1.12     2.56
## 10     -0.50       5.383184       GOOD        12.9    19.17      1.12     2.56
##    PB_ratio NetProfitMargin_ratio current_ratio roa_ratio roe_ratio
## 1      2.54                 13.28          6.61      8.87     14.37
## 2      8.57                -10.23          0.81     -6.34    -34.85
## 3      8.57                -10.23          0.81     -6.34    -34.85
## 4      2.54                 13.28          6.61      8.87     14.37
## 5      2.54                 13.28          6.61      8.87     14.37
## 6      8.57                -10.23          0.81     -6.34    -34.85
## 7      2.54                 13.28          6.61      8.87     14.37
## 8      2.54                 13.28          6.61      8.87     14.37
## 9      2.54                 13.28          6.61      8.87     14.37
## 10     2.54                 13.28          6.61      8.87     14.37
##    date_BUY_fix_DATE date_SELL_fix_DATE holding_period_days PE_positive
## 1         2015-06-26         2017-06-15            720 days       19.17
## 2         2018-10-02         2020-09-21            720 days          NA
## 3         2018-10-01         2020-09-21            721 days          NA
## 4         2015-06-15         2017-06-05            721 days       19.17
## 5         2015-06-16         2017-06-05            720 days       19.17
## 6         2018-09-24         2020-09-14            721 days          NA
## 7         2015-06-12         2017-06-01            720 days       19.17
## 8         2015-06-17         2017-06-06            720 days       19.17
## 9         2015-06-10         2017-05-30            720 days       19.17
## 10        2015-05-27         2017-05-16            720 days       19.17
##      log_PE Leverage_Ratio        Holding_Period Buy_Year Buy_Quarter_Num
## 1  2.953347       1.620068 Long-term (>180 days)     2015               2
## 2        NA       5.496845 Long-term (>180 days)     2018               4
## 3        NA       5.496845 Long-term (>180 days)     2018               4
## 4  2.953347       1.620068 Long-term (>180 days)     2015               2
## 5  2.953347       1.620068 Long-term (>180 days)     2015               2
## 6        NA       5.496845 Long-term (>180 days)     2018               3
## 7  2.953347       1.620068 Long-term (>180 days)     2015               2
## 8  2.953347       1.620068 Long-term (>180 days)     2015               2
## 9  2.953347       1.620068 Long-term (>180 days)     2015               2
## 10 2.953347       1.620068 Long-term (>180 days)     2015               2
##    Buy_Quarter Real_Return
## 1       2015.2   13.988221
## 2       2018.4    1.785244
## 3       2018.4    1.698469
## 4       2015.2   13.331309
## 5       2015.2   13.156618
## 6       2018.3    1.612364
## 7       2015.2   12.951402
## 8       2015.2   12.929273
## 9       2015.2   12.765934
## 10      2015.2   11.766368
# Kiểm tra số lượng khoản đầu tư đáp ứng chiến lược
cat("\nTổng số khoản đầu tư đáp ứng chiến lược lọc:", nrow(value_investment_candidates), "\n")
## 
## Tổng số khoản đầu tư đáp ứng chiến lược lọc: 39200

Nhận xét

  1. Ý nghĩa chiến lược lọc

Thao tác này mô phỏng việc tìm kiếm các khoản đầu tư thỏa mãn tiêu chí của chiến lược Đầu tư Giá trị (Value Investing) — mua tài sản với giá thấp hơn giá trị nội tại. Cụ thể:

  • PE_ratio < 20 là chỉ báo định giá thấp (mua cổ phiếu “giá rẻ”).

  • nominal_return > 0.10 và investment == “GOOD” là chỉ báo về chất lượng và hiệu quả sinh lời thực tế.

  1. Phân tích Kết quả Lọc

Số lượng quan sát được giữ lại là 39.200 sẽ là một tập con có chất lượng cao, có khả năng sinh lời tốt (GOOD, Return>10%) nhưng lại không bị định giá quá cao.

Việc sắp xếp bằng arrange(desc(nominal_return)) giúp nhà phân tích nhanh chóng xác định các giao dịch tốt nhất thỏa mãn các ràng buộc về giá trị, cho phép kiểm tra chi tiết các ngành nghề (sector) hoặc công ty (company) dẫn đầu trong nhóm này.

3.4.2. Tổng hợp và xếp hạng hiệu suất theo chu kỳ (nyse_summary_annual)

Tổng hợp dữ liệu theo nhóm (group_by() và summarise()) là thao tác để tính toán các chỉ số mô tả cho từng nhóm, thể hiện được sự khác biệt về hiệu suất và rủi ro giữa các ngành nghề qua các năm. Ta sẽ nâng cao thao tác này bằng cách thêm chức năng xếp hạng (rank()) để so sánh hiệu suất tương đối của các ngành trong cùng một năm. Ta chia ra các nhóm như:

Nhóm dữ liệu theo Ngành (sector) và Năm Mua (Buy_Year).

Tính Lợi suất trung bình (Mean_Return) và Rủi ro trung bình (Mean_Volatility).

Sử dụng hàm rank() trong mutate() để xếp hạng Lợi suất trung bình của các ngành trong từng năm.

# Tổng hợp và xếp hạng hiệu suất theo ngành và năm
nyse_summary_annual <- nyse_clean %>%
  # Bước 1: Nhóm theo Ngành và Năm
  group_by(sector, Buy_Year) %>%
  # Bước 2: Tính toán các chỉ số tổng hợp
  summarise(
    Count = n(),
    Mean_Return = mean(nominal_return, na.rm = TRUE),
    Mean_Volatility = mean(Volatility_Buy, na.rm = TRUE),
    .groups = 'drop_last' # Giữ lại nhóm sector để rank
  ) %>%
  
  # Bước 3: Xếp hạng Lợi suất trung bình trong từng Năm (cần nhóm lại theo Buy_Year)
  # rank(desc(Mean_Return)) xếp hạng từ cao đến thấp
  mutate(
    Rank_by_Year = rank(desc(Mean_Return), ties.method = "min") # ties.method="min" gán hạng cao nhất nếu có cùng giá trị
  ) %>%
  ungroup() # Bỏ tất cả các nhóm

# Xem kết quả tóm tắt với thứ hạng cho 15 hàng đầu
print(head(nyse_summary_annual, 15))
## # A tibble: 15 × 6
##    sector Buy_Year Count Mean_Return Mean_Volatility Rank_by_Year
##    <fct>     <dbl> <int>       <dbl>           <dbl>        <int>
##  1 AUTO       2013  3475     0.0292            0.316            2
##  2 AUTO       2014 16175    -0.0164            0.290            4
##  3 AUTO       2015 15944    -0.0274            0.266            5
##  4 AUTO       2016 15888     0.0847            0.307            1
##  5 AUTO       2017 15772    -0.00211           0.253            3
##  6 AUTO       2018 12582    -0.0359            0.256            6
##  7 BANK       2013  2853     0.0176            0.229            3
##  8 BANK       2014 12855    -0.0343            0.207            5
##  9 BANK       2015 15942    -0.0658            0.242            6
## 10 BANK       2016 19086     0.155             0.342            1
## 11 BANK       2017 18953     0.0604            0.286            2
## 12 BANK       2018 15068    -0.0297            0.225            4
## 13 FMCG       2013  2116     0.0288            0.151            5
## 14 FMCG       2014  9618     0.0392            0.138            3
## 15 FMCG       2015  9601     0.0458            0.142            2
# Kiểm tra một năm cụ thể để thấy việc xếp hạng đã hoạt động
cat("\nKiểm tra xếp hạng cho năm 2017:\n")
## 
## Kiểm tra xếp hạng cho năm 2017:
nyse_summary_annual %>%
  filter(Buy_Year == 2017) %>%
  arrange(Rank_by_Year)

Nhận xét

Bảng tổng hợp nyse_summary_annual cho thấy sự khác biệt rõ rệt về hiệu suất và rủi ro giữa các ngành (AUTO, BANK, FMCG) trong giai đoạn 2013-2018.

  1. Phân tích xu hướng ngành theo thời gian
  • AUTO: Năm 2016 đạt lợi suất trung bình cao nhất (8.47%). Các năm khác lợi suất thấp hoặc âm. Dao động từ 0.25 đến 0.31. Hiệu suất không ổn định. Lợi suất cao nhất (8.47%) đi kèm với mức Volatility cao (0.307), phù hợp với nguyên tắc lợi suất-rủi ro.

  • BANK: Năm 2016 đạt lợi suất trung bình cao nhất (15.53%). Dao động từ 0.20 đến 0.34. Ngành có lợi suất cao nhất (15.53%) nhưng cũng có rủi ro cao nhất (0.342) trong các năm được liệt kê. Cho thấy ngành ngân hàng có tính chu kỳ và biến động mạnh.

  • FMCG: Lợi suất ổn định và dương trong cả ba năm (2.88% đến 4.58%). Dao động thấp nhất (0.138 đến 0.151). Ngành này là ngành phòng thủ, thể hiện lợi suất thấp nhưng rủi ro cực kỳ thấp (chỉ bằng ∼1/2 so với AUTO/BANK), minh chứng cho tính ổn định của hàng tiêu dùng nhanh.

  1. Phân tích tương quan lợi suất – rủi ro
  • BANK 2016: lợi suất trung bình (mean) là 15.53%, rủi ro trung bình là 0.342 - Rủi ro cao nhất → Lợi suất cao nhất (Phù hợp với lý thuyết tài chính).

  • FMCG 2013-2015: có lợi suất trung bình là 2.8%∼4.5% và rủi ro trung bình là 0.138∼0.151 - Rủi ro thấp nhất → Lợi suất thấp nhất (Phù hợp với lý thuyết tài chính).

Mối quan hệ này cho thấy sự đánh đổi giữa rủi ro và lợi suất tồn tại rõ ràng giữa các ngành.

  1. Phân tích xếp hạng tương đối (Rank_by_Year)

Biến Rank_by_Year cho phép so sánh hiệu suất tương đối của các ngành trong cùng một năm (trong đó Hạng 1 là tốt nhất).

  • Năm 2016 (Năm Tăng trưởng):

    • Ngành BANK (15.53%) có khả năng đạt Hạng 1 trong năm này (vì lợi suất này rất cao).

    • Ngành AUTO (8.47%) cũng có hiệu suất tốt, có thể đạt Hạng 2 hoặc 3 tùy thuộc vào các ngành chưa được hiển thị.

  • Năm 2018 (Năm Suy thoái/Thị trường khó khăn):

    • Cả AUTO (−3.58%) và BANK (−2.97%) đều có lợi suất âm, cho thấy chúng là những ngành dễ bị ảnh hưởng bởi suy thoái kinh tế. Ngành nào có Rank tốt hơn trong năm này sẽ là ngành “tổn thất ít nhất”.

3.4.3. Tạo biến trễ (Lagged_Mean_Return)

Biến trễ (Lagged Variable) cho phép chúng ta kiểm tra xem hiệu suất hoặc định giá của công ty trong quá khứ (ví dụ: năm trước) có ảnh hưởng đến lợi suất trong tương lai (năm hiện tại) hay không.

Ta sẽ tạo biến trễ cho lợi suất trung bình hàng năm (Mean_Return) trong bảng tổng hợp nyse_summary_annual. Sử dụng hàm lag() của dplyr sau khi nhóm dữ liệu theo ngành (sector).

#Tạo biến lợi suất trễ (Lagged Return)
nyse_summary_annual <- nyse_summary_annual %>%
  # nhóm theo Sector trước
  group_by(sector) %>%
  # Sắp xếp theo Buy_Year để đảm bảo lag() hoạt động đúng thứ tự thời gian
  arrange(Buy_Year) %>%
  mutate(
    # Lợi suất trung bình của năm trước (lag(n=1))
    Lagged_Mean_Return = lag(Mean_Return, n = 1, default = NA) 
  ) %>%
  ungroup()

# Xem kết quả kiểm tra (Lợi suất năm trước chuyển lên hàng năm sau)
cat("Kiểm tra Biến Lợi suất Trễ:\n")
## Kiểm tra Biến Lợi suất Trễ:
nyse_summary_annual %>%
  filter(sector == "AUTO" | sector == "BANK") %>%
  select(sector, Buy_Year, Mean_Return, Lagged_Mean_Return) %>%
  head(12)

Ý nghĩa của Lệnh lag():

Lệnh lag(n=1) dịch chuyển giá trị Mean_Return lên một hàng (tức là một năm), nhưng chỉ giới hạn trong nhóm sector hiện tại.

Hàng đầu tiên của mỗi nhóm ngành (ví dụ: AUTO 2013) sẽ có giá trị NA cho Lagged_Mean_Return vì không có dữ liệu năm trước.

Giá trị Phân tích:

Biến Lagged_Mean_Return là một biến độc lập rất mạnh. Nó sẽ được sử dụng trong chương sau để kiểm tra giả thuyết: Liệu hiệu suất hoạt động của một ngành trong năm trước có phải là yếu tố dự báo đáng kể cho hiệu suất năm hiện tại hay không?

Đây là cách định lượng các khái niệm như quán tính lợi nhuận (momentum) hoặc hiệu ứng đảo ngược trung bình (mean reversion) trong tài chính.

3.5. Chuyển đổi dạng dữ liệu cho trực quan hóa (Pivot Longer) (valuation_ratios_long)

Sử dụng pivot_longer() để chuyển các cột tỷ suất định giá (PE_ratio, PB_ratio, PS_ratio) sang dạng dài (long format), cần thiết cho việc vẽ biểu đồ so sánh phân bố giữa các tỷ suất.

# Chuyển đổi Wide_Long (pivot_longer)
valuation_ratios_long <- nyse_clean %>%
  # Chọn các cột so sánh
  select(investment, PE_ratio, PB_ratio, PS_ratio) %>%
  # Thực hiện pivot_longer
  pivot_longer(
    # Chọn các cột chuyển thành hàng
    cols = c(PE_ratio, PB_ratio, PS_ratio), 
    # Tên cột mới chứa tên tỷ suất (PE_ratio, PB_ratio, PS_ratio)
    names_to = "Ratio_Type",
    # Tên cột mới chứa giá trị tương ứng của tỷ suất
    values_to = "Ratio_Value"
  )

# Xem 10 hàng đầu tiên để kiểm tra sự chuyển đổi
print(head(valuation_ratios_long, 10))
## # A tibble: 10 × 3
##    investment Ratio_Type Ratio_Value
##    <fct>      <chr>            <dbl>
##  1 BAD        PE_ratio         12.6 
##  2 BAD        PB_ratio          3.19
##  3 BAD        PS_ratio          0.38
##  4 GOOD       PE_ratio         11.4 
##  5 GOOD       PB_ratio          0.54
##  6 GOOD       PS_ratio          1.71
##  7 BAD        PE_ratio         10.6 
##  8 BAD        PB_ratio          2.6 
##  9 BAD        PS_ratio          1.67
## 10 BAD        PE_ratio         11.1

Trực quan hoá so sánh phân bố: Biểu đồ Boxplot

# Loại bỏ giá trị quá lớn để biểu đồ hộp không bị nén quá mức
# Giả sử chỉ quan tâm đến các giá trị nhỏ hơn 100 để thấy rõ sự khác biệt
valuation_ratios_filtered <- valuation_ratios_long %>%
  filter(Ratio_Value < 100) 

# Vẽ Biểu đồ Hộp
ggplot(valuation_ratios_filtered, aes(x = Ratio_Type, y = Ratio_Value, fill = investment)) +
  geom_boxplot(outlier.shape = NA) + # Loại bỏ outliers trên biểu đồ để làm nổi bật hộp
  scale_y_continuous(labels = comma) + # Dùng dấu phẩy cho trục Y
  labs(
    title = "So sánh phân bố Tỷ suất định giá theo kết quả đầu tư",
    subtitle = "Dữ liệu được lọc để Ratio_Value < 100",
    x = "Loại Tỷ suất Định giá",
    y = "Giá trị Tỷ suất",
    fill = "Kết quả"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold"))

3.6. Lưu trữ dữ liệu đã xử lý

  • nyse: tập dữ liệu gốc.

  • nyse_clean: Tập dữ liệu chính đã được làm sạch và bổ sung các biến mới (Real_Return, log_PE, Leverage_Ratio, Holding_Period, Buy_Year, Buy_Quarter (loại bỏ: X, date_SELL_fix*)).

  • nyse_summary_annual: Bảng tổng hợp hiệu suất theo ngành và năm. (Mean_Return, Mean_Volatility, Rank_by_Year, Lagged_Mean_Return.)

  • valuation_ratios_long: Bảng dữ liệu dạng dài (long format) cho trực quan hóa. (Ratio_Type (Chứa PE, PB, PS), Ratio_Value.)

# Lưu các tập dữ liệu
save(nyse_clean, nyse_summary_annual, valuation_ratios_long, 
     file = "nyse_processed_final.RData") 

# Xác nhận việc lưu file
cat("✅ Đã hoàn tất và lưu trữ dữ liệu sạch vào file: nyse_processed_final.RData\n")
## ✅ Đã hoàn tất và lưu trữ dữ liệu sạch vào file: nyse_processed_final.RData
  • Chuẩn hóa dữ liệu: Xử lý lỗi, xử lý NA và chuẩn hóa các biến liên tục như PE_ratio (tạo log_PE).

  • Tạo biến Giá trị:

    • Tạo các tỷ số tài chính cốt lõi (Leverage_Ratio) và biến kinh tế (Real_Return).

    • Tạo các biến chiến lược (Holding_Period) và chu kỳ thời gian (Buy_Year, Buy_Quarter).

  • Chuẩn bị mô hình và phân tích chuỗi thời gian:

    • Tổng hợp dữ liệu theo nhóm và tạo biến trễ (Lagged_Mean_Return) để phân tích ảnh hưởng của quá khứ.

    • Chuyển đổi dữ liệu sang dạng dài (valuation_ratios_long) phục vụ cho trực quan hóa so sánh.

    • Tập dữ liệu nyse_clean và nyse_summary_annual hiện là cơ sở để tiến hành kiểm định giả thuyết thống kê và xây dựng mô hình dự báo trong các chương sau.

CHƯƠNG 4: TRỰC QUAN HÓA DỮ LIỆU (DATA VISUALIZATION)

# Tải các gói thư viện cần thiết
library(tidyverse)
library(scales)
library(corrplot)

# Tải dữ liệu đã xử lý từ Chương 3
load("nyse_processed_final.RData")

cat("✅ Đã tải các gói thư viện và tập dữ liệu nyse_clean, nyse_summary_annual.\n")
## ✅ Đã tải các gói thư viện và tập dữ liệu nyse_clean, nyse_summary_annual.

4.1. Trực quan hóa phân bố và tần suất (Đơn biến - Univariate)

4.1.1. Phân bố lợi suất thực tế (Real_Return) và danh nghĩa (nominal_return)

# Chuyển dữ liệu lợi suất sang dạng dài (long format)
return_comparison_long <- nyse_clean %>%
  select(nominal_return, Real_Return) %>%
  filter(nominal_return > -0.25 & nominal_return < 0.25) %>%
  pivot_longer(
    cols = everything(),
    names_to = "Return_Type",
    values_to = "Return_Value"
  )

# Vẽ Biểu đồ Mật độ (Density Plot)
ggplot(return_comparison_long, aes(x = Return_Value, fill = Return_Type)) +
  geom_density(alpha = 0.6) +
  labs(title = "Hình 4.1.1. So sánh phân bố lợi suất danh nghĩa và thực tế",
       x = "Lợi suất", y = "Mật độ") +
  geom_vline(xintercept = 0, linetype = "dashed", color = "red") +
  scale_x_continuous(labels = percent) +
  theme_minimal()

So sánh phân bố lợi suất:

  • Tác động của lạm phát: Đường phân bố của Real_Return (màu xanh lam) đã dịch chuyển rõ rệt sang trái so với nominal_return (màu đỏ hồng). Đỉnh (Mode) của Real_Return nằm ở giá trị lợi suất âm nhẹ, trong khi đỉnh của nominal_return nằm sát 0%. Điều này minh chứng trực quan rằng lạm phát đã làm suy giảm sức mua của lợi nhuận danh nghĩa, khiến một phần lợi nhuận danh nghĩa dương trở thành lợi nhuận thực tế âm.

  • Tính lệch (Skewness): Cả hai phân bố đều lệch phải mạnh (đuôi đồ thị kéo dài sang phía dương). Điều này xác nhận rằng phần lớn các giao dịch có lợi suất thấp, nhưng tồn tại một số ít giao dịch siêu lợi nhuận kéo giá trị trung bình lên.

  • Độ nhọn (Kurtosis): Cả hai phân bố đều có đỉnh rất nhọn và hẹp, có thể rủi ro rơi vào các sự kiện cực đoan như lỗ/lãi rất lớn cao hơn mức dự đoán của phân bố chuẩn.

4.1.2. Phân bố thời gian nắm giữ (Holding_Period)

# Vẽ biểu đồ cột (Bar Chart)
ggplot(nyse_clean, aes(x = Holding_Period, fill = Holding_Period)) +
  geom_bar(stat = "count", show.legend = FALSE) +
  geom_text(stat = 'count', aes(label = comma(..count..)), vjust = -0.5, size = 4) +
  labs(title = "Hình 4.1.2. Tần suất khoản đầu tư theo thời gian nắm giữ",
       x = "Thời gian nắm giữ", y = "Số lượng quan sát") +
  scale_y_continuous(labels = comma) +
  theme_minimal()

Tần suất khoản đầu tư theo thời gian nắm giữ:

  • Chiến lược chiếm ưu thế: Nhóm Long-term (>180 days) có số lượng giao dịch cao nhất (147,526), chiếm ưu thế nhẹ so với hai nhóm còn lại. Điều này khẳng định chiến lược mua và giữ là phong cách chiếm ưu thế trong bộ dữ liệu, thường được áp dụng bởi các nhà đầu tư lớn hoặc quỹ.

  • Tính đại diện: Ba nhóm có sự phân bổ tương đối đồng đều (Long-term: 147.5K; Short-term: 135.0K; Mid-term: 122.7K). Bộ dữ liệu là mẫu đại diện tốt cho đa dạng các hoạt động đầu tư, từ giao dịch chủ động (Short/Mid-term) đến đầu tư thụ động (Long-term).

4.1.3. Phân bố định giá chuẩn hóa (log_PE)

# Vẽ biểu đồ Histogram của log_PE
ggplot(nyse_clean, aes(x = log_PE)) +
  geom_histogram(bins = 40, fill = "#1F77B4", color = "white") +
  geom_density(aes(y = after_stat(count) * diff(range(nyse_clean$log_PE, na.rm = TRUE)) / 40),
               color = "red", linetype = "dashed") +
  labs(title = "Hình 4.1.3. Phân bố tỷ suất P/E sau khi chuẩn hóa Logarit (log_PE)",
       x = "Giá trị log(PE Ratio)", y = "Tần suất") +
  theme_minimal()

Nhận xét hình 4.1.3 (Phân bố tỷ suất P/E sau khi chuẩn hóa Logarit):

  • Phân bố của log_PE (đường histogram và density màu đỏ gạch) đã trở nên tương đối đối xứng và tập trung quanh giá trị trung tâm (đỉnh phân bố nằm khoảng 2.5 đến 3.5). Mục tiêu chuyển đổi logarit đã đạt được, giúp giảm thiểu ảnh hưởng của các outliers cực lớn trong PE_ratio gốc và đưa phân bố tiến gần hơn đến giả định phân bố chuẩn của mô hình hồi quy.

  • Giá trị tập trung nhất (ở đỉnh) nằm trong khoảng log_PE từ 2.5 đến 3.5, tương đương P/E từ \(e^{2.5}≈12.2\) đến \(e^{3.5}≈33.1\). Đây là phạm vi định giá phổ biến nhất. Các giá trị log_PE > 6 vẫn tồn tại nhưng có tần suất rất thấp, cho thấy vẫn còn một lượng nhỏ công ty được định giá cực cao.

4.2. Phân tích mối quan hệ tuyến tính (Bivariate Scatter Plots)

4.2.1. Đánh đổi Rủi ro (Volatility) - Lợi suất (Real_Return)

nyse_filtered_scatter <- nyse_clean %>%
  filter(Real_Return > -0.5 & Real_Return < 0.5)

ggplot(nyse_filtered_scatter,
       aes(x = Volatility_Buy, y = Real_Return, color = investment)) +
  geom_point(alpha = 0.2, size = 1) +
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed", linewidth = 0.7) +
  labs(title = "Hình 4.2.1. Mối quan hệ đánh đổi rủi ro và lợi suất thực tế",
       x = "Rủi ro tại thời điểm mua (Volatility_Buy)",
       y = "Lợi suất thực tế (Real_Return)") +
  scale_y_continuous(labels = percent) +
  theme_minimal()

Nhận xét hình 4.2.1 (Biểu đồ tán xạ rủi ro - lợi suất):

  • Đường hồi quy (geom_smooth, nét đứt đen) gần như nằm ngang hoặc hơi dốc xuống khi độ biến động (Volatility) tăng lên. Trong phạm vi lợi suất giới hạn (-50% đến 50%), biểu đồ không cho thấy mối quan hệ tuyến tính dương mạnh giữa rủi ro (Volatility) và lợi suất (Real_Return). Điều này mâu thuẫn với lý thuyết thị trường hiệu quả cơ bản (Risk-Return Trade-off), cho thấy sự phức tạp của thị trường hoặc rủi ro được đo lường chưa đủ.

  • Phân loại Investment:

    • Khoản đầu tư GOOD (xanh lam) tập trung hoàn toàn ở phía trên đường 0% lợi suất.

    • Khoản đầu tư BAD (đỏ hồng) tập trung ở phía dưới đường 0% lợi suất.

    • Ý nghĩa: Điều này khẳng định sự phân loại investment là chính xác và có cơ sở thống kê vững chắc: lợi suất thực tế dương dẫn đến GOOD và ngược lại.

4.2.2. Đòn bẩy (Leverage_Ratio) vs. Hiệu suất (Real_Return)

nyse_filtered_scatter_lev <- nyse_clean %>%
  filter(Real_Return > -0.5 & Real_Return < 0.5, Leverage_Ratio < 10) # Lọc Outlier Leverage

ggplot(nyse_filtered_scatter_lev,
       aes(x = Leverage_Ratio, y = Real_Return)) +
  geom_point(alpha = 0.3, size = 1, color = "#2ca02c") +
  geom_smooth(method = "lm", color = "red", se = FALSE, linewidth = 1) +
  labs(title = "Hình 4.2.2. Mối quan hệ giữa đòn bẩy và lợi suất thực tế",
       x = "Tỷ số đòn bẩy (Leverage_Ratio)",
       y = "Lợi suất thực tế (Real_Return)") +
  scale_y_continuous(labels = percent) +
  theme_minimal()

Nhận xét:

  • Về mối quan hệ, đường hồi quy (geom_smooth, màu đỏ) gần như nằm ngang, cho thấy lợi suất trung bình không thay đổi đáng kể khi tỷ số đòn bẩy (Leverage_Ratio) tăng từ 1.0 đến 10.0. Mặc dù lý thuyết tài chính cho rằng đòn bẩy sẽ khuếch đại cả lợi nhuận và rủi ro, biểu đồ này cho thấy không có mối quan hệ tuyến tính dương rõ rệt giữa mức đòn bẩy cơ bản của công ty và Real_Return trung bình của giao dịch. Điều này gợi ý rằng hiệu ứng của đòn bẩy có thể bị chi phối bởi các yếu tố khác (như chất lượng quản lý hoặc bối cảnh thị trường).

  • Sự phân tán dữ liệu rất lớn trên toàn bộ phạm vi Leverage_Ratio cho thấy rằng dù đòn bẩy cao hay thấp, khả năng lỗ lớn (−50%) hay lãi lớn (+50%) đều tồn tại.

4.2.3. Mối quan hệ giữa ROA và ROE (Đòn bẩy)

ggplot(nyse_clean, aes(x = roa_ratio, y = roe_ratio)) +
  geom_point(alpha = 0.4, color = "#00AFBB") +
  geom_smooth(method = "lm", color = "red", se = FALSE) +
  labs(title = "Hình 4.2.3. Mối quan hệ giữa ROA và ROE của doanh nghiệp",
       x = "ROA (%)",
       y = "ROE (%)") +
  theme_minimal()

Nhận xét:

  • Biểu đồ thể hiện mối tương quan tuyến tính dương rất mạnh giữa ROA (Lợi nhuận trên tổng tài sản) và ROE (Lợi nhuận trên vốn chủ sở hữu).

  • Đường hồi quy (geom_smooth, màu đỏ) có độ dốc lớn hơn 1, đặc biệt rõ rệt ở các giá trị ROA dương.

Ý nghĩa: Điều này là minh chứng trực quan cho hiệu ứng đòn bẩy tài chính (Financial Leverage). Lợi nhuận được tạo ra từ tài sản (ROA) đã được khuếch đại lên trên vốn cổ phần (ROE) nhờ việc sử dụng nợ. Tức là, với cùng một mức lợi nhuận từ tài sản, công ty có đòn bẩy cao hơn sẽ có ROE cao hơn, phù hợp với công thức phân tích DuPont.

4.2.4. Định giá log_PE vs. Lợi suất (Real_Return)

nyse_filtered_scatter_pe <- nyse_clean %>%
  filter(Real_Return > -0.5 & Real_Return < 0.5)

ggplot(nyse_filtered_scatter_pe,
       aes(x = log_PE, y = Real_Return)) +
  geom_point(alpha = 0.3, size = 1, color = "#ff7f0e") +
  geom_smooth(method = "lm", color = "blue", se = FALSE, linewidth = 1) +
  labs(title = "Hình 4.2.4. Mối quan hệ giữa định giá (log_PE) và lợi suất thực tế",
       x = "Giá trị log(PE Ratio)",
       y = "Lợi suất thực tế (Real_Return)") +
  scale_y_continuous(labels = percent) +
  theme_minimal()

Nhận xét Hình 4.2.4 (Biểu đồ tán xạ định giá và lợi suất):

  • Đường hồi quy (geom_smooth, màu xanh dương) có độ dốc âm rõ rệt, thể hiện mối tương quan tuyến tính ngược chiều giữa log_PE và Real_Return. Khi giá trị định giá (log_PE) tăng lên, lợi suất thực tế trung bình có xu hướng giảm.

  • Kết quả này cung cấp sự hỗ trợ trực quan cho giả thuyết đầu tư giá trị rằng:

    • Cổ phiếu giá trị (được định giá thấp, log_PE thấp) có lợi suất trung bình cao hơn.

    • Cổ phiếu tăng trưởng (được định giá cao, log_PE cao) có lợi suất trung bình thấp hơn.

  • Về độ phân tán: Mặc dù đường hồi quy có xu hướng âm, sự phân tán của các điểm dữ liệu là cực kỳ lớn trên toàn bộ trục log_PE (từ 1.0 đến 7.0).

Ý nghĩa: Điều này chỉ ra rằng log_PE không phải là yếu tố dự báo duy nhất và không mạnh mẽ cho lợi suất. Khả năng đạt được siêu lợi nhuận (+50%) hay chịu lỗ nặng (−50%) vẫn tồn tại ở bất kỳ mức định giá nào. Các mô hình hồi quy ở các chương sau sẽ cần kết hợp thêm các yếu tố rủi ro và hiệu quả hoạt động để cải thiện khả năng giải thích lợi suất.

4.3. Phân tích mối quan hệ nội tại và rủi ro

4.3.1. Biểu đồ Heatmap tương quan

# Chọn các biến định lượng cần thiết
corr_data <- nyse_clean %>%
  select(Real_Return, nominal_return, Volatility_Buy, Volatility_sell,
         log_PE, Leverage_Ratio, roe_ratio, roa_ratio, Sharpe.Ratio) %>%
  drop_na() # Xử lý NA do biến mới tạo

# Tính toán ma trận tương quan
M <- cor(corr_data)

# Vẽ Heatmap
corrplot(M, method = "circle", type = "upper",
         order = "hclust", tl.col = "black", tl.srt = 45,
         title = "Hình 4.3.1. Ma trận tương quan giữa các biến định lượng cốt lõi",
         mar=c(0,0,1,0)) # Điều chỉnh lề cho tiêu đề

Nhận xét mối quan hệ Real_Return và nominal_return:

  • Vòng tròn này có màu xanh nhạt (ước tính r≈0.4 đến 0.5). Tương quan dương trung bình này ngược với logic tài chính Real≈Nominal, nhưng nó cho thấy tác động của biến lạm phát (inflation) đã làm thay đổi đáng kể mối quan hệ giữa hai biến lợi suất này trong bộ dữ liệu, giảm tương quan tuyến tính trực tiếp.

  • Mối quan hệ Volatility (Rủi ro): Volatility_Buy và Volatility_sell vẫn có tương quan dương rất mạnh (r≈0.9, màu xanh đậm). Độ biến động giá khi mua và khi bán là gần như không đổi.

    • Vấn đề đa cộng tuyến: Mối tương quan dương rất mạnh giữa các cặp biến (Volatility_Buy và Volatility_sell (r≈0.9); roe_ratio và roa_ratio (r≈0.9)) có thể tồn tại vấn đề đa cộng tuyến nếu cả hai biến trong cùng cặp được đưa vào mô hình hồi quy cùng một lúc.
  • Mối quan hệ lợi suất và tỷ số tài chính: log_PE có tương quan rất yếu (gần 0, vòng tròn rất nhỏ, màu trắng) với Real_Return. Điều này củng cố rằng chỉ riêng PE không phải là yếu tố dự báo lợi suất mạnh.

  • Mối quan hệ Sharpe.Ratio và Volatility: Biểu đồ cho thấy Sharpe.Ratio có tương quan dương rất mạnh (r≈0.9 đến 1) với Volatility_Buy và Volatility_sell (vòng tròn màu xanh đậm). Kết quả này là trái ngược với lý thuyết tài chính cơ bản. Theo lý thuyết, khi rủi ro (Volatility) tăng lên, Sharpe.Ratio phải giảm xuống (tương quan âm). Việc quan sát thấy tương quan dương mạnh mẽ có thể rằng trong bộ dữ liệu này các giao dịch có lợi suất điều chỉnh rủi ro cao (Sharpe.Ratio cao) cũng là những giao dịch xảy ra trong các giai đoạn có độ biến động giá cổ phiếu cao.

    Kết luận: Trong bộ dữ liệu đang nghiên cứu, các nhà đầu tư đã được bù đắp quá mức cho rủi ro tăng thêm, hoặc lợi nhuận sinh ra trong các giai đoạn rủi ro cao là rất lớn, làm phá vỡ mối quan hệ nghịch đảo thông thường giữa lợi suất điều chỉnh rủi ro và độ biến động. Đây là một phát hiện quan trọng cần được điều tra sâu hơn về các yếu tố cơ bản đằng sau giao dịch.

  • ROA và Leverage_Ratio là tương quan âm trung bình (r≈−0.6, màu đỏ/cam), được biểu thị bằng vòng tròn màu đỏ/cam (Leverage_Ratio được định nghĩa là tỷ số nợ trên tài sản). Về mặt trực giác, người ta có thể kỳ vọng mối quan hệ dương (công ty dùng nhiều nợ (Leverage cao) để tài trợ tài sản sẽ có ROA cao hơn do mở rộng quy mô). Tuy nhiên, kết quả âm này cho thấy một thực tế khác: Những công ty có khả năng sinh lời trên tài sản (ROA) càng cao thì càng có xu hướng sử dụng ít đòn bẩy nợ (Leverage_Ratio) hơn. Mối quan hệ tương quan âm trung bình này có thể được lý giải thông qua hai cơ chế chính:

    • Nhu cầu tài trợ nội bộ: Các công ty có ROA cao thường tạo ra dòng tiền nội bộ mạnh mẽ và lợi nhuận giữ lại lớn. Họ có thể tự tài trợ cho các dự án mở rộng của mình mà không cần dựa vào nợ vay bên ngoài quá mức, dẫn đến tỷ số đòn bẩy thấp.

    • Vị thế thị trường và rủi ro: Các công ty có hiệu suất cao (ROA cao) thường là các công ty đã thiết lập vững chắc và không cần chấp nhận rủi ro tài chính cao (đòn bẩy cao) để duy trì tốc độ tăng trưởng, dẫn đến chính sách tài trợ thận trọng hơn.

    • Kết luận: Mối tương quan r≈−0.6 gợi ý rằng trong bộ dữ liệu này, hiệu quả hoạt động (ROA) đang thúc đẩy quyết định về cấu trúc vốn, chứ không phải cấu trúc vốn đang thúc đẩy hiệu quả.

4.3.2. So sánh Tỷ suất định giá (P/E, P/B, P/S) theo Investment

# Lọc giá trị quá lớn để biểu đồ hộp không bị nén quá mức
valuation_ratios_filtered <- valuation_ratios_long %>%
  filter(Ratio_Value < 100)

# Vẽ Biểu đồ Hộp
ggplot(valuation_ratios_filtered, aes(x = Ratio_Type, y = Ratio_Value, fill = investment)) +
  geom_boxplot(outlier.shape = NA) +
  labs(title = "Hình 4.3.2. So sánh phân bố tỷ suất định giá theo kết quả đầu tư",
       subtitle = "Dữ liệu được lọc để Ratio_Value < 100",
       x = "Loại tỷ suất định giá", y = "Giá trị tỷ suất", fill = "Kết quả") +
  scale_y_continuous(labels = comma) +
  theme_minimal()

Nhận xét biểu đồ hộp

Biểu đồ hộp sau khi đã loại bỏ các outliers cực lớn để tăng tính trực quan cho ta thấy được vài những thông tin như sau:

  • Về mức độ định giá (Trung vị - Median)

    • PE_ratio (Price-to-Earnings): Trung vị (Median) của PE là cao nhất trong ba tỷ suất. Điều này cho thấy giá cổ phiếu chủ yếu được xác định bởi lợi nhuận (Earnings).

    • PB_ratio (Price-to-Book): Trung vị thấp hơn PE nhưng cao hơn PS.

    • PS_ratio (Price-to-Sales): Trung vị là thấp nhất, phù hợp với bản chất của tỷ suất P/S dựa trên doanh thu (S).

  • Về sức mạnh dự báo (GOOD vs. BAD)

    • PE_ratio: Hộp GOOD (xanh lam) có trung vị cao hơn hộp BAD (đỏ hồng). Vùng interquartile range (IQR) của hộp GOOD cũng nằm cao hơn hộp BAD một chút. Điều này cho rằng các khoản đầu tư GOOD thường được thị trường định giá cao hơn về mặt lợi nhuận (P/E cao hơn) so với các khoản BAD.

    • PB_ratio: GOOD có Trung vị cao hơn BAD (mặc dù chênh lệch nhỏ).

    • PS_ratio: Hộp GOOD và BAD của PS_ratio gần như trùng nhau hoàn toàn ở cả trung vị và IQR. Đây là tỷ suất cho thấy sự khác biệt yếu nhất giữa hai nhóm, thấp hơn cả PB_ratio.

** Kết luận trực quan:**

  • PE_ratio và PB_ratio là các tỷ suất có khả năng phân biệt cao hơn PS_ratio, bởi vì GOOD investments có xu hướng có trung vị định giá cao hơn (tức là P/E và P/B cao hơn) so với BAD investments.

  • PS_ratio cho thấy sự khác biệt yếu nhất giữa hai nhóm.

  • Phạm vi phân tán lớn của PE_ratio và PB_ratio xác nhận rằng định giá là một yếu tố rất biến động trên sàn NYSE, nhưng các nhà đầu tư vẫn sẵn sàng trả mức giá cao hơn cho những khoản đầu tư được kỳ vọng là GOOD.

4.3.3. So sánh phân bố rủi ro (Volatility Buy vs. Sell)

# Chuyển dữ liệu sang dạng dài
vol_data <- nyse_clean %>%
  select(Volatility_Buy, Volatility_sell) %>%
  pivot_longer(cols = everything(), names_to = "Giai_doan", values_to = "Volatility")

ggplot(vol_data, aes(x = Giai_doan, y = Volatility, fill = Giai_doan)) +
  geom_boxplot(alpha = 0.7) +
  labs(title = "Hình 4.3.3. Phân bố độ biến động giá khi mua và khi bán",
       x = "Giai đoạn giao dịch", y = "Độ biến động (Volatility)") +
  theme_minimal() +
  theme(legend.position = "none")

Phân tích Hình 4.3.3 (Biểu đồ hộp so sánh Volatility):

  • Phân bố trung tâm (Trung vị và IQR):

    • Trung vị của Volatility_Buy (đỏ hồng) và Volatility_sell (xanh lam) là gần như giống nhau (≈0.23).

    • Phạm vi phân tán trung tâm (IQR - thân hộp) của hai biến này gần như cũng trùng nhau.

Ý nghĩa: Điều này khẳng định rằng sự biến động (rủi ro) không có sự khác biệt đáng kể giữa thời điểm nhà đầu tư thực hiện giao dịch mua và giao dịch bán. Rủi ro là một đặc tính nội tại của cổ phiếu trong khoảng thời gian nắm giữ, không thay đổi theo giai đoạn giao dịch.

  • Giá trị ngoại lai (Outliers): Cả hai bên đều có một lượng lớn outliers kéo dài lên trên, đạt giá trị tối đa gần 1.0. Đuôi ngoại lai ở phía Volatility_sell (bán) dường như kéo dài hơn và dày đặc hơn một chút. Các giao dịch cực đoan (biến động rất cao) vẫn tồn tại, và chúng có thể phổ biến hơn một chút ở giai đoạn bán, có thể phản ánh các sự kiện thị trường hoặc các quyết định bán dưới áp lực.

Kết luận: Phân bố Volatility_Buy và Volatility_sell gần như đồng nhất, củng cố nhận xét từ ma trận tương quan (Hình 4.3.1) rằng hai biến này tương quan dương rất mạnh (r≈0.9) và có thể dẫn đến đa cộng tuyến trong mô hình hồi quy. Do đó, chỉ cần chọn một trong hai biến để đại diện cho yếu tố rủi ro.

4.4. Phân tích hiệu suất theo Nhóm và Chu kỳ (Group Performance)

4.4.1. Hiệu suất trung bình theo ngành nghề (sector)

# Tính toán lại tổng hợp theo Sector
nyse_sector_summary <- nyse_clean %>%
  group_by(sector) %>%
  summarise(
    Mean_Return = mean(nominal_return, na.rm = TRUE),
    .groups = 'drop'
  )

# Vẽ Biểu đồ
ggplot(nyse_sector_summary, aes(x = reorder(sector, Mean_Return), y = Mean_Return, fill = sector)) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  labs(title = "Hình 4.4.1. Lợi suất trung bình danh nghĩa theo ngành",
       x = "Ngành nghề", y = "Lợi suất danh nghĩa (nominal_return)") +
  theme_minimal()

Nhận xét:

  • Ngành dẫn đầu: Ngành TECH có lợi suất danh nghĩa trung bình (≈20%) cao vượt trội so với tất cả các ngành khác. Kết quả này phù hợp với kỳ vọng về các ngành có tốc độ tăng trưởng cao và chấp nhận rủi ro lớn hơn.

  • Ngành xếp sau: Các ngành RETAIL (≈5.5%) và FMCG (≈4%) nằm ở mức trung bình.

  • Ngành hiệu suất thấp: Ngành AUTO có lợi suất trung bình gần 0% (≈−0.01), cho thấy sự kém hiệu quả hoặc giai đoạn khó khăn của ngành này trong thời gian nghiên cứu.

4.4.2. So sánh hiệu suất GOOD và BAD

# Tính toán lại tổng hợp theo Investment
nyse_investment_summary <- nyse_clean %>%
  group_by(investment) %>%
  summarise(
    Mean_Return = mean(nominal_return, na.rm = TRUE),
    .groups = 'drop'
  )

# Vẽ Biểu đồ
ggplot(nyse_investment_summary, aes(x = investment, y = Mean_Return, fill = investment)) +
  geom_col(show.legend = FALSE) +
  labs(title = "Hình 4.4.2. So sánh lợi suất trung bình theo loại khoản đầu tư",
       x = "Phân loại đầu tư", y = "Lợi suất danh nghĩa (nominal_return)") +
  theme_minimal()

Nhận xét:

Biểu đồ thể hiện sự khác biệt tuyệt đối giữa hai nhóm:

  • Khoản đầu tư GOOD có lợi suất danh nghĩa trung bình ≈19%.

  • Khoản đầu tư BAD có lợi suất danh nghĩa trung bình gần 0% (≈0.5%).

Ý nghĩa: Việc phân loại GOOD/BAD (dựa trên Real_Return) có sự nhất quán gần như hoàn hảo với nominal_return. Đây là minh chứng cuối cùng cho việc biến investment là một biến mục tiêu chính xác để phân loại và dự báo thành công.

4.4.3. Phân tích chuỗi thời gian lợi suất theo năm

# Lọc ra các ngành chính để biểu đồ không quá phức tạp
nyse_summary_filtered <- nyse_summary_annual %>%
  filter(sector %in% c("TECH", "BANK", "RETAIL", "FMCG"))

ggplot(nyse_summary_filtered, aes(x = Buy_Year, y = Mean_Return, group = sector, color = sector)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  labs(title = "Hình 4.4.3. Xu hướng Lợi suất danh nghĩa trung bình theo Ngành và Năm",
       x = "Năm mua (Buy_Year)", y = "Lợi suất danh nghĩa trung bình", color = "Ngành") +
  scale_y_continuous(labels = percent) +
  scale_x_continuous(breaks = unique(nyse_summary_filtered$Buy_Year)) +
  theme_minimal()

Nhận xét:

  • Tính chu kỳ (Phản ứng với chu kỳ kinh tế): Các ngành BANK và TECH thể hiện tính chu kỳ rõ rệt:

    • Cả hai đều đạt đỉnh hiệu suất vào năm 2016 và giảm mạnh vào năm 2018. Điều này phản ánh sự biến động của các ngành phụ thuộc vào chu kỳ kinh tế và lãi suất hoặc tốc độ đổi mới (Công nghệ).
  • Tính ổn định:

    • Ngành FMCG thể hiện hiệu suất ổn định nhất theo thời gian (đường màu xanh ô-liu gần như đi ngang), dao động quanh mức 2% đến 9%.

    • Ngành RETAIL có biến động trung bình, với hiệu suất phục hồi tốt vào năm 2017.

  • Lợi suất TECH: Ngành TECH duy trì vị thế dẫn đầu trong suốt các năm, đặc biệt đạt đỉnh trên 30% vào năm 2016.

Biểu đồ này chỉ ra rằng hiệu suất không phải là một hằng số. Năm mua (Buy_Year) là một yếu tố quan trọng và cần được xem xét trong mô hình để kiểm soát các yếu tố chu kỳ kinh tế vĩ mô.

4.4.4. Hiệu suất theo chiến lược đầu tư (Holding_Period)

ggplot(nyse_clean, aes(x = Holding_Period, y = Real_Return, fill = Holding_Period)) +
  # Lọc giá trị cực đoan để Boxplot rõ ràng hơn
  coord_cartesian(ylim = c(-0.5, 1.5)) +
  geom_boxplot(alpha = 0.7, outlier.alpha = 0.1) +
  labs(title = "Hình 4.4.4. Phân bố lợi suất thực tế theo chiến lược đầu tư (Thời gian nắm giữ)",
       x = "Thời gian nắm giữ", y = "Lợi suất thực tế (Real_Return)") +
  scale_y_continuous(labels = percent) +
  theme_minimal() +
  theme(legend.position = "none")

Nhận xét:

  • Hiệu suất trung vị:

Quan sát trực quan cho thấy:

  • Short−term (<=30 days) có trung vị cao nhất (≈20%).

  • Mid−term (31-180 days) có trung vị thấp hơn (≈18%).

  • Long−term (>180 days) có trung vị thấp nhất (≈15%).

Ý nghĩa: Điều này mâu thuẫn với giả thuyết chung về việc nắm giữ dài hạn (Buy and Hold) thường mang lại lợi suất trung bình cao nhất. Trong bộ dữ liệu này, chiến lược giao dịch ngắn hạn (Short-term) lại có xu hướng đạt lợi suất trung vị tốt hơn. Điều này có thể phản ánh một giai đoạn thị trường tăng trưởng mạnh trong chu kỳ nghiên cứu, nơi các nhà giao dịch ngắn hạn có thể nhanh chóng chốt lời hiệu quả hơn trước các đợt điều chỉnh.

  • Rủi ro và phạm vi:

    • Mặc dù Long-term có trung vị thấp nhất, nó lại có phạm vi IQR (thân hộp) rộng nhất và râu hộp kéo dài nhất lên phía 150%.

Ý nghĩa: Chiến lược Long−term có biên độ lợi nhuận tiềm năng lớn nhất (phạm vi từ lỗ nhẹ đến siêu lợi nhuận), nhưng đi kèm với tính phân tán cao của lợi suất thực tế.

Kết luận: Phân tích trực quan gợi ý rằng lợi suất thực tế trung vị không tự động tăng theo thời gian nắm giữ. Short-term mang lại lợi suất trung vị tốt nhất, trong khi Long-term mang lại phạm vi lợi suất tiềm năng rộng nhất nhưng với trung vị thấp nhất trong ba nhóm.

TÓM TẮT CHƯƠNG 4: HƯỚNG TỚI MÔ HÌNH HÓA DỮ LIỆU

1. Xác nhận biến phụ thuộc

  • Tính cần thiết của Real_Return: Phân bố lợi suất thực tế (Real_Return) đã dịch chuyển sang trái so với lợi suất danh nghĩa (nominal_return), khẳng định sự ăn mòn của lạm phát và xác lập Real_Return là biến phụ thuộc chính xác nhất.

  • Hiệu quả chuẩn hóa: Biến định giá log_PE đã được chuyển đổi thành công thành phân bố tương đối đối xứng, đáp ứng giả định phân bố chuẩn cho mô hình hồi quy.

  • Tính đại diện: Biến phân loại investment (GOOD vs BAD) là hợp lệ, với sự phân tách rõ ràng theo Real_Return.

2. Các mối quan hệ mâu thuẫn với lý thuyết

Phân tích đã phát hiện các mối quan hệ mâu thuẫn với các mô hình tài chính cổ điển, đòi hỏi phải được kiểm định chặt chẽ trong chương sau:

  • Đánh đổi Rủi ro - Lợi suất: Biểu đồ tán xạ không cho thấy mối quan hệ tuyến tính dương mạnh giữa Volatility (rủi ro) và Real_Return.

  • Hiệu quả của đòn bẩy: Mối tương quan giữa Sharpe.Ratio và Volatility là dương rất mạnh (r≈0.9), trái ngược với công thức Sharpe (rủi ro tăng thì Sharpe phải giảm).

  • Đòn bẩy tài chính: Mối tương quan âm trung bình (r≈−0.6) giữa ROA và Leverage_Ratio cho thấy các công ty sinh lời tốt (ROA cao) có xu hướng sử dụng ít nợ hơn.

3. Các biến dự báo tiềm năng và cần kiểm soát

  • Định giá: log_PE có mối quan hệ tuyến tính âm với Real_Return, ủng hộ giả thuyết đầu tư giá trị (Value Investing).

  • Yếu tố nhóm:

    • Ngành nghề (Sector): Ngành TECH có lợi suất trung bình cao vượt trội và có tính chu kỳ cao.

    • Thời gian nắm giữ: Chiến lược Short−term có trung vị lợi suất tốt hơn so với Long-term.

    • Đa cộng tuyến: Tương quan mạnh giữa Volatility_Buy/Volatility_sell và roe_ratio/roa_ratio cảnh báo cần chọn biến đại diện để tránh làm sai lệch hệ số hồi quy.