楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用して Python であれこれ取り組んでいます。この「自動売買への道」のトピックでは、プログラミングの話題にも踏み込んで、日々の活動をまとめていきます。
デイトレ用自作アプリ
以下は株価に関連する情報の流れを示しています。
楽天証券では、Python からネットワーク越しに直接取引できるような API が提供されていないので、マーケットスピード II RSS を介して取引をする構成を取っています。
現在、強化学習を利用して、取引モデルを育成中です。
報酬設計の沼にハマる (2)
条件を変えながら報酬設計を試しているうちに、モデルの推論パフォーマンスが落ちてきて、遂に収益がマイナスばかりになってしまいました。そこで、一旦シンプルな報酬設計に戻して、ひとつひとつ変更を確認してそれを簡単にまとめながら進めることにしました。
推論に使用するティックデータ : ticks_20251019.xlsx, 7011
使用するティックデータは 9:00:00 から 15:24:50(ランチタイムを除く)までの 19,490 個(最大)のティックデータです。実際には寄り付いてからのデータになります。
今のところ、推論に使用する過去のティックデータは以下 (ticks_20251019.xlsx, 7011) に固定しています。
報酬 = 確定損益 + 含み損益 : 昨日のデータを加えて再学習
昨日取得したデータ ticks_20251030.xlsx, 7011 を加えた 50 個のデータで(今回学習したモデルに対して)追加学習をしました。
推論結果(使用データ : ticks_20251019.xlsx, 7011)
推論パフォーマンスを確認しました。収益がマイナスばかりになってしまっていいところがありません。収益なしの 0 円で返済する場合にはペナルティを課すようにした方が良いのかもしれません。
注文日時 銘柄コード 売買 約定単価 約定数量 損益
0 2025-09-19 10:16:34 7011 売建 3744 1 NaN
1 2025-09-19 10:16:35 7011 買埋 3744 1 -2.0
2 2025-09-19 12:43:44 7011 売建 3706 1 NaN
3 2025-09-19 12:43:51 7011 買埋 3707 1 -3.0
4 2025-09-19 12:58:21 7011 売建 3698 1 NaN
5 2025-09-19 12:58:22 7011 買埋 3696 1 0.0
6 2025-09-19 13:09:56 7011 売建 3645 1 NaN
7 2025-09-19 13:09:57 7011 買埋 3645 1 -2.0
8 2025-09-19 13:10:35 7011 売建 3645 1 NaN
9 2025-09-19 13:10:37 7011 買埋 3643 1 0.0
10 2025-09-19 13:11:29 7011 売建 3637 1 NaN
11 2025-09-19 13:11:33 7011 買埋 3635 1 0.0
12 2025-09-19 13:12:06 7011 売建 3631 1 NaN
13 2025-09-19 13:12:07 7011 買埋 3631 1 -2.0
14 2025-09-19 14:04:07 7011 売建 3652 1 NaN
15 2025-09-19 14:04:09 7011 買埋 3651 1 -1.0
16 2025-09-19 14:04:58 7011 売建 3653 1 NaN
17 2025-09-19 14:05:04 7011 買埋 3655 1 -4.0
一株当りの損益 : -14.0 円
モデルへの報酬分布
n: 19387, mean: -0.000, stdev: 0.000
観測数 : 9
報酬分布
分布はさらに狭くなり、ほとんど 0 へ収束してしまいました。😭
観測値のトレンド
観測値の「含損益」がほとんど動いていません。
スリッページを 0 にしてみる ①
指値で売買しようとしても、その株価で約定できるとは限りません。そこで、1 ティック分(対象銘柄では 1 円)は必ずスベると想定してスリッページを 1 円に設定していました。
つまり、指値より常に、1 円高く買って 1 円安く売る設定にしています。取引履歴上は同じ値段で売買すると 2 円の損失が発生します。
しかし、よくよく考えてみると、モデル側がスリッページ前提で取引するような仕組みになってしまっています。
本来は指値を取引履歴に残すのではなく約定価格を履歴に残すべきなので、スリッページの扱いに工夫の余地があります。この設定のせいでモデルの学習が収益を上げる方向に進まない可能性があると考えて、一旦 0 にしてみました。
とりあえず ticks_20251019.xlsx, 7011 で学習・推論させてみました。
推論結果(使用データ : ticks_20251019.xlsx, 7011)
過去データ ticks_20250919.xlsx の銘柄 7011 について推論します。
モデル models/ppo_7011.zip を読み込みます。
Wrapping the env in a DummyVecEnv.
注文日時 銘柄コード 売買 約定単価 約定数量 損益
0 2025-09-19 09:01:04 7011 売建 3719 1 NaN
1 2025-09-19 09:01:09 7011 買埋 3714 1 5.0
2 2025-09-19 09:01:10 7011 売建 3715 1 NaN
3 2025-09-19 09:01:13 7011 買埋 3713 1 2.0
4 2025-09-19 09:01:14 7011 売建 3715 1 NaN
... ... ... ... ... ... ...
2601 2025-09-19 15:24:43 7011 買埋 3687 1 -1.0
2602 2025-09-19 15:24:44 7011 売建 3689 1 NaN
2603 2025-09-19 15:24:53 7011 買埋 3688 1 1.0
2604 2025-09-19 15:24:54 7011 売建 3688 1 NaN
2605 2025-09-19 15:24:59 7011 買埋(強制返済) 3689 1 -1.0
[2606 rows x 6 columns]
一株当りの損益 : 189.0 円
モデルへの報酬分布
n: 19387, mean: -0.000, stdev: 0.005
報酬分布
分布は明確にはプラス側に寄ってはいませんが、きれいな正規分布にはなっていません。
観測値のトレンド
取引頻度が多いですが、学習を重ねることで頻度が変わるのかを確認してみたいです。
スリッページを 0 にしてみる ②
過去 50 個のデータでさせた後、ticks_20251019.xlsx, 7011 で推論させてみました。
推論結果(使用データ : ticks_20251019.xlsx, 7011)
高頻度の取引回数で実用的ではありませんが、利益は出ているようです。
過去データ ticks_20250919.xlsx の銘柄 7011 について推論します。
モデル models/ppo_7011.zip を読み込みます。
Wrapping the env in a DummyVecEnv.
注文日時 銘柄コード 売買 約定単価 約定数量 損益
0 2025-09-19 09:01:04 7011 売建 3719 1 NaN
1 2025-09-19 09:01:05 7011 買埋 3719 1 0.0
2 2025-09-19 09:01:06 7011 売建 3718 1 NaN
3 2025-09-19 09:01:07 7011 買埋 3718 1 0.0
4 2025-09-19 09:01:08 7011 売建 3714 1 NaN
... ... ... ... ... ... ...
12945 2025-09-19 15:24:55 7011 買埋 3688 1 0.0
12946 2025-09-19 15:24:56 7011 売建 3688 1 NaN
12947 2025-09-19 15:24:57 7011 買埋 3688 1 0.0
12948 2025-09-19 15:24:58 7011 売建 3689 1 NaN
12949 2025-09-19 15:24:59 7011 買埋(強制返済) 3689 1 0.0
[12950 rows x 6 columns]
一株当りの損益 : 627.0 円
モデルへの報酬分布
n: 19387, mean: 0.000, stdev: 0.004
観測数 : 9
報酬分布
取引履歴では利益が出ているものの、縦軸が対数軸ですが分布形状は正規分布のように左右対称です。学習を重ねると、分布の広がりは抑えられていくという傾向は変わりません。
観測値のトレンド
圧倒的に SHORT ポジション(売建)が多いですが、LONG ポジション(買建)も少しあります。
損益 0 の売買にペナルティをかける ①
高頻度な売買を減らすために、まずは損益 0 の売買に -0.5 円(-0.5 ティック)のペナルティをかけてみます。
ticks_20251019.xlsx, 7011 で学習・推論させてみました。
推論結果(使用データ : ticks_20251019.xlsx, 7011)
「スリッページを 0 にしてみる ①」の取引頻度と比べると 10% 程度に取引回数が減りました。
過去データ ticks_20250919.xlsx の銘柄 7011 について推論します。
モデル models/ppo_7011.zip を読み込みます。
Wrapping the env in a DummyVecEnv.
注文日時 銘柄コード 売買 約定単価 約定数量 損益
0 2025-09-19 09:01:04 7011 買建 3719 1 NaN
1 2025-09-19 09:01:06 7011 売埋 3718 1 -1.0
2 2025-09-19 09:01:10 7011 買建 3715 1 NaN
3 2025-09-19 09:01:19 7011 売埋 3716 1 1.0
4 2025-09-19 09:01:21 7011 売建 3717 1 NaN
.. ... ... ... ... ... ...
235 2025-09-19 15:21:44 7011 売埋 3686 1 1.0
236 2025-09-19 15:21:51 7011 買建 3686 1 NaN
237 2025-09-19 15:21:57 7011 売埋 3686 1 0.0
238 2025-09-19 15:21:58 7011 売建 3686 1 NaN
239 2025-09-19 15:24:59 7011 買埋(強制返済) 3689 1 -3.0
[240 rows x 6 columns]
一株当りの損益 : 35.0 円
モデルへの報酬分布
n: 19387, mean: 0.000, stdev: 0.006
観測数 : 9
報酬分布
分布は母数が少ないのでなんとも言えません。学習を重ねてどうなるか確認します。
観測値のトレンド
次のステップ
今晩、51 個の過去データであらたに学習させて、明日、推論のパフォーマンスを確認します。学習を重ねることで、今までと同様に分布の広がりが引き締まるのであれば、報酬のスケーリングの調整も検討する予定です。
参考サイト
- マーケットスピード II RSS | 楽天証券のトレーディングツール
- マーケットスピード II RSS 関数マニュアル
- 注文 | マーケットスピード II RSS オンラインヘルプ | 楽天証券のトレーディングツール
- Gymnasium Documentation
- Stable-Baselines3 Docs - Reliable Reinforcement Learning Implementations
- PyTorch documentation
- PythonでGUIを設計 | Qtの公式Pythonバインディング
- Python in Excel alternative: Open. Self-hosted. No limits.
- Book - xlwings Documentation































