6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

freqAI-LSTM トレーディングモデル徹底解説

Posted at

freqAI-LSTM トレーディングモデル徹底解説

はじめに

本記事では、GitHub上で公開されているNetanelshoshan/freqAI-LSTMリポジトリのトレーディングモデルを技術的に詳しく解説します。このプロジェクトは、FreqtradeのFreqAIモジュールをベースに、LSTMネットワークと動的重み付けシステムを組み合わせた高度な機械学習トレーディングボットです。

本記事は技術的分析を目的としており、投資の推奨や保証を行うものではありません。

プロジェクト概要

このトレーディングモデルの主な特徴は以下の通りです。

  • 多次元指標の統合: 複数のテクニカル指標を正規化し、動的な重み付けで統合
  • 深層学習による予測: PyTorch実装のLSTMモデルによる時系列予測
  • 適応的システム: 市場レジーム判定とボラティリティ調整機能
  • 高度な最適化: 過学習防止とノイズ除去機能

作者は最新版のFreqtrade(2024.02以降)で発生する問題を受け、TensorFlowからPyTorchへ移行しました。これにより、より良いGPUサポートと高速な開発サイクルを実現しています。

FreqAIフレームワークの特徴量生成

このモデルでは、FreqAIフレームワーク内で3つの段階で特徴量を生成しています。

1. 基本特徴量 (feature_engineering_expand_basic)

dataframe["%-pct-change"] = dataframe["close"].pct_change()
dataframe["%-raw_volume"] = dataframe["volume"]
dataframe["%-raw_price"] = dataframe["close"]

2. 拡張特徴量 (feature_engineering_expand_all)

複数の時間枠(timeframe)で以下の指標を計算します。

  • CCI (Commodity Channel Index, 期間20)
  • RSI (Relative Strength Index, 期間10)
  • Momentum (期間4)
  • SMA (Simple Moving Average, 期間10)
  • MACD (高速26期間、低速12期間)
  • ROC (Rate of Change, 期間2)
  • ボリンジャーバンド (期間20、標準偏差2.2)

設定ファイルでは2時間足と4時間足のデータを含め、相関ペア(BTC/USDT、ETH/USDT)からの特徴量も活用しています。

3. 標準特徴量 (feature_engineering_standard)

時間的な特徴を抽出します。

dataframe["%-day_of_week"] = dataframe["date"].dt.dayofweek
dataframe["%-hour_of_day"] = dataframe["date"].dt.hour

エントリー・Exit決定の仕組み

エントリーとExitの決定は、予測されたターゲットスコアと閾値比較によって行われます。

エントリー条件

ロングエントリー

enter_long_conditions = [
    df["do_predict"] == 1,              # FreqAIによる予測フラグ
    df['&-target'] > self.threshold_buy.value,   # 予測スコア > 買い閾値
    df['volume'] > 0                    # 出来高チェック
]

ショートエントリー

enter_short_conditions = [
    df["do_predict"] == 1,
    df['&-target'] < self.threshold_sell.value,  # 予測スコア < 売り閾値
    df["volume"] > 0
]

Exit条件

Exit条件はエントリー条件の逆転として設計されています。

  • ロングExit: 予測スコアが売り閾値を下回った時
  • ショートExit: 予測スコアが買い閾値を上回った時

最適化されたパラメータ

ハイパースペース最適化により以下の閾値が設定されています。

パラメータ
threshold_buy 0.59453
threshold_sell 0.80573

LSTMモデルの役割と予測内容

LSTMモデルは**統合ターゲットスコア(T)**を予測することが主要な役割です。

予測対象: 統合ターゲットスコア

$$
T = S \times R \times V \times R2 \times V2
$$

各要素の意味は以下の通りです。

  • S: 正規化された指標の加重平均スコア
  • R: ボリンジャーバンドベースの市場レジーム (-1, 0, 1)
  • V: ボリンジャーバンド幅による逆ボラティリティ調整
  • R2: 100期間移動平均による長期トレンド判定 (-1, 1)
  • V2: ATRによる逆ボラティリティ調整

LSTMが学習する内容

LSTMは以下の複合的な市場情報から未来のターゲットスコアを学習します。

学習要素 内容 役割
時系列パターン 過去の価格・出来高の動き トレンド継続性の予測
指標の相関関係 複数指標間の時間的関係 市場状態の総合判断
ボラティリティサイクル 市場の不安定性の変化 リスク調整された予測
レジーム変化 市場環境の転換点 適応的戦略の実行

アーキテクチャとモデル構成

PyTorchLSTMModel構造

モデルは以下の層構造で構成されています。

class PyTorchLSTMModel(nn.Module):
    def __init__(self, input_dim: int, output_dim: int, **kwargs):
        # パラメータ設定
        self.num_lstm_layers = kwargs.get("num_lstm_layers", 1)
        self.hidden_dim = kwargs.get("hidden_dim", 100)
        self.dropout_percent = kwargs.get("dropout_percent", 0.3)
        
        # LSTM層 + バッチ正規化 + ドロップアウト
        self.lstm_layers = nn.ModuleList()
        self.batch_norms = nn.ModuleList()
        self.dropouts = nn.ModuleList()
        
        # 全結合層
        self.fc1 = nn.Linear(self.hidden_dim, 36)
        self.alpha_dropout = nn.AlphaDropout(p=0.5)
        self.fc2 = nn.Linear(36, output_dim)

デフォルト設定

パラメータ
LSTM層数 3層
隠れ層次元 128
ドロップアウト率 40%
ウィンドウサイズ 5時間足
学習率 0.003
バッチサイズ 32
エポック数 10

正規化とドロップアウト戦略

過学習防止のための多層防御を実装しています。

  • バッチ正規化: 各LSTM層の出力を正規化
  • ドロップアウト: 各層で40%のニューロンを無効化
  • アルファドロップアウト: 全結合層で50%の確率的無効化
  • 残差接続: 層間の勾配流れを改善

動的重み付けシステム

この戦略の核心は動的重み付けシステムにあります。市場状況に応じて指標の重要度を自動調整します。

基本重み設定

最適化により決定された各指標の基本重みです。

指標 重み値 パラメータ名
移動平均偏差 0.54347 w0
MACD 0.82226 w1
ROC 0.56675 w2
RSI 0.77918 w3
ボリンジャーバンド幅 0.98488 w4

動的重み調整の仕組み

# トレンド強度の計算
trend_strength = abs(dataframe['ma'] - dataframe['close'])

# 強いトレンドの閾値設定
strong_trend_threshold = (trend_strength.rolling(window=14).mean() + 
                         1.5 * trend_strength.rolling(window=14).std())

# 強トレンド時はモメンタムの重みを1.5倍に増加
is_strong_trend = trend_strength > strong_trend_threshold
dataframe['w_momentum'] = np.where(is_strong_trend, self.w3.value * 1.5, self.w3.value)

集約スコア計算

$$
S = w_0 \times \text{正規化MA} + w_1 \times \text{正規化MACD} + w_2 \times \text{正規化ROC} + \ldots + \text{動的モメンタム重み} \times \text{正規化Momentum}
$$

マーケットレジーム判定

市場状況を2段階のフィルターで判定し、予測精度を向上させています。

第1レジームフィルター(R)

ボリンジャーバンドによる短期レジーム判定です。

dataframe['R'] = 0  # デフォルト: レンジ相場
# 上昇レジーム: 価格が中央線と上限線の両方を上回る
dataframe.loc[(dataframe['close'] > dataframe['bb_middleband']) & 
              (dataframe['close'] > dataframe['bb_upperband']), 'R'] = 1
# 下降レジーム: 価格が中央線と下限線の両方を下回る
dataframe.loc[(dataframe['close'] < dataframe['bb_middleband']) & 
              (dataframe['close'] < dataframe['bb_lowerband']), 'R'] = -1

第2レジームフィルター(R2)

100期間移動平均による長期トレンド判定です。

dataframe['ma_100'] = ta.SMA(dataframe, timeperiod=100)
dataframe['R2'] = np.where(dataframe['close'] > dataframe['ma_100'], 1, -1)

レジーム判定の利点

  • ノイズ削減: レンジ相場では取引シグナルを抑制
  • 方向性確認: 短期と長期の両方でトレンド方向を確認
  • 適応性向上: 市場状況に応じた重み調整

ボラティリティ調整機能

市場のボラティリティに応じてターゲットスコアを調整する2重のボラティリティフィルターを実装しています。

ボリンジャーバンド幅調整(V)

bb_width = (dataframe['bb_upperband'] - dataframe['bb_lowerband']) / dataframe['bb_middleband']
dataframe['V'] = 1 / bb_width  # 逆ボラティリティ(高ボラティリティ時は重みを下げる)

ATR調整(V2)

dataframe['V2'] = 1 / dataframe['atr']  # ATRベースの逆ボラティリティ調整

ボラティリティ調整の効果

市場状況 ボラティリティ 調整効果 取引への影響
安定市場 重み増加 積極的な取引シグナル
不安定市場 重み減少 慎重な取引シグナル
急変動市場 極高 大幅重み減少 取引回避

パフォーマンスと課題

報告されたパフォーマンス

  • 精度: 120日間の小規模データセットで90%以上の精度を達成
  • ハードウェア: M1 Max / RTX3070での動作確認済み
  • 取引頻度: 厳格な判定により、シグナル生成は控えめ
  • 月次収益: 2024年3月のバックテストで2ペアでの安定した日次収益

主要な技術的課題

過学習の防止

以下の手法で対処しています。

  • ドロップアウト層の多用
  • 正則化技術の適用
  • 層数とニューロン数の調整
  • エポック数の最適化

ノイズ取引の回避

以下の仕組みで実現しています。

  • 閾値フィルターによるシグナル選別
  • 重み付けシステムによるノイズ除去
  • 非類似度測定の検討(今後の改善点)

Freqtradeバージョン対応課題

Freqtrade 2024.02以降で問題が発生するため、PyTorchへの完全移行を実施しました。また、最小時間枠が5分に制限されている問題への対処として、設定ファイルの手動編集が必要です。

技術的評価と総評

技術的強み

アーキテクチャ設計

  • 多層防御の過学習対策: バッチ正規化、ドロップアウト、残差接続の組み合わせ
  • モジュラー設計: 各コンポーネントが独立してテスト・調整可能
  • スケーラビリティ: PyTorchベースでGPU加速と並列処理に対応

特徴量エンジニアリング

  • 多次元統合: 価格、出来高、時間的特徴の総合的活用
  • 正規化戦略: Z-score正規化による指標間の公平な比較
  • 適応性: 市場レジームに応じた動的重み調整

実装上の評価

優れた点

  • 理論的根拠: 各コンポーネントに明確な理論的背景
  • 実装品質: Clean Codeの原則に従った可読性の高いコード
  • 拡張性: 新しい指標や調整ロジックの追加が容易
  • 再現性: 設定ファイルによる完全なパラメータ管理

改善点

  • 依存関係: Freqtradeのバージョン制約への対応が必要
  • パラメータ数: 多数の調整可能パラメータによる最適化の複雑性
  • 検証データ: 120日間という限定的なテスト期間

総合評価

本プロジェクトは理論と実装の両面で高度な技術力を示す優秀なトレーディングシステムです。特に以下の点で評価できます。

  • 革新性: 動的重み付けシステムによる適応的な市場分析
  • 堅牢性: 多層の過学習防止とリスク管理機能
  • 実用性: 実際の取引環境での動作実績
  • 発展性: 新しい指標や調整ロジックの追加が容易な設計

本システムを実運用に適用する場合は、より長期間のバックテストとペーパートレーディングによる十分な検証を行うことを強く推奨します。また、市場環境の変化に応じてパラメータの定期的な再最適化が必要です。

まとめ

freqAI-LSTMプロジェクトは、機械学習とテクニカル分析を巧みに組み合わせた洗練されたトレーディングシステムです。動的重み付け、マーケットレジーム判定、ボラティリティ調整などの高度な機能により、市場の変化に適応的に対応できる設計となっています。

技術的な完成度は高いですが、実運用には慎重なテストと継続的な監視が不可欠です。このプロジェクトから学べる技術やアプローチは、アルゴリズムトレーディングに興味のある開発者にとって非常に有益な参考資料となるでしょう。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?