Minimum Spanning Tree: Từ lý thuyết đồ thị đến thị trường chứng khoán
Biến ma trận tương quan của hàng trăm cổ phiếu thành một cây duy nhất — và vì sao khoảng cách √(2(1−ρ)) là lựa chọn tự nhiên.
Mục lục
Với 300 cổ phiếu, ma trận tương quan có gần 45.000 cặp giá trị. Không ai đọc nổi chừng đó con số. Năm 1999, Rosario Mantegna đề xuất một ý tưởng đơn giản mà mạnh mẽ: coi mỗi cổ phiếu là một đỉnh của đồ thị, biến tương quan thành khoảng cách, rồi chỉ giữ lại cây khung nhỏ nhất (minimum spanning tree — MST)[1]. Kết quả là một cấu trúc chỉ có cạnh nhưng vẫn phản ánh rõ các cụm ngành.
Từ giá đến tương quan
Gọi là giá đóng cửa của cổ phiếu tại phiên . Ta làm việc với log return thay vì giá:
Hệ số tương quan Pearson giữa hai cổ phiếu và trên một cửa sổ thời gian:
trong đó là trung bình theo thời gian. Ta có .
Biến tương quan thành khoảng cách
Tương quan không phải là một khoảng cách: nó không thoả bất đẳng thức tam giác, và “gần nhau” lại tương ứng với giá trị lớn. Mantegna dùng phép biến đổi:
Khi đó : hai cổ phiếu tương quan hoàn hảo có , hai cổ phiếu ngược chiều hoàn toàn có .
Vì sao lại là căn bậc hai?
Chuẩn hoá chuỗi return của mỗi cổ phiếu thành vector có trung bình 0 và độ dài 1. Khi đó tích vô hướng chính là tương quan, , và:
Nói cách khác, chính là khoảng cách Euclid giữa hai vector đã chuẩn hoá. Vì vậy nó tự động thoả mọi tiên đề của một metric, kể cả bất đẳng thức tam giác .
Cây khung nhỏ nhất
Cho đồ thị vô hướng liên thông với trọng số . Một cây khung là tập gồm cạnh nối mọi đỉnh mà không tạo chu trình. MST là cây khung có tổng trọng số nhỏ nhất:
Cả hai thuật toán kinh điển đều dựa trên tính chất lát cắt (cut property): với mọi cách chia thành hai phần, cạnh nhẹ nhất bắc qua lát cắt luôn thuộc một MST nào đó[4].
| Tiêu chí | Kruskal (1956)[2] | Prim (1957)[3] |
|---|---|---|
| Ý tưởng | Duyệt cạnh từ nhẹ đến nặng, bỏ cạnh tạo chu trình | Mở rộng dần một cây từ một đỉnh gốc |
| Cấu trúc dữ liệu chính | Union-Find (disjoint set) | Priority queue |
| Độ phức tạp | với binary heap | |
| Phù hợp | Đồ thị thưa, cạnh đã có sẵn dạng danh sách | Đồ thị dày |
Với ma trận tương quan, đồ thị là đầy đủ: . Với vài trăm cổ phiếu, cả hai đều chạy trong tích tắc.
Cài đặt bằng Python
Đoạn code dưới đây cài Kruskal với Union-Find, không phụ thuộc thư viện đồ thị nào. Đầu vào là DataFrame giá đóng cửa, mỗi cột là một mã cổ phiếu.
import numpy as npimport pandas as pd
def correlation_distance(prices: pd.DataFrame) -> pd.DataFrame: """Ma trận khoảng cách d_ij = sqrt(2(1 - rho_ij)) từ giá đóng cửa.""" log_returns = np.log(prices).diff().dropna() rho = log_returns.corr() # clip trước khi lấy căn: sai số dấu phẩy động có thể làm 1 - rho hơi âm (=> NaN) return np.sqrt((2 * (1 - rho)).clip(lower=0))
class UnionFind: def __init__(self, n: int): self.parent = list(range(n))
def find(self, x: int) -> int: while self.parent[x] != x: self.parent[x] = self.parent[self.parent[x]] # path halving x = self.parent[x] return x
def union(self, a: int, b: int) -> bool: root_a, root_b = self.find(a), self.find(b) if root_a == root_b: return False # a và b đã cùng cây => thêm cạnh sẽ tạo chu trình self.parent[root_b] = root_a return True
def kruskal_mst(dist: pd.DataFrame) -> list[tuple[str, str, float]]: names = list(dist.columns) n = len(names) # Lấy tam giác trên của ma trận => danh sách cạnh (vectorized, không dùng vòng lặp lồng nhau) i, j = np.triu_indices(n, k=1) weights = dist.to_numpy()[i, j] order = np.argsort(weights, kind="stable")
uf = UnionFind(n) edges = [] for k in order: if uf.union(i[k], j[k]): edges.append((names[i[k]], names[j[k]], float(weights[k]))) if len(edges) == n - 1: break return edges| Cạnh trong MST | ||
|---|---|---|
| BANK_A — BANK_B | 0.82 | 0.600 |
| BANK_B — BANK_C | 0.76 | 0.693 |
| BANK_A — STEEL_A | 0.55 | 0.949 |
| STEEL_A — TECH_A | 0.41 | 1.086 |
Các ngân hàng tụ lại thành một nhánh với khoảng cách nhỏ; các ngành khác nối vào qua những cạnh dài hơn. Trên dữ liệu thật, cấu trúc cụm ngành này là quan sát nổi bật nhất trong nghiên cứu gốc của Mantegna[1].
Những điểm cần cẩn trọng
- Cửa sổ thời gian: tương quan thay đổi theo chế độ thị trường. MST tính trên 3 tháng khủng hoảng có thể rất khác MST trên 3 năm.
- Độ ổn định: với phiên và cổ phiếu, khi không nhỏ, ma trận tương quan mẫu chứa nhiều nhiễu. Nên thử lại MST trên các cửa sổ con để xem cạnh nào ổn định.
- MST loại bỏ thông tin: từ cạnh chỉ giữ lại . Nó tốt cho việc nhìn cấu trúc, không thay thế được toàn bộ ma trận tương quan khi tính rủi ro danh mục.
Tài liệu tham khảo
- [1]Rosario N. Mantegna. Hierarchical structure in financial markets. The European Physical Journal B, 11, 193–197, 1999.
- [2]Joseph B. Kruskal. On the shortest spanning subtree of a graph and the traveling salesman problem. Proceedings of the American Mathematical Society, 7(1), 48–50, 1956.
- [3]Robert C. Prim. Shortest connection networks and some generalizations. Bell System Technical Journal, 36(6), 1389–1401, 1957.
- [4]Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction to Algorithms (4th edition). MIT Press, 2022. Chương 21 — Minimum Spanning Trees.