2025-09-14

自動売買への道 (2025-09-14)

楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用して Python であれこれ取り組んでいます。この「自動売買への道」のトピックでは、プログラミングの話題にも踏み込んで、日々の活動をまとめていきます。

デイトレ用自作アプリ

以下は株価に関連する情報の流れを示しています。

株価データの流れ(Windows 11)

楽天証券では、Python からネットワーク越しに直接取引できるような API が提供されていないので、マーケットスピード II RSS を介して取引をする構成を取っています。

強化学習のシステム作成

自分が使いたい売買ルールに従った環境クラスを作り、PPO エージェントを用意して過去のティックデータで何度学習させても売買アクションが偏ってしまって、収益を向上させる方向に学習が進みませんでした。

環境クラスを整理し直す

自分が強化学習で試したい売買ができる環境クラスを整理しました。

  • ティックデータ(Excel 形式で Time, Price, Volume 列)
  • 観測量(observation)
    • price(株価), log_volume(累積出来高の増分の対数)の他に下記の特徴量を追加
    • ma(移動平均), sigma(移動標準偏差), rsi(RSI), zscore(Zスコア)
      • period = 60 で特徴量を算出
      • 最初の 60(秒)をウォームアップとして、常に売買アクションを報酬 0 の HOLD に置き換えた。
  • 行動(action)の定義
    • HOLD / BUY / SELL / REPAY
  • 報酬設計(PnL、制約違反ペナルティ)
    • (ナンピンせずに)固定した建玉だけで信用売買するように強い制約を設定

下記は、いろいろ手直しを加えた現在の学習クラスです。

trading_env_20250914.py

ランダムテストをバカにはできない

モデルの学習が報酬を増やす方向に進まないことを GPT-5 に相談すると、ランダムエージェントを使って報酬の出現頻度の分布を確認することを勧められました。

最初は、ランダムで売買アクションを環境クラスに投げてどんな意味があるんだ?と思いましたが、よくよく考えてみると、ランダムな売買アクションですら報酬が極端に偏るようであれば、流石に学習も進まないのだろうなと考え直しました。

GPT-5 が提案してくれたサンプルでは env.action_space.sample() でランダムな売買アクションを生成していました。利用しているパッケージ Gymnasium のドキュメントでこのメソッドの説明を探してみたところ API の説明欄には見つからず、下記のサイトにありました。

# Choose an action: 0 = push cart left, 1 = push cart right
action = env.action_space.sample()  # Random action for now - real agents will be smarter!

定義されたアクション空間からランダムにアクションを選んでくれるようです。

過去のティックデータに対して、ランダムな売買アクションを生成した場合の報酬の出現頻度を確認しました。

smoke_test_20250914.py

以下が実行例です。

               Time  Price    Volume
0      1.756339e+09   3734    447400
1      1.756339e+09   3734    447400
2      1.756339e+09   3725    525400
3      1.756339e+09   3725    525400
4      1.756339e+09   3728    549400
...             ...    ...       ...
19400  1.756362e+09   3800  13631200
19401  1.756362e+09   3800  13631200
19402  1.756362e+09   3800  13632500
19403  1.756362e+09   3800  13632500
19404  1.756362e+09   3800  13634700

[19405 rows x 3 columns]
Episode finished: steps=19405, total_reward=-8955.46, final_pnl=58.00
出力結果(例)

最初は報酬の出現頻度が特定の報酬値に極端に偏っていました。そこで環境クラスが利用している TransactionManager クラスで、単一の建玉売買ルールを維持しながら報酬あるいはペナルティが単調になり過ぎないように調節を続けました。

縦軸が対数スケールではありますが、まずまずの分布形状とばらつき幅(横軸)を得られるようになりました。

PPO エージェント

生成 AI に相談しながらそこそこ使えそうな PPO エージェントを作り始めていますが、思うようなものが出来ていません。

生成 AI だけでは思うような環境クラスを作れなかったのと同様に、PPO エージェントもスクラッチからコーディングできる必要がありそうです。残念ながら、今はそのレベルまで習熟できていません。もう少し時間がかかりそうです。

課  題

現在、課題と考えていることを下記にまとめました[随時更新〗。

  • マーケットスピード II RSS による売買
    • Excel VBA, Python 側で実際の売買を試す。
    • 売買のためのサンプルワーク
  • PyTorch を利用した強化学習モデルの実用化
    • 環境クラス(gymnasium 準拠)の作成 ✓
    • PPO エージェントの作成

参考サイト

  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 件のコメント:

コメントを投稿