Chuỗi thời gian 5 — Prophet & Deep Learning
Chuỗi thời gian 5 — Prophet & Deep Learning
Sau khi đã nắm mô hình cổ điển ETS/ARIMA (Chuỗi thời gian 3) và tiếp cận feature + ML (Chuỗi thời gian 4), bài này bàn về hai nhánh "hiện đại" hay được nhắc tới: Prophet của Meta và deep learning cho chuỗi thời gian. Cả hai đều mạnh, nhưng cũng dễ bị dùng sai. Thông điệp xuyên suốt — và bạn nên khắc cốt ghi tâm — là: phức tạp hơn không đồng nghĩa với tốt hơn. Trên chuỗi đơn biến vài trăm điểm (đúng loại dữ liệu ngân hàng gặp hằng ngày), một SARIMA hay Holt-Winters chạy vài giây thường ngang bằng hoặc thắng một mạng LSTM huấn luyện hàng giờ. Cả hai công cụ dưới đây chỉ có ý nghĩa khi bạn luôn đặt chúng cạnh baseline (naive/seasonal-naive) và mô hình cổ điển.
1. Prophet — dự báo cộng tính dễ dùng
Prophet (Meta/Facebook mã nguồn mở) tiếp cận dự báo theo kiểu mô hình hồi quy cộng tính (additive regression) thay vì tự tương quan như ARIMA. Nó phân rã chuỗi thành ba thành phần cộng lại, cộng thêm nhiễu:
y(t) = g(t) + s(t) + h(t) + ε(t)
- g(t) — trend (xu hướng): đường tăng trưởng dài hạn. Prophet dùng trend tuyến tính từng khúc (piecewise linear) với các changepoint — điểm mà độ dốc thay đổi — được tự phát hiện; hoặc trend logistic bão hoà (có trần
cap) cho dữ liệu tăng trưởng có giới hạn. - s(t) — seasonality (mùa vụ): biểu diễn bằng chuỗi Fourier, cho phép chồng nhiều mùa vụ cùng lúc (tuần, năm) một cách mượt mà.
- h(t) — holiday/event: hiệu ứng của các ngày đặc biệt (lễ, Tết, sự kiện) do bạn khai báo.
- ε(t): nhiễu.
1.1. Vì sao Prophet dễ dùng
Prophet được thiết kế cho phân tích viên không chuyên về chuỗi thời gian, và điều đó thể hiện ở vài đặc điểm thực dụng:
- Không cần chuỗi dừng, không cần đọc ACF/PACF. Bạn đưa vào một DataFrame hai cột
ds(ngày) vày(giá trị), gọi.fit()rồi.predict(). - Chịu được missing và outlier khá tốt: dữ liệu thiếu vài ngày không làm nó gãy; các điểm bất thường ít kéo lệch trend nhờ trend từng khúc.
- Tự cho khoảng tin cậy (uncertainty interval) cho cả trend lẫn dự báo.
- Thành phần dễ diễn giải: vẽ được riêng trend, mùa vụ tuần, mùa vụ năm và hiệu ứng lễ — rất tiện khi trình bày với lãnh đạo nghiệp vụ.
# Minh hoa — KHONG danh dau chay duoc (day la Python)
import pandas as pd
from prophet import Prophet
# df co dung 2 cot: ds (datetime), y (gia tri)
m = Prophet(
seasonality_mode="multiplicative", # bien do mua vu tang theo muc
weekly_seasonality=True,
yearly_seasonality=True,
changepoint_prior_scale=0.05, # do "deo" cua trend, cang lon cang uon theo du lieu
interval_width=0.9, # khoang tin cay 90%
)
m.fit(df)
future = m.make_future_dataframe(periods=30) # du bao 30 ngay
fcst = m.predict(future)
# fcst co: yhat, yhat_lower, yhat_upper, trend, weekly, yearly...
1.2. Thêm ngày lễ Việt Nam
Đây là điểm rất giá trị cho dữ liệu ngân hàng Việt Nam: giao dịch, số dư, lượng hồ sơ biến động mạnh quanh Tết Nguyên đán, 30/4–1/5, Quốc khánh 2/9, Tết Dương lịch. Prophet cho khai báo ngày lễ dưới dạng DataFrame; mỗi lễ có thể có "cửa sổ" trước/sau (lower_window, upper_window) để bắt hiệu ứng lan toả (ví dụ giao dịch tăng vọt trước Tết vài ngày).
# Minh hoa — KHONG danh dau chay duoc (day la Python)
tet = pd.DataFrame({
"holiday": "tet_nguyen_dan",
"ds": pd.to_datetime(["2025-01-29", "2026-02-17"]), # mung 1 Tet AL
"lower_window": -7, # 7 ngay truoc Tet (rut tien, mua sam)
"upper_window": 5, # 5 ngay sau Tet (nghi le)
})
le_304 = pd.DataFrame({
"holiday": "30_4",
"ds": pd.to_datetime(["2025-04-30", "2026-04-30"]),
"lower_window": 0, "upper_window": 1,
})
holidays_vn = pd.concat([tet, le_304])
m = Prophet(holidays=holidays_vn, seasonality_mode="multiplicative")
m.fit(df)
Lưu ý: Tết theo âm lịch nên rơi vào ngày dương khác nhau mỗi năm — bạn phải liệt kê thủ công (hoặc dùng thư viện lịch âm) cho từng năm cả trong quá khứ (để mô hình học hiệu ứng) lẫn tương lai (để dự báo áp dụng). Đây là lỗi hay gặp: chỉ khai lễ cho quá khứ mà quên tương lai thì dự báo Tết sang năm sẽ sai bét.
1.3. Ưu / nhược và khi nào hợp
| Ưu điểm | Nhược điểm |
|---|---|
| Cực nhanh để có kết quả đầu tiên, ít cần chỉnh | Kém khi dữ liệu không dạng "trend + mùa vụ + lễ" |
| Thành phần diễn giải rõ ràng | Bỏ qua tự tương quan ngắn hạn (không có phần AR như ARIMA) |
| Chịu missing/outlier, khoảng tin cậy sẵn có | Hay overfit changepoint nếu changepoint_prior_scale quá lớn |
| Thêm lễ và biến ngoại sinh (regressor) dễ | Chỉ một chuỗi mỗi lần; nhiều chuỗi phải lặp thủ công |
Prophet hợp khi: dữ liệu có mùa vụ mạnh (tuần + năm), nhiều ngày lễ ảnh hưởng lớn, có lịch sử ≥ 1 năm (lý tưởng ≥ 2 năm để học mùa vụ năm), và bạn cần kết quả nhanh + dễ giải thích. Không hợp khi: chuỗi rất ngắn, chủ yếu là động lực tự tương quan ngắn hạn (ARIMA thắng), hay dữ liệu tần suất cao với cấu trúc phức tạp.
2. Deep learning cho chuỗi thời gian
Khi có nhiều chuỗi và quan hệ phi tuyến/dài hạn, deep learning bắt đầu có đất diễn. Ý tưởng chung: học một hàm ánh xạ từ cửa sổ đầu vào (một đoạn quá khứ độ dài L, gọi là lookback window) sang cửa sổ dự báo (horizon H).
2.1. RNN / LSTM / GRU — mạng có bộ nhớ chuỗi
RNN (Recurrent Neural Network) xử lý chuỗi tuần tự, mang một "trạng thái ẩn" (hidden state) từ bước này sang bước kế — tức là có bộ nhớ. RNN thuần bị vanishing gradient, khó nhớ phụ thuộc xa. LSTM (Long Short-Term Memory) và GRU (Gated Recurrent Unit) thêm các cổng (gate) để chọn giữ/quên thông tin, nhớ được phụ thuộc dài hạn hơn nhiều. Cơ chế chi tiết đã trình bày ở Deep Learning 5 — Chuỗi & RNN; ở đây chỉ nói cách áp dụng vào forecasting.
Với dự báo, ta thường xếp dữ liệu thành các cặp cửa sổ: đầu vào là L bước gần nhất (kèm feature như thứ trong tuần, cờ lễ), đầu ra là giá trị bước kế tiếp (one-step) hoặc H bước (multi-step).
2.2. Seq2seq — encoder/decoder cho dự báo nhiều bước
Với horizon dài, thay vì dự báo lặp một-bước (dễ tích luỹ lỗi), kiến trúc seq2seq dùng một encoder nén cả cửa sổ quá khứ thành vector ngữ cảnh, rồi một decoder sinh lần lượt H bước tương lai. Đây là cách bắt phụ thuộc dài giữa quá khứ và cả đoạn tương lai.
2.3. 1D-CNN và TCN
Không phải cứ chuỗi là phải hồi quy tuần tự. 1D-CNN trượt các bộ lọc convolution dọc theo trục thời gian để bắt mẫu hình cục bộ (motif). TCN (Temporal Convolutional Network) là CNN chuyên cho chuỗi với hai ý tưởng chính: causal convolution (chỉ nhìn quá khứ, không rò rỉ tương lai) và dilated convolution (giãn cách bộ lọc để mở rộng "tầm nhìn" theo cấp số mũ mà không tăng số lớp). TCN thường huấn luyện song song nhanh hơn RNN (không cần lan truyền tuần tự) và bắt phụ thuộc dài tốt.
2.4. Attention & Transformer cho chuỗi thời gian
Cơ chế attention cho mô hình "tập trung" vào các bước quá khứ quan trọng nhất cho một dự báo, bất kể khoảng cách — vượt qua giới hạn nhớ của RNN. Transformer (nền tảng của LLM, xem Deep Learning 6 — Transformers) dựa hoàn toàn vào self-attention và được thích nghi cho chuỗi thời gian.
- Temporal Fusion Transformer (TFT): kiến trúc chuyên cho forecasting, kết hợp LSTM cục bộ + attention, xử lý nhiều loại đầu vào (biến tĩnh như mã chi nhánh; biến động đã biết tương lai như lịch lễ; biến động chỉ biết quá khứ), và tự cho biết feature nào quan trọng (interpretability) cùng dự báo quantile.
- Mô hình nền tảng (foundation models) cho TS: gần đây xuất hiện các mô hình lớn huấn luyện trước trên khối chuỗi thời gian khổng lồ, hướng tới dự báo zero-shot (dự báo chuỗi mới mà không cần huấn luyện lại). Đây là hướng nghiên cứu đang phát triển; trên bài toán ngân hàng cụ thể, chúng chưa chắc thắng mô hình huấn luyện riêng và cần thẩm định kỹ trước khi tin.
2.5. DeepAR — dự báo xác suất trên nhiều chuỗi
DeepAR (Amazon) là mô hình tự hồi quy dựa trên RNN, huấn luyện trên toàn bộ tập nhiều chuỗi cùng lúc (global model) thay vì một mô hình mỗi chuỗi. Điểm mạnh: học được mẫu hình chung giữa các chuỗi (ví dụ hàng nghìn chi nhánh/khách hàng có hành vi tương tự), rất hữu ích với chuỗi ngắn hoặc thưa — thứ mà mô hình riêng lẻ không đủ dữ liệu. DeepAR xuất ra phân phối xác suất (không phải một con số), nên cho khoảng tin cậy trực tiếp.
3. Khi nào deep learning đáng dùng — và khi nào KHÔNG
Đây là phần quan trọng nhất của bài. Đừng chọn DL vì nó "hiện đại".
DL đáng cân nhắc khi HỘI TỤ nhiều yếu tố:
- Nhiều chuỗi (hàng trăm–hàng nghìn) chia sẻ mẫu hình chung → global model (DeepAR, TFT) học chéo giữa các chuỗi.
- Dữ liệu lớn, mỗi chuỗi đủ dài để mạng học được.
- Quan hệ phi tuyến hoặc phụ thuộc dài hạn phức tạp mà tuyến tính không nắm được.
- Nhiều biến ngoại sinh (covariate) đa dạng: lịch lễ, chiến dịch, biến vĩ mô, thuộc tính tĩnh của chuỗi.
- Có hạ tầng (GPU), năng lực MLOps để huấn luyện lại và giám sát (xem ML 8 — Triển khai & MLOps).
DL thường KHÔNG đáng dùng khi:
- Dữ liệu ít — một chuỗi vài trăm điểm. Đây là trường hợp phổ biến nhất ở ngân hàng, và mô hình cổ điển thường thắng: nhanh hơn trăm lần, không cần GPU, dễ diễn giải, ít overfit. Các cuộc thi M3/M4 nhiều lần cho thấy phương pháp thống kê (hoặc lai) đánh bại DL thuần trên dữ liệu đơn biến vừa và nhỏ.
- Cần diễn giải rõ ràng cho kiểm toán/nghiệp vụ — mô hình cộng tính hay tuyến tính minh bạch hơn.
- Team chưa có năng lực vận hành mô hình DL (tune, huấn luyện lại, theo dõi drift).
Trục hoành ẩn của sơ đồ là lượng dữ liệu tăng dần đi kèm độ phức tạp mô hình tăng dần: từ naive → ETS/ARIMA/Prophet → ML trên feature → deep learning. Đi lên tầng cao hơn chỉ chính đáng khi dữ liệu và bài toán thực sự đòi hỏi.
4. Dự báo xác suất & khoảng tin cậy
Một dự báo chỉ đưa ra một con số (point forecast) thường không đủ cho quyết định ngân hàng. "Ngày mai cần bao nhiêu tiền mặt ATM?" — trả lời "trung bình 200 triệu" thì vô dụng nếu 5% khả năng cần 400 triệu (hết tiền là sự cố). Ta cần khoảng hoặc phân phối.
- Prediction interval (khoảng dự báo): ví dụ khoảng 90% — dự báo thực tế sẽ rơi vào đây với xác suất 90%. ARIMA/ETS/Prophet đều xuất được.
- Quantile forecasting: thay vì dự báo trung bình, dự báo trực tiếp các phân vị (P10, P50, P90...). Huấn luyện với pinball/quantile loss. TFT và các mô hình DL hiện đại hỗ trợ tự nhiên. Rất hợp cho bài toán tồn quỹ: chọn P95 cho lượng tiền tiếp quỹ để an toàn.
- Phân phối đầy đủ: DeepAR cho phân phối xác suất trọn vẹn, lấy mẫu ra được bất kỳ phân vị nào.
Điểm mấu chốt: luôn đánh giá cả chất lượng khoảng (coverage — khoảng 90% có thật sự chứa 90% quan sát không?) chứ không chỉ điểm dự báo. Chi tiết chỉ số ở Chuỗi thời gian 6 — Đánh giá.
# Minh hoa — KHONG danh dau chay duoc (day la PyTorch, sketch quantile loss)
import torch
def pinball_loss(y_true, y_pred, q):
# y_pred la du bao phan vi thu q (vd q=0.9)
e = y_true - y_pred
return torch.max(q * e, (q - 1) * e).mean()
# Huan luyen dong thoi nhieu phan vi: P10, P50, P90
quantiles = [0.1, 0.5, 0.9]
# model xuat 1 gia tri cho moi quantile; tong loss = sum pinball_loss tren tung q
5. Quy trình thực dụng: leo thang có kiểm soát
Nguyên tắc vàng khi đối mặt bài toán dự báo mới:
- Baseline trước: naive + seasonal-naive. Ghi lại MAPE/RMSE (xem Chuỗi thời gian 6).
- Cổ điển: ETS/ARIMA/Prophet. Với dữ liệu ngân hàng vừa/nhỏ, đây thường là điểm dừng tốt.
- Feature + ML: nếu cần biến ngoại sinh phức tạp — LightGBM trên feature (Chuỗi thời gian 4).
- Deep learning: chỉ khi có nhiều chuỗi/dữ liệu lớn/quan hệ phi tuyến, và các tầng trên không đủ.
Ở mỗi tầng, so với tầng dưới trên cùng tập kiểm định. Nếu tầng phức tạp hơn không cải thiện đáng kể (tính cả chi phí vận hành), dừng lại. Phức tạp phải "trả tiền" bằng độ chính xác thực sự.
Use case thực tế
Bối cảnh: NCB muốn dự báo lượng tiền mặt rút ra mỗi ngày tại 250 máy ATM trong 7 ngày tới, để tối ưu lịch tiếp quỹ (xe tiếp quỹ tốn kém; ATM hết tiền gây khiếu nại). Mỗi ATM là một chuỗi, có ~2 năm lịch sử ngày.
Bước 1 — Baseline & cổ điển trên vài ATM. Chọn 5 ATM đại diện. Seasonal-naive (m=7) cho MAPE ~14%. Prophet với mùa vụ tuần + lịch lễ Việt Nam (Tết, 30/4, 2/9, cửa sổ trước Tết -7 ngày) giảm còn ~9.5% — hiệu ứng "rút tiền trước Tết" được bắt rõ. Đây đã là kết quả dùng được cho phần lớn ATM.
Bước 2 — Vì sao cân nhắc DL. Có 250 chuỗi chia sẻ mẫu hình (ATM cùng khu vực hành vi giống nhau), một số ATM mới chỉ vài tháng dữ liệu (chuỗi ngắn). Đây đúng điều kiện global model tỏa sáng → thử DeepAR huấn luyện chung trên cả 250 chuỗi, đưa lịch lễ làm covariate biết-trước-tương lai.
Bước 3 — So sánh trên tập kiểm định 7 ngày cuối:
| Mô hình | Phạm vi | MAPE trung bình | Ghi chú |
|---|---|---|---|
| Seasonal-naive | mỗi ATM | 14.0% | baseline |
| Prophet | mỗi ATM (250 lần) | 9.5% | tốt, dễ giải thích |
| DeepAR | global 250 chuỗi | 8.1% | thắng rõ ở ATM ngắn ngày |
Bước 4 — Dự báo xác suất. DeepAR cho phân phối; đội Vận hành lấy P95 làm mức tiếp quỹ (chấp nhận thừa nhẹ để gần như không bao giờ hết tiền). Kiểm tra coverage: khoảng 90% chứa ~89% quan sát thực → hiệu chỉnh tốt.
Kết luận: DeepAR thắng vì đúng bối cảnh nhiều chuỗi + chuỗi ngắn. Nhưng chi phí là hạ tầng GPU, pipeline huấn luyện lại hằng tuần và giám sát drift (Chuỗi thời gian 8). Với ATM có lịch sử dài và ổn định, Prophet vẫn được giữ làm phương án dự phòng dễ giải thích. Nếu chỉ có vài chục ATM, đội đã dừng ở Prophet — DL không bõ công.
Ghi nhớ
- Prophet = mô hình cộng tính
y = trend + seasonality + holiday + nhiễu. Dễ dùng, chịu missing/outlier, thành phần diễn giải rõ, có khoảng tin cậy sẵn. - Thêm lễ Việt Nam (đặc biệt Tết âm lịch, với cửa sổ trước/sau) rất giá trị cho dữ liệu ngân hàng — nhớ khai cả quá khứ lẫn tương lai vì Tết rơi vào ngày dương khác nhau mỗi năm.
- DL cho TS: RNN/LSTM/GRU (nhớ chuỗi, xem DL 5), seq2seq (multi-step), 1D-CNN/TCN (nhanh, causal + dilated), attention/Transformer/TFT, DeepAR (xác suất, global).
- DL đáng dùng khi: nhiều chuỗi + dữ liệu lớn + quan hệ phi tuyến/dài hạn + có GPU/MLOps. KHÔNG đáng khi: dữ liệu ít (mô hình cổ điển thường thắng), cần diễn giải, thiếu năng lực vận hành.
- Phức tạp không tự động tốt hơn. Leo thang có kiểm soát: baseline → cổ điển/Prophet → ML feature → DL, so sánh ở từng tầng trên cùng tập kiểm định.
- Dự báo xác suất (prediction interval, quantile với pinball loss, phân phối DeepAR) quan trọng cho quyết định ngân hàng như tiếp quỹ ATM; luôn kiểm tra coverage chứ không chỉ điểm dự báo.
Bài viết liên quan
Phân biệt AI/ML/DL, các kiểu học máy, quy trình ML end-to-end và thuật ngữ nền tảng.
Chất lượng dữ liệu, xử lý thiếu/ngoại lai, mã hoá, chuẩn hoá, tạo đặc trưng và tránh data leakage.
Mô hình ngôn ngữ lớn hoạt động ra sao, token, context window, tham số sinh, và kỹ thuật viết prompt.
Retrieval-Augmented Generation, vector database, tool calling, agent và MCP để xây ứng dụng LLM thực tế.