Giới thiệu dự án

Dự đoán giá cổ phiếu là một trong những bài toán phức tạp và thách thức nhất trong lĩnh vực tài chính định lượng (Quantitative Finance). Sự biến động của thị trường chứng khoán chịu tác động bởi vô số yếu tố phi tuyến tính, bất định và có tính chu kỳ phức tạp. Theo thống kê thực tế, hơn 90% nhà đầu tư cá nhân thua lỗ trên thị trường chứng khoán do thiếu phương pháp định lượng khoa học và chịu ảnh hưởng tâm lý giao dịch. Trong bối cảnh kỷ nguyên số và sự bùng nổ dữ liệu lớn, việc ứng dụng Trí tuệ Nhân tạo (AI), Học máy (Machine Learning - ML) và Học sâu (Deep Learning - DL) mở ra hướng tiếp cận đột phá nhằm khai phá các quy luật ẩn sâu trong dữ liệu tài chính.

Đề tài khóa luận "Ứng Dụng Học Máy và Học Sâu Trong Dự Đoán Giá Cổ Phiếu Tại Thị Trường Việt Nam" tập trung giải quyết bài toán dự báo chuỗi thời gian tài chính cho 70 cổ phiếu niêm yết trên Sàn Giao dịch Chứng khoán TP. Hồ Chí Minh (HOSE). Đề tài kết hợp mạng nơ-ron hồi quy Long Short-Term Memory (LSTM) với 10 chỉ báo kỹ thuật đặc trưng dạng liên tục, đồng thời tiến hành mô phỏng giao dịch thực tế để so sánh với mô hình kinh tế lượng truyền thống ARIMA và mô hình phân bổ danh mục Hiện đại Mean - Variance.

Mục tiêu nghiên cứu cụ thể

  1. Xây dựng và tối ưu mô hình học sâu LSTM: Huấn luyện kiến trúc mạng LSTM với dữ liệu chuỗi thời gian nhiều biến (multivariate time-series) dựa trên 10 chỉ báo phân tích kỹ thuật dạng liên tục nhằm dự báo lợi nhuận cổ phiếu trong kỳ hạn ngắn hạn (20 ngày giao dịch).
  2. Kiểm định hiệu quả dự báo (Predictive Performance): So sánh định lượng năng lực dự báo giữa mô hình LSTM và mô hình kinh tế lượng Auto-Regressive Integrated Moving Average (ARIMA) thông qua các thang đo Mean Squared Error (MSE) và Độ chính xác chiều biến động (Hit Accuracy).
  3. Mô phỏng chiến lược giao dịch định lượng (Backtesting): Xây dựng các danh mục đầu tư giả lập ($n = 1, 2, 3, 4, 5$ cổ phiếu) dựa trên lợi nhuận kỳ vọng từ mô hình LSTM, tích hợp chi phí giao dịch thực tế và kiểm định thống kê $t$-test so với danh mục Mean - Variance (Markowitz) và danh mục đầu tư thụ động (Buy & Hold).

Phạm vi và giới hạn nghiên cứu

  • Đối tượng & Dữ liệu: 70 doanh nghiệp niêm yết trên sàn HOSE có lịch sử giao dịch liên tục từ trước ngày 04/01/2010.
  • Thời gian dự báo: Dự báo ngắn hạn $t+20$ ngày giao dịch.
  • Giới hạn: Nghiên cứu tập trung vào dữ liệu định lượng giá, khối lượng và chỉ báo kỹ thuật, chưa xét đến các biến cố vĩ mô đột xuất và phân tích cảm xúc từ tin tức (sentiment analysis).

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

Phân tích hiện trạng

Thị trường tài chính hiện đại tồn tại hai trường phái tiếp cận chủ đạo: Phân tích cơ bản (Fundamental Analysis) và Phân tích kỹ thuật (Technical Analysis). Sự kết hợp giữa phân tích kỹ thuật và học máy tạo tiền đề cho giao dịch thuật toán (Algorithmic Trading).

Phương pháp tiếp cận Ưu điểm Nhược điểm Độ trễ tín hiệu Khả năng xử lý phi tuyến
Phân tích cơ bản (Graham & Dodd) Đánh giá giá trị nội tại doanh nghiệp, biên an toàn cao Đòi hỏi dữ liệu tài chính sâu, phản ứng chậm với biến động giá ngắn hạn Rất lớn (Quý/Năm) Kém
Kinh tế lượng chuỗi thời gian (ARIMA/GARCH) Cơ sở toán học chặt chẽ, dễ giải thích tham số Chỉ mô hình hóa quan hệ tuyến tính, giả định nghiêm ngặt về tính dừng Thấp Không có
Học máy cổ điển (SVM, RF, ANN) Học quan hệ phi tuyến, phân lớp tín hiệu tốt Khó bắt kịp tương quan phụ thuộc thời gian dài (long-term temporal dependencies) Thấp Khá
Học sâu chuỗi thời gian (LSTM - Đề xuất) Lưu trữ bộ nhớ dài hạn, tự động trích xuất đặc trưng động, xử lý chuỗi đa chiều Đòi hỏi năng lực tính toán GPU, nguy cơ overfitting cao nếu không regularization Thấp (Tự động) Rất cao

Ma trận ưu tiên yêu cầu kỹ thuật (MoSCoW)

  • Must have: Cấu trúc LSTM 3 cổng (Input, Forget, Output); 10 chỉ báo kỹ thuật tính toán chuẩn xác; Xử lý dữ liệu liên tục; Kiểm định tính dừng Dickey-Fuller cho ARIMA.
  • Should have: Kỹ thuật Regularization Dropout chống Overfitting; Mô phỏng chi phí giao dịch 0.15% - 0.25%; Kiểm định $t$-test thống kê.
  • Could have: Đa dạng hóa danh mục theo bài toán tối ưu hóa Mean - Variance kết hợp LSTM.
  • Won't have (lần này): Tích hợp NLP phân tích báo cáo tài chính và tin tức mạng xã hội.

Thiết kế hệ thống và Cấu trúc mô hình

                         Input Vector x_t (10 Technical Indicators)

Ngăn xếp công nghệ (Technology Stack)

  • Ngôn ngữ: Python 3.8+
  • Deep Learning Framework: TensorFlow 2.4.1 / Keras
  • Kinh tế lượng & Thống kê: Statsmodels 0.12.2, Scipy 1.6.2
  • Xử lý dữ liệu: Pandas 1.2.4, NumPy 1.19.5
  • Tăng tốc phần cứng: CUDA Toolkit 11.2, NVIDIA GPU

Methodology và Đặc trưng kỹ thuật

Nghiên cứu sử dụng 10 chỉ báo kỹ thuật liên tục ($n = 14$ kỳ) được tiêu chuẩn hóa:

  1. Simple Moving Average (SMA): $SMA_t = \frac{1}{n}\sum_{i=0}^{n-1} C_{t-i}$
  2. Weighted Moving Average (WMA): $WMA_t = \frac{\sum_{i=1}^n i \cdot C_{t-n+i}}{\sum_{i=1}^n i}$
  3. Momentum (MTM): $MTM_t = C_t - C_{t-n}$
  4. Moving Average Convergence Divergence (MACD): $MACD_t = EMA(12)_t - EMA(26)_t$, Signal Line $= EMA(9)(MACD_t)$
  5. Stochastic Oscillator (%K): $%K_t = \frac{C_t - LL_t}{HH_t - LL_t} \times 100$
  6. Stochastic Oscillator (%D): $%D_t = SMA(3)(%K_t)$
  7. Relative Strength Index (RSI): $RSI_t = 100 - \frac{100}{1 + RS_t}$
  8. Larry William's %R: $%R_t = \frac{HH_t - C_t}{HH_t - LL_t} \times (-100)$
  9. Accumulation/Distribution Oscillator (A/D): $A/D_t = A/D_{t-1} + \frac{(C_t - L_t) - (H_t - C_t)}{H_t - L_t} \times V_t$
  10. Commodity Channel Index (CCI): $CCI_t = \frac{M_t - SM_t}{0.015 \cdot D_t}$

Implementation và kết quả

Development Process & Pipeline triển khai

Quy trình triển khai mô hình bao gồm: Thu thập dữ liệu OHLCV $\rightarrow$ Feature Engineering $\rightarrow$ Chuẩn hóa MinMax Scaler $\rightarrow$ Cửa sổ trượt (Sliding Window: Lookback 30 ngày, Forecast 20 ngày) $\rightarrow$ Huấn luyện LSTM với Dropout $\rightarrow$ Dự báo & Tối ưu danh mục.

import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from tensorflow.keras.optimizers import Adam

def build_lstm_stock_model(input_shape: tuple, learning_rate: float = 0.001) -> Sequential:
    """
    Xay dung kien truc mang LSTM du doan loi nhuan co phieu.
    Input Shape: (timesteps, features) = (30, 10)
    """
    model = Sequential([
        LSTM(units=64, return_sequences=True, input_shape=input_shape),
        Dropout(0.2),
        LSTM(units=32, return_sequences=False),
        Dropout(0.2),
        Dense(units=16, activation='relu'),
        Dense(units=1, activation='linear')  # Du bao ty suat sinh loi lien tuc
    ])
    
    optimizer = Adam(learning_rate=learning_rate)
    model.compile(optimizer=optimizer, loss='mean_squared_error', metrics=['mae'])
    return model

# Thiet lap toan hoc cho cac cong LSTM:
# f_t = sigma(W_f * x_t + U_f * h_{t-1} + b_f)
# i_t = sigma(W_i * x_t + U_i * h_{t-1} + b_i)
# C~_t = tanh(W_c * x_t + U_c * h_{t-1} + b_c)
# C_t = f_t (.) C_{t-1} + i_t (.) C~_t
# o_t = sigma(W_o * x_t + U_o * h_{t-1} + b_o)
# h_t = o_t (.) tanh(C_t)
# Tinh toan 10 chi bao ky thuat (Feature Engineering Pipeline)
def compute_technical_indicators(df: pd.DataFrame, n: int = 14) -> pd.DataFrame:
    features = pd.DataFrame(index=df.index)
    
    # 1. Chenh lech gia voi SMA
    features['DIFF_SMA'] = df['Close'] - df['Close'].rolling(window=n).mean()
    
    # 2. Chenh lech gia voi WMA
    weights = np.arange(1, n + 1)
    features['DIFF_WMA'] = df['Close'] - df['Close'].rolling(n).apply(
        lambda prices: np.dot(prices, weights) / weights.sum(), raw=True
    )
    
    # 3. Momentum (MTM)
    features['MTM'] = df['Close'] - df['Close'].shift(n)
    
    # 4. MACD Difference
    ema12 = df['Close'].ewm(span=12, adjust=False).mean()
    ema26 = df['Close'].ewm(span=26, adjust=False).mean()
    macd = ema12 - ema26
    signal = macd.ewm(span=9, adjust=False).mean()
    features['DIFF_MACD'] = df['Close'] - macd
    features['DIFF_SIGNAL'] = macd - signal
    
    # 5 & 6. Stochastic %K & %D
    low_min = df['Low'].rolling(window=n).min()
    high_max = df['High'].rolling(window=n).max()
    features['STCK'] = ((df['Close'] - low_min) / (high_max - low_min)) * 100
    features['STCD'] = features['STCK'].rolling(window=3).mean()
    
    # 7. RSI
    delta = df['Close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ma_up = up.rolling(window=n).mean()
    ma_down = down.rolling(window=n).mean()
    rs = ma_up / (ma_down + 1e-8)
    features['RSI'] = 100 - (100 / (1 + rs))
    
    # 8. Larry Williams %R
    features['WILLIAMS_R'] = ((high_max - df['Close']) / (high_max - low_min)) * (-100)
    
    # 9. A/D Oscillator
    clv = ((df['Close'] - df['Low']) - (df['High'] - df['Close'])) / (df['High'] - df['Low'] + 1e-8)
    features['AD'] = (clv * df['Volume']).cumsum()
    
    # 10. Commodity Channel Index (CCI)
    tp = (df['High'] + df['Low'] + df['Close']) / 3
    features['CCI'] = (tp - tp.rolling(n).mean()) / (0.015 * tp.rolling(n).std() + 1e-8)
    
    return features.dropna()

Testing và Kết quả đạt được

Nghiên cứu áp dụng quy trình kiểm định nghiêm ngặt: Đánh giá sai số hồi quy trên tập kiểm tra (Test Set) và mô phỏng giao dịch danh mục đa dạng hóa cổ phiếu.

1. So sánh năng lực dự báo mô hình

Mô hình LSTM vượt trội hoàn toàn so với mô hình ARIMA truyền thống trên cả tiêu chí phương sai sai số và khả năng đoán đúng xu hướng biến động giá:

Tiêu chí Đánh giá Mô hình LSTM (Đề xuất) Mô hình ARIMA(1, d, 1) Cải thiện (%)
Mean Squared Error (MSE) 0.00142 0.00389 $\downarrow$ 63.50%
Root Mean Squared Error (RMSE) 0.03768 0.06237 $\downarrow$ 39.58%
Hit Accuracy (Đoán đúng chiều) 58.45% 50.12% $\uparrow$ +8.33%

2. Kết quả giả lập giao dịch trên dữ liệu thực tế

Chiến lược giao dịch: Lựa chọn $n$ cổ phiếu có tỷ suất sinh lời dự báo cao nhất để giải ngân định kỳ, áp dụng mức phí giao dịch thực tế là 0.20%/lệnh.

Danh mục ($n$ Cổ phiếu) Lợi nhuận tích lũy LSTM (%) Lợi nhuận Mean - Variance (%) Lợi nhuận Buy & Hold (%) Giá trị $p$-value ($t$-test)
Danh mục $n = 1$ 148.32% 82.15% 45.20% $p < 0.01$
Danh mục $n = 2$ 132.50% 76.40% 45.20% $p < 0.01$
Danh mục $n = 3$ 121.18% 71.85% 45.20% $p < 0.05$
Danh mục $n = 4$ 110.65% 68.20% 45.20% $p < 0.05$
Danh mục $n = 5$ 104.90% 65.10% 45.20% $p < 0.05$

Kết quả kiểm định $t$-test khẳng định mức sinh lời vượt trội của danh mục dựa trên LSTM có ý nghĩa thống kê rõ rệt ($p < 0.05$), bác bỏ giả thuyết thị trường hiệu quả dạng yếu đối với nhóm cổ phiếu nghiên cứu trên sàn HOSE.


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

  1. Bảo toàn thông tin liên tục từ 10 chỉ báo kỹ thuật: Khác biệt với các nghiên cứu trước đây (như Sang & Pierro, 2019 - nhị phân hóa chỉ báo thành $0/1$ gây mất mát thông tin), đề tài giữ nguyên miền giá trị liên tục và chuẩn hóa theo độ biến động, giúp mạng nơ-ron khai thác toàn diện cường độ của tín hiệu thị trường.
  2. Khắc phục triệt để hiện tượng Vanishing Gradient: Cấu trúc LSTM với cơ chế 3 cổng kiểm soát dòng thông tin Cell State cho phép mô hình học được các tương quan phụ thuộc dài hạn qua chuỗi 30 ngày giao dịch mà các mạng RNN truyền thống không thể thực hiện.
  3. Cầu nối giữa Khoa học dữ liệu và Tài chính định lượng: Đề tài không dừng lại ở việc dự báo chỉ số thống kê đơn thuần mà trực tiếp xây dựng hệ thống backtesting danh mục hoàn chỉnh, tính toán chi phí trượt giá và kiểm định sự vượt trội bằng phương pháp phân tích phương sai thống kê ($t$-test).

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

Kịch bản ứng dụng trong thực tế

  • Hệ thống cảnh báo sớm và gợi ý danh mục (Trading Advisory System): Tích hợp vào các nền tảng môi giới của công ty chứng khoán để cung cấp danh sách Top cổ phiếu tiềm năng định kỳ cho khách hàng.
  • Quỹ đầu tư định lượng (Quantitative Hedge Fund): Sử dụng làm mô hình thành phần (alpha factor) trong hệ thống giao dịch tự động đa mô hình (Ensemble Trading Architecture).

Yêu cầu triển khai hạ tầng kỹ thuật

  • Phần cứng: Tối thiểu 16GB RAM, CPU 8 Cores, khuyến nghị GPU NVIDIA RTX 3060 hoặc tương đương để tái huấn luyện mô hình định kỳ (Re-training).
  • Môi trường: Linux Ubuntu 20.04 LTS, Docker Container, Python 3.8+ Runtime.
  • Chi phí & ROI: Triển khai giải pháp mã nguồn mở trên hạ tầng Cloud (AWS/GCP) ước tính khoảng $100 - $200/tháng, mang lại tiềm năng gia tăng hiệu suất đầu tư danh mục từ 15% - 30%/năm so với chiến lược thụ động.

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

  • Hạn chế kỹ thuật: Mô hình chỉ khai thác dữ liệu giá và khối lượng lịch sử, chưa nắm bắt được các sự kiện bất khả kháng (Black Swan events), chính sách thay đổi lãi suất bất ngờ hoặc tin đồn doanh nghiệp.
  • Thời gian huấn luyện: Kiến trúc Deep Learning phức tạp đòi hỏi thời gian huấn luyện tương đối lớn khi mở rộng quy mô lên toàn bộ hơn 400 mã cổ phiếu sàn HOSE.
  • Hướng phát triển đề xuất:
    • Tích hợp cơ chế Attention Mechanism và Transformer Architecture (như Temporal Fusion Transformer) để gia tăng khả năng nắm bắt bối cảnh dài hạn.
    • Ứng dụng Xử lý ngôn ngữ tự nhiên (FinBERT) phân tích cảm xúc mạng xã hội và báo cáo tài chính nhằm xây dựng mô hình đa phương thức (Multimodal Deep Learning).

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

  • Sinh viên & Học viên: Tài liệu tham khảo chuẩn mực về cách thiết kế thực nghiệm, tiền xử lý dữ liệu tài chính và áp dụng mô hình Deep Learning trong phân tích định lượng.
  • Kỹ sư AI & Quantitative Developers: Bộ khung mã nguồn sạch, kiến trúc mô hình tối ưu cho dữ liệu chuỗi thời gian nhiều chiều (Multivariate Time Series).
  • Nhà đầu tư & Tổ chức tài chính: Cung cấp bằng chứng định lượng rõ ràng về việc ứng dụng AI nhằm nâng cao tỷ suất sinh lời và quản trị rủi ro danh mục tại thị trường chứng khoán Việt Nam.

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

1. Yêu cầu cấu hình phần cứng tối thiểu để triển khai và chạy mô hình là gì?

Hệ thống cần tối thiểu CPU 4 nhân, 8GB RAM để thực hiện suy luận (Inference). Để huấn luyện lại toàn bộ mô hình cho 70 mã cổ phiếu với 10 chỉ báo qua 10 năm dữ liệu, khuyến nghị sử dụng GPU có từ 6GB VRAM (như NVIDIA GTX 1660 hoặc RTX 3060) để rút ngắn thời gian huấn luyện xuống dưới 30 phút.

2. Tại sao mô hình lại sử dụng dữ liệu liên tục thay vì nhị phân hóa các chỉ báo kỹ thuật?

Nhị phân hóa tín hiệu kỹ thuật (ví dụ RSI > 70 chuyển thành 1, ngược lại là 0) làm triệt tiêu hoàn toàn thông tin về cường độ xung lực thị trường. Giữ nguyên giá trị liên tục giúp mạng nơ-ron học được độ phân kỳ chính xác và mức độ quá mua/quá bán thực tế của tài sản.

3. Mô hình xử lý chi phí giao dịch và thuế như thế nào trong bài toán giả lập?

Trong quá trình backtesting, mô hình trừ trực tiếp tỷ lệ chi phí giao dịch và thuế thực tế (0.20% trên giá trị mỗi lệnh mua và bán). Lợi nhuận tích lũy được báo cáo là lợi nhuận thuần (Net Return) sau khi đã khấu trừ đầy đủ chi phí.

4. Cơ chế chống quá khớp (Overfitting) được triển khai ra sao?

Nghiên cứu sử dụng đồng thời hai lớp Dropout (tỷ lệ ngắt kết nối ngẫu nhiên 20%) giữa các tầng LSTM, kết hợp kỹ thuật Early Stopping dựa trên Validation Loss để ngăn chặn mô hình học vẹt các nhiễu ngẫu nhiên trong dữ liệu lịch sử.

5. Khả năng mở rộng quy mô (Scalability) của hệ thống khi tăng số lượng mã cổ phiếu?

Cấu trúc module hóa cho phép mô hình huấn luyện độc lập hoặc song song (Parallel Training) cho hàng trăm mã cổ phiếu khác nhau trên sàn HOSE/HNX. Hệ thống có thể dễ dàng đóng gói thành các microservices xử lý phân tán qua Celery hoặc Kubernetes.


Kết luận

Đề tài khóa luận tốt nghiệp "Ứng Dụng Học Máy và Học Sâu Trong Dự Đoán Giá Cổ Phiếu Tại Thị Trường Việt Nam" đã chứng minh tính khả thi và hiệu quả vượt trội của việc kết hợp mạng nơ-ron LSTM với 10 chỉ báo phân tích kỹ thuật dạng liên tục. Mô hình không chỉ giảm thiểu sai số MSE tới 63.50% so với mô hình ARIMA truyền thống mà còn đem lại lợi nhuận tích lũy vượt bậc (đạt tới 148.32% ở danh mục $n = 1$) qua kiểm định $t$-test nghiêm ngặt. Đây là minh chứng khoa học vững chắc khẳng định tiềm năng ứng dụng của Trí tuệ Nhân tạo trong lĩnh vực đầu tư tài chính tại Việt Nam, mở ra triển vọng phát triển các hệ thống giao dịch tự động thông minh trong tương lai.