regime-detection について
regime-detectionは、トレーディング戦略の開発者向けに市場環境を分析するスキルです。ボラティリティ、トレンド、平均回帰の指標を組み合わせ、検出したレジームに応じた戦略、ポジションサイズ、ストップの調整方法を示します。
主な機能
- 01ATR、ADX、EMA、ボリンジャーバンド指標
- 02ハースト指数とCUSUMによる検出
- 03オプションの隠れマルコフモデル
- 044象限のレジーム分類
- 05レジームに応じた戦略とリスクの調整
活用シーン
- 01現在の市場環境に合う戦略の選択
- 02ボラティリティに応じたサイズとストップの調整
- 03高ボラティリティのレンジ相場で取引を縮小
- 04PumpFunトークンの短期レジーム分析
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill regime-detectionインストール後、Claude Code で/regime-detectionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/methodology.mdstrategy_adaptation.mdscripts/detect_regime.pyregime_backtest.py詳細
レジーム検出
現在の市場レジームを特定することで、適切な戦略を選び、正しくポジションサイズを設定し、レンジ相場でトレンドフォローのロジックを適用したり、その逆を行ったりするのを避けられます。
レジーム検出が重要な理由
どの戦略にも「得意なレジーム」があります。モメンタム戦略は明確な上昇トレンドで大きな利益を生みますが、荒いレンジ相場では損失が膨らみます。平均回帰型のグリッド戦略は低ボラティリティの保ち合いで力を発揮しますが、トレンドを伴うブレイクアウトには圧倒されます。レジーム検出により、今どの戦略を使うべきかが分かります。
主なメリット:
- 戦略の選択:現在の環境に合った戦略にシグナルを振り分けます
- ポジションサイズの調整:不利なレジームではエクスポージャーを減らし、有利なレジームでは増やします
- ストップの調整:高ボラティリティのレジームではストップを広くし、低ボラティリティのトレンドでは狭くします
- ドローダウンの抑制:「危険ゾーン」のレジーム(高ボラティリティ+トレンドなし)では取引を見送ります
レジームを構成する主な要素
直交する2つの軸で、4象限のレジームモデルを定義します。
| 低ボラティリティ | 高ボラティリティ | |
|---|---|---|
| トレンド相場 | Q1:明確なトレンド — トレンドフォローに最適 | Q2:変動の大きいトレンド — 注意しながらモメンタムを活用 |
| レンジ相場 | Q3:静かなレンジ — 平均回帰に最適 | Q4:荒れた相場 — エクスポージャーを減らすか、取引を見送る |
第3の要素である平均回帰傾向(ハースト指数)は、価格がどれほど安定して回帰するかを示し、Q3をさらに細分化します。
シンプルな手法(ML不要)
1. ATRのボラティリティ・パーセンタイル
現在のATRを直近の履歴と比較して順位付けし、0~100のパーセンタイルスコアを算出します。
import pandas as pd
import numpy as np
def atr_percentile(
high: pd.Series, low: pd.Series, close: pd.Series,
atr_period: int = 14, lookback: int = 100
) -> pd.Series:
"""ATR percentile rank over a rolling window."""
tr = pd.concat([
high - low,
(high - close.shift(1)).abs(),
(low - close.shift(1)).abs()
], axis=1).max(axis=1)
atr = tr.rolling(atr_period).mean()
return atr.rolling(lookback).apply(
lambda x: pd.Series(x).rank(pct=True).iloc[-1], raw=False
)
- 25パーセンタイル未満 → 低ボラティリティのレジーム
- 25~75パーセンタイル → 通常のボラティリティ
- 75パーセンタイル超 → 高ボラティリティのレジーム
2. ADXによるトレンドの強さ
ADXが25を超えるとトレンド相場、20を下回るとレンジ相場を示します。
def compute_adx(
high: pd.Series, low: pd.Series, close: pd.Series,
period: int = 14
) -> pd.Series:
"""Average Directional Index."""
plus_dm = high.diff().clip(lower=0)
minus_dm = (-low.diff()).clip(lower=0)
# Zero out when the other is larger
plus_dm[plus_dm < minus_dm] = 0
minus_dm[minus_dm < plus_dm] = 0
tr = pd.concat([
high - low,
(high - close.shift(1)).abs(),
(low - close.shift(1)).abs()
], axis=1).max(axis=1)
atr = tr.ewm(span=period, adjust=False).mean()
plus_di = 100 * plus_dm.ewm(span=period, adjust=False).mean() / atr
minus_di = 100 * minus_dm.ewm(span=period, adjust=False).mean() / atr
dx = 100 * (plus_di - minus_di).abs() / (plus_di + minus_di)
return dx.ewm(span=period, adjust=False).mean()
3. EMAの傾き+価格の位置
def trend_direction(close: pd.Series, period: int = 20) -> pd.Series:
"""Returns +1 (uptrend), -1 (downtrend), 0 (neutral)."""
ema = close.ewm(span=period, adjust=False).mean()
slope = ema.diff(5) # 5-bar slope
above = (close > ema).astype(int)
direction = pd.Series(0, index=close.index)
direction[(slope > 0) & (above == 1)] = 1
direction[(slope < 0) & (above == 0)] = -1
return direction
4. ボリンジャーバンド幅のパーセンタイル
BB幅(上限-下限)/中央線をボラティリティの代用指標として使います。「スクイーズ」(パーセンタイルが低い状態)は、しばしばブレイクアウトに先行します。
def bb_width_percentile(
close: pd.Series, period: int = 20,
std_dev: float = 2.0, lookback: int = 100
) -> pd.Series:
"""Bollinger Band width percentile."""
sma = close.rolling(period).mean()
std = close.rolling(period).std()
width = (2 * std_dev * std) / sma
return width.rolling(lookback).apply(
lambda x: pd.Series(x).rank(pct=True).iloc[-1], raw=False
)
統計的手法
ローリング・ハースト指数
ハースト指数Hは、時系列の挙動を次のように分類します。
- H < 0.4 → 平均回帰(反持続性)
- 0.4 ≤ H ≤ 0.6 → ランダムウォーク(利用可能な構造なし)
- H > 0.6 → トレンド(持続性)
Rescaled Range(R/S)法で算出します。詳しい導出については references/methodology.md を参照してください。
def hurst_exponent(series: pd.Series, max_lag: int = 50) -> float:
"""Estimate Hurst exponent using R/S method."""
lags = range(2, max_lag)
rs_values = []
for lag in lags:
chunks = [series.iloc[i:i+lag] for i in range(0, len(series) - lag, lag)]
rs_list = []
for chunk in chunks:
if len(chunk) < lag:
continue
mean_val = chunk.mean()
devs = chunk - mean_val
cumdev = devs.cumsum()
r = cumdev.max() - cumdev.min()
s = chunk.std(ddof=1)
if s > 0:
rs_list.append(r / s)
if rs_list:
rs_values.append(np.mean(rs_list))
else:
rs_values.append(np.nan)
valid = [(l, r) for l, r in zip(lags, rs_values) if not np.isnan(r)]
if len(valid) < 5:
return 0.5
log_lags = np.log([v[0] for v in valid])
log_rs = np.log([v[1] for v in valid])
coeffs = np.polyfit(log_lags, log_rs, 1)
return coeffs[0]
変化点検出(CUSUM)
リターン系列の平均または分散の急激な変化を検出します。
def cusum_test(
returns: pd.Series, threshold: float = 2.0
) -> list[int]:
"""CUSUM change-point detection on returns.
Returns indices where regime changes are detected.
"""
mean_r = returns.mean()
std_r = returns.std()
if std_r == 0:
return []
s_pos, s_neg = 0.0, 0.0
changes = []
for i, r in enumerate(returns):
z = (r - mean_r) / std_r
s_pos = max(0, s_pos + z - 0.5)
s_neg = max(0, s_neg - z - 0.5)
if s_pos > threshold or s_neg > threshold:
changes.append(i)
s_pos, s_neg = 0.0, 0.0
return changes
隠れマルコフモデル
hmmlearn を使った2~3状態のレジームモデル向けです。これは任意機能であり、すべての主要機能はnumpy/pandasのみで動作します。
# Optional: requires `uv pip install hmmlearn`
from hmmlearn import hmm
def fit_hmm_regimes(
returns: np.ndarray, n_states: int = 2, n_iter: int = 100
) -> tuple[np.ndarray, object]:
"""Fit a Gaussian HMM to return series."""
X = returns.reshape(-1, 1)
model = hmm.GaussianHMM(
n_components=n_states, covariance_type="full", n_iter=n_iter
)
model.fit(X)
states = model.predict(X)
return states, model
特徴量の選択と状態の解釈について詳しくは references/methodology.md を参照してください。
暗号資産特有の考慮事項
レジームの変化速度
暗号資産のレジームは、株式よりもはるかに速く変化します。
| パラメーター | 株式 | 暗号資産(大型銘柄) | 暗号資産(マイクロキャップ/PumpFun) |
|---|---|---|---|
| ATRのルックバック | 100~200本 | 50~100本 | 20~50本 |
| ADX期間 | 14~28 | 10~14 | 7~10 |
| レジームの持続期間 | 数週間~数か月 | 数日~数週間 | 数時間~数日 |
| ハースト指数のウィンドウ | 200本以上 | 100本 | 50本 |
レジームのシグナルとしての出来高
暗号資産では、出来高によってレジームの質を確認できます。
- 高出来高+トレンド → 強い確信が持てるため、保有を続けます
- 低出来高+トレンド → 緩やかな動きで信頼性が低いため、サイズを減らします
- 高出来高+レンジ → 分配または蓄積の可能性があるため、ブレイクアウトに注意します
- 低出来高+レンジ → 活気のない市場のため、取引を見送ります
PumpFunのマイクロレジーム
新しいトークンのローンチでは、典型的な順序で推移します。
- ローンチ時の急騰(数分):垂直方向の値動き、極端なボラティリティ、平均回帰なし
- 最初の急落(数分~数時間):利益確定、高ボラティリティ、下降トレンド
- 保ち合い(数時間~数日):低ボラティリティのレンジ、平均回帰の可能性
- 第2波または終焉:再びブレイクアウトする(新たなトレンド)か、ゼロに向かって下落します
各マイクロレジームは数分から数時間続きます。1分足と20~50本のウィンドウを使います。
組み合わせによるレジーム分類
def classify_regime(
vol_percentile: float, adx: float, hurst: float,
trend_dir: int
) -> dict[str, str]:
"""Classify into the 4-quadrant model."""
vol_regime = (
"low" if vol_percentile < 0.30
else "high" if vol_percentile > 0.70
else "normal"
)
trend_regime = (
"trending" if adx > 25
else "ranging" if adx < 20
else "transitional"
)
direction = (
"up" if trend_dir > 0
else "down" if trend_dir < 0
else "neutral"
)
mr_regime = (
"mean_reverting" if hurst < 0.4
else "trending" if hurst > 0.6
else "random"
)
return {
"volatility": vol_regime,
"trend": trend_regime,
"direction": direction,
"mean_reversion": mr_regime,
"quadrant": f"{vol_regime}_vol_{trend_regime}",
}
戦略の適応
レジームと戦略の完全な対応表については、references/strategy_adaptation.md を参照してください。
クイックリファレンス:
| 現在のレジーム | アクション |
|---|---|
| 低ボラティリティ+上昇トレンド | トレンドフォローをフルサイズで実行し、ストップを狭く設定 |
| 高ボラティリティ+トレンド | モメンタムを半分のサイズで実行し、ストップを広く設定 |
| 低ボラティリティ+レンジ相場 | 平均回帰/グリッド戦略 |
| 高ボラティリティ+レンジ相場 | サイズを25%に縮小するか、取引を見送る |
| レジーム移行中 | ポジションを解消するか、最小サイズまで縮小 |
他のスキルとの統合
pandas-ta:ATR、ADX、ボリンジャーバンド、EMAを計算volatility-modeling:高度なボラティリティ予測(GARCH、実現ボラティリティ)strategy-framework:実行前にレジームフィルターを通してシグナルを振り分けposition-sizing:レジームのボラティリティに応じてポジションサイズを調整risk-management:レジームごとにポートフォリオのリスク上限を調整
ファイル
リファレンス
references/methodology.md— ハースト指数、HMM、変化点検出、ボラティリティ推定手法の詳細な数式references/strategy_adaptation.md— ポジションサイジング、ストップの調整、PumpFunのマイクロレジームのプレイブックを含む、レジームと戦略の完全な対応表
スクリプト
scripts/detect_regime.py— ライブデータまたはデモデータでレジーム指標を計算し、4象限モデルに分類scripts/regime_backtest.py— 明確なレジーム移行を含む合成データで、レジーム適応型戦略と固定戦略を比較