楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用して Python であれこれ取り組んでいます。この「自動売買への道」のトピックでは、プログラミングの話題にも踏み込んで、日々の活動をまとめていきます。
デイトレ用自作アプリ
以下は株価に関連する情報の流れを示しています。
株価データの流れ(Windows 11)
楽天証券では、Python からネットワーク越しに直接取引できるような API が提供されていないので、マーケットスピード II RSS を介して取引をする構成を取っています。
強化学習のシステム作成
GPT-5 をはじめとした生成 AI に PPO エージェントのサンプルを提案してもらって、運良く良さげな学習効果が得られるものがあれば、そのコードを徹底的にレビューして、自分で使いこなせるようにしようという都合の良いことを考えていました。
運良く学習が進むエージェントが得られたので、これをベースにあれこれチューニングを始めています。
行動マスクの導入…
学習モデルにナンピン無し(常に最大 1 建玉)で売買するルールを遵守してもらうのに、報酬 / ペナルティだけでは学習効果に限界を感じたので、GPT-5 と相談しながら行動マスクを導入することにしました。
つまり、行動マスクを導入することで、
- 建玉が無いときに取りうるアクションは、
- HOLD(何もしない)
- BUY(買建)
- SELL(売建)
- の三種類
- 建玉が有るときに取りうるアクションは、
- の二種類
になるよう制限をかけようとしました。
環境クラスに行動マスクをかけるのに必要な機能を実装できたのですが、GPT-5 を無料プランで利用しているので、すぐに制限がかかってしまいます。😭
制限が解除されるまでの間、Gemini とやりとりを始めたところ、PyTorch の使用を指定しなかったので Stable Baselines 3 を利用したサンプルが提示されました。
強化学習のプログラミングに慣れるまではあれこれ手をつけず PyTorch に絞ってまずは取り組もうと考えていたのですが…、Gemini が提示した Stable Baselines 3 を利用したサンプルの平易さにぐらっときてしまいました。😍
Stable Baselines 3
Stable Baselines3 (SB3) は、PyTorch による強化学習アルゴリズムの実装セットです。下記に参考サイトをいくつか示しました。
Stable Baselines 3 では(そのままでは)行動マスクを適用できませんが、それでも環境クラスさえ作っておけば簡単に強化学習を試せるそのシンプルさに参ってしまったので、行動マスク導入は一旦保留にして Stable Baselines 3 にパッケージを利用してみることにしました。
とりあえず GUI 化
定型のチャートを作成する時や機能を確認する時にはもっぱら Jupyter Lab を利用していますが、良い条件を探すために網羅的に条件を振りたい時は、遠回りのようであっても GUI を用意するのが自分のやり方です。
Stable Baselines 3 を利用すれば、自力で学習と推論の処理部分を組み立てられそうだったので、好きなファイルを選んで学習、推論できるように最低限の GUI を用意しました。
複数銘柄のティックデータを収集したファイル ticks_YYYYMMDD.xlsx を選んで(シート名である)銘柄コードを選択後、開始ボタンをクリックすれば学習を始めます。学習が終われば、同じティックデータで推論した結果を標準出力します。
以下に実行例を示しました。
Using cpu device
Wrapping the env with a `Monitor` wrapper
Wrapping the env in a DummyVecEnv.
-----------------------------
| time/ | |
| fps | 1682 |
| iterations | 1 |
| time_elapsed | 1 |
| total_timesteps | 2048 |
-----------------------------
-----------------------------------------
| time/ | |
| fps | 1326 |
| iterations | 2 |
| time_elapsed | 3 |
| total_timesteps | 4096 |
| train/ | |
| approx_kl | 0.020303011 |
| clip_fraction | 0.326 |
| clip_range | 0.2 |
| entropy_loss | -1.37 |
| explained_variance | 0.0022 |
| learning_rate | 0.0003 |
| loss | 33.3 |
| n_updates | 10 |
| policy_gradient_loss | -0.0377 |
| value_loss | 144 |
-----------------------------------------
...
(途中省略)
...
------------------------------------------
| rollout/ | |
| ep_len_mean | 1.94e+04 |
| ep_rew_mean | -54 |
| time/ | |
| fps | 1160 |
| iterations | 63 |
| time_elapsed | 111 |
| total_timesteps | 129024 |
| train/ | |
| approx_kl | 0.0003118569 |
| clip_fraction | 0.00571 |
| clip_range | 0.2 |
| entropy_loss | -0.111 |
| explained_variance | 0.00376 |
| learning_rate | 0.0003 |
| loss | 0.418 |
| n_updates | 620 |
| policy_gradient_loss | -0.00032 |
| value_loss | 0.677 |
------------------------------------------
取引明細
注文日時 銘柄コード 売買 約定単価 約定数量 損益
0 2025-08-19 09:02:17 7011 売建 4015 1 NaN
1 2025-08-19 09:02:18 7011 買埋 4015 1 0.0
2 2025-08-19 09:02:19 7011 売建 4016 1 NaN
3 2025-08-19 09:02:20 7011 買埋 4016 1 0.0
4 2025-08-19 09:02:21 7011 売建 4016 1 NaN
... ... ... .. ... ... ...
19301 2025-08-19 15:24:55 7011 買埋 3913 1 1.0
19302 2025-08-19 15:24:56 7011 売建 3913 1 NaN
19303 2025-08-19 15:24:57 7011 買埋 3915 1 -2.0
19304 2025-08-19 15:24:58 7011 売建 3915 1 NaN
19305 2025-08-19 15:24:59 7011 買埋 3915 1 0.0
[19306 rows x 6 columns]
--- テスト結果 ---
モデル報酬(総額): 977.24
最終的な総収益(1 株利益): 12.00
finished training!
テスト用に使用している学習クラスの特徴量は Price と Volume を少し加工した 2 つの特徴量と、現在のポジション状態(PositionType)を one-hot ベクトルに変換した下記の 3 情報だけです。
array([
[1., 0., 0.], # PositionType.NONE → index 0
[0., 1., 0.], # PositionType.LONG → index 1
[0., 0., 1.] # PositionType.SHORT → index 2
])
上記取引明細を見ると、取引量が 19,000 を超えていて、ほぼ毎回売買していることになります。
こんな高頻度の取引は使いものにならないのですが、ルール違反だと売買されないので、裏を返せば ナンピン無し(常に最大 1 建玉)で売買するルールが守られているようには見えます。
学習・推論を確認するだけの簡単な機能しか実装していませんが、これをベースに系統的な特徴量を含むパラメータ探索を進めていきます。
参考サイト
- マーケットスピード II RSS | 楽天証券のトレーディングツール
- マーケットスピード II RSS 関数マニュアル
- 注文 | マーケットスピード II RSS オンラインヘルプ | 楽天証券のトレーディングツール
- PythonでGUIを設計 | Qtの公式Pythonバインディング
- PyQtGraph - Scientific Graphics and GUI Library for Python
- Python in Excel alternative: Open. Self-hosted. No limits.
- Book - xlwings Documentation