SB3 メモ

楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用してリアルタイムで株価などのデータを取り込んでいます。リアルタイムで売買ができるように Python で強化学習のアルゴリズムを利用したシステム開発に日々取り込んでいます。

毎日のように生成 AI とのやりとりをしていますが、StableBaselines3 (SB3) に関するやりとりで残しておきたい内容を備忘録としてまとめました。


過学習の兆候と判断基準 (PPO)

SB3 の PPO エージェントで過学習を判断する主なポイントは、報酬の過剰な安定化と汎化性能の低下です。特に、訓練環境では高報酬だが、テスト環境や初期状態の変化に弱くなる場合は過学習の兆候です。

以下に、Stable Baselines3 (SB3) で PPO エージェントの過学習を判断するための具体的な観察ポイントを整理します。

  1. 報酬の過剰な安定化
    • 訓練中のエピソード報酬が早期に頭打ちになり、変動がほぼなくなる。
    • しかし、テスト環境や初期状態のランダム化で報酬が著しく低下する。
    • → 汎化能力が失われ、特定の状態に最適化されすぎている可能性。
  2. KL 散度の急激な低下
    • PPO では KL 散度(旧ポリシーと新ポリシーの差)を監視しており、これが極端に小さくなると、ポリシーがほぼ変化しなくなっていることを示す。
    • → 学習が停滞しているか、過学習で探索が止まっている可能性。
  3. エピソードの行動パターンが固定化
    • 行動が単調で、環境の変化に対応できない。
    • 例えば、Volume の変化に対して反応が鈍くなる。
    • → 過去の報酬履歴に依存しすぎて、柔軟性が失われている。
  4. 訓練と評価の報酬差が拡大
    • eval_env を使って定期的に評価した際、訓練環境と評価環境で報酬に大きな差が出る。
    • → 過学習の典型的な兆候。
  5. 学習曲線の過剰な滑らかさ
    • tensorboard で ep_rew_mean や value_loss を可視化した際、極端に滑らかな曲線が続く。
    • → 探索が止まり、同じ軌道ばかりを繰り返している可能性。

対策と改善案

環境のランダム化
初期状態やノイズを導入して汎化性能を高める。
Early Stopping
eval_callback で評価報酬が一定期間改善しない場合に学習停止。
正則化の強化
ent_coef(エントロピー係数)を高めて探索を促進。
学習率の調整
learning_rate をスケジューリングして過学習を抑制。
複数環境での訓練
VecEnv を使って多様な状態を経験させる。

Maskable PPO

Maskable PPO は、状態依存の無効アクションをマスクすることで、学習効率と方策の安定性を向上させる SB3 拡張版です。

🧠 Maskable PPO の概要

  • ベースアルゴリズム: Proximal Policy Optimization (PPO)
  • 拡張点: 状態依存の無効アクションをマスクする機能を追加
  • 目的: 無効なアクションを選ばないようにすることで、報酬のノイズを減らし、学習を安定化させる

🔍 なぜアクションマスクが必要か?

多くの環境では、状態によって有効なアクションが変わります。例えば:

  • ゲームで「すでに埋まっているマスに置く」などの違法手
  • 資源管理で「資源が足りないのに購入する」などの無効操作
  • ロボット制御で「関節の可動域を超える動作」などの物理的制約

これらを無視して学習すると、方策が無効なアクションを選び続けてしまい、報酬が得られず学習が停滞します。

🛠 実装と使用方法

MaskablePPO は sb3_contrib パッケージに含まれています。

from sb3_contrib import MaskablePPO
from sb3_contrib.common.wrappers import ActionMasker

# 環境にアクションマスクを適用するラッパー
def mask_fn(obs):
    # obs に基づいて有効なアクションを True/False で返す
    return valid_action_mask

env = ActionMasker(your_env, mask_fn)

model = MaskablePPO("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=100_000)
  • ActionMasker は環境をラップし、各ステップで有効なアクションをマスクします
  • mask_fn は状態に応じて有効なアクションを返す関数です(np.array([True, False, ...])

📈 メリットと注意点

メリット:

  • 無効アクションによる報酬のノイズを除去
  • 方策の収束が速くなる
  • 探索効率が向上

注意点:

  • マスク関数の設計が重要(誤ったマスクは学習を妨げる)
  • 環境が Discrete アクション空間である必要がある
  • Gymnasium のバージョンによっては互換性に注意(例: gymnasium>0.29.1 では一部非対応)

参考サイト

  1. マーケットスピード II RSS | 楽天証券のトレーディングツール
  2. マーケットスピード II RSS 関数マニュアル
  3. 注文 | マーケットスピード II RSS オンラインヘルプ | 楽天証券のトレーディングツール
  4. PythonでGUIを設計 | Qtの公式Pythonバインディング
  5. PyQtGraph - Scientific Graphics and GUI Library for Python
  6. Python in Excel alternative: Open. Self-hosted. No limits.
  7. Book - xlwings Documentation
にほんブログ村 株ブログ 株日記へ
PVアクセスランキング にほんブログ村

0 件のコメント:

コメントを投稿