ARIMA trong đầu tư: dùng được ở đâu và vì sao dễ thất bại khi thị trường đổi chế độ?
ARIMA trong đầu tư
ARIMA thường được giới thiệu như một mô hình dự báo chuỗi thời gian, nên phản xạ đầu tiên rất dễ là lấy giá VN-Index, FPT hay HPG rồi hỏi “ngày mai giá bao nhiêu?”. Trong đầu tư, đó lại không phải cách dùng ARIMA hiệu quả nhất. Giá cổ phiếu thường chứa trend, structural break và rất nhiều noise; còn daily return của cổ phiếu lớn lại thường có autocorrelation khá yếu. ARIMA chỉ thực sự có giá trị khi chuỗi có một cấu trúc thời gian đủ ổn định để quá khứ còn mang thông tin cho tương lai. Vì vậy, thay vì dùng ARIMA như một “máy dự báo giá”, nên xem nó như một công cụ để khai thác mean-reversion, persistence, spread, basis, lãi suất, thanh khoản hoặc những biến đã được biến đổi về dạng ổn định hơn.

1. Trong đầu tư, ARIMA hợp với “chuỗi có hành vi” hơn là “giá đang tăng”
Một cổ phiếu tăng từ 50 lên 80 rồi 120 có thể khiến ARIMA fit rất đẹp trên price level, nhưng điều đó chưa tạo ra edge. Giá ngày mai gần giá hôm nay vốn đã là một baseline rất mạnh. Nếu model dự báo FPT ngày mai 121 trong khi hôm nay là 120, chưa chắc có bất kỳ thông tin đầu tư nào trong con số đó.
Chuỗi đáng nghiên cứu hơn là những chuỗi có xu hướng quay về một mức tương đối ổn định. Ví dụ spread giữa hai tài sản có quan hệ kinh tế, futures basis, chênh lệch lợi suất hoặc một số chỉ báo liquidity. Giả sử có spread:
spread = price_A - beta * price_BNếu spread bình thường dao động quanh 0 nhưng hôm nay lên +2.5 độ lệch chuẩn, câu hỏi đầu tư trở nên rõ hơn: spread có xu hướng quay về mức cân bằng hay không? Đây là bài toán phù hợp với ARIMA hơn nhiều so với “HPG ngày mai tăng hay giảm”.
Có thể kiểm tra nhanh:
from statsmodels.tsa.stattools import adfuller
result = adfuller(spread.dropna())
print("ADF:", result[0])
print("p-value:", result[1])Nếu spread tương đối stationary, có thể fit ARIMA:
from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(
spread,
order=(2, 0, 1)
)
fit = model.fit()
forecast = fit.forecast(steps=5)
print(forecast)Giả sử spread hiện tại là 2.4 và model dự báo:
T+1 1.95
T+2 1.52
T+3 1.20
T+4 0.98
T+5 0.83ARIMA lúc này không nói “mua cổ phiếu A”. Nó đang cho một hypothesis cụ thể hơn: chênh lệch hiện tại có xác suất thu hẹp trong vài phiên tới. Strategy có thể được thiết kế long tài sản đang rẻ tương đối và short tài sản đang đắt tương đối, nếu thị trường cho phép triển khai.
Ở Việt Nam, ý tưởng tương tự có thể áp dụng cho những bài toán như chênh lệch futures–spot, một số spread lãi suất, basis giữa các kỳ hạn hoặc các chuỗi có cấu trúc mean-reverting. Với cổ phiếu cơ sở, ARIMA có thể đóng vai trò feature hoặc forecast component thay vì trực tiếp quyết định Buy/Sell.
Ví dụ thay vì:
signal = forecast_price > current_pricecó thể dùng:
expected_change = forecast - current_value
signal = (
(expected_change > threshold)
& (liquidity_ok)
& (market_regime_ok)
)Một forecast chỉ được sử dụng khi expected move đủ lớn để vượt transaction cost và các điều kiện thị trường khác.
Điểm quan trọng là ARIMA phải cạnh tranh với một baseline rất đơn giản. Với return, baseline có thể chỉ là:
forecast = 0Với price level:
forecast_t1 = price_tNếu ARIMA không đánh bại được baseline ngoài mẫu, việc thêm ARIMA vào trading system chưa tạo thêm giá trị.
2. ARIMA có thể đang đúng hôm qua nhưng sai hoàn toàn hôm nay khi regime thay đổi
Đây mới là điểm quan trọng nhất khi áp dụng ARIMA vào đầu tư.
Giả sử trong hai năm một spread vận động như sau:
Mean = 0
Std = 1.0Mỗi khi spread lên +2, nó thường quay về 0. Strategy mean-reversion hoạt động khá tốt. ARIMA học được cấu trúc đó và liên tục forecast spread giảm sau những lần tăng mạnh.
Sau đó xảy ra một thay đổi về chính sách, cấu trúc thanh khoản hoặc hành vi của thị trường. Mean mới trở thành:
Mean = 3
Std = 1.5Spread đang ở 3.5 nhưng model cũ vẫn nghĩ mức cân bằng là 0. Nó liên tục dự báo giảm mạnh.
Trader nhìn model:
Spread hiện tại 3.5
ARIMA forecast 1.5và mở một mean-reversion trade.
Nhưng spread mới đang dao động bình thường quanh 3.
Strategy không thua vì ARIMA “tệ”. Nó thua vì mức cân bằng của thị trường đã thay đổi nhưng model vẫn sống trong regime cũ.
Trong đầu tư, điều này xảy ra thường xuyên hơn nhiều so với dữ liệu công nghiệp hay những chuỗi có cấu trúc tương đối cố định.
Một regime có thể thay đổi theo trend. Thị trường đang sideway rồi chuyển sang bull market. Một quan hệ mean-reversion có thể biến thành momentum. Autocorrelation có thể từ âm chuyển sang dương.
Ví dụ:
Giai đoạn A
Return_t ≈ -0.30 × Return_t-1Nghĩa là tăng hôm nay thường đi kèm điều chỉnh ngày sau.
Sau đó:
Giai đoạn B
Return_t ≈ +0.25 × Return_t-1Tăng hôm nay lại có xu hướng tiếp diễn.
Nếu fit một AR(1) trên toàn bộ hai giai đoạn:
Coefficient ≈ 0kết luận sẽ là “return không có structure”.
Nhưng thực tế không phải không có structure. Structure đã đổi dấu.
Đó là lý do với đầu tư, ARIMA không nên được fit một lần rồi sử dụng nhiều năm. Có thể theo dõi rolling autocorrelation:
rolling_acf = (
returns
.rolling(120)
.apply(lambda x: x.autocorr(lag=1))
)Nếu biểu đồ chuyển:
-0.20
-0.15
-0.08
0.02
+0.12
+0.18model mean-reversion đang bước sang một môi trường hoàn toàn khác.
Volatility cũng là một regime. Một model được fit trong giai đoạn thị trường dao động khoảng 0.8%/ngày rất dễ thất bại khi volatility lên 2–3%/ngày. Forecast mean có thể chưa sai quá nhiều nhưng confidence interval, stop-loss và position sizing đều trở nên không phù hợp.
Có thể theo dõi:
vol60 = returns.rolling(60).std()và chia đơn giản:
df["regime"] = np.where(
df["vol60"] > df["vol60"].rolling(252).median(),
"High Vol",
"Low Vol"
)Sau đó đo sai số ARIMA theo regime:
df["error"] = abs(
df["actual"] - df["forecast"]
)
print(
df.groupby("regime")["error"].mean()
)Ví dụ:
Low Vol MAE = 0.72
High Vol MAE = 1.48Kết quả này có ý nghĩa đầu tư hơn một con số MAE duy nhất cho toàn bộ sample. Nó nói rằng model hoạt động khá ổn trong low-vol regime nhưng mất đáng kể độ chính xác khi thị trường biến động mạnh.
Strategy có thể từ đó thiết kế một rule rất đơn giản:
if regime == "High Vol":
position_size *= 0.5hoặc thậm chí:
if regime == "High Vol":
signal = 0ARIMA lúc này không còn là một model độc lập. Nó trở thành một thành phần của trading system có điều kiện theo regime.
3. Cách dùng ARIMA thực tế hơn trong một hệ thống đầu tư
Một workflow hợp lý không nên bắt đầu bằng câu hỏi “p bằng bao nhiêu, q bằng bao nhiêu?”. Nên bắt đầu từ hypothesis đầu tư.
Ví dụ:
“Basis giữa futures và spot có xu hướng quay về mức cân bằng trong vài phiên sau khi lệch quá mạnh.”
Từ hypothesis đó mới kiểm tra dữ liệu:
Basis có stationary không?
↓
Có autocorrelation không?
↓
Relationship có ổn định qua nhiều năm không?
↓
ARIMA có đánh bại naive forecast không?
↓
Forecast có đủ lớn sau transaction cost không?Giả sử basis:
basis = futures_price - spot_priceCó thể tạo rolling model:
from statsmodels.tsa.arima.model import ARIMA
window = 252
predictions = []
for i in range(window, len(basis)):
train = basis.iloc[
i-window:i
]
model = ARIMA(
train,
order=(2, 0, 1)
).fit()
prediction = model.forecast(1).iloc[0]
predictions.append(prediction)Sử dụng 252 phiên gần nhất thay vì toàn bộ lịch sử giúp model thích nghi với cấu trúc mới nhanh hơn.
Sau đó chuyển forecast thành expected move:
expected_move = prediction - current_basisNhưng không giao dịch mọi forecast.
Ví dụ:
if (
abs(expected_move) > transaction_cost_buffer
and regime_is_stable
and liquidity_is_good
):
trade = TrueNhư vậy trading system không dựa vào ARIMA một cách tuyệt đối. Forecast chỉ là một input.
Một cách dùng khác rất thực tế là forecast liquidity hoặc market activity. Ví dụ turnover, volume hoặc một số liquidity series có thể có autocorrelation rõ hơn return. Nếu có thể dự báo phiên nào thanh khoản thấp, strategy có thể giảm size hoặc tránh triển khai những lệnh cần liquidity lớn.
ARIMA cũng có thể dùng như một baseline model trước khi nhảy sang XGBoost, LSTM hay Transformer. Nếu một deep-learning model chỉ tốt hơn ARIMA một chút trên Test Set, nhưng tốn hàng chục lần độ phức tạp và rất nhạy với hyperparameter, chưa chắc nó đáng để đưa vào production.
Ví dụ:
Naive Forecast MAE 1.00
ARIMA MAE 0.91
XGBoost MAE 0.89
LSTM MAE 0.88Nhìn riêng metric, LSTM tốt nhất. Nhưng sau phí, instability và retraining cost, khác biệt 0.03 so với ARIMA có thể không có ý nghĩa kinh tế.
Một cách kiểm tra quan trọng nữa là parameter stability. Có thể fit AR(1) từng năm:
2019 φ = -0.28
2020 φ = -0.24
2021 φ = -0.19
2022 φ = +0.06
2023 φ = +0.21
2024 φ = +0.17Nếu hệ số đổi từ âm sang dương, không nên tiếp tục dùng một model mean-reversion chỉ vì backtest 2019–2021 rất đẹp.
Trong production, có thể monitor:
Rolling Forecast Error
Rolling Autocorrelation
Rolling Mean
Rolling Volatility
AR/MA Coefficient
Residual Autocorrelation
Trading P&LKhi các biến này thay đổi mạnh cùng lúc, model có thể đang đối diện structural break.
ARIMA cũng không nhất thiết phải tự giải quyết mọi thứ. Nếu mean có autocorrelation nhưng volatility clustering mạnh, có thể dùng:
ARIMA → Conditional Mean
GARCH → Conditional VolatilityNếu có seasonality rõ:
SARIMANếu relationship giữa nhiều series quan trọng:
VAR / VECMNếu regime thay đổi liên tục và cần model linh hoạt hơn, có thể chuyển sang state-space, change-point detection hoặc regime-switching model.
Nhưng ARIMA vẫn có một lợi thế lớn: nó buộc người làm đầu tư phải kiểm tra xem quá khứ thực sự chứa information gì trước khi đưa thêm Machine Learning vào.
Một pipeline đầu tư thực tế có thể là:
Market Data
→ Chọn chuỗi có ý nghĩa kinh tế
→ Stationarity / ACF
→ ARIMA Forecast
→ Regime Filter
→ Liquidity Filter
→ Transaction Cost
→ Position Sizing
→ Walk-forward Backtest
→ Paper TradingKhi đó ARIMA chỉ chiếm một phần nhỏ trong hệ thống, nhưng là phần có nhiệm vụ cụ thể: ước lượng component của chuỗi có thể dự báo được từ quá khứ.
Điểm quan trọng nhất khi dùng ARIMA trong đầu tư không phải dự báo đúng từng con số. Một forecast basis từ 2.4 xuống 1.6 nhưng thực tế xuống 1.8 vẫn có thể tạo trade đúng hướng. Ngược lại, forecast giá cổ phiếu ngày mai 101.2 khi thực tế 101.1 có RMSE rất đẹp nhưng chẳng mang lại lợi nhuận nếu transaction cost lớn hơn expected move.
Vì vậy nên đánh giá ARIMA bằng hai lớp. Lớp thứ nhất là forecasting: MAE, RMSE, residual, autocorrelation. Lớp thứ hai mới là đầu tư: hit rate, expected return, Sharpe, drawdown, turnover và P&L sau chi phí.
ARIMA có thể không phải mô hình hấp dẫn nhất để dự báo trực tiếp cổ phiếu. Nhưng nó rất hữu ích để trả lời một câu hỏi nền tảng hơn: chuỗi này còn giữ một cấu trúc có thể khai thác được hay thị trường đã chuyển sang một chế độ khác?
Nếu câu trả lời là cấu trúc vẫn ổn định, ARIMA có thể là một model đơn giản nhưng hiệu quả. Nếu regime đã đổi, điều quan trọng không phải cố tối ưu thêm (p,d,q), mà là nhận ra model đang mô tả một thị trường không còn tồn tại nữa.
