data-science · Vietnamese · 9 min
🇺🇸 Read in EnglishDự báo doanh thu bằng Data Science: Từ thống kê cổ điển đến AI
February 2, 2026
Từ Holt-Winters đến XGBoost rồi đến Chronos — mỗi phương pháp dự báo doanh thu có vị trí riêng của nó. Bài này giúp bạn chọn đúng công cụ cho đúng bài toán.
Mỗi năm, khi tháng Chạp đến, các doanh nghiệp bán lẻ Việt Nam đối mặt với cùng một bài toán: doanh thu Tết năm nay sẽ như thế nào? Đặt hàng thiếu thì mất doanh thu, đặt hàng thừa thì tồn kho ăn vốn. Đây không phải vấn đề cảm tính — đây là bài toán dự báo, và data science có câu trả lời.
Bài này đi từ đầu đến cuối: dự báo doanh thu là gì, dữ liệu cần gì, các phương pháp hoạt động ra sao, đánh giá thế nào, và những cạm bẫy nào hay giết chết một mô hình tốt trước khi nó kịp vào production.
Dự báo doanh thu là gì và tại sao nó quan trọng
Dự báo doanh thu (revenue forecasting) là quá trình ước tính doanh thu tương lai — theo ngày, tuần, tháng, hoặc quý — dựa trên dữ liệu lịch sử kết hợp với các tín hiệu kinh doanh như khuyến mãi, mùa vụ, và điều kiện thị trường.
Sai số trong dự báo có hậu quả tiền tệ trực tiếp: dự báo thấp hơn thực tế dẫn đến hết hàng và mất doanh thu; dự báo cao hơn thực tế dẫn đến tồn kho và đóng băng vốn. Theo ước tính được trích dẫn rộng rãi trong ngành bán lẻ, cải thiện 5% độ chính xác dự báo có thể giảm chi phí tồn kho 10–15%. Với các công ty SaaS, dự báo MRR/ARR chính xác là KPI cấp hội đồng quản trị.
Bài toán này ngồi ở giao điểm của phân tích chuỗi thời gian, machine learning, và hiểu biết nghiệp vụ. Không có mô hình nào tốt mà không có ngữ cảnh kinh doanh.
Chân trời dự báo: ngắn, trung, dài
Trước khi chọn phương pháp, hãy hỏi: quyết định nào sẽ dùng dự báo này?
Ngắn hạn (1 ngày – 4 tuần): Vận hành hàng ngày, nhân sự, flash sale. Yêu cầu độ chính xác cao nhất, cần dữ liệu chi tiết. Các phương pháp thống kê và ML với lag features gần đây là phù hợp nhất.
Trung hạn (1–6 tháng): Lập kế hoạch chuỗi cung ứng, ngân sách marketing, tuyển dụng. SARIMA, XGBoost với calendar features, và Temporal Fusion Transformer đều phù hợp.
Dài hạn (6 tháng – 5 năm): Kế hoạch chiến lược, báo cáo nhà đầu tư. Ít cần độ chính xác tuyệt đối, cần nhiều hơn là hướng đi đúng và khoảng kịch bản (scenario ranges). Decomposition đơn giản và regression với biến vĩ mô là đủ.
Một mô hình LSTM ba tầng cho dự báo chiến lược 3 năm là over-engineering. Một hồi quy tuyến tính cho dự báo khuyến mãi 7 ngày là under-engineering. Chân trời quyết định phương pháp.
Dữ liệu cần có
Dữ liệu doanh thu lịch sử là nền tảng, nhưng mô hình tốt cần nhiều hơn thế.
Lịch sử bán hàng: Tối thiểu 2 chu kỳ mùa vụ đầy đủ — tức là ít nhất 2 năm dữ liệu tháng nếu có tính mùa vụ năm. Dữ liệu ngày cần 1–3 năm.
Tính năng lịch (calendar features): Ngày trong tuần, tuần trong năm, tháng, quý, ngày lễ quốc gia. Với doanh nghiệp Việt Nam, điều này đặc biệt quan trọng: Tết Nguyên Đán không phải một ngày — nó là một giai đoạn kéo dài nhiều tuần với tác động mua sắm trước và sụt giảm sau. Biến days_until_tet (số ngày đến Tết) thường nằm trong top features quan trọng nhất với mô hình ML.
Dữ liệu khuyến mãi: Mức chiết khấu, thời gian campaign, kênh bán hàng (online/offline). Một đợt promotion có thể tạo spike doanh thu 2–10 lần giá trị baseline — lớn hơn bất kỳ pattern nào mô hình có thể học được từ lịch sử thuần túy.
Yếu tố bên ngoài (exogenous variables): GDP, CPI, chỉ số niềm tin tiêu dùng, tỷ giá (quan trọng với nhà bán lẻ hàng nhập khẩu), thời tiết (với F&B, thời trang), Google Trends (tín hiệu nhu cầu đi trước doanh thu 1–4 tuần).
Chất lượng dữ liệu: Xử lý missing data, outlier (giai đoạn COVID-19), và structural breaks (mở cửa hàng mới, ra sản phẩm mới) quan trọng không kém chọn mô hình.
Hành trình phương pháp: từ cổ điển đến AI
1. Moving Average và Exponential Smoothing (ETS / Holt-Winters)
Moving Average (MA) là điểm khởi đầu đơn giản nhất: trung bình N kỳ gần nhất. Bổ sung trọng số cho các kỳ gần hơn ra Weighted MA. Đơn giản, minh bạch, nhưng không bắt được xu hướng hay mùa vụ.
Holt-Winters (ETS — Error-Trend-Seasonal) là bước tiến quan trọng. Mô hình phân rã chuỗi thành ba thành phần — level, trend, seasonal — mỗi thành phần được cập nhật liên tục qua tham số làm mịn (alpha, beta, gamma):
- Additive: Tác động mùa vụ có độ lớn tuyệt đối ổn định.
- Multiplicative: Tác động mùa vụ tỷ lệ với baseline — phổ biến hơn trong bán lẻ vì spike Tết lớn hơn khi baseline cao hơn.
from statsmodels.tsa.holtwinters import ExponentialSmoothing
model = ExponentialSmoothing(
train,
trend='add',
seasonal='mul',
seasonal_periods=12 # monthly data, annual seasonality
)
fitted = model.fit()
pred = fitted.forecast(3)ETS nhanh, giải thích được, và thường khó đánh bại trên dữ liệu tháng ngắn. Luôn build ETS trước như baseline trước khi chuyển sang phương pháp phức tạp hơn.
SARIMA — Seasonal ARIMA — thêm khả năng mô hình hóa thống kê chặt chẽ hơn. Chuỗi cần stationary; tham số (p,d,q)(P,D,Q,m) được chọn qua ACF/PACF plots hoặc tự động bằng pmdarima.auto_arima. Hữu ích khi cần confidence intervals và giải thích thống kê, nhưng giả định quan hệ tuyến tính và khó mở rộng khi có nhiều biến ngoại sinh.
2. Gradient Boosted Trees: XGBoost và LightGBM
Đây là phương pháp thống trị production trong ngành. XGBoost và LightGBM liên tục thắng các cuộc thi dự báo lớn (M5 Walmart Competition) và được triển khai rộng rãi trong doanh nghiệp vì lý do thực tế: chúng xử lý tốt mixed-type features, robust với outlier và missing values, có thể giải thích qua SHAP values, và scale tốt với hàng triệu dòng dữ liệu.
Paradigm shift quan trọng: Time series được frame lại thành bài toán supervised regression. Mỗi dòng = một time step. Target = revenue(t). Features = tất cả thông tin biết được tại thời điểm dự báo.
Feature engineering — kỹ năng cốt lõi
Mô hình chỉ tốt bằng features của nó. Đây là những features quan trọng nhất (xếp theo SHAP importance điển hình trong bán lẻ/e-commerce):
Lag features (tín hiệu tự hồi quy):
df['lag_1'] = df['revenue'].shift(1) # kỳ trước
df['lag_7'] = df['revenue'].shift(7) # cùng ngày tuần trước (daily)
df['lag_28'] = df['revenue'].shift(28) # cùng kỳ tháng trước
df['lag_365'] = df['revenue'].shift(365) # cùng kỳ năm trướcQuy tắc bắt buộc: Chỉ dùng lag >= forecast horizon để tránh data leakage. Nếu dự báo 7 ngày tới, feature nhỏ nhất là lag_7.
Rolling statistics (tín hiệu được làm mịn):
df['rolling_mean_7'] = df['revenue'].shift(1).rolling(7).mean()
df['rolling_mean_28'] = df['revenue'].shift(1).rolling(28).mean()
df['rolling_std_28'] = df['revenue'].shift(1).rolling(28).std()Calendar features (đặc biệt quan trọng với bối cảnh Việt Nam):
df['day_of_week'] = df['date'].dt.dayofweek
df['month'] = df['date'].dt.month
df['is_weekend'] = (df['date'].dt.dayofweek >= 5).astype(int)
df['is_holiday'] = df['date'].apply(is_vn_holiday)
df['days_until_tet'] = df['date'].apply(days_to_next_tet)
df['is_month_end'] = df['date'].dt.is_month_end.astype(int)
df['is_promo'] = ... # từ promotion scheduleInteraction features: is_weekend * is_promo (khuyến mãi cuối tuần mạnh hơn multiplicatively), month * is_holiday.
Training và validation đúng cách
from sklearn.model_selection import TimeSeriesSplit
import xgboost as xgb
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, val_idx in 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]
model = xgb.XGBRegressor(
n_estimators=500, learning_rate=0.05,
max_depth=5, subsample=0.8,
colsample_bytree=0.8, random_state=42
)
model.fit(X_train, y_train,
eval_set=[(X_val, y_val)],
early_stopping_rounds=50, verbose=False)Không bao giờ shuffle time series data. Temporal CV — expanding window hoặc sliding window — là bắt buộc.
3. Deep Learning: LSTM và Temporal Fusion Transformer
LSTM (Long Short-Term Memory) là mạng hồi quy với cơ chế gating cho phép học long-range dependencies. Phù hợp khi dataset lớn (100K+ dòng), pattern phi tuyến phức tạp, nhiều chuỗi liên quan. Nhưng LSTM chậm, khó giải thích, và thường bị XGBoost với feature engineering tốt đánh bại trên dataset tabular < 50K dòng.
Temporal Fusion Transformer (TFT) — do Lim et al. từ Google phát triển — là bước tiến lớn hơn. TFT kết hợp:
- Variable selection networks: Tự học feature nào quan trọng tại mỗi time step — mang lại khả năng giải thích gần với feature importance của tree models.
- Multi-head attention: Bắt long-range dependencies; attention weights cho thấy time step nào trong quá khứ quan trọng.
- Quantile outputs: Dự báo khoảng tin cậy (P10/P50/P90) thay vì chỉ point estimate — lợi thế lớn cho lập kế hoạch kinh doanh (kịch bản lạc quan vs. bi quan).
- Known future inputs: Có thể dùng calendar features, lịch khuyến mãi đã lên kế hoạch, ngày lễ tương lai như covariates.
TFT đặc biệt phù hợp khi bạn có nhiều chuỗi liên quan (100+ SKU), tập features phong phú, cần prediction intervals, và dataset > 10K dòng. Trong M5 Walmart Competition (42K chuỗi), TFT vào top.
# Dùng thư viện pytorch-forecasting
from pytorch_forecasting import TemporalFusionTransformer, TimeSeriesDataSet4. Foundation Models: Chronos và TimeGPT
Lớp mô hình mới nhất: pre-trained transformer có thể dự báo zero-shot — không cần training trên data của bạn.
Amazon Chronos (2024) là open-source, chạy local (không tốn API, không vấn đề privacy), nhiều kích thước (small → large). Tokenizes time series values tương tự cách LLM tokenize text, sau đó autoregressively generate future values. Trên benchmark GIFT-Eval (2024), Chronos-Large cạnh tranh với statistical baselines nhưng thường thua XGBoost được fine-tune tốt trên task cụ thể.
from chronos import ChronosPipeline
import torch
pipeline = ChronosPipeline.from_pretrained(
"amazon/chronos-t5-small",
device_map="cpu",
torch_dtype=torch.float32
)
forecast = pipeline.predict(context, prediction_length=12)TimeGPT (Nixtla) là proprietary API với khả năng tương tự. Tiện cho prototyping nhanh nhưng có chi phí per-call và vấn đề data privacy khi gửi dữ liệu bán hàng ra ngoài.
Khi nào dùng foundation models? Cold-start (sản phẩm mới, cửa hàng mới chưa có lịch sử), prototyping nhanh, thiếu ML engineering resources. Khi có đủ dữ liệu và thời gian, XGBoost với feature engineering tốt vẫn thắng trong hầu hết bài toán business cụ thể.
Bảng so sánh phương pháp
| Phương pháp | Độ đơn giản | Độ chính xác | Yêu cầu dữ liệu | Khả năng giải thích |
|---|---|---|---|---|
| Moving Average / ETS | Rất cao | Trung bình | Ít (≥1 năm) | Rất cao |
| SARIMA | Trung bình | Trung bình | Trung bình (≥2 năm) | Cao |
| XGBoost / LightGBM | Trung bình | Cao | Trung bình–nhiều | Cao (SHAP) |
| LSTM | Thấp | Cao | Nhiều (≥50K dòng) | Thấp |
| Temporal Fusion Transformer | Thấp | Rất cao | Nhiều (nhiều chuỗi) | Trung bình |
| Chronos / TimeGPT | Rất cao | Trung bình | Không cần (zero-shot) | Thấp |
Đánh giá mô hình: các metric quan trọng
Chọn metric sai là cạm bẫy thường gặp. Đây là các metric chính:
MAE (Mean Absolute Error): Trung bình sai số tuyệt đối theo đơn vị doanh thu (triệu VND). Dễ giải thích với stakeholders không kỹ thuật.
MAE = mean(|y_true - y_pred|)
RMSE (Root Mean Squared Error): Giống MAE nhưng phạt nặng hơn với sai số lớn. Dùng khi miss spike Tết hay Black Friday là rất tệ.
RMSE = sqrt(mean((y_true - y_pred)²))
MAPE (Mean Absolute Percentage Error): Sai số % trung bình — trực quan cho giao tiếp kinh doanh ("dự báo của chúng ta sai 8% trung bình").
MAPE = mean(|y_true - y_pred| / |y_true|) × 100
Giới hạn nghiêm trọng của MAPE: Bùng nổ hoặc undefined khi y_true = 0 hoặc gần 0. Không dùng MAPE khi chuỗi có nhiều ngày zero sales.
sMAPE giải quyết vấn đề này một phần: sMAPE = mean(2 × |y_true - y_pred| / (|y_true| + |y_pred|)) × 100
WRMSSE: Metric của M5 Competition, cân theo tỷ trọng doanh thu của từng chuỗi. Phức tạp nhưng phản ánh đúng tác động kinh doanh khi có nhiều SKU.
Quy tắc baseline: Trước khi báo cáo bất kỳ kết quả nào là "tốt", hãy so sánh với naive baseline đơn giản nhất: y_hat(t) = y(t - 52 tuần) (cùng tuần năm ngoái). Mô hình không đánh bại baseline này thì không có giá trị production trong bán lẻ.
Báo cáo cho stakeholders: MAE và MAPE. Chọn model: RMSE (khi lỗi lớn costly). Chuỗi có zero: sMAPE.
Những cạm bẫy phổ biến
Data Leakage — nghiêm trọng nhất
Data leakage xảy ra khi features chứa thông tin tương lai mà tại thời điểm thực tế sẽ không có. Hậu quả: mô hình trông rất tốt trong evaluation nhưng thất bại hoàn toàn trong production.
Ví dụ điển hình:
- Tính
rolling_mean(t-3, t+3)— bao gồm 3 bước tương lai trong cửa sổ rolling. - Dùng promotion flag được set retroactively sau khi campaign kết thúc.
- Random train/test split thay vì temporal split — đây là lỗi nghiêm trọng nhất với time series.
Fix: Luôn dùng temporal split. Mọi feature phải được tính chỉ từ data có tại thời điểm t.
Overfit theo mùa vụ
Mô hình học seasonality quá cứng. Khi pattern thay đổi (thói quen mua sắm hậu COVID, đối thủ mới, mix sản phẩm thay đổi), mô hình fail. Dấu hiệu: train/validation error thấp nhưng test error cao trong giai đoạn out-of-distribution.
Fix: Regularize feature set, ưu tiên recent data, retrain thường xuyên.
Bỏ qua structural breaks
Cửa hàng renovate 6 tuần, sản phẩm mới cannibalize sản phẩm cũ, đối thủ mở cửa gần đó — những sự kiện này phá vỡ patterns lịch sử. Hãy flag chúng như exogenous variables hoặc train model riêng cho giai đoạn pre/post break.
Chỉ báo cáo point forecast
Dự báo điểm duy nhất cho stakeholders tạo false confidence. Họ cần biết khoảng không chắc chắn. TFT, CatBoost quantile regression, và conformal prediction có thể tạo ra P10/P50/P90 intervals.
Không backtesting đúng cách
Một train/test split duy nhất không đủ — kết quả phụ thuộc rất nhiều vào giai đoạn nào được chọn làm test. Dùng rolling/walk-forward CV với nhiều test windows; báo cáo mean ± std của error.
Hướng đi tiếp theo
Dự báo doanh thu không phải là một problem được giải quyết một lần. Mô hình cần retrain thường xuyên (hàng tháng hoặc khi error vượt ngưỡng), và infrastructure production phải track feature drift và alert khi MAPE tăng bất thường.
Foundation models như Chronos và TimeGPT đang hạ thấp barrier với cold-start scenarios, nhưng chúng chưa thay thế được XGBoost với feature engineering tốt trong hầu hết bài toán business có đủ dữ liệu. Probabilistic forecasting — báo cáo khoảng P10/P50/P90 thay vì chỉ point estimate — đang trở thành tiêu chuẩn trong các tổ chức mature. Và với bối cảnh Việt Nam, câu hỏi Tết seasonality tác động như thế nào đến foundation models — vốn được train chủ yếu trên time series phương Tây — vẫn còn là câu hỏi mở.
Cái khó nhất trong bài toán này không phải chọn mô hình. Là feature engineering tốt, temporal validation nghiêm ngặt, và đủ hiểu biết nghiệp vụ để biết khi nào spike là signal và khi nào là noise.
Tóm tắt:
- Luôn build ETS/Holt-Winters trước như baseline — nếu model phức tạp không đánh bại được nó, chưa đủ lý do để dùng
- XGBoost với feature engineering tốt thống trị production trong hầu hết bài toán có đủ dữ liệu; LSTM và TFT mạnh hơn khi có nhiều chuỗi liên quan và dataset lớn
- Temporal split và walk-forward CV là bắt buộc — random split với time series là data leakage, không có exception
- Lag features phải >= forecast horizon; calendar features phải phản ánh Tết và ngày lễ địa phương để model nắm được pattern đặc thù Việt Nam
- Foundation models (Chronos, TimeGPT) lý tưởng cho cold-start khi chưa có đủ lịch sử; khi có dữ liệu, XGBoost với feature engineering tốt thường vẫn thắng
Nguồn tham khảo
- Forecasting: Principles and Practice (3rd ed.) — Hyndman & Athanasopoulos
- Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting — Lim et al., 2019
- Chronos: Learning the Language of Time Series — Ansari et al., Amazon Research, 2024
- XGBoost: A Scalable Tree Boosting System — Chen & Guestrin, 2016