Amihud Illiquidity Ratio (ILLIQ)
Nguồn: Yakov Amihud (2002, Journal of Financial Markets) Loại: Tín hiệu thanh khoản / phần bù rủi ro Tag:
moi:2026-05-16#liquidity#risk-premium#cross-asset
Bản chất tín hiệu
Amihud (2002) đề xuất một thước đo thanh khoản đơn giản nhưng rất hiệu quả từ dữ liệu daily — không cần tick data hay order book. Công thức:
$$\text{ILLIQ}_t = \frac{|R_t|}{V_t}$$
trong đó $R_t$ là lợi suất ngày $t$ (decimal) và $V_t$ là khối lượng giao dịch tính bằng tiền (turnover). Trực giác: ILLIQ đo độ dịch chuyển giá per dollar volume — tài sản thanh khoản tốt thì $V$ lớn hấp thụ được biến động giá nhỏ; tài sản thanh khoản kém thì một chút volume cũng đẩy giá đi xa.
ILLIQ trung bình theo tháng/quý/năm tương quan rất mạnh với:
- Bid-ask spread (corr ~ 0.75 trên cổ phiếu Mỹ).
- Kyle's lambda (price impact coefficient — corr ~ 0.65).
- Roll's effective spread.
Phát hiện quan trọng nhất của Amihud: lợi suất kỳ vọng tăng theo ILLIQ — tài sản kém thanh khoản trả phần bù để bù đắp cho rủi ro thanh khoản. Phần bù này tồn tại trên cổ phiếu Mỹ, cổ phiếu các thị trường mới nổi, trái phiếu, và đặc biệt rõ rệt nhất trên crypto.
So với các tín hiệu thanh khoản dựa trên order book (OFI, BADR), ILLIQ có 3 lợi thế:
- Chỉ cần OHLCV daily — universal trên mọi thị trường có data công khai.
- Robust với cấu trúc microstructure khác biệt giữa các sàn.
- Capture được persistent illiquidity (tuần/tháng) chứ không phải noise intraday.
Hạn chế: cần ít nhất 60-100 phiên để có ILLIQ trung bình ổn định; không bắt được illiquidity ngắn hạn flash.
Ứng dụng giao dịch chính
Ba cách dùng phổ biến:
Cross-sectional liquidity premium (long-short):
- Universe: nhóm tài sản đồng nhất (e.g. 30 mã cổ phiếu, 50 đồng altcoin).
- Sort theo ILLIQ trung bình 60 phiên: long top 1/3 (illiquid) — short bottom 1/3 (liquid).
- Rebalance hàng tháng. Lợi suất kỳ vọng dương dài hạn nhờ liquidity risk premium.
Filter chiến lược momentum/value: chỉ trade khi ILLIQ < median lịch sử để tránh slippage ăn alpha. Đặc biệt quan trọng cho altcoin và small-cap.
Adaptive position sizing: size $\propto \frac{1}{\sqrt{\text{ILLIQ}_t}}$ — tài sản thanh khoản kém thì size nhỏ lại để giữ market impact không đổi.
Áp dụng đa thị trường
VN30F (Hợp đồng tương lai chỉ số Việt Nam)
- Tính ILLIQ trên front month contract daily. ADV ~ 250.000 contracts × giá ~ 1.300 điểm × 100.000 VND = ~ 32 nghìn tỷ VND/phiên.
- ILLIQ trung bình rolling 60 phiên ~ 1e-12 đến 5e-12. Khi nhảy lên > 1e-11 báo hiệu phiên thiếu market maker (thường là phiên có sự kiện sốc).
- Filter: khi ILLIQ rolling 5 phiên > quantile 80% lịch sử → giảm size 50%, mở rộng stop.
US equity futures (ES, NQ, RTY, YM)
- ES (E-mini S&P 500) là tài sản thanh khoản nhất hành tinh: ADV ~ 1.5-2M contracts × $200 × $5,200 = ~$2 trillion notional/phiên. ILLIQ cực thấp (~1e-15), gần như không có liquidity premium intraday.
- NQ (Nasdaq) và RTY (Russell 2000) ILLIQ cao hơn ES 2-5x, đặc biệt RTY khi market crash.
- Use case: cross-contract liquidity arbitrage — khi ILLIQ_RTY/ILLIQ_ES tăng vọt (> 95th percentile), đó là dấu hiệu small-cap đang bị thiếu vốn → small-cap underperform 5-10 phiên tiếp theo.
- Calendar effect: ILLIQ tăng quanh roll period (3rd Friday quarterly) và FOMC days.
Crypto spot (BTC, ETH, altcoins major)
- BTC spot trên Binance: ILLIQ ~ 1e-10 (rất thanh khoản). ETH spot ~ 2e-10.
- Altcoin top-50 trên Binance: ILLIQ trải dài từ 1e-9 (XRP, SOL, BNB) đến 1e-7 (small-cap altcoin).
- Đây là chỗ liquidity premium mạnh nhất: bài nghiên cứu của Liu, Tsyvinski, Wu (2022) chỉ ra trong universe top-100 altcoin, decile illiquid nhất outperform decile liquid nhất ~ 18%/năm trên 2014-2020.
- Triển khai: weekly rebalance — chia universe altcoin (vol > $10M ADV để loại bỏ ghost) thành quintile theo ILLIQ 30 ngày, long Q5 — short Q1, equal weight.
Crypto futures (BTC perp, ETH perp, altcoin perp)
- BTC perpetual trên Binance/Bybit: ILLIQ tương đương BTC spot (arbitrage chặt).
- Altcoin perpetual: ILLIQ thường cao hơn spot 2-3x do tightness của perp market kém hơn.
- Use case: khi ILLIQ_perp - ILLIQ_spot > 95th percentile → spot/perp basis trade có khả năng widen (perp dễ bị squeeze hơn).
- Funding rate × ILLIQ: combo của high funding + high ILLIQ thường báo hiệu liquidation cascade — fade vị thế đang đông.
Lưu ý chung khi cross-market
- ILLIQ phải normalize trước khi so sánh cross-asset (do scale của $V$ rất khác nhau). Cách phổ biến: dùng rank percentile trong từng universe và compare ranks.
- ILLIQ daily có strong day-of-week effect trên crypto (cuối tuần thanh khoản thấp) và US futures (Friday vs Monday) — dùng deseasonalized version.
Minh họa Python
import numpy as np
import pandas as pd
def amihud_illiq(close: pd.Series, dollar_volume: pd.Series,
window: int = 60) -> pd.Series:
"""
Tính ILLIQ rolling trung bình trên cửa sổ window phiên.
close: chuỗi giá đóng cửa daily (decimal).
dollar_volume: turnover = volume * vwap hoặc volume * close (cùng đơn vị tiền).
"""
daily_return = close.pct_change().abs()
illiq_daily = daily_return / dollar_volume.replace(0, np.nan)
return illiq_daily.rolling(window).mean()
def cross_sectional_liquidity_signal(prices_df: pd.DataFrame,
dollar_vol_df: pd.DataFrame,
lookback: int = 30,
n_quantile: int = 5) -> pd.DataFrame:
"""
Sort universe theo ILLIQ và trả về long/short signal theo quantile.
prices_df, dollar_vol_df: cùng index timestamp, cùng cột (tài sản).
Trả về DataFrame cùng shape với prices_df, giá trị {-1, 0, +1}.
"""
illiq = prices_df.pct_change().abs() / dollar_vol_df.replace(0, np.nan)
illiq_avg = illiq.rolling(lookback).mean()
ranks = illiq_avg.rank(axis=1, pct=True)
signal = pd.DataFrame(0, index=prices_df.index, columns=prices_df.columns)
signal[ranks > (1 - 1 / n_quantile)] = 1 # top quantile (illiquid) — long
signal[ranks < (1 / n_quantile)] = -1 # bottom quantile (liquid) — short
return signal
def adaptive_size_by_illiq(target_notional: float,
current_illiq: float,
median_illiq: float) -> float:
"""Adjust size theo illiquidity — illiquid hơn median thì giảm."""
ratio = current_illiq / median_illiq if median_illiq > 0 else 1.0
scale = 1.0 / np.sqrt(max(ratio, 0.1))
return target_notional * min(scale, 1.0) # không bao giờ size lớn hơn target
# Ví dụ cross-section trên altcoin universe:
# signal = cross_sectional_liquidity_signal(close_df, dollar_vol_df,
# lookback=30, n_quantile=5)
# pnl = (signal.shift(1) * close_df.pct_change()).mean(axis=1)