feature-engineering について
feature-engineeringは、暗号資産の市場、取引、オンチェーンデータから特徴量を作る、トレーディングMLモデル向けスキルです。定常性、ローリング正規化、先読みバイアスの防止、特徴量選択、ラベル作成を扱います。
主な機能
- 01価格、出来高、テクニカル指標の特徴量
- 02マイクロストラクチャ、オンチェーン、クロスアセット特徴量
- 03定常性の検定と変換
- 04先読みバイアスを避けるローリング正規化
- 05特徴量選択とラベル作成
活用シーン
- 01OHLCVデータからモデル入力を構築
- 02特徴量の定常性を検定して変換
- 03正規化や分割での先読みバイアスを防止
- 04特徴量を選び分類・回帰の目的変数を作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill feature-engineeringインストール後、Claude Code で/feature-engineeringを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/feature_catalog.mdpitfalls.mdscripts/build_features.pyfeature_importance.py詳細
取引 ML のための特徴量エンジニアリング
特徴量エンジニアリングは、ML 取引モデルの構築において最も効果の高い作業です。モデルの選択(XGBoost、ニューラルネット、ロジスティック回帰)は、入力特徴量の品質や多様性ほど重要ではありません。優れた特徴量を使ったシンプルなモデルは、常に生の価格を使った複雑なモデルを上回ります。
このスキルでは、暗号資産/Solana トークンの取引を対象とした分類(シグナル分類)モデルと回帰モデルに使用する、市場データからの特徴量の構築、検証、選択について説明します。
モデルより特徴量が優れている理由
生の OHLCV データは非定常で、ノイズが多く、高次元です。価格系列を直接使って学習したモデルは過学習します。特徴量エンジニアリングによって、生のデータを、マーケットの挙動のさまざまな側面を捉える定常的で有益なシグナルに変換します。
- 圧縮:数千本の価格バーを、数十個の記述統計量に集約します
- 定常性:非定常な価格を定常なリターンや比率に変換します
- ドメイン知識:トレーダーの直感(サポート/レジスタンス、出来高のクライマックスなど)を計算可能な量として符号化します
- レジーム認識:トレンド相場とレンジ相場で異なる挙動を示す特徴量が、モデルの適応に役立ちます
特徴量のカテゴリ
1. 価格特徴量
OHLCV の価格列のみから導出されます。価格系列自体からトレンド、モメンタム、ボラティリティを捉えます。
| 特徴量 | 計算式 | ルックバック |
|---|---|---|
log_return | ln(close_t / close_{t-1}) | 1 バー |
abs_return | abs(log_return) | 1 バー |
return_volatility | std(log_return, N) | 20 バー |
momentum_N | close_t / close_{t-N} - 1 | 5、10、20 |
acceleration | momentum_5 - momentum_5[5] | 10 バー |
high_low_range | (high - low) / close | 1 バー |
close_position | (close - low) / (high - low) | 1 バー |
gap | open_t / close_{t-1} - 1 | 1 バー |
rolling_skew | skew(log_return, N) | 20 バー |
rolling_kurtosis | kurtosis(log_return, N) | 20 バー |
2. 出来高特徴量
出来高は価格変動を裏付けたり、否定したりします。価格と出来高のダイバージェンスは、短期取引において最も信頼性の高いシグナルのひとつです。
| 特徴量 | 計算式 | ルックバック |
|---|---|---|
volume_ratio | volume_t / mean(volume, N) | 20 バー |
volume_ma_ratio | sma(volume, 5) / sma(volume, 20) | 20 バー |
obv_slope | slope(OBV, N) | 10 バー |
vwap_deviation | (close - VWAP) / VWAP | 日中 |
volume_acceleration | volume_ratio_t - volume_ratio_{t-1} | 21 バー |
buy_volume_ratio | buy_volume / total_volume | 1 バー |
dollar_volume | close * volume | 1 バー |
volume_cv | std(volume, N) / mean(volume, N) | 20 バー |
3. テクニカル特徴量
pandas-ta で計算する標準的なテクニカル指標です。パラメーターの詳細については、pandas-ta スキルを参照してください。
| 特徴量 | ソース | ルックバック |
|---|---|---|
rsi | RSI(14) | 14 バー |
macd_histogram | MACD(12,26,9) ヒストグラム | 33 バー |
bb_position | (close - BB_lower) / (BB_upper - BB_lower) | 20 バー |
bb_width | (BB_upper - BB_lower) / BB_mid | 20 バー |
atr_ratio | ATR(14) / close | 14 バー |
adx | ADX(14) | 14 バー |
stoch_k | ストキャスティクス %K(14,3) | 14 バー |
cci | CCI(20) | 20 バー |
mfi | MFI(14) | 14 バー |
supertrend_direction | Supertrend の方向(+1/-1) | 10 バー |
4. マイクロストラクチャ特徴量
取引単位のデータ(個々のスワップ/トランザクション)から導出されます。オンチェーンデータまたは DEX API データが必要です。
| 特徴量 | 説明 |
|---|---|
trade_count_ratio | このバーの取引数 / バーあたりの平均取引数 |
avg_trade_size | 平均取引サイズ(USD) |
large_trade_pct | 10,000 ドルを超える取引の出来高割合 |
unique_traders | 個別ウォレットアドレス数 |
buy_count_ratio | 買い取引数 / 取引総数 |
trade_size_entropy | 取引サイズ分布のシャノンエントロピー |
5. オンチェーン機能
ブロックチェーンの状態変化から導出します。Helius または Solana RPC のデータが必要です。
| 機能 | 説明 |
|---|---|
holder_count_change | N 期間におけるユニーク保有者数の変化 |
whale_net_flow | 上位 10 保有者が移動させたトークンの純量 |
token_velocity | 転送量 / 流通供給量 |
liquidity_change | DEX 流動性プールの TVL の変化 |
6. クロスアセット機能
対象トークンと市場全体との関係を捉えます。
| 機能 | 説明 |
|---|---|
sol_correlation | SOL 価格とのローリング相関 |
btc_beta | BTC リターンに対するローリングベータ |
sector_momentum | 同じセクターのトークンの平均リターン |
7. 時間機能
暦時間を周期的にエンコードします。周期的な連続性(23 時は 0 時に近い)を保つには、sin/cos エンコーディングを使用します。
import numpy as np
hour_sin = np.sin(2 * np.pi * hour / 24)
hour_cos = np.cos(2 * np.pi * hour / 24)
day_of_week = np.sin(2 * np.pi * day / 7)
定常性
非定常な特徴量は、新しいデータでモデルを失敗させます。 特徴量が定常であるとは、その統計的性質(平均、分散)が時間とともに変化しないことです。
定常性のテスト
拡張ディッキー・フラー検定(ADF 検定)を使用します。
from scipy.stats import adfuller
result = adfuller(feature_series.dropna())
p_value = result[1]
is_stationary = p_value < 0.05
特徴量を定常化する
| 非定常 | 定常化する変換 |
|---|---|
| 価格 | 対数リターン |
| 出来高 | 出来高比(出来高 / 平均出来高) |
| OBV | OBV の傾き(回帰係数) |
| 保有者数 | 保有者数の変化 |
| RSI | すでに定常(0~100 の範囲) |
| ドル建て出来高 | ドル建て出来高 / ローリング平均 |
ルール:特徴量が時間とともに上昇または下降する傾向にある場合、非定常です。比率、差分、または変化率に変換してください。
正規化
特徴量を計算した後、すべての特徴量のスケールが比較可能になるように正規化します。これは距離ベースのモデル(KNN、SVM)では不可欠であり、ツリーモデルにも有効です。
| 方法 | 数式 | 使用する場面 |
|---|---|---|
| Z スコア | (x - mean) / std | ガウス分布に近い分布 |
| 最小最大 | (x - min) / (max - min) | 範囲が限定された特徴量(RSI、BB の位置) |
| 順位 | rank(x) / len(x) | 裾の重い分布 |
重要:正規化にはローリング統計量を使用してください。全サンプルの平均/標準偏差は使用しないでください。先読みバイアスが生じます。
# CORRECT: rolling z-score
z = (feature - feature.rolling(60).mean()) / feature.rolling(60).std()
# WRONG: full-sample z-score (lookahead bias!)
z = (feature - feature.mean()) / feature.std()
先読みなしの保証
トレーディング ML で最も危険なバグは先読みバイアスです。これは、特徴量やターゲットの計算に将来の情報を使用することです。次のルールを必ず守ってください。
- ローリング計算のみを使用する:全系列に対して
.mean()や.std()を使用しないでください。常に.rolling(N).mean()を使用してください。 - 特徴量を後ろにずらすのではなく、ターゲットを前にずらす:ターゲットは
close.shift(-N) / close - 1(将来リターン)です。close / close.shift(N) - 1(ターゲットに使用された過去のリターン)ではありません。 - 将来のインデックスに合わせない:特徴量とターゲットの DataFrame を結合する際は、特徴量の行
tがターゲットの行t(ターゲットにはすでに将来方向へのシフトが含まれています)と対応していることを確認してください。 - 時間順に訓練/テストを分割する:ランダムに分割しないでください。常に
train = data[:split_idx]、test = data[split_idx:]としてください。
特徴量選択
多くの特徴量を計算した後、予測力が高く、重複の少ない特徴量を選択します。
ステップ 1:低分散の特徴量を削除する
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.01)
X_filtered = selector.fit_transform(X)
ステップ 2:相関フィルター
別の特徴量との相関が 0.9 を超える特徴量を削除します(ターゲットとの相関が高い方を残します)。
corr_matrix = X.corr().abs()
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))
to_drop = [col for col in upper.columns if any(upper[col] > 0.9)]
ステップ 3:特徴量の重要度
ランダムフォレストを訓練し、重要度順に順位付けします。
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
importances = pd.Series(rf.feature_importances_, index=X.columns).sort_values(ascending=False)
ステップ 4:相互情報量
相関の非線形な代替手段です。
from sklearn.feature_selection import mutual_info_classif
mi = mutual_info_classif(X_train, y_train, random_state=42)
mi_scores = pd.Series(mi, index=X.columns).sort_values(ascending=False)
ラベルの作成
ラベル(ターゲット)は、モデルが何を予測するかを定義します。
二値分類
forward_return = close.shift(-N) / close - 1
label = (forward_return > threshold).astype(int) # 1 = up, 0 = not up
一般的な閾値:1 時間足では 1%、4 時間足では 3%、日足では 5%です。
多クラス分類
label = pd.cut(forward_return,
bins=[-np.inf, -threshold, threshold, np.inf],
labels=[0, 1, 2]) # 0=down, 1=flat, 2=up
回帰
target = forward_return # Predict exact return magnitude
初期モデルには二値分類を推奨します。よりシンプルで、ノイズに対してより堅牢です。
他のスキルとの連携
pandas-ta:テクニカル指標を計算し、特徴量として使用しますbirdeye-api:特徴量の計算に使用する OHLCV データと取引データを取得しますhelius-api:保有者/クジラの特徴量に使用するオンチェーンデータを取得しますsignal-classification:設計した特徴量をモデルの入力として使用しますregime-detection:レジームラベルを特徴量として使用するか、レジーム条件付きモデルに使用しますohlcv-processing:特徴量の計算前に生データをクリーニングしてリサンプリングします
ファイル
リファレンス
references/feature_catalog.md— 約 40 個の特徴量を網羅したカタログです。計算式、ルックバック期間、定常性の状態、解釈に関する注意事項を記載していますreferences/pitfalls.md— トレーディングの特徴量エンジニアリングでよくある間違いを解説します: 先読みバイアス、過学習、生存者バイアス、データスヌーピング、非定常性
スクリプト
scripts/build_features.py— OHLCV データから 25 個以上の特徴量を計算し、定常性のテストと品質レポートを行います。合成データを使うデモモードと、Birdeye API 経由のライブデータに対応していますscripts/feature_importance.py— 木ベースの重要度と置換重要度を使用して、予測力に基づいて特徴量をランク付けします。相関分析により、冗長な特徴量を特定します