2025-11-14

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

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

今日の日経平均株価

現在値 50,376.53 -905.30 -1.77% 15:30
前日終値 51,281.83 11/13 高値 50,767.74 09:00
始値 50,767.74 09:00 安値 50,246.60 09:09

※ 右の 15 分足チャートは Yahoo! Finance のデータを yfinance で取得して作成しました。

【関連ニュース】

デイトレ用自作アプリ

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

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

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

現在は、強化学習を利用した取引モデルの開発に取り組んでいます。

強化学習システムの概要

取引回数の制限 (2)

過去のティックデータで学習したモデルで推論すると、取引回数が多いほど損失が大きくなるという相関を確認できました。

そこで、取引回数に上限を設定するとして、当初は生成 AI が提案した、取引できる残り回数が少なくなるほど観測値の変化が急になる報酬関数を採用しました。しかし、モデルはその変化に過敏に反応しすぎているように見えたので、今回は直線的にカウントダウンするように観測値を調整しました。。

実装例
import numpy as np

def scaled_remaining(trade_counter, max_trade_count):
    return trade_counter / max_trade_count

推論に使用したティックデータ

下の観測値の検証用トレンドチャートの、下から 4 番目の TRADE という観測値が取引回数のカウントダウンですが、この例では取引回数が少なすぎてカウントダウンの様子は確認できませんでした。

取引回数の上限を設定した時の観測値のトレンド

推論の実行例

過去データ ticks_20251009.xlsx の銘柄 7011 について推論します。
モデル models/ppo_7011.zip を読み込みます。
Wrapping the env with a `Monitor` wrapper
Wrapping the env in a DummyVecEnv.
                  注文日時 銘柄コード        売買  約定単価  約定数量     損益
0  2025-10-09 09:01:10  7011        買建  4320     1    NaN
1  2025-10-09 09:01:13  7011        売埋  4321     1    1.0
2  2025-10-09 09:01:14  7011        売建  4336     1    NaN
3  2025-10-09 15:24:59  7011  買埋(強制返済)  4203     1  133.0
一株当りの損益 : 134.0 円
モデルへの報酬分布
n: 19391, mean: 2.876, stdev: 1.222
観測数 : 11

マラソンテストのパフォーマンス (3)

三度、過去データ全てで学習をさせて、その学習モデルで同じ過去データを推論させました。

学習済みモデルで昨日までの過去データを推論[収益は 1 株単位](3)

取引回数が 100 回に張り付くこと頻度は少し減りましたがまだまだ多いです。まるで取引回数が 100 回になるように誘導しているみたいです。

あと何回取引できるかを観測値にしてモデルに知らせることが仇になっているような気がしないでもありません。

ちなみに、マラソンテストの前に観測値のトレンドを確認したティックデータをマラソンテスト用の学習済みモデルで推論した結果は以下のようになりました。

取引回数の上限を設定した時の観測値のトレンド (2)

推論の実行例

過去データ ticks_20251009.xlsx の銘柄 7011 について推論します。
モデル models/ppo_7011.zip を読み込みます。
Wrapping the env with a `Monitor` wrapper
Wrapping the env in a DummyVecEnv.
                   注文日時 銘柄コード        売買  約定単価  約定数量    損益
0   2025-10-09 09:01:10  7011        買建  4320     1   NaN
1   2025-10-09 09:01:31  7011        売埋  4317     1  -3.0
2   2025-10-09 09:01:32  7011        買建  4318     1   NaN
3   2025-10-09 09:01:40  7011        売埋  4314     1  -4.0
4   2025-10-09 09:01:42  7011        買建  4311     1   NaN
..                  ...   ...       ...   ...   ...   ...
65  2025-10-09 14:38:42  7011        売埋  4188     1  -2.0
66  2025-10-09 14:39:02  7011        買建  4190     1   NaN
67  2025-10-09 14:40:54  7011        売埋  4188     1  -2.0
68  2025-10-09 14:46:40  7011        買建  4182     1   NaN
69  2025-10-09 15:24:59  7011  売埋(強制返済)  4203     1  21.0

[70 rows x 6 columns]
一株当りの損益 : -100.0 円
モデルへの報酬分布
n: 19391, mean: 0.646, stdev: 0.495
観測数 : 11

報酬分布はプラス方向にしっかり寄っているのにもかかわらず、実際の収益が大きくマイナスになってしまっています。

これは、建玉を長く保持すればするだけ報酬を多く付与しているためです。その結果生じる報酬と収益との乖離も課題です。

しかし、この週末は、まず取引回数をそこそこの回数に抑えることに注力したいと思います。

参考サイト

  1. マーケットスピード II RSS | 楽天証券のトレーディングツール
  2. マーケットスピード II RSS 関数マニュアル
  3. 注文 | マーケットスピード II RSS オンラインヘルプ | 楽天証券のトレーディングツール
  4. Gymnasium Documentation
  5. Stable-Baselines3 Docs - Reliable Reinforcement Learning Implementations
  6. Maskable PPO — Stable Baselines3 - documentation
  7. PyTorch documentation
  8. PythonでGUIを設計 | Qtの公式Pythonバインディング
  9. Python in Excel alternative: Open. Self-hosted. No limits.
  10. Book - xlwings Documentation
にほんブログ村 株ブログ 株日記へ
PVアクセスランキング にほんブログ村

0 件のコメント:

コメントを投稿