Bài viết gần đây
| Bài 3: Huấn Luyện Mô Hình XGBoost Dự Đoán Xu Hướng Giá Trong Giao Dịch Định Lượng
Được viết bởi thanhdt vào ngày 08/06/2026 lúc 21:12 | 45 lượt xem
Chào mừng bạn trở lại với chuỗi bài viết “Xây Dựng Hệ Thống Machine Learning Trading Chuyên Nghiệp” của DNT Academy.
Ở Bài 2, chúng ta đã chế biến thành công bộ dữ liệu thô (OHLCV) từ MT5 thành các đặc trưng chỉ báo kỹ thuật chất lượng (SMA, EMA, RSI, MACD, Lag Features). Hôm nay, chúng ta sẽ bước vào giai đoạn hấp dẫn nhất: Huấn luyện mô hình học máy để dự báo xu hướng thị trường.
Thuật toán được chọn mặt gửi vàng hôm nay là XGBoost (Extreme Gradient Boosting) – vị vua không vương miện trong việc xử lý dữ liệu dạng bảng (Tabular Data) và chuỗi thời gian tài chính.
1. Tại Sao Lại Chọn XGBoost Cho Trading?
Trong tài chính, mối quan hệ giữa các biến chỉ báo và biến động giá là phi tuyến tính và cực kỳ phức tạp. Các mô hình tuyến tính đơn giản như Linear Regression thường bị “underfit” (không học hết được quy luật). Ngược lại, Deep Learning thường quá phức tạp và dễ rơi vào bẫy “overfitting” (học vẹt nhiễu thị trường).
XGBoost giải quyết hoàn hảo cả hai vấn đề:
* Hiệu năng vượt trội: Xây dựng trên nền tảng cây quyết định (Decision Trees) nâng cấp bằng kỹ thuật Boosting, giúp nắm bắt nhanh các mối quan hệ phi tuyến tính.
* Cơ chế chống quá khớp (Regularization): Tích hợp sẵn L1 (Lasso) và L2 (Ridge) phạt các trọng số cây quá lớn, hạn chế tối đa việc mô hình học theo nhiễu (noise) của thị trường.
* Tốc độ & Tính linh hoạt: Tốc độ tính toán song song cực nhanh, xử lý dữ liệu khuyết thiếu (NaN) cực tốt.
2. Thiết Kế Biến Mục Tiêu (Target Variable) Cho Mô Hình
Một sai lầm kinh điển của người mới học là dự đoán trực tiếp giá đóng cửa (Close Price) ngày mai. Giá tài chính biến động không ngừng và chịu ảnh hưởng bởi quá nhiều nhiễu ngẫu nhiên.
[!TIP]
Tư duy của Quant: Đơn giản hóa bài toán! Thay vì dự đoán giá ngày mai tăng đến số thập phân nào, chúng ta hãy dự đoán hướng đi của giá (Direction):
* $Y = 1$ (Tăng): Giá đóng cửa ngày mai cao hơn giá đóng cửa hôm nay.
* $Y = 0$ (Giảm/Không tăng): Giá đóng cửa ngày mai thấp hơn hoặc bằng hôm nay.
Chúng ta biến bài toán hồi quy (Regression) phức tạp thành bài toán Phân loại nhị phân (Binary Classification) đơn giản và hiệu quả hơn rất nhiều.
import pandas as pd
import numpy as np
# Tạo biến mục tiêu Y (Dự đoán nến tiếp theo)
df['Target'] = (df['Close'].shift(-1) > df['Close']).astype(int)
# Bỏ dòng cuối cùng do dịch chuyển shift(-1) sẽ bị khuyết giá trị Target
df.dropna(inplace=True)
3. Phân Tách Dữ Liệu: TimeSeriesSplit Tránh Thiên Kiến Nhìn Trước
Nếu sử dụng hàm train_test_split ngẫu nhiên thông thường của thư viện Scikit-learn, bạn sẽ bị dính lỗi Look-ahead Bias (Thiên kiến nhìn trước tương lai). Đối với chuỗi thời gian, dữ liệu quá khứ phải dùng để dự đoán tương lai, bạn không thể dùng dữ liệu ngày mai để dạy mô hình đoán giá hôm qua.
Giải pháp: Sử dụng cơ chế phân tách lũy tiến theo thời gian TimeSeriesSplit (Walk-Forward Validation).
from sklearn.model_selection import TimeSeriesSplit
# Chọn các đặc trưng đầu vào (Features)
features = [
'MA5', 'MA10', 'MA20', 'MA50', 'Close_MA5_Ratio', 'Close_MA20_Ratio',
'RSI_14', 'MACD_12_26_9', 'MACD_Signal', 'Volatility_20',
'Volume_Ratio_5', 'Return_Lag1', 'Return_Lag2'
]
X = df[features]
y = df['Target']
# Thiết lập TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
4. Huấn Luyện Mô Hình XGBoost Bằng Python
Chúng ta sử dụng lớp XGBClassifier từ thư viện xgboost. Bạn có thể tinh chỉnh các siêu tham số (Hyperparameters) để chống overfitting như: max_depth (độ sâu của cây), learning_rate (tốc độ học), và n_estimators (số lượng cây).
import xgboost as xgb
from sklearn.metrics import classification_report, accuracy_score, precision_score
# Khởi tạo mô hình XGBoost với các tham số hạn chế Overfitting
model = xgb.XGBClassifier(
n_estimators=100,
max_depth=3, # Hạn chế độ sâu để tránh học vẹt
learning_rate=0.05,
subsample=0.8, # Sử dụng 80% tập dữ liệu ngẫu nhiên cho mỗi cây
colsample_bytree=0.8, # Sử dụng 80% đặc trưng ngẫu nhiên cho mỗi cây
random_state=42,
eval_metric='logloss'
)
# Chạy Backtest Walk-Forward qua 5 Fold thời gian
for fold, (train_idx, val_idx) in enumerate(tscv.split(X)):
X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
# Huấn luyện mô hình
model.fit(X_train, y_train)
# Dự đoán
preds = model.predict(X_val)
# Đánh giá sơ bộ từng Fold
acc = accuracy_score(y_val, preds)
precision = precision_score(y_val, preds)
print(f"Fold {fold+1} - Accuracy: {acc:.4f} | Precision: {precision:.4f}")
5. Đánh Giá Mô Hình: Tại Sao “Precision” Là Chỉ Số Sống Còn?
Trong giao dịch tài chính, chúng ta không cần mô hình đoán đúng mọi xu hướng (Accuracy cao). Cái chúng ta cần là khi mô hình báo lệnh Mua ($Y=1$), lệnh đó phải có xác suất thắng cao nhất.
- Accuracy (Độ chính xác tổng thể): Dễ bị bóp méo nếu thị trường có xu hướng quá mạnh (Trend).
- Precision (Độ chuẩn xác tín hiệu mua): $frac{text{True Positives}}{text{True Positives} + text{False Positives}}$.
- Ý nghĩa: Khi mô hình dự đoán giá tăng, thì thực tế có bao nhiêu lần giá thực sự tăng?
- Tầm quan trọng: Precision càng cao, bạn càng ít bị dính các tín hiệu mua giả (False Breakout), giảm thiểu tối đa các lệnh thua lỗ không đáng có.
# Xem báo cáo chi tiết cho Fold cuối cùng
print("n=== CHI TIẾT ĐÁNH GIÁ MÔ HÌNH ===")
print(classification_report(y_val, preds))
6. Đo Lường Mức Độ Quan Trọng Của Đặc Trưng (Feature Importance)
Một điểm mạnh khác của XGBoost là khả năng giải thích (Explainable AI). Bạn có thể dễ dàng xem đặc trưng nào đóng vai trò lớn nhất trong quyết định dự đoán của mô hình.
import matplotlib.pyplot as plt
# Lấy trọng số đặc trưng
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]
# Vẽ biểu đồ
plt.figure(figsize=(10, 6))
plt.title("Đặc trưng đóng đóng góp nhiều nhất vào Mô Hình XGBoost")
plt.bar(range(X.shape[1]), importances[indices], align="center")
plt.xticks(range(X.shape[1]), [features[i] for i in indices], rotation=45)
plt.tight_layout()
plt.show()
Nhìn vào biểu đồ này, bạn sẽ biết được mô hình của mình đang ra quyết định dựa trên Động lượng (RSI) hay dựa trên Biến động (Volatility) để liên tục tối ưu.
🎯 Kết luận & Bước tiếp theo
Bây giờ bạn đã sở hữu một bộ não AI hoàn chỉnh bằng XGBoost, tự tin dự báo xu hướng thị trường dựa trên cơ sở khoa học dữ liệu và thống kê vững chắc.
Bước tiếp theo của chúng ta là gì? Có mô hình dự đoán rồi, làm sao để sinh lệnh thực tế? Quản lý vốn ra sao?
Ở Bài 4, chúng ta sẽ đóng gói mô hình học máy này bằng joblib, đưa vào bộ khung robot Order Good (OG) kết hợp hệ thống Redis Message Queue để kích hoạt giao dịch tự động siêu tốc trên tài khoản Live.
🎓 LÀM CHỦ TOÀN BỘ HỆ THỐNG ALGO TRADING CHUYÊN NGHIỆP
Nếu bạn muốn sở hữu toàn bộ mã nguồn hệ thống phân tích Machine Learning Trading nâng cao, thiết kế hạ tầng bot giao dịch 3 thành phần (OG – OF – OM) chạy 24/7 và chiến lược Hedging giảm thiểu rủi ro tối đa, hãy đăng ký ngay khóa học:
👉 Lập trình Python nâng cao: Hedging & Gự động hóa giao dịch tại Hướng Nghiệp Dữ Liệu.
Đồng hành cùng bạn trên con đường trở thành một Algorithmic Trader thực thụ!