このレポートでは、Transformer ベースの深層強化学習 (DRL) エージェントを使用した暗号通貨取引への新しいアプローチを紹介します。このシステムは、最新の NLP にヒントを得たアーキテクチャ (Transformer)、Double DQN (DDQN)、Noisy Networks、および低ランク適応 (LoRA) をテスト時トレーニング (TTT) に活用します。これらのコンポーネントを組み合わせることで、エージェントは、BTC/USDT の履歴データに対する適応性の向上、ポリシー形成の安定性、および収益性の大幅な向上を示します。これらの結果は、予備的ではありますが、この方法をより複雑なデータセット (注文書レベルなど) や複数の資産クラスに拡張でき、機関レベルの取引戦略にスケーラブルな基盤を提供できることを示唆しています。
編集者注: この記事は情報提供のみを目的としており、投資アドバイスではありません。暗号通貨は投機的で複雑であり、高いリスクを伴います。これは、価格の高騰や初期投資の損失の可能性を意味する場合があります。投資の決定を行う前に、財務状況、投資目的を考慮し、ファイナンシャルアドバイザーに相談してください。HackerNoon 編集チームは、記事の文法の正確性のみを検証しており、この記事に記載されている情報の正確性、信頼性、完全性を保証または保証するものではありません。#DYOR
なぜトランスフォーマーなのか、なぜDRLなのか、なぜ気にする必要があるのか
トランスフォーマー: NLP の世界で生まれ、シーケンスの解読に優れています。市場は単なる時系列パズルです。トランスフォーマーはそれを物語のように読み、平均的なクオンツが瞬きするよりもずっと前にプロットの展開 (価格変動) を予測します。
ダブル DQN (DDQN):一方的な Q 値推定はもう不要です。DDQN は、悪名高い過大評価を削減し、巧妙な強気相場や弱気相場に対処するために必要な信頼性を取引ポリシーに与えます。
Noisy Nets は、パラメータ化されたノイズをネットワークの重みに直接追加することで探索を促進します。
LoRA は、最小限のオーバーヘッドでテスト時トレーニング (TTT) を可能にし、完全な再トレーニング サイクルなしでモデルが新しい市場条件に迅速に適応できるようにします。
テスト時トレーニング (TTT):市場は変化し、進化し、驚きをもたらします。TTT により、このモデルは迅速に適応し、まるで明日の見出しを今日読んでいるかのように、飛行中に戦略を調整します。
コードはオンです
このフレームワークでは、最新の Transformer ベースのアーキテクチャによってガイドされる、シミュレートされた取引環境と学習エージェントが対話するシステムが作成されます。このシステムの中核は、時間の経過とともに取引の決定を改善し、強化学習を通じて戦略を洗練し、新しい市場状況に迅速に適応することを目指しています。
まず、 Transformer モデルについて考えてみましょう。従来、Transformer は単語やトークンのシーケンスを解釈することで、自然言語処理などの分野に革命をもたらしてきました。ここでは、同じ原理が時系列価格データに適用されます。単語の代わりに、モデルは過去の市場の特徴 (価格、ボリューム、テクニカル指標) を取り込み、意味のある時間的依存関係を抽出しようとします。コードで定義されているTransformerNetwork
クラスは、このアプローチの例です。コンストラクターが生の入力特徴をより高次元の表現に投影し、複数の Transformer エンコーダー レイヤーに渡す方法に注目してください。
class TransformerNetwork(nn.Module): def __init__(self, state_dim, output_dim, lookback, nhead=8, num_layers=4, model_dim=512, lora_r=8, lora_alpha=1.0, lora_active=False, sigma_init=hyperparameters['SIGMA_INIT']): super(TransformerNetwork, self).__init__() self.model_dim = model_dim self.lookback = lookback self.lora_active = lora_active self.input_fc = NoisyLoRALinear(state_dim, self.model_dim, r=lora_r, alpha=lora_alpha, lora_active=lora_active, sigma_init=sigma_init) encoder_layer = TransformerEncoderLayerRelative(d_model=model_dim, nhead=nhead, lora_r=lora_r, alpha=lora_alpha, lora_active=lora_active, sigma_init=sigma_init) self.transformer = TransformerEncoderRelative(encoder_layer, num_layers=num_layers) self.output_fc = NoisyLoRALinear(self.model_dim, output_dim, r=lora_r, alpha=lora_alpha, lora_active=lora_active, sigma_init=sigma_init) self._initialize_weights() def forward(self, x): x = self.input_fc(x) x = x.permute(1, 0, 2) x = self.transformer(x) x = x.mean(dim=0) output = self.output_fc(x) return output
このスニペットはフローを強調しています。生の状態はinput_fc
(ノイズと潜在的な低ランクの適応で強化された線形レイヤー) から入り、時間的および相対的な位置情報を取得するスタックされたTransformerEncoderLayerRelative
モジュールを通過し、最後にoutput_fc
によってアクションにまとめられます。この設計により、モデルはさまざまな時点でイベントを評価し、収益性の高い機会を示唆する可能性のある繰り返しパターンまたは異常を識別できます。
Transformer モデルがエージェントの「目」と「耳」を提供するとすれば、 TradingEnv クラスはそれが対話する世界をシミュレートします。 TradingEnv
という名前のこの環境クラスは、ポジションのオープンやクローズなどのアクションを実行することの意味と、報酬の割り当て方法を定義します。環境内では、エージェントは価格の変化、テクニカル指標、および現在の保有状況を観察します。次の抜粋は、環境が市場データとエージェントのポジションから状態を構築する方法を示しています。
def get_state(self): states = [] current_timestamp = self.tech_array.iloc[self.time]['timestamp'] weight_long = float(self.stocks_long * self.current_price / self.total_asset) if self.total_asset > 0 else 0.0 weight_short = float(self.stocks_short * self.current_price / self.total_asset) if self.total_asset > 0 else 0.0 for _ in range(self.lookback): row = self.precomputed_tech.get(current_timestamp) if row is not None: features = row.drop(['timestamp', 'date']).astype(np.float32).values state_row = np.concatenate(([weight_long, weight_short], features)).astype(np.float32) else: state_row = np.zeros(self.state_dim, dtype=np.float32) states.append(state_row) current_timestamp -= self.get_timeframe_in_seconds() states = states[::-1] # ensure chronological order state = torch.tensor(np.array(states, dtype=np.float32), dtype=torch.float32).unsqueeze(0).to(self.device) return state
ここで、環境は位置情報と特徴の履歴ウィンドウを含む豊富な状態埋め込みを形成します。このウィンドウ化された視点を提供することで、Transformer は時間的パターンをモデル化できます。環境内の各ステップでは、位置が更新され、利益または損失が計算され、エージェントに新しい状態と報酬が返されます。この循環的な交換によってフィードバック ループが促進され、エージェントは何が機能し、何が機能しないかを学習できます。
意思決定エンジンは、Double DQN アプローチを実装するDiscreteDDQNAgentクラスにあります。Double DQN は、アクションの選択と値の推定に別々のネットワークを使用することで、Q 学習におけるよく知られている過大評価バイアスに対処するのに役立ちます。エージェントは、Transformer ベースのモデルのonline_net
インスタンスとtarget_net
インスタンスを維持し、リプレイ バッファーを使用して過去の経験をサンプリングします。トレーニング中は、予測された Q 値とターゲット ネットワークから得られたターゲット Q 値の差を最小限に抑えることで、パラメーターを更新します。
def update(self): self.online_net.train() if len(self.memory) < self.batch_size: return None states, actions, rewards, next_states, dones = self.memory.sample(self.batch_size) q_values = self.online_net(states).gather(1, actions.unsqueeze(1)).squeeze(1) with torch.no_grad(): next_q_values = self.target_net(next_states).gather(1, self.online_net(next_states).argmax(dim=1).unsqueeze(1)).squeeze(1) target_q_values = rewards + self.gamma * next_q_values * (1 - dones) ddqn_loss = self.loss_fn(q_values, target_q_values.detach()) self.optimizer.zero_grad() ddqn_loss.backward() torch.nn.utils.clip_grad_norm_(self.online_net.parameters(), max_norm=1.0) self.optimizer.step() self.soft_update() return ddqn_loss.item()
このコードから、慎重なトレーニング ルーチンが明らかになります。エージェントは、過去の遷移のミニバッチを繰り返しサンプリングし、DDQN 損失を計算し、 online_net
更新します。定期的に、 target_net
のソフト アップデートを実行して、ゆっくりと改善を追跡します。Transformer のパターン認識機能と Double DQN の安定した学習ダイナミクスを組み合わせることで、エージェントは徐々に収益性の高い取引を選択する能力が向上します。
しかし、市場の状況は決して静止しません。ボラティリティの変化、規制の変更、突然の流動性イベントにより、昨日の勝者が今日の敗者に変わる可能性があります。このような変化に対処するために、テスト時トレーニング (TTT)の概念が導入されました。大量の経験を収集した後に実行される更新のみに依存するのではなく、TTT では、推論中であっても、新しい状態が到来すると、ネットワークの特定の部分が動的に適応できます。この迅速な適応により、エージェントは戦略をオンザフライで再調整し、完全な再トレーニング サイクルを待たずに予期しない状況に適応できます。
このコードでは、推論中にパラメータを選択的にトレーニングし、パラメータの小さなサブセットに焦点を当てることで、TTT が促進されます。たとえば、エージェントはネットワークの一部を変更して、新しいパターンをすばやく吸収できます。メソッドactivate_lora()
とdeactivate_lora()
(Transformer、Env、DDQN、および TTT ロジックに焦点を当てているため、ここでは示していません) は、これらの適応パラメータのオン/オフを切り替えます。このコード スニペットは特に LoRA (低ランク適応) を参照していますが、同じ考え方が適用されます。TTT は、モデルの特定の部分がテスト時に学習できるようにすることを意味します。TTT モードがアクティブな場合、専用のオプティマイザーがこれらのパラメータをその場で更新します。
def update_auxiliary(self, state): self.autoencoder.train() self.online_net.train() # Ensure noise and adaptive params are active masked_state, target_state = self.mask_input(state) masked_state_flat = masked_state.view(state.size(0), -1) target_state_flat = target_state.view(state.size(0), -1) reconstructed = self.autoencoder(masked_state_flat) aux_loss = F.mse_loss(reconstructed, target_state_flat) self.autoencoder_optimizer.zero_grad() self.ttt_optimizer.zero_grad() aux_loss.backward() torch.nn.utils.clip_grad_norm_(self.autoencoder.parameters(), max_norm=1.0) torch.nn.utils.clip_grad_norm_(filter(lambda p: p.requires_grad, self.online_net.parameters()), max_norm=1.0) self.autoencoder_optimizer.step() self.ttt_optimizer.step() self.autoencoder.eval() return aux_loss.item()
テスト時にトリガーされるこの補助的な更新ルーチンは、システムの適応性を示します。エージェントは意図的に入力機能の一部をマスクして再構築し、現在の市場体制の内部表現を改善しようとします。これにより、データの変化に迅速に対応し、常に変化する状況で収益性の高い戦略を維持できます。
まとめると、これらのコンポーネント間の相互作用により、堅牢で柔軟なトレーディング マシンが作成されます。Transformer ベースのモデルは、市場シグナルに関する豊富なコンテキスト依存の理解を提供します。TradingEnv は、現実的な条件とフィードバック ループをシミュレートします。Double DQN フレームワークは、アクション値の安定した学習を保証し、徐々に取引の決定を洗練させます。最後に、TTT により、エージェントは機敏性を維持し、新しいパターンに直面したときに内部パラメーターを調整できます。これらの要素を組み合わせることで、パターン認識が洗練され、市場の不確実性に直面しても回復力のあるシステムの基盤が整い、次世代のトレーディング戦略の魅力的なビジョンが提供されます。
結果はどうなりましたか?
次のレベルの可能性
コメントして、参加して、お得なオファーをしましょう🤯
これを一時的な好奇心にしないでください。コメントし、批評し、質問してください。戦略をどのように転換するか、または柔軟な DRL ソリューションを既存のスタックに統合する方法がわからない場合は、コメントを残してください。