Kết quả mô hình SARIMAX
Dưới đây là kết quả từ mô hình SARIMAX được huấn luyện để dự đoán giá đóng cửa (Close) của một tập dữ liệu với 46 quan sát.
Thông tin chung về mô hình
- Mô hình: ARIMA(5, 1, 0)
- Số quan sát: 46
- Log Likelihood: -292.937
- AIC: 597.873
- BIC: 608.713
- HQIC: 601.914
Hệ số ước lượng
Hệ số | Giá trị | Sai số chuẩn | Z-score | P-value | 95% CI (dưới) | 95% CI (trên) |
---|---|---|---|---|---|---|
ar.L1 | -0.1720 | 0.126 | -1.370 | 0.171 | -0.418 | 0.074 |
ar.L2 | -0.2766 | 0.185 | -1.494 | 0.135 | -0.640 | 0.086 |
ar.L3 | 0.0590 | 0.199 | 0.297 | 0.767 | -0.331 | 0.449 |
ar.L4 | 0.0135 | 0.214 | 0.063 | 0.950 | -0.406 | 0.433 |
ar.L5 | 0.0103 | 0.180 | 0.057 | 0.955 | -0.343 | 0.364 |
sigma² | 29,100 | 6820.258 | 4.267 | 0.000 | 15,700 | 42,500 |
Các kiểm định thống kê
- Ljung-Box (Q-test): Kiểm định tính độc lập của phần dư
- Giá trị Q: 1.47
- P-value: 0.22 (Không có bằng chứng mạnh về sự tự tương quan)
- Jarque-Bera (JB-test): Kiểm định phần dư có tuân theo phân phối chuẩn không
- Giá trị JB: 0.04
- P-value: 0.98 (Không bác bỏ giả thuyết phần dư tuân theo phân phối chuẩn)
- Heteroskedasticity (H-test): Kiểm định phương sai phần dư có thay đổi theo thời gian không
- Hệ số H: 0.78
- P-value: 0.63 (Không có bằng chứng về phương sai không đồng nhất)
- Skewness: 0.07 (Phần dư không bị lệch nhiều)
- Kurtosis: 2.96 (Gần với phân phối chuẩn có kurtosis = 3)
Nhận xét
- Các hệ số AR (tự hồi quy) có ý nghĩa thống kê thấp (p-value > 0.05), cho thấy rằng mô hình có thể cần được tinh chỉnh.
- Giá trị sigma² cao cho thấy phần dư có mức độ biến động lớn.
- Không có dấu hiệu của tự tương quan mạnh hay phương sai không đồng nhất.
- Phần dư có vẻ tuân theo phân phối chuẩn dựa trên kiểm định JB.
Cần tinh chỉnh gì?
1. Kiểm tra bậc của mô hình ARIMA
- Mô hình hiện tại sử dụng ARIMA(5,1,0), có thể kiểm tra các mô hình khác như ARIMA(1,1,1) hoặc ARIMA(2,1,2) để xem liệu có cải thiện không.
- Sử dụng tiêu chí AIC/BIC để chọn mô hình tối ưu.
2. Tối ưu hóa dựa trên AIC và BIC
- AIC (Akaike Information Criterion) và BIC (Bayesian Information Criterion) là hai chỉ số quan trọng để so sánh các mô hình ARIMA.
- Nguyên tắc chung:
- Chọn mô hình có giá trị AIC/BIC thấp nhất.
- AIC ưu tiên độ khớp của mô hình, trong khi BIC ưu tiên tính đơn giản (ít tham số hơn).
- Nếu AIC và BIC cho kết quả khác nhau, nên xem xét thêm yếu tố overfitting. Nếu AIC thấp nhưng BIC cao, mô hình có thể đang bị overfitting (khớp quá mức với dữ liệu huấn luyện), khi đó nên chọn mô hình đơn giản hơn.
- Để cả AIC và BIC đều nhỏ, cần cân bằng giữa số lượng tham số và độ khớp mô hình. Điều này có thể đạt được bằng cách:
- Thử nghiệm các giá trị (p, d, q) khác nhau để tìm ra mô hình tối ưu.
- Giảm số bậc của mô hình nếu cần thiết để tránh quá nhiều tham số (tránh overfitting).
- Loại bỏ các hệ số không có ý nghĩa thống kê (p-value cao) để làm mô hình gọn hơn.
- Xem xét biến ngoại sinh (SARIMAX) nếu có các yếu tố tác động đến chuỗi thời gian.
3. Kiểm tra tính dừng của dữ liệu
- Đảm bảo rằng chuỗi dữ liệu thực sự cần sai phân bậc 1 (d=1).
- Sử dụng kiểm định ADF (Augmented Dickey-Fuller) để kiểm tra tính dừng.
4. Xem xét thành phần MA (Trung bình trượt)
- Hiện tại mô hình chưa có phần MA (q=0), có thể kiểm tra xem thêm phần tử MA giúp cải thiện dự đoán không.
5. Kiểm tra hiệu suất trên tập kiểm tra
- Chia dữ liệu thành tập huấn luyện và kiểm tra để đánh giá hiệu suất mô hình.
- Sử dụng RMSE (Root Mean Squared Error) để đánh giá.
6. Xem xét các yếu tố ngoại sinh (SARIMAX)
- Nếu có yếu tố tác động như chỉ số kinh tế, lãi suất, khối lượng giao dịch, có thể thêm vào mô hình dưới dạng biến ngoại sinh.
👉 Bước tiếp theo: Kiểm tra lại mô hình với các giá trị (p,d,q) khác nhau, thêm yếu tố MA nếu cần, tối ưu AIC/BIC và đánh giá mô hình trên tập kiểm tra.
Code tối ưu mô hình ARIMA
import itertools
import pandas as pd
import statsmodels.api as sm
# Dữ liệu giả định
data = pd.read_csv('data.csv', index_col=0, parse_dates=True)
train = data['Close']
# Tạo danh sách giá trị p, d, q
p = d = q = range(0, 5)
pdq = list(itertools.product(p, d, q))
best_aic, best_bic, best_params = float('inf'), float('inf'), None
for param in pdq:
try:
model = sm.tsa.ARIMA(train, order=param)
results = model.fit()
if results.aic < best_aic and results.bic < best_bic:
best_aic, best_bic, best_params = results.aic, results.bic, param
except:
continue
print(f'Mô hình tối ưu: ARIMA{best_params}, AIC: {best_aic}, BIC: {best_bic}')
Code trên sẽ tự động tìm mô hình có AIC và BIC thấp nhất bằng cách thử nghiệm các giá trị (p,d,q) khác nhau.