mcpField
F
feature-engineering

feature-engineering

github.com/agiprolabsデータ・データベース456523 回インストール8 週間前に更新
リポジトリ

feature-engineering について

feature-engineeringは、暗号資産の市場、取引、オンチェーンデータから特徴量を作る、トレーディングMLモデル向けスキルです。定常性、ローリング正規化、先読みバイアスの防止、特徴量選択、ラベル作成を扱います。

主な機能

  1. 01価格、出来高、テクニカル指標の特徴量
  2. 02マイクロストラクチャ、オンチェーン、クロスアセット特徴量
  3. 03定常性の検定と変換
  4. 04先読みバイアスを避けるローリング正規化
  5. 05特徴量選択とラベル作成

活用シーン

  1. 01OHLCVデータからモデル入力を構築
  2. 02特徴量の定常性を検定して変換
  3. 03正規化や分割での先読みバイアスを防止
  4. 04特徴量を選び分類・回帰の目的変数を作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/agiprolabs/claude-trading-skills --skill feature-engineering

インストール後、Claude Code で/feature-engineeringを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
feature_catalog.md
pitfalls.md
scripts/
build_features.py
feature_importance.py

詳細

取引 ML のための特徴量エンジニアリング

特徴量エンジニアリングは、ML 取引モデルの構築において最も効果の高い作業です。モデルの選択(XGBoost、ニューラルネット、ロジスティック回帰)は、入力特徴量の品質や多様性ほど重要ではありません。優れた特徴量を使ったシンプルなモデルは、常に生の価格を使った複雑なモデルを上回ります。

このスキルでは、暗号資産/Solana トークンの取引を対象とした分類(シグナル分類)モデルと回帰モデルに使用する、市場データからの特徴量の構築、検証、選択について説明します。

モデルより特徴量が優れている理由

生の OHLCV データは非定常で、ノイズが多く、高次元です。価格系列を直接使って学習したモデルは過学習します。特徴量エンジニアリングによって、生のデータを、マーケットの挙動のさまざまな側面を捉える定常的で有益なシグナルに変換します。

  • 圧縮:数千本の価格バーを、数十個の記述統計量に集約します
  • 定常性:非定常な価格を定常なリターンや比率に変換します
  • ドメイン知識:トレーダーの直感(サポート/レジスタンス、出来高のクライマックスなど)を計算可能な量として符号化します
  • レジーム認識:トレンド相場とレンジ相場で異なる挙動を示す特徴量が、モデルの適応に役立ちます

特徴量のカテゴリ

1. 価格特徴量

OHLCV の価格列のみから導出されます。価格系列自体からトレンド、モメンタム、ボラティリティを捉えます。

特徴量計算式ルックバック
log_returnln(close_t / close_{t-1})1 バー
abs_returnabs(log_return)1 バー
return_volatilitystd(log_return, N)20 バー
momentum_Nclose_t / close_{t-N} - 15、10、20
accelerationmomentum_5 - momentum_5[5]10 バー
high_low_range(high - low) / close1 バー
close_position(close - low) / (high - low)1 バー
gapopen_t / close_{t-1} - 11 バー
rolling_skewskew(log_return, N)20 バー
rolling_kurtosiskurtosis(log_return, N)20 バー
2. 出来高特徴量

出来高は価格変動を裏付けたり、否定したりします。価格と出来高のダイバージェンスは、短期取引において最も信頼性の高いシグナルのひとつです。

特徴量計算式ルックバック
volume_ratiovolume_t / mean(volume, N)20 バー
volume_ma_ratiosma(volume, 5) / sma(volume, 20)20 バー
obv_slopeslope(OBV, N)10 バー
vwap_deviation(close - VWAP) / VWAP日中
volume_accelerationvolume_ratio_t - volume_ratio_{t-1}21 バー
buy_volume_ratiobuy_volume / total_volume1 バー
dollar_volumeclose * volume1 バー
volume_cvstd(volume, N) / mean(volume, N)20 バー
3. テクニカル特徴量

pandas-ta で計算する標準的なテクニカル指標です。パラメーターの詳細については、pandas-ta スキルを参照してください。

特徴量ソースルックバック
rsiRSI(14)14 バー
macd_histogramMACD(12,26,9) ヒストグラム33 バー
bb_position(close - BB_lower) / (BB_upper - BB_lower)20 バー
bb_width(BB_upper - BB_lower) / BB_mid20 バー
atr_ratioATR(14) / close14 バー
adxADX(14)14 バー
stoch_kストキャスティクス %K(14,3)14 バー
cciCCI(20)20 バー
mfiMFI(14)14 バー
supertrend_directionSupertrend の方向(+1/-1)10 バー
4. マイクロストラクチャ特徴量

取引単位のデータ(個々のスワップ/トランザクション)から導出されます。オンチェーンデータまたは DEX API データが必要です。

特徴量説明
trade_count_ratioこのバーの取引数 / バーあたりの平均取引数
avg_trade_size平均取引サイズ(USD)
large_trade_pct10,000 ドルを超える取引の出来高割合
unique_traders個別ウォレットアドレス数
buy_count_ratio買い取引数 / 取引総数
trade_size_entropy取引サイズ分布のシャノンエントロピー
5. オンチェーン機能

ブロックチェーンの状態変化から導出します。Helius または Solana RPC のデータが必要です。

機能説明
holder_count_changeN 期間におけるユニーク保有者数の変化
whale_net_flow上位 10 保有者が移動させたトークンの純量
token_velocity転送量 / 流通供給量
liquidity_changeDEX 流動性プールの TVL の変化
6. クロスアセット機能

対象トークンと市場全体との関係を捉えます。

機能説明
sol_correlationSOL 価格とのローリング相関
btc_betaBTC リターンに対するローリングベータ
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
特徴量を定常化する
非定常定常化する変換
価格対数リターン
出来高出来高比(出来高 / 平均出来高)
OBVOBV の傾き(回帰係数)
保有者数保有者数の変化
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 で最も危険なバグは先読みバイアスです。これは、特徴量やターゲットの計算に将来の情報を使用することです。次のルールを必ず守ってください。

  1. ローリング計算のみを使用する:全系列に対して .mean() や .std() を使用しないでください。常に .rolling(N).mean() を使用してください。
  2. 特徴量を後ろにずらすのではなく、ターゲットを前にずらす:ターゲットは close.shift(-N) / close - 1(将来リターン)です。close / close.shift(N) - 1(ターゲットに使用された過去のリターン)ではありません。
  3. 将来のインデックスに合わせない:特徴量とターゲットの DataFrame を結合する際は、特徴量の行 t がターゲットの行 t(ターゲットにはすでに将来方向へのシフトが含まれています)と対応していることを確認してください。
  4. 時間順に訓練/テストを分割する:ランダムに分割しないでください。常に 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 — 木ベースの重要度と置換重要度を使用して、予測力に基づいて特徴量をランク付けします。相関分析により、冗長な特徴量を特定します

コメント