Phương pháp Bootstrap

(Bootstrap Method)

Trong thống kê và học máy, việc đánh giá độ bất định của một ước lượng (như trung bình, phương sai hay một thước đo rủi ro) thường phụ thuộc vào phân phối chọn mẫu của ước lượng đó. Trong thực tế, phân phối này hiếm khi có sẵn dưới dạng giải tích. Phương pháp Bootstrap dùng phân phối thực nghiệm để xấp xỉ độ bất định mà không cần ấn định một họ phân phối tham số cụ thể. Bài viết trình bày trực giác, cách hoạt động và một ứng dụng của Bootstrap trong phân tích chuỗi thời gian tài chính.

1. Giới thiệu

Được giới thiệu lần đầu vào năm 1979 bởi nhà thống kê Bradley Efron, Bootstrap (hay lấy mẫu lại, resampling) là một họ phương pháp thống kê; phiên bản cơ bản dưới đây là phi tham số.

Cái tên “Bootstrap” xuất phát từ thành ngữ tiếng Anh “to pull oneself up by one’s bootstraps”, ám chỉ việc tự lực cánh sinh thực hiện một điều tưởng chừng như vô lý (tự nhấc bổng mình lên bằng dây giày của chính mình). Trong thống kê, ý nghĩa của nó là: làm thế nào để ước lượng phân phối chọn mẫu (sampling distribution) của một đại lượng thống kê chỉ từ một tập dữ liệu ban đầu duy nhất?

Bootstrap thường được dùng để ước lượng sự biến thiên, sai số chuẩn hoặc khoảng tin cậy khi công thức giải tích khó tính, hoặc khi ta không muốn ấn định một họ phân phối tham số. Phương pháp thay thế một phần tính toán giải tích bằng lặp mô phỏng, nhưng vẫn phụ thuộc vào các giả thiết về cơ chế sinh dữ liệu và tính đại diện của mẫu.

2. Ý tưởng cốt lõi

Trực giác của Bootstrap là dùng phân phối thực nghiệm của mẫu để thay thế tạm thời phân phối quần thể chưa biết.

Giả sử chúng ta có một mẫu dữ liệu quan sát được từ một quần thể (population) chưa biết. Trong thống kê cổ điển, chúng ta thường giả định quần thể có một hình dạng phân phối nào đó (ví dụ: phân phối Chuẩn) và dùng mẫu để ước lượng tham số của phân phối đó.

Bootstrap lại có một cách tiếp cận khác: nó sử dụng chính phân phối thực nghiệm (empirical distribution) của mẫu dữ liệu hiện tại đóng vai trò như một “quần thể thế thân” (stand-in) cho quần thể thật chưa biết. Nguyên lý này được gọi là nguyên lý cắm vào (plug-in principle).

Bằng cách lấy mẫu lại có hoàn lại (resampling with replacement) từ tập dữ liệu ban đầu, chúng ta có thể tạo ra nhiều “mẫu giả” (bootstrap samples). Từ các mẫu giả này, chúng ta tính lại đại lượng thống kê đang quan tâm để xấp xỉ sự biến thiên của nó.

3. IID Bootstrap

Phiên bản cơ bản nhất của Bootstrap là IID Bootstrap (Independent and Identically Distributed Bootstrap), được sử dụng khi các quan sát trong mẫu độc lập và có cùng phân phối.

Thuật toán từng bước:

Giả sử bạn có một mẫu ban đầu gồm $n$ quan sát: $X = {x_1, x_2, \dots, x_n}$. Bạn muốn ước lượng một đại lượng thống kê $\theta$ (ví dụ: số trung bình, trung vị).

  1. Lấy mẫu lại: Rút ngẫu nhiên có hoàn lại $n$ giá trị từ tập $X$. Kết quả thu được là một mẫu bootstrap $X^\ast = {x^\ast_1, x^\ast_2, \dots, x^\ast_n}$. Vì lấy mẫu có hoàn lại, một số phần tử trong $X$ có thể xuất hiện nhiều lần trong $X^\ast$, trong khi một số khác có thể không xuất hiện.
  2. Tính toán đại lượng thống kê: Trên mẫu $X^\ast$, tính toán đại lượng thống kê $\theta^\ast$.
  3. Lặp lại: Lặp lại bước 1 và 2 với số lần lặp $B$ đủ lớn cho độ chính xác Monte Carlo cần thiết; $B=1000$ là một mốc minh họa, không phải ngưỡng phù hợp cho mọi bài toán. Ta thu được một tập hợp các giá trị $\theta^\ast_1, \theta^\ast_2, \dots, \theta^\ast_B$.
  4. Phân tích kết quả: Phân phối thực nghiệm của các giá trị $\theta^\ast$ là phân phối Bootstrap, được dùng để xấp xỉ phân phối chọn mẫu của đại lượng thống kê. Từ đó, ta có thể ước lượng phương sai, sai số chuẩn hoặc khoảng tin cậy.

Ví dụ cụ thể: Xây dựng khoảng tin cậy cho lợi suất trung bình. Nếu ta tính được 1000 giá trị trung bình từ 1000 mẫu bootstrap, ta sắp xếp chúng từ nhỏ đến lớn. Khoảng percentile 95% lấy hai phân vị 2.5% và 97.5%. Mức 95% nói về tỷ lệ bao phủ của quy trình trong những lần lấy mẫu lặp lại dưới các giả thiết của Bootstrap; nó không có nghĩa tham số cố định có xác suất 95% nằm trong khoảng vừa tính.

Chọn một phân phối rồi bấm Lấy mẫu để tạo mẫu gốc $X$. Sau đó, mỗi lần bấm Tái mẫu 1 lần sẽ tạo một $X^\ast$, tính $\theta^\ast$ và thêm đúng một giá trị vào histogram. Nút Thêm 100 lần phát nhanh thêm 100 lượt trên cùng mẫu gốc.

THÍ NGHIỆM TƯƠNG TÁC

Nhìn thấy Bootstrap qua bốn bước

Mô phỏng lấy mẫu và lấy mẫu lại Bootstrap Bốn hàng lần lượt biểu diễn phân phối tổng thể, mẫu gốc, mẫu bootstrap cùng số trung bình, và histogram của các số trung bình bootstrap.

4. Moving-Block Bootstrap

IID Bootstrap không phù hợp khi sự phụ thuộc theo thời gian là thành phần cần được giữ lại. Dữ liệu chuỗi thời gian có thể có sự phụ thuộc chuỗi (serial dependence)hiện tượng cụm biến động (volatility clustering); lấy mẫu lại từng quan sát độc lập sẽ làm mất cấu trúc thứ tự và phần lớn cấu trúc tự tương quan của mẫu.

Để giải quyết vấn đề này, ta sử dụng Moving-Block Bootstrap (Bootstrap khối động). Thay vì bốc ngẫu nhiên từng điểm dữ liệu, ta bốc ngẫu nhiên từng khối (block) dữ liệu liên tiếp nhau.

Thuật toán Block Bootstrap:

  1. Chọn độ dài khối $\ell$: Khối dữ liệu cần đủ dài để giữ được phần phụ thuộc chuỗi cần quan tâm, nhưng cũng phải đủ ngắn để có nhiều khối khác nhau. Công thức $\ell = \min\left(20, \text{round}(n^{1/3})\right)$ dưới đây chỉ là một lựa chọn minh họa; trong phân tích thực tế, độ dài khối cần được chọn theo mục tiêu ước lượng và cấu trúc phụ thuộc của dữ liệu.
  2. Tạo các khối: Từ chuỗi $n$ quan sát, ta trích xuất tất cả các khối có độ dài $\ell$ liền kề nhau. Sẽ có $n - \ell + 1$ khối có thể có (do chúng chồng lấp lên nhau - moving blocks).
  3. Rút khối ngẫu nhiên: Chọn ngẫu nhiên có hoàn lại các khối cho đến khi tổng số phần tử bằng (hoặc vừa vượt quá) cỡ mẫu $n$.
  4. Ghép nối: Ghép (concatenate) các khối đã rút lại với nhau để tạo thành một chuỗi mẫu bootstrap mới. Cắt bỏ các phần tử dư thừa nếu chuỗi dài hơn $n$.
  5. Tính toán và lặp lại: Tương tự như IID, tính toán đại lượng thống kê trên chuỗi mẫu mới và lặp lại $B$ lần.

5. Bootstrap trong ước lượng rủi ro tài chính

Trong tài chính, VaR (Value at Risk)ES (Expected Shortfall) là hai thước đo thường dùng để mô tả rủi ro giảm giá (downside risk).

Bootstrap có thể hữu ích trong bối cảnh này vì không ấn định một họ phân phối tham số cho lợi suất. Tuy vậy, phương pháp vẫn cần giả thiết rằng phân phối thực nghiệm đại diện đủ tốt cho cơ chế sinh dữ liệu; IID Bootstrap còn giả thiết các quan sát độc lập và cùng phân phối. Vì lợi suất thực tế có thể lệch và có đuôi dày, giả định chuẩn có thể đánh giá thấp một số rủi ro ở đuôi. Lấy mẫu lại từ lợi suất lịch sử tạo ra các kịch bản theo phân phối thực nghiệm, chứ không phải dự báo trực tiếp các đường sinh lời tương lai.

Đối với chuỗi lợi suất chứng khoán hàng ngày, kiểm định Ljung-Box có thể phát hiện tự tương quan, đặc biệt trong chuỗi lợi suất bình phương. Nếu dữ liệu cụ thể cho thấy cấu trúc như vậy, đó là một lý do để cân nhắc Bootstrap theo khối thay cho IID Bootstrap. Phương pháp theo khối giữ lại phụ thuộc trong phạm vi khối, nhưng không mặc nhiên bảo tồn toàn bộ động lực học của chuỗi.

Tuy nhiên, mọi phương pháp đều có sự đánh đổi (trade-off): Giới hạn quan trọng của Bootstrap thông thường là nó chỉ lấy lại các giá trị đã quan sát. Nếu mẫu lịch sử không chứa các biến động tương tự Black Monday 1987 hay giai đoạn COVID-19 2020, phép lấy mẫu lại từng lợi suất không thể tạo ra một quan sát đơn lẻ nằm ngoài miền giá trị của mẫu. Mô hình Monte Carlo tham số có thể sinh giá trị ngoài miền đó, nhưng mức độ hợp lý của chúng lại phụ thuộc vào mô hình và cách hiệu chỉnh phần đuôi.

6. Ví dụ minh hoạ bằng Python

Dưới đây là một đoạn code Python ngắn gọn minh hoạ cả hai kỹ thuật trên bằng thư viện numpy.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np

# Tạo dữ liệu giả lập (ví dụ: lợi suất 500 ngày)
np.random.seed(42)
returns = np.random.normal(0.001, 0.02, 500)
n = len(returns)
B = 1000 # Số lần bootstrap

# --- 1. IID Bootstrap cho Khoảng tin cậy của lợi suất trung bình ---
boot_means = np.zeros(B)
for i in range(B):
    # Lấy mẫu có hoàn lại từng phần tử
    idx = np.random.randint(0, n, n)
    boot_sample = returns[idx]
    boot_means[i] = np.mean(boot_sample)

ci_lower, ci_upper = np.percentile(boot_means, [2.5, 97.5])
print(f"IID Bootstrap - 95% CI for Mean: [{ci_lower:.5f}, {ci_upper:.5f}]")

# --- 2. Moving-Block Bootstrap cho phân phối lợi suất tích luỹ 20 ngày ---
# Theo công thức: \ell = \min(20, \text{round}(n^{1/3}))
l = min(20, int(round(n**(1/3)))) 
num_blocks = int(np.ceil(20 / l)) # Số khối cần rút để được chuỗi 20 ngày

boot_cum_returns = np.zeros(B)
for i in range(B):
    boot_series = []
    for _ in range(num_blocks):
        # Chọn ngẫu nhiên vị trí bắt đầu của khối
        start_idx = np.random.randint(0, n - l + 1)
        block = returns[start_idx : start_idx + l]
        boot_series.extend(block)
    
    # Cắt cho đúng độ dài 20 ngày và tính lợi suất tích luỹ (đơn giản hoá bằng tổng)
    boot_path = np.array(boot_series[:20])
    boot_cum_returns[i] = np.sum(boot_path)

var_95 = np.percentile(boot_cum_returns, 5) # 5% VaR
print(f"Block Bootstrap - 95% VaR (20 days): {var_95:.4f}")

7. So sánh Bootstrap và Monte Carlo

Để kết luận, hãy xem qua bảng so sánh tóm tắt giữa Bootstrap và Mô phỏng Monte Carlo tham số - hai phương pháp thường được đặt lên bàn cân trong đo lường rủi ro:

Tiêu chí Bootstrap (Mô phỏng lịch sử) Monte Carlo tham số
Giả định phân phối Không cần chọn một họ tham số, nhưng vẫn cần giả thiết về lấy mẫu và sự phụ thuộc Cần chọn mô hình tham số (Chuẩn, Student-t, v.v.)
Điểm mạnh Dễ triển khai; giữ lại độ lệch và hình dạng đuôi đã xuất hiện trong phân phối thực nghiệm. Cho phép mô tả các cấu trúc rủi ro phức tạp và sinh kịch bản ngoài miền giá trị đã quan sát.
Điểm yếu Bị giới hạn bởi tính đại diện và cỡ của mẫu; kết quả có thể sai lệch nếu cơ chế sinh dữ liệu thay đổi. Phụ thuộc vào mức độ phù hợp của mô hình và cách hiệu chỉnh; có rủi ro mô hình (model risk).
Khi nào nên dùng? Khi có sẵn lượng dữ liệu lịch sử lớn, đại diện tốt cho hiện tại và phân phối thực tế quá phức tạp. Khi lịch sử quá ngắn, hoặc khi cần kiểm tra sức chịu đựng (Stress testing) với các kịch bản chưa từng có.

8. Tổng kết

Bootstrap chuyển một phần bài toán suy luận sang tính toán trên phân phối thực nghiệm. IID Bootstrap phù hợp với mẫu độc lập, còn các biến thể theo khối có thể giữ lại một phần phụ thuộc thời gian. Khi dùng để ước lượng VaR hoặc ES, kết quả vẫn phụ thuộc vào tính đại diện của dữ liệu, cách chọn khối và tính ổn định của cơ chế sinh lợi suất; Bootstrap không tự giải quyết rủi ro mô hình hay các biến cố chưa được phản ánh trong mẫu.