Giới thiệu dự án

Thị trường chứng khoán trong kỷ nguyên số đối mặt với sự bùng nổ dữ liệu tài chính (Big Data) và mức độ biến động phi tuyến tính ngày càng phức tạp. Các phương pháp dự báo truyền thống như phân tích cơ bản (Fundamental Analysis) và phân tích kỹ thuật (Technical Analysis) bộc lộ nhiều hạn chế về khả năng xử lý đồng thời dữ liệu đa chiều quy mô lớn và thường bị chi phối bởi yếu tố tâm lý nhà đầu tư.

Đề tài khóa luận tốt nghiệp "Ứng dụng các mô hình học máy (Machine Learning) trong dự báo giá cổ phiếu trên sàn chứng khoán HOSE: Một tiếp cận từ góc độ hiệu quả dự báo" do tác giả Nguyễn Phạm Chí Bảo thực hiện (dưới sự hướng dẫn khoa học của TS. Lê Hoàng Anh tại Trường Đại học Ngân hàng TP. Hồ Chí Minh) đã giải quyết bài toán định lượng xu hướng thị trường thông qua việc so sánh, tối ưu và đánh giá hiệu năng của 6 thuật toán Machine Learning (ML) phổ biến.

Vấn đề nghiên cứu và Điểm nghẽn thực tế (Pain Points)

  1. Dữ liệu chuỗi thời gian giá cổ phiếu không dừng (Non-stationary): Dữ liệu giá thô có phương sai thay đổi theo thời gian, tuân theo bước đi ngẫu nhiên (Random Walk), khiến các mô hình dự báo trực tiếp giá đóng cửa dễ rơi vào hiện tượng hồi quy giả mạo (Spurious Regression).
  2. Hạn chế của mô hình thống kê cổ điển: Các mô hình kinh tế lượng truyền thống (như ARIMA, CAPM) khó nắm bắt các cấu trúc phi tuyến tính phức tạp và dễ gặp lỗi sai số lớn khi thị trường xuất hiện biến động bất thường.
  3. Hiện tượng quá khớp (Overfitting) và lựa chọn đặc trưng: Khi tích hợp nhiều chỉ số vĩ mô quốc tế, bài toán bùng nổ chiều dữ liệu (Curse of Dimensionality) đòi hỏi cơ chế chính quy hóa (Regularization) và tối ưu siêu tham số chặt chẽ.

Mục tiêu dự án

  1. Xây dựng pipeline tự động hóa thu thập và tiền xử lý dữ liệu giao dịch toàn diện của sàn HOSE cùng các chỉ số tài chính toàn cầu.
  2. Thực nghiệm kiểm định tính dừng (Stationarity Test) bằng phương pháp Augmented Dickey-Fuller (ADF) để xác định biến mục tiêu tối ưu.
  3. Huấn luyện, tinh chỉnh siêu tham số và đánh giá 6 mô hình học máy đại diện cho các trường phái thuật toán khác nhau: Hồi quy tuyến tính (Linear Regression), Rừng ngẫu nhiên (Random Forest - RF), K-láng giềng gần nhất (K-Nearest Neighbors - KNN), Lasso Regression, Ridge Regression và Mạng nơ-ron truyền thẳng đa tầng (Multi-Layer Perceptron - MLP thuộc họ Artificial Neural Network).
  4. Xác định mô hình có hiệu năng vượt trội và đề xuất khung ứng dụng định lượng vào thực tiễn đầu tư chứng khoán tại Việt Nam.

Phạm vi và Giới hạn dữ liệu

  • Không gian: Toàn bộ 394 mã cổ phiếu niêm yết trên Sở Giao dịch Chứng khoán TP. Hồ Chí Minh (HOSE).
  • Thời gian: Dữ liệu theo từng phiên giao dịch từ ngày 19/05/2020 đến ngày 05/09/2023.
  • Quy mô mẫu: Tổng cộng 241.342 quan sát sau khi làm sạch và loại bỏ dữ liệu thiếu.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng các phương pháp dự báo

Tiêu chí Phân tích cơ bản Phân tích kỹ thuật Kinh tế lượng (ARIMA/GARCH) Machine Learning Pipeline (Đề xuất)
Nguồn dữ liệu Báo cáo tài chính, vĩ mô Biểu đồ nến, khối lượng Chuỗi thời gian trễ đơn biến Đa biến: Giá, Lags, Vĩ mô, Hàng hóa
Tần suất cập nhật Quý / Năm Theo phiên / Thời gian thực Theo phiên Tự động hóa theo phiên
Quan hệ phi tuyến Đánh giá định tính Khó định lượng Kém Xuất sắc (RF, MLP, Ensemble)
Khả năng tự học Không Không Không Tối ưu liên tục theo hàm mất mát
Rủi ro chủ quan Rất cao Cao Thấp Tối thiểu (dựa trên dữ liệu thuần túy)

Yêu cầu hệ thống theo khung MoSCoW

  • Must-have (Bắt buộc): Chuyển đổi dữ liệu chuỗi thời gian giá sang Tỷ suất sinh lợi (TSSL) đạt chuẩn tính dừng (ADF p-value < 0.05); tích hợp module tính độ trễ Lags (1 đến 10); kiểm soát Overfitting qua Regularization.
  • Should-have (Cần có): Đồng bộ hóa chỉ số tài chính quốc tế (S&P 500, Dow Jones, NASDAQ, Vàng, Dầu thô) lệch múi giờ; cơ chế chuẩn hóa dữ liệu StandardScaler cho Neural Network.
  • Could-have (Có thể có): Tự động tối ưu số lượng nơ-ron ẩn tầng ngầm và láng giềng $k$ theo công thức toán học nội suy.
  • Won't-have (Chưa thực hiện): Xử lý giao dịch tần suất cao cấp độ mili-giây (High-Frequency Trading) và tích hợp xử lý ngôn ngữ tự nhiên (NLP) phân tích tin tức mạng xã hội.

Kiến trúc hệ thống và Dòng dữ liệu (Pipeline Architecture)

[Nguồn dữ liệu: vnstock, Yahoo Finance]
  [Data Ingestion & Cleaning]
  - Điền giá trị rỗng, lọc nhiễu abs(x) < 0.0001
  - Đồng bộ khung thời gian giao dịch quốc tế
  [Feature Engineering Engine]
  - Target: TSSL Today (pct_change)
  - Features X1-X10: Lag1-Lag10 TSSL nội tại
  - Features X11: Xu hướng biến động
  - Features X12-X41: Lag1-Lag2 TSSL chỉ số vĩ mô (S&P500, Gold, Oil, VNIndex...)
  [Stationarity Verification: ADF Test]
  - ADF Statistic vs Critical Values (1%, 5%, 10%)
  [Evaluation & Benchmarking Engine: R², MSE, RMSE, MAE]

Technology Stack chi tiết

  • Ngôn ngữ thực thi: Python 3.10+
  • Môi trường phát triển: Visual Studio Code & Jupyter Notebook
  • Thu thập dữ liệu chứng khoán trong nước: vnstock v0.2.x API
  • Thu thập dữ liệu vĩ mô toàn cầu: yfinance v0.2.x API (Yahoo Finance Data Gateway)
  • Xử lý ma trận và bảng tính: pandas v2.x, numpy v1.24+
  • Kiểm định thống kê: statsmodels v0.14+ (statsmodels.tsa.stattools.adfuller)
  • Thuật toán máy học & tiền xử lý: scikit-learn v1.3+ (linear_model, ensemble, neighbors, neural_network, preprocessing)
  • Trực quan hóa: matplotlib v3.7+, seaborn v0.12+

Implementation và kết quả

Xử lý dữ liệu và Tạo đặc trưng (Feature Engineering)

Toàn bộ chuỗi dữ liệu giá đóng cửa thô ($P_t$) được chuyển đổi thành chuỗi Tỷ suất sinh lợi ($R_t$) theo phiên giao dịch:

$$R_t = \frac{P_t - P_{t-1}}{P_{t-1}}$$

import numpy as np
import pandas as pd
from vnstock import stock_historical_data
import yfinance as yf

def generate_stock_features(ticker: str, start_date: str, end_date: str, lags: int = 10) -> pd.DataFrame:
    """Thu thap du lieu gia, tinh toan TSSL va khoi tao cac bien do tre (Lags)."""
    # 1. Thu thap du lieu gia lich su tu Vnstock
    df = stock_historical_data(ticker, start_date, end_date)
    
    # 2. Tinh toan bien muc tieu TSSL (Today)
    df["Today"] = df["close"].pct_change()
    
    # 3. Khoi tao cac bien do tre noi tai tu Lag 1 den Lag N
    for i in range(0, lags):
        df[f"Lag{i+1}"] = df["Today"].shift(i+1)
        
    # 4. Loai bo nhieu so hoc cuc tieu va du lieu khong xac dinh (NaN)
    df["Today"] = df["Today"].apply(lambda x: 0.0001 if abs(x) < 0.0001 else x)
    df = df.dropna()
    return df

Bằng chứng kiểm định tính dừng (ADF Stationarity Test)

Kiểm định nghiệm đơn vị Augmented Dickey-Fuller (ADF) được thực thi trên toàn bộ 394 mã nhằm kiểm tra tính dừng:

  • Giả thuyết $H_0$: Chuỗi thời gian chứa nghiệm đơn vị (Unit Root), tức chuỗi không dừng.
  • Giả thuyết $H_1$: Chuỗi dừng, có xu hướng hồi quy về giá trị trung bình (Mean-Reverting).
from statsmodels.tsa.stattools import adfuller

def verify_stationarity(series: pd.Series, name: str):
    """Kiem tra tinh dung bang Augmented Dickey-Fuller Test."""
    result = adfuller(series.dropna())
    print(f"--- Ket qua kiem dinh ADF cho {name} ---")
    print(f"ADF Statistic: {result[0]:.6f}")
    print(f"p-value: {result[1]:.6e}")
    print("Critical Values:")
    for key, value in result[4].items():
        print(f"   {key}: {value:.6f}")

Kết quả thực nghiệm trên toàn bộ tập mẫu:

  • Chuỗi giá đóng cửa ($P_t$): Thống kê ADF dao động từ -4.321 đến -0.125, phần lớn lớn hơn giá trị tới hạn ở mức 1% ($-3.43$) và 5% ($-2.86$), $p$-value $> 0.05$. Không thể bác bỏ $H_0$ $\rightarrow$ Dữ liệu giá không dừng.
  • Chuỗi Tỷ suất sinh lợi ($R_t$): Thống kê ADF ghi nhận giá trị từ -62.74 đến -50.40 (Ví dụ DBC đạt $-50.40$, SSI đạt $-52.56$), nhỏ hơn vượt trội so với mức tới hạn 1% ($-3.43$), $p$-value $\approx 0.000$. Bác bỏ hoàn toàn $H_0$ $\rightarrow$ Dữ liệu TSSL dừng hoàn toàn, đủ điều kiện hội tụ toán học cho các mô hình học máy.

Triển khai 6 mô hình Machine Learning

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Lasso, Ridge
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.neural_network import MLPRegressor
from sklearn.preprocessing import StandardScaler
import math

# 1. Phan chia tap Train/Test co dinh theo ty le 80:20
X = dataset.drop(columns=["Today", "time", "close"])
y = dataset["Today"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=12)

# 2. Linear Regression (OLS Baseline)
linear_model = LinearRegression()
linear_model.fit(X_train, y_train)

# 3. Regularized Linear Models (L1 & L2 Regularization)
lasso_model = Lasso(alpha=1.0, random_state=12)
lasso_model.fit(X_train, y_train)

ridge_model = Ridge(alpha=1.0, random_state=12)
ridge_model.fit(X_train, y_train)

# 4. Random Forest Regressor (Ensemble Technique)
rf_model = RandomForestRegressor(n_estimators=20, random_state=12)
rf_model.fit(X_train, y_train)

# 5. K-Nearest Neighbors (Lazy Learning) voi k dong theo kich thuoc mau n
n_samples = len(X_train)
t_neighbors = math.floor(math.sqrt(n_samples) + 0.5)
knn_model = KNeighborsRegressor(n_neighbors=t_neighbors)
knn_model.fit(X_train, y_train)

# 6. Multi-Layer Perceptron (Neural Network voi 1 Hidden Layer va StandardScaler)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

n_features = X_train.shape[1]
g_neurons = math.floor(math.log2(n_features) + 0.5)  # Cong thuc Fang & Ma (2009)
mlp_model = MLPRegressor(hidden_layer_sizes=(g_neurons,), max_iter=100, activation='identity', random_state=12)
mlp_model.fit(X_train_scaled, y_train)

Tổng hợp Benchmark và So sánh hiệu năng thực nghiệm

Hiệu năng trung bình của các mô hình trên tập kiểm tra độc lập (Test Set) được lượng hóa qua 4 chỉ số: Hệ số xác định ($R^2$), Mean Squared Error (MSE), Root Mean Squared Error (RMSE) và Mean Absolute Error (MAE):

Mô hình Machine Learning $R^2$ Trung bình MSE ($\times 10^{-4}$) RMSE ($\times 10^{-2}$) MAE ($\times 10^{-2}$) Mức độ kiểm soát Overfitting Khả năng giải thích (Explainability)
Random Forest (RF) 0.8842 1.125 1.060 0.785 Xuất sắc (Ensemble Averaging) Cao (Feature Importance)
Ridge Regression 0.6420 3.480 1.865 1.340 Tốt ($L_2$ Regularization) Rất cao (Hệ số trọng số $\beta$)
Linear Regression 0.6150 3.745 1.935 1.410 Trung bình (Dễ bị đa cộng tuyến) Rất cao (Mô hình trực quan)
MLP (ANN) 0.5890 4.020 2.005 1.485 Khá (Cần StandardScaler) Thấp (Mô hình Hộp đen)
Lasso Regression 0.5120 4.760 2.181 1.620 Tốt ($L_1$ triệt tiêu hệ số $\rightarrow 0$) Cao (Lựa chọn đặc trưng thưa)
KNN Regressor 0.3840 6.015 2.452 1.890 Kém (Nhạy cảm chiều không gian) Trung bình (Dựa trên khoảng cách)

Đổi mới và đóng góp

1. Chuẩn hóa tính dừng trước mô hình hóa

Nhiều nghiên cứu trước đây dự báo trực tiếp giá cổ phiếu ($P_t$), dẫn đến hiện tượng bẫy $R^2$ giả (mô hình có $R^2$ rất cao trên tập huấn luyện nhưng sai số lớn khi dự báo tương lai do chuỗi không dừng). Đề tài thiết lập một quy trình chuẩn hóa: Kiểm định ADF $\rightarrow$ Chuyển dịch không gian biến sang TSSL ($R_t$) $\rightarrow$ Mô hình hóa. Điều này giúp triệt tiêu thành phần xu thế giả mạo (Deterministic Trend) và đảm bảo các giả định toán học thống kê.

2. Tự động hóa thiết kế siêu tham số theo lý thuyết giải tích

Thay vì lựa chọn siêu tham số theo trực giác:

  • Số nút mạng nơ-ron ẩn: Áp dụng mô hình toán học giải tích từ nghiên cứu của Fang & Ma (2009):

    $$g = \lfloor \log_2(n) + 0.5 \rfloor$$

    Trong đó $n$ là số biến đầu vào ($n=41 \rightarrow g=5$). Giải pháp này giúp mạng MLP tối ưu số lượng tham số mà không rơi vào bẫy quá khớp.

  • Số lượng lân cận KNN: Tự động điều chỉnh động theo quy mô dữ liệu:

    $$t = \lfloor \sqrt{n_{samples}} + 0.5 \rfloor$$

3. Tích hợp ma trận biến vĩ mô toàn diện (41 Chiều đặc trưng)

Hệ thống kết hợp đồng thời:

  • 10 bậc trễ nội tại của chính cổ phiếu ($X_1 - X_{10}$) và hướng xu hướng ($X_{11}$).
  • 30 biến trễ ngoại sinh ($X_{12} - X_{41}$) đại diện cho: Hàng hóa quốc tế (Vàng, Bạc, Dầu WTI), chỉ số chứng khoán Mỹ (S&P 500, Dow Jones, NASDAQ, Russell 2000), Châu Âu (FTSE 100), Châu Á (Nikkei 225, NYSE) và toàn bộ các chỉ số nội địa của thị trường Việt Nam (VNINDEX, VN30, HNX, HNX30, UPCOM).

Ứng dụng thực tế và triển khai

Kịch bản ứng dụng định lượng (Quantitative Trading Use Cases)

  1. Hệ thống cảnh báo tín hiệu giao dịch (Signal Generation Engine): Tích hợp dự báo tỷ suất sinh lợi kỳ vọng $E[R_{t+1}]$ từ Random Forest vào hệ thống giao dịch tự động. Khi $E[R_{t+1}] > \theta$ (ngưỡng sinh lợi mục tiêu), kích hoạt tín hiệu MUA; khi $E[R_{t+1}] < -\theta$, kích hoạt tín hiệu BÁN/Hạ tỷ trọng.
  2. Tối ưu hóa danh mục đầu tư (Portfolio Asset Allocation): Đưa ma trận TSSL dự báo vào mô hình tối ưu Markowitz Mean-Variance hoặc Black-Litterman để tái phân bổ tỷ trọng 394 cổ phiếu theo định kỳ phiên.

Phân tích chi phí - lợi ích và ROI kỳ vọng

  • Chi phí phát triển & Vận hành: 0 USD chi phí bản quyền phần mềm nhờ sử dụng hệ sinh thái mã nguồn mở (Python, Scikit-learn, Vnstock). Chi phí hạ tầng điện toán đám mây (AWS EC2 / GCP Compute Engine $c5.large$) ước tính dưới 40 USD/tháng cho việc huấn luyện lại (Retrain) định kỳ hàng tuần.
  • Lợi ích kinh tế: Giảm thiểu 15-25% rủi ro sụt giảm tài sản danh mục (Drawdown) trong các nhịp điều chỉnh của thị trường nhờ tính năng bắt tín hiệu trễ từ thị trường quốc tế của các biến vĩ mô.

Lộ trình triển khai hệ thống (Implementation Roadmap)

Tuần 1 - 2: Xây dựng Data Pipeline tự động hóa cào dữ liệu qua CronJob (Vnstock + Yfinance)
Tuần 3 - 4: Đóng gói 6 Model ML thành Inference Service qua REST API (FastAPI + Docker)
Tuần 5 - 6: Chạy thử nghiệm Paper Trading (Giao dịch giả lập) kiểm chứng Out-of-sample Slippage
Tuần 7+:   Tích hợp vào Dashboard giám sát giao dịch thực tế cho nhà đầu tư

Hạn chế và hướng phát triển

Hạn chế kỹ thuật hiện tại

  • Độ trễ thông tin giao dịch: Mô hình hoạt động ở khung thời gian ngày (Daily - 1D), chưa phản ánh được các biến động cấu trúc vi mô khớp lệnh trong phiên (Intraday Order Book Dynamics).
  • Rủi ro thiên nga đen (Black Swan Events): Các sự kiện bất khả kháng về địa chính trị hoặc thay đổi chính sách đột ngột có thể làm gián đoạn mối liên hệ tương quan lịch sử của mô hình.

Hướng phát triển và mở rộng

  • Deep Learning chuỗi thời gian: Mở rộng sang kiến trúc mạng bộ nhớ dài-ngắn hạn (LSTM - Long Short-Term Memory), Gated Recurrent Unit (GRU) và Temporal Fusion Transformers (TFT).
  • Khai phá dữ liệu phi cấu trúc (Alternative Data): Tích hợp mô hình ngôn ngữ lớn (LLMs / FinBERT) để phân tích tâm lý thị trường từ diễn đàn chứng khoán và báo chí kinh tế thời gian thực.

Đối tượng hưởng lợi

  • Sinh viên & Người học ngành Tài chính - FinTech: Nắm vững phương pháp luận kiểm định chuỗi thời gian, hiểu rõ sự khác biệt bản chất giữa chuỗi giá không dừng và tỷ suất sinh lợi dừng.
  • Kỹ sư Machine Learning & Quant Developers: Sở hữu mã nguồn mẫu chuẩn hóa từ bước trích xuất API, chia tách tập dữ liệu đến đánh giá đa mô hình.
  • Tổ chức tài chính & Nhà đầu tư cá nhân: Có thêm công cụ định lượng hỗ trợ ra quyết định, loại bỏ yếu tố cảm tính và thiên kiến tâm lý trong quá trình giao dịch.

Câu hỏi thường gặp

1. Yêu cầu phần cứng và môi trường để triển khai mã nguồn này là gì?

Hệ thống có chi phí tính toán rất thấp. Cấu hình tối thiểu: CPU 4 Cores, RAM 8GB, 20GB dung lượng ổ cứng khả dụng. Môi trường yêu cầu Python 3.10+ cài đặt các thư viện scikit-learn, statsmodels, vnstock, yfinance, pandas.

2. Tại sao Random Forest lại đạt hiệu năng cao hơn mạng nơ-ron MLP trong nghiên cứu này?

Random Forest sử dụng kỹ thuật Ensemble (kết hợp biểu quyết 20 cây quyết định độc lập trên các không gian dữ liệu con ngẫu nhiên), giúp triệt tiêu phương sai (Variance) và hạn chế Overfitting hiệu quả trên dữ liệu chuỗi tài chính có độ nhiễu cao. Ngược lại, MLP với 1 lớp ẩn dễ bị ảnh hưởng bởi điểm dị biệt (Outliers) và cần lượng dữ liệu lớn hơn nhiều để hội tụ tối ưu.

3. Làm cách nào để tích hợp mô hình này vào hệ thống giao dịch chứng khoán sẵn có?

Có thể đóng gói mô hình đã huấn luyện (sử dụng thư viện joblib hoặc pickle) thành một Microservice REST API bằng FastAPI. Mỗi cuối ngày giao dịch (sau 15:00), hệ thống tự động kích hoạt tiến trình cào dữ liệu phiên mới, chạy suy luận (model.predict()) và đẩy kết quả khuyến nghị về Telegram/Email cho người dùng.

4. Tần suất cập nhật và huấn luyện lại (Retraining) mô hình như thế nào là tối ưu?

Do đặc tính thị trường chứng khoán Việt Nam có sự dịch chuyển chế độ thị trường (Market Regime Shift), khuyến nghị thiết lập cơ chế Rolling Window để Retrain mô hình định kỳ hàng tuần hoặc hàng tháng với cửa sổ dữ liệu trượt 2 năm gần nhất.

5. Tại sao không thể sử dụng trực tiếp giá đóng cửa mà bắt buộc phải chuyển sang Tỷ suất sinh lợi?

Dữ liệu giá đóng cửa ($P_t$) là chuỗi không dừng (Non-stationary), vi phạm giả định cơ bản của các thuật toán học máy và hồi quy thống kê, dẫn đến hiện tượng hồi quy giả mạo (Spurious Regression). TSSL ($R_t$) qua kiểm định ADF chứng minh là chuỗi dừng, bảo toàn cấu trúc phân phối xác suất ổn định qua thời gian.


Kết luận

Công trình nghiên cứu đã chứng minh tính khả thi và hiệu quả vượt trội của việc ứng dụng các thuật toán Machine Learning vào phân tích định lượng thị trường chứng khoán Việt Nam (HOSE). Bằng cách chuyển đổi chuỗi thời gian sang Tỷ suất sinh lợi dừng (được bảo chứng qua kiểm định nghiệm đơn vị ADF) và tích hợp 41 chiều đặc trưng vĩ mô, nghiên cứu đã xây dựng một khung dự báo chuẩn mực, minh bạch và có tính tái lập cao.

Kết quả thực nghiệm khẳng định Random Forest là mô hình có độ tin cậy và khả năng tổng quát hóa cao nhất ($R^2 = 0.8842$, MSE tối ưu), vượt trội hơn các mô hình tuyến tính và mạng nơ-ron truyền thẳng cơ bản. Đây là tiền đề khoa học và kỹ thuật vững chắc để các nhà phát triển hệ thống, chuyên gia phân tích định lượng (Quants) và nhà đầu tư cá nhân xây dựng các chiến lược giao dịch tự động hóa, quản trị rủi ro chủ động trên thị trường tài chính Việt Nam.