背景知識:取引における強化学習
「教師あり学習は明日上がるか下がるかを教えてくれる;強化学習はどれだけ買うか、いつ損切りするかを教えてくれる。」
なぜ取引は強化学習に適しているのか?
| 取引問題 | RLフレームワークマッピング |
|---|---|
| 現在のポジション、市場状態 | State |
| 買い/売り/保持/ポジションサイズ | Action |
| コスト後のリターン | Reward |
| 取引コスト、スリッページ | 環境フィードバック |
| 長期リターンの最大化 | 目的関数 |
重要な洞察:取引は逐次決定問題であり、独立した予測問題ではない。
RL vs 教師あり学習:根本的な違い
| 次元 | 教師あり学習 | 強化学習 |
|---|---|---|
| 目的 | 予測精度 | 累積リターンの最大化 |
| ラベルソース | 履歴データ(既知) | アクション結果(探索で発見) |
| 決定の連続性 | 各予測は独立 | 将来の影響を考慮 |
| 取引コスト | 後で差し引き | 決定に組み込み |
| ポジション管理 | 追加ロジック | ネイティブサポート |
比較例:
教師あり学習アプローチ:
1. 予測:AAPL明日上昇確率60%
2. アクション:買い
3. 問題:どれだけ?既存ポジションは?
強化学習アプローチ:
1. State:現在100株保有、残高$10,000、AAPL上昇トレンド
2. 決定:Q値に基づき、50株追加すべき
3. 考慮:この決定は取引コスト、ポジションリスク、将来の可能な動きを考慮
取引RLの核心要素
1. State空間
| Stateタイプ | 例 | 次元 |
|---|---|---|
| 価格特徴量 | リターン、MA、RSI | 10-50 |
| ポジション情報 | 現在のポジション、コストベース、未実現損益 | 3-5 |
| アカウント情報 | 現金比率、使用マージン | 2-3 |
| 市場状態 | ボラティリティ、トレンド強度 | 2-5 |
State設計原則:
- 意思決定に十分な情報を含める
- 次元爆発を避ける
- 値を正規化
2. Action空間
離散Action(シンプルだが粗い):
Actions = {強い売り、売り、保持、買い、強い買い}
マッピング = {-100%, -50%, 0%, +50%, +100%}
連続Action(精密だが複雑):
Action = [-1, 1]のターゲットポジション比率
-1 = 100%ショート
0 = フラット
+1 = 100%ロング
3. Reward関数 — 最も重要な設計
Reward関数の設計はRL取引システムの成否を分ける要因。間違ったRewardはAgentに完全に逆の行動を学習させる。
4つのタイプのReward関数とそれらの使用ケース
| タイプ | 公式 | 長所 | 短所 | 使用ケース |
|---|---|---|---|---|
| 利益志向 | r_t = position × return - cost | シンプル、直感的 | リスクを無視 | 初心者/ベースライン |
| リスク調整済 | r_t = (return - rf) / volatility | リスクを考慮 | コストを無視 | 中/低頻度 |
| コストペナルティ | `r_t = profit - α | Δpos | - β×spread` | 回転率を制御 |
| 多目的 | r_t = w1×profit + w2×sharpe - w3×drawdown | 総合的バランス | 複雑なチューニング | 本番環境 |
タイプ1:利益志向
# 最もシンプルなreward関数
r_t = position_{t-1} × (P_t - P_{t-1}) - transaction_cost
# 例:
# 100株保有、価格が$100から$101へ、手数料$5
# r_t = 100 × (101 - 100) - 5 = $95
問題:Agentは「オールイン」戦略を学習—高ボラティリティは高い利益/損失を意味し、リスク考慮なし。
タイプ2:リスク調整済リターン
# 瞬間シャープレシオに類似
r_t = (return_t - risk_free_rate) / volatility_t
# ここで:
# return_t = position × price_change / portfolio_value
# volatility_t = rolling_std(returns, window=20)
# 例:
# 日次リターン0.5%、無リスク金利0.01%(日次)、20日間ボラティリティ1%
# r_t = (0.5% - 0.01%) / 1% = 0.49
長所:絶対リターンではなくリスク調整済リターンの追求を促す。
問題:ボラティリティが低い時Rewardが大きすぎる可能性;平滑化が必要。
タイプ3:コストペナルティ
# 高頻度戦略専用、過度の取引にペナルティ
r_t = profit_t - α × |position_t - position_{t-1}| - β × spread_t
# パラメータ:
# α = 回転率ペナルティ係数(通常0.001-0.01)
# β = スプレッドペナルティ係数(通常0.5-2.0)
# spread_t = ビッドアスクスプレッド
# 例:
# 利益$100、ポジション変化500株、スプレッド$0.02/株
# α=0.005、β=1.0
# r_t = 100 - 0.005×500 - 1.0×0.02×500 = 100 - 2.5 - 10 = $87.5
重要:αとβの選択は実際の取引コストを反映する必要があり、そうでなければAgent行動が現実から逸脱する。
タイプ4:多目的複合Reward
# 本番環境システムの推奨設計
r_t = w1 × profit_t + w2 × sharpe_t - w3 × drawdown_t - w4 × turnover_t
# パラメータ:
# w1 = 利益重み(通常1.0)
# w2 = Sharpe重み(通常0.1-0.5)
# w3 = ドローダウンペナルティ(通常0.5-2.0)
# w4 = 回転率ペナルティ(通常0.01-0.1)
# 設定例:
weights = {
'profit': 1.0, # ベースリターン
'sharpe': 0.3, # リスク調整
'drawdown': 1.5, # 重いドローダウンペナルティ
'turnover': 0.05 # 軽い回転率ペナルティ
}
チューニング推奨:
- まず利益志向Rewardでベースラインを訓練
- 徐々にリスクペナルティ項を追加
- バックテスト結果に基づき重みを調整
- 検証セットで最終重みを決定
よくあるReward関数設計エラー
| エラー | 結果 | 解決策 |
|---|---|---|
| リターンのみをRewardに使用 | Agentがオールイン | リスクペナルティ項を追加 |
| 取引コストを無視 | 高頻度だが実際には損失 | 回転率ペナルティを追加 |
| Rewardスケールが大きすぎる | 訓練不安定 | [-1, 1]に正規化 |
| Reward遅延が長すぎる | 学習困難 | 中間Reward使用(未実現損益変化) |
| Rewardが複雑すぎる | チューニング困難 | シンプルから始め反復 |
実践的Reward関数コード
import numpy as np
class TradingReward:
"""本番環境Reward関数"""
def __init__(self, config: dict):
self.w_profit = config.get('profit_weight', 1.0)
self.w_sharpe = config.get('sharpe_weight', 0.3)
self.w_drawdown = config.get('drawdown_weight', 1.5)
self.w_turnover = config.get('turnover_weight', 0.05)
def calculate(self, state: dict) -> float:
"""複合Rewardを計算"""
# 利益項
profit = state['position'] * state['price_change']
# Sharpe項(瞬間版)
if state['volatility'] > 0:
sharpe = state['return'] / state['volatility']
else:
sharpe = 0
# ドローダウンペナルティ
drawdown = max(0, state['peak_value'] - state['current_value'])
drawdown_pct = drawdown / state['peak_value'] if state['peak_value'] > 0 else 0
# 回転率コスト
turnover = abs(state['position'] - state['prev_position'])
turnover_cost = turnover * state['transaction_cost']
# 複合Reward
reward = (
self.w_profit * profit
+ self.w_sharpe * sharpe
- self.w_drawdown * drawdown_pct
- self.w_turnover * turnover_cost
)
# 正規化(オプション)
return np.clip(reward, -1.0, 1.0)
シンプルなReward(初心者向け):
R_t = Position × Return - Trading Cost
リスク調整済Reward:
R_t = Return - λ × Risk Penalty
= Position × Return - λ × |Return - Mean|²
Sharpe志向Reward:
R_t = (Return - Risk-free Rate) / Volatility
一般的なRLアルゴリズムと適用性
| アルゴリズム | タイプ | 適用シナリオ | 長所/短所 |
|---|---|---|---|
| DQN | 離散アクション、価値関数 | シンプルな取引決定 | 実装が容易、アクション制限 |
| DDPG | 連続アクション、方策勾配 | ポジション最適化 | 細かい制御、訓練困難 |
| PPO | 一般、方策勾配 | バランスの取れた選択 | 安定、中程度のサンプル効率 |
| A2C/A3C | 並列訓練 | マルチアセット同時訓練 | 訓練が速い、リソース必要 |
| SAC | 連続アクション、最大エントロピー | 探索を奨励 | 早期停止を防ぐ、計算集約的 |
実践的推奨:PPOから始める、安定性とパフォーマンスのバランスが良い。
取引RLの特殊な課題
課題1:低いサンプル効率
比較:
- ゲーム:無制限の訓練サンプルを生成可能
- 取引:限られた履歴データ
10年間の日次データ ≈ 2,500サンプル
5年間の分次データ ≈ 500,000サンプル
解決策:
- よりシンプルなモデルを使用
- データ拡張(ノイズ追加、時間ワープ)
- マルチアセット並列訓練
課題2:非定常環境
ゲームルールは固定、市場ルールは変化:
- 2019:低ボラティリティ環境
- 2020:COVIDクラッシュ
- 2021:個人投資家熱狂
- 2022:金利上昇サイクル
解決策:
- ローリング訓練(N日ごとにモデル更新)
- レジーム条件付き訓練
- マルチ環境訓練
課題3:スパースで遅延したReward
問題:
- 今日買い、正しいか1週間後にわかる
- 短期損失が長期利益につながる可能性(平均化)
解決策:
- より高頻度の中間Rewardを使用
- 未実現損益変化を即時フィードバックとして導入
- 割引因子gammaを調整
課題4:過学習
症状:
- 訓練セット年率100%以上
- テストセット年率-20%
解決策:
- モデル構造を簡素化
- 正則化を追加
- Purged CV検証を使用
- 異なる市場サイクルでテスト
実践的応用例
単一資産ポジション管理
State:
- 過去20日間のリターン系列
- 現在のポジション比率
- RSI、MACD指標
Action:
- [0, 1]のターゲットポジション(ロングのみ)
Reward:
- 日次リターン x ポジション - 回転率コスト
結果:
- Agentはトレンド初期にポジションを追加することを学習
- 高ボラティリティ時にポジションを削減
- 自動的に回転率を制御
マルチアセット配分
State:
- N資産の特徴量ベクトル
- 現在の配分重み
- ポートフォリオボラティリティ
Action:
- [0, 1]^Nのターゲット重みベクトル、合計1
Reward:
- ポートフォリオシャープレシオ
結果:
- Agentは分散を学習
- リスクエクスポージャーを動的に調整
- 危機時に高ベータ資産を削減
マルチエージェント視点
RLはマルチエージェントアーキテクチャの特定Agentを置き換えまたは強化できる:
アプローチ1:RLがSignal Agentを置き換え
- Signal Agentは元々ルールまたは教師ありモデルを使用
- RLで置き換えて取引シグナルを直接出力
- Risk Agentは依然としてルールベース制約を使用
アプローチ2:RLをMeta Agentとして
- Signal Agentが複数のシグナルを提供
- RL Meta Agentがそれらをどう組み合わせるかを決定
- レジーム間で異なるシグナルの重みを学習
アプローチ3:複数のRL Agentが協力
- 資産ごとに1つのRL Agent
- グローバルRisk Agentがポジションを調整
- 共有経験プールで学習を加速
よくある誤解
誤解1:RLは手動ルールを完全に置き換えられる
現実的でない。RLには以下が必要:
- 大量サンプル訓練
- 安定したRewardシグナル
- 合理的なState設計
これらすべてにドメイン知識が必要。RLは強化ツールであり、万能薬ではない。
誤解2:より複雑なRLアルゴリズムほど良い
金融では逆であることが多い。良いState設計のシンプルなアルゴリズム(DQN、PPO)は、粗い設計の複雑なアルゴリズム(SAC、TD3)を上回ることが多い。
誤解3:RLを訓練すれば直接本番環境に投入できる
危険。RLは以下を学習する可能性:
- 履歴データに過学習した戦略
- 極端な市場で失敗する行動
- 実際には実行できない高回転率戦略
厳格なアウトオブサンプルテストとペーパートレードが必須。
実践的推奨事項
1. シンプルから始める
開始設定:
- アルゴリズム:PPO
- アクション:離散5レベル
- State:< 20次元
- 単一資産
2. Rewardエンジニアリングがモデルより重要
悪いReward:リターンのみを見る
-> Agentはオールインを学習
良いReward:リターン - リスクペナルティ - 回転率コスト
-> Agentはリスク管理を学習
3. 検証プロセス
1. 訓練セット:60%
2. 検証セット:20%(ハイパーパラメータ調整)
3. テストセット:20%(最終評価、1回のみ使用)
比較するベースライン:
- バイアンドホールド
- シンプルなmomentum戦略
- 教師あり学習 + ルール
まとめ
| 重要ポイント | 説明 |
|---|---|
| RLの利点 | エンドツーエンド最適化、自動的にコストとポジションを考慮 |
| 主要な課題 | 少ないサンプル、変化する環境、過学習 |
| 推奨開始 | PPO + 離散アクション + シンプルなState |
| 成功の鍵 | Reward設計 > アルゴリズム選択 > モデル構造 |
| マルチエージェント統合 | Signal Agentを置き換えまたはMeta Agentとして機能 |