Hướng dẫn toàn tập dự báo chuỗi thời gian bằng Python: ARIMA, SARIMA và Exponential Smoothing

lúc 15:44 2 tháng 9, 2026
15 views

Dự báo chuỗi thời gian (Time Series Forecasting) là một trong những kỹ thuật cốt lõi trong khoa học dữ liệukinh doanh thông minh. Kỹ thuật này giúp các tổ chức dự đoán chính xác doanh thu, nhu cầu thị trường, giá cổ phiếu hoặc lưu lượng truy cập website trong tương lai. Ngôn ngữ Python cung cấp một hệ sinh thái mạnh mẽ với các thư viện như pandas, numpy và statsmodels, cho phép các lập trình viên và nhà phân tích dễ dàng xây dựng các mô hình dự báo chuyên sâu.

Tổng quan về dữ liệu chuỗi thời gian 📊

Chuỗi thời gian là tập hợp các điểm dữ liệu được thu thập theo các mốc thời gian tuần tự, thường có khoảng cách đều nhau (theo giờ, ngày, tháng hoặc năm). Trước khi xây dựng mô hình, bạn cần hiểu rõ ba thành phần cấu thành chính:

  • Xu hướng (Trend): Hướng đi dài hạn của dữ liệu, thể hiện sự tăng trưởng hoặc suy giảm theo thời gian.
  • Tính mùa vụ (Seasonality): Sự biến động lặp lại theo những chu kỳ cố định (ví dụ: sức mua tăng mạnh vào dịp cuối tuần hoặc mùa lễ hội).
  • Nhiễu (Noise/Residual): Các biến động ngẫu nhiên không theo quy luật mà mô hình không thể giải thích được.

Dưới đây là chi tiết mã nguồn Python và hướng dẫn triển khai ba mô hình dự báo phổ biến nhất hiện nay.

1. Mô hình Exponential Smoothing (San mũ) 📈

Mô hình San mũ (Exponential Smoothing - ETS) rất phù hợp cho các chuỗi thời gian có xu hướng hoặc tính mùa vụ mà không đòi hỏi quá khắt khe về tính dừng của dữ liệu. Phương pháp này hoạt động bằng cách gán các trọng số giảm dần theo cấp số nhân cho các quan sát trong quá khứ, nghĩa là dữ liệu gần đây sẽ có trọng số cao hơn dữ liệu cũ.

Code demo Exponential Smoothing với Python:

Code
import pandas as pd
import numpy as np
from statsmodels.tsa.holtwinters import ExponentialSmoothing

# Tạo dữ liệu mẫu chuỗi thời gian giả lập
np.random.seed(42)
time_index = pd.date_range(start="2024-01-01", periods=100, freq="D")
sales_values = np.linspace(100, 200, 100) + np.sin(np.linspace(0, 20, 100)) * 15
time_series_data = pd.Series(sales_values, index=time_index)

# Khởi tạo và huấn luyện mô hình Holt-Winters Exponential Smoothing
# seasonal_periods=7 giả định chu kỳ mùa vụ diễn ra theo tuần
ets_model = ExponentialSmoothing(
    time_series_data, 
    trend="add", 
    seasonal="add", 
    seasonal_periods=7
)
ets_fit = ets_model.fit()

# Thực hiện dự báo 10 bước tiếp theo trong tương lai
forecast_ets = ets_fit.forecast(steps=10)
print("Kết quả dự báo Exponential Smoothing:")
print(forecast_ets)

2. Mô hình ARIMA (Autoregressive Integrated Moving Average) 📉

ARIMA là mô hình kinh điển và cực kỳ phổ biến, kết hợp giữa ba thành phần: Tự hồi quy (AR), Tích hợp (I - giúp làm cho chuỗi dữ liệu đạt tính dừng)Trung bình trượt (MA). Mô hình này được biểu diễn qua bộ tham số ARIMA(p, d, q), trong đó p là số độ trễ tự hồi quy, d là bậc sai phân, và q là kích thước cửa sổ trung bình trượt.

Code demo ARIMA với Python:

Code
from statsmodels.tsa.arima.model import ARIMA

# Xây dựng mô hình ARIMA với bộ tham số p=1, d=1, q=1
arima_model = ARIMA(time_series_data, order=(1, 1, 1))
arima_fit = arima_model.fit()

# Hiển thị bảng tổng quan thông số thống kê của mô hình
print(arima_fit.summary())

# Dự báo giá trị cho 10 ngày tiếp theo
forecast_arima = arima_fit.forecast(steps=10)
print("Kết quả dự báo ARIMA:")
print(forecast_arima)

3. Mô hình SARIMA (Seasonal ARIMA) 🌐

Khi dữ liệu chuỗi thời gian của bạn không chỉ có xu hướng hay tính dừng thông thường mà còn chứa các yếu tố mùa vụ lặp lại phức tạp, mô hình ARIMA tiêu chuẩn sẽ không đủ khả năng xử lý. Lúc này, SARIMA (Seasonal ARIMA) là giải pháp nâng cấp hoàn hảo, bổ sung thêm các thành phần mùa vụ được ký hiệu bằng cấu trúc SARIMA(p, d, q)x(P, D, Q)_s.

Code demo SARIMA với Python:

Code
from statsmodels.tsa.statespace.sarimax import SARIMAX

# Xây dựng mô hình SARIMA với chu kỳ mùa vụ s=7 ngày
sarima_model = SARIMAX(
    time_series_data, 
    order=(1, 1, 1), 
    seasonal_order=(1, 1, 1, 7)
)
sarima_fit = sarima_model.fit(disp=False)

# Tiến hành dự báo cho 10 bước tiếp theo
forecast_sarima = sarima_fit.forecast(steps=10)
print("Kết quả dự báo SARIMA:")
print(forecast_sarima)

Lựa chọn mô hình nào cho dự án của bạn? ⚖️

Việc lựa chọn mô hình dự báo phụ thuộc rất lớn vào đặc tính và cấu trúc thực tế của tập dữ liệu:

  • Exponential Smoothing: Nên được ưu tiên khi bạn cần tốc độ tính toán nhanh, dữ liệu có xu hướng và mùa vụ rõ ràng mà không muốn mất quá nhiều thời gian tinh chỉnh tham số phức tạp.
  • ARIMA: Phù hợp tuyệt vời cho các chuỗi dữ liệu không có tính mùa vụ nhưng có mức độ tự tương quan cao sau khi đã thực hiện các bước lấy sai phân (d).
  • SARIMA: Là lựa chọn tối ưu nhất khi bài toán yêu cầu độ chính xác cao trên các tập dữ liệu lớn mang đặc thù chu kỳ rõ rệt theo tuần, tháng hoặc năm.

Bằng cách nắm vững cách sử dụng các mô hình này trong Python, bạn có thể tự tin giải quyết phần lớn các bài toán dự báo kinh tế và kỹ thuật trong thực tế công việc.

Bài tập thực hành vận dụng 🏋️

Bài tập 1: Dự báo dữ liệu hành khách hàng không với Exponential Smoothing

  • Mô tả: Sử dụng bộ dữ liệu mẫu (hoặc tự tạo dữ liệu giả lập có xu hướng tăng và tính mùa vụ rõ rệt theo năm).
  • Yêu cầu: Xây dựng mô hình Exponential Smoothing (Holt-Winters) với thành phần xu hướng và mùa vụ dạng cộng hoặc nhân. Chia dữ liệu thành tập huấn luyện và tập kiểm thử (12 tháng cuối), sau đó tính toán sai số RMSE (Root Mean Squared Error) để đánh giá độ chính xác của mô hình.

Bài tập 2: So sánh hiệu suất giữa ARIMA và SARIMA trên chuỗi thời gian có chu kỳ tuần

  • Mô tả: Sử dụng tập dữ liệu chuỗi thời gian giả lập biểu diễn lượng truy cập website hằng ngày, có chu kỳ lặp lại mạnh mẽ theo chu kỳ 7 ngày (tuần).
  • Yêu cầu: Tiến hành kiểm định tính dừng (ví dụ: dùng kiểm định Augmented Dickey-Fuller), xác định bậc sai phân d, sau đó lần lượt xây dựng mô hình ARIMA tiêu chuẩn và mô hình SARIMA (với s = 7). Dự báo cho 14 ngày tiếp theo và viết đoạn code vẽ biểu đồ so sánh kết quả dự báo của cả hai mô hình với dữ liệu thực tế.

Bình luận

Đăng nhập để để lại bình luận.
Chưa có bình luận nào cho bài viết này.

Bài viết liên quan