背景知識:取引における強化学習

「教師あり学習は明日上がるか下がるかを教えてくれる;強化学習はどれだけ買うか、いつ損切りするかを教えてくれる。」


なぜ取引は強化学習に適しているのか?

取引問題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、RSI10-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     # 軽い回転率ペナルティ
}

チューニング推奨

  1. まず利益志向Rewardでベースラインを訓練
  2. 徐々にリスクペナルティ項を追加
  3. バックテスト結果に基づき重みを調整
  4. 検証セットで最終重みを決定

よくある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として機能
この章を引用する
Zhang, Wayland (2026). 背景知識:取引における強化学習. In AIクオンツ取引:ゼロからイチへ. https://waylandz.com/quant-book-ja/Reinforcement-Learning-in-Trading
@incollection{zhang2026quant_Reinforcement_Learning_in_Trading,
  author = {Zhang, Wayland},
  title = {背景知識:取引における強化学習},
  booktitle = {AIクオンツ取引:ゼロからイチへ},
  year = {2026},
  url = {https://waylandz.com/quant-book-ja/Reinforcement-Learning-in-Trading}
}