Signal 9 — Market Regime Filter
| Thuộc tính | Giá trị |
|---|---|
| Phân loại | Macro / Regime Detection |
| Khung thời gian | Daily |
| Paper gốc | Ang-Bekaert (2002) — Regime Switching; Lo-MacKinlay (1988) |
| Loại dữ liệu | Index returns + volatility + breadth |
| Hướng giao dịch | Filter on/off cho chiến lược khác |
| Capacity | N/A — filter |
Logic. Dùng K-means clustering (k=4) trên features: [return_20d, realized_vol_20d, VR(5), drawdown_60d] để classify 4 regimes: Bull-Quiet, Bull-Volatile, Bear-Volatile, Bear-Quiet. Áp dụng momentum chỉ trong Bull-Quiet, mean-reversion trong Bear-Volatile, đứng ngoài trong Bull-Volatile.
Code Python.
python
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
def build_regime_features(index_df):
ret = index_df['close'].pct_change()
feat = pd.DataFrame({
'ret_20': ret.rolling(20).sum(),
'vol_20': ret.rolling(20).std() * np.sqrt(252),
'vr_5': ret.rolling(5).var() / (5 * ret.rolling(1).var().rolling(5).mean()),
'dd_60': index_df['close'] / index_df['close'].rolling(60).max() - 1,
}).dropna()
return feat
def fit_regimes(feat, n_clusters=4, seed=42):
scaler = StandardScaler()
X = scaler.fit_transform(feat)
km = KMeans(n_clusters=n_clusters, random_state=seed, n_init=10).fit(X)
return scaler, kmQuantConnect setup. Trong Initialize, fit model trên 5 năm history của VN-Index. Schedule daily prediction → set self.current_regime = .... Các strategy con check self.current_regime trước khi entry.