背景知識:特徴量エンジニアリングの一般的な落とし穴
クオンツ取引におけるAlphaの80%は特徴量エンジニアリングから来るが、失敗の80%も特徴量エンジニアリングから来る。
落とし穴1:未来情報の漏洩
問題:特徴量の計算で誤って未来のデータを使用してしまう。
# 間違った例:当日の終値を指標に使用するが、寄付で判断
df['ma20'] = df['close'].rolling(20).mean() # 当日の終値を含む
signal = df['close'] > df['ma20'] # 当日の終値で判断
# 正しいアプローチ:shift(1)で過去のデータのみ使用を保証
df['ma20'] = df['close'].rolling(20).mean().shift(1)
signal = df['close'] > df['ma20']
検出方法:
- 特徴量とラベルの相関 > 0.9 → 漏洩の可能性が高い
- モデル精度 > 90% → ほぼ確実に漏洩
落とし穴2:グローバル正規化
問題:データセット全体の統計量で正規化すると、未来の分布情報が漏洩する。
# 間違った例
mean = df['close'].mean() # 未来のデータを含む
std = df['close'].std()
df['normalized'] = (df['close'] - mean) / std
# 正しいアプローチ:ローリングウィンドウ正規化
df['normalized'] = (
(df['close'] - df['close'].rolling(20).mean()) /
df['close'].rolling(20).std()
)
落とし穴3:高相関特徴量の冗長性
問題:複数の特徴量が高度に相関し、情報の冗長性と過学習リスクを生む。
| 特徴量グループ | 相関 | 問題 |
|---|---|---|
| MA5, MA10, MA20 | 0.95以上 | ほぼ同一の情報 |
| RSI, Stochastic | 0.8以上 | 両方とも過買い/過売りを測定 |
| Close, VWAP | 0.99 | ほぼ同一 |
解決策:
- 相関 > 0.7 の場合は1つの特徴量のみ保持
- PCAで次元削減
- 最も説明力のある代表を選択
落とし穴4:ノイズへの過学習
問題:特徴量が多いほど、訓練データのノイズを記憶する可能性が高まる。
特徴量数とサンプル数の経験則:
Samples / Features > 20 -> セーフゾーン
Samples / Features = 10 -> 警告ゾーン
Samples / Features < 5 -> 危険ゾーン
例:1000サンプル、最大50特徴量を使用
解決策:
- 再帰的特徴量削除、検証セットのパフォーマンスを観察
- L1正規化で自動選択
- ドメイン知識が統計的有意性より優先
落とし穴5:カテゴリ特徴量のエンコードエラー
問題:カテゴリ特徴量の不適切な処理が情報損失や偽の関係を引き起こす。
# 間違った例:直接数値エンコード(順序を暗示)
sector_map = {'Technology': 1, 'Healthcare': 2, 'Finance': 3}
df['sector'] = df['sector_name'].map(sector_map) # モデルは 3 > 2 > 1 と考える
# 正しいアプローチ:One-Hotエンコード
df = pd.get_dummies(df, columns=['sector_name'])
落とし穴6:時変相関の無視
問題:特徴量の予測力が異なる期間で不安定。
| 期間 | Momentum Factor IC | Value Factor IC |
|---|---|---|
| 2015-2017 | 0.05 | 0.02 |
| 2018-2019 | 0.01 | 0.04 |
| 2020-2021 | 0.06 | -0.02 |
解決策:
- 単一のICではなくローリングICを使用
- IC安定性(IC/std(IC))が絶対IC値より重要
- レジーム条件下での特徴量の有効性を考慮
落とし穴7:データスヌーピング
問題:「有効な」特徴量が見つかるまで繰り返しテストし、実際には過学習。
100個の特徴量をテスト
-> p<0.05で5個が「有意」と予想
-> これらの5個は単なるランダムノイズの可能性
解決策:
- Bonferroni補正を使用:p値閾値 = 0.05 / テスト数
- 独立したOOSデータセットを予約
- 「成功した」特徴量だけでなく、すべてのテスト特徴量を記録
落とし穴8:取引コストの影響を無視
問題:高回転率の特徴量は実際の取引でコストに食われる。
Feature A: IC = 0.05, 回転率 200%/月
Feature B: IC = 0.03, 回転率 50%/月
片道コスト0.2%と仮定:
Feature Aのコスト: 200% x 0.2% x 2 = 0.8%/月
Feature Bのコスト: 50% x 0.2% x 2 = 0.2%/月
コスト後、Feature Bの方が良いかもしれない
特徴量エンジニアリングチェックリスト
| チェック項目 | 合格基準 |
|---|---|
| 未来情報なし | すべての特徴量がshift(1)以前のデータを使用 |
| ローリング正規化 | グローバルmean/stdを使用しない |
| 低相関 | 特徴量間の相関 < 0.7 |
| サンプル比 | Samples / Features > 20 |
| IC安定性 | IC / std(IC) > 0.5 |
| コスト実現可能性 | 回転率コスト後もプラスリターン |