楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用して Python であれこれ取り組んでいます。この「自動売買への道」のトピックでは、プログラミングの話題にも踏み込んで、日々の活動をまとめていきます。
デイトレ用自作アプリ
以下は株価に関連する情報の流れを示しています。
楽天証券では、Python からネットワーク越しに直接取引できるような API が提供されていないので、マーケットスピード II RSS を介して取引をする構成を取っています。
現在、強化学習を利用して、取引モデルを育成中です。
報酬設計の沼にハマる
前回、StableBaselines3 を利用した PPO エージェントで、モデルの学習が進むようになったことを確認しました。
Python のコードを整理しながら、ちょこちょこと条件を変えながら報酬設計を試しているうちに、モデルの推論パフォーマンスが落ちてきて、遂に収益がマイナスばかりになってしまいました。😭
何をどう変えたかをきっちり履歴に残しておかなくて、しかも試しているうちにあちこちの不備を見つけては直すことを繰り返していたので、元に戻れなくなってしまいました。
仕方がないので、超シンプルな報酬設計に戻り、記録を取りながら改良を進めることにしました。
なお、推論結果は再現しないので、最初の結果を残しました。
推論に使用するティックデータ : ticks_20251019.xlsx, 7011
使用するティックデータは 9:00:00 から 15:24:50(ランチタイムを除く)までの 19,490 個(最大)のティックデータです。実際には寄り付いてからのデータになります。
今のところ、推論に使用する過去のティックデータは以下 (ticks_20251019.xlsx, 7011) に固定します。最初のうちは同じファイルでモデルの学習もします。
報酬 = 確定損益(1 つの過去データで学習・推論)
最もシンプルなケースとして、売買して確定した損益のみをスケーリングして報酬とした場合を試しました。
推論結果(使用データ : ticks_20251019.xlsx, 7011)
同じデータで学習・推論した結果です。
注文日時 銘柄コード 売買 約定単価 約定数量 損益
0 2025-09-19 09:03:40 7011 買建 3722 1 NaN
1 2025-09-19 09:06:38 7011 売埋 3727 1 3.0
2 2025-09-19 09:06:47 7011 買建 3727 1 NaN
3 2025-09-19 09:17:39 7011 売埋 3734 1 5.0
4 2025-09-19 09:20:42 7011 売建 3735 1 NaN
5 2025-09-19 09:33:56 7011 買埋 3744 1 -11.0
6 2025-09-19 09:35:25 7011 買建 3736 1 NaN
7 2025-09-19 09:48:32 7011 売埋 3746 1 8.0
8 2025-09-19 09:49:48 7011 買建 3747 1 NaN
9 2025-09-19 09:56:43 7011 売埋 3741 1 -8.0
10 2025-09-19 09:58:21 7011 買建 3732 1 NaN
11 2025-09-19 10:01:35 7011 売埋 3726 1 -8.0
12 2025-09-19 10:03:00 7011 買建 3726 1 NaN
13 2025-09-19 10:16:48 7011 売埋 3745 1 17.0
14 2025-09-19 10:17:37 7011 買建 3739 1 NaN
15 2025-09-19 12:43:58 7011 売埋 3706 1 -35.0
16 2025-09-19 12:47:29 7011 買建 3696 1 NaN
17 2025-09-19 12:49:43 7011 売埋 3707 1 9.0
18 2025-09-19 12:53:14 7011 買建 3711 1 NaN
19 2025-09-19 13:00:56 7011 売埋 3693 1 -20.0
20 2025-09-19 13:02:57 7011 買建 3683 1 NaN
21 2025-09-19 15:24:59 7011 売埋(強制返済) 3689 1 4.0
一株当りの損益 : -36.0 円
報酬分布
報酬設計がシンプル過ぎるためか、報酬 0 に集まってしまったので縦軸を対数にしました。
観測値のトレンド
報酬 = 確定損益 + 含み損益(1 つの過去データで学習・推論)
次に、確定損益に加えて、含み損益の 1% を報酬に加えた場合を試しました。
推論結果(使用データ : ticks_20250819.xlsx, 7011)
これも同じデータで学習・推論した結果です。
注文日時 銘柄コード 売買 約定単価 約定数量 損益
0 2025-09-19 09:03:37 7011 売建 3718 1 NaN
1 2025-09-19 14:13:43 7011 買埋 3662 1 54.0
2 2025-09-19 14:14:24 7011 売建 3662 1 NaN
3 2025-09-19 15:12:02 7011 買埋 3681 1 -21.0
4 2025-09-19 15:12:45 7011 売建 3682 1 NaN
5 2025-09-19 15:24:59 7011 買埋(強制返済) 3689 1 -9.0
一株当りの損益 : 24.0 円
報酬分布
含み損益の 1% では小さすぎるのか、あまり大きな変化はありません。縦軸はまだ対数軸です。贔屓目に見ればプラス側にちょっと分布が寄ったような気がします。
観測値のトレンド
LONG ポジション(買建)が 1 回も選択されていません。取引回数が少なかったし、こんなものかもしれません。
報酬 = 確定損益 + 含み損益(49 の過去データで学習、1 つのデータで推論)
複数のデータで学習を重ねることでどの程度変化するかを確認しました。
最後のエピソード
49 個のデータ ticks_20250819.xlsx - ticks_20251029.xlsx, 7011 で新しいモデルを学習した最後の出力です。
----------------------------------------- | rollout/ | | | ep_len_mean | 1.92e+04 | | ep_rew_mean | 0.0553 | | time/ | | | fps | 503 | | iterations | 49 | | time_elapsed | 199 | | total_timesteps | 100352 | | train/ | | | approx_kl | 0.007784045 | | clip_fraction | 0.0556 | | clip_range | 0.2 | | entropy_loss | -0.26 | | explained_variance | 0.369 | | learning_rate | 0.0003 | | loss | -0.0303 | | n_updates | 24000 | | policy_gradient_loss | -0.012 | | value_loss | 7e-05 | ----------------------------------------- モデルを models/ppo_7011.zip に保存します。
推論結果(使用データ : ticks_20250819.xlsx, 7011)
ticks_20250819.xlsx, 7011 で推論した結果です。
注文日時 銘柄コード 売買 約定単価 約定数量 損益
0 2025-09-19 09:03:14 7011 売建 3723 1 NaN
1 2025-09-19 09:03:18 7011 買埋 3719 1 2.0
2 2025-09-19 09:03:52 7011 売建 3722 1 NaN
3 2025-09-19 09:05:15 7011 買埋 3720 1 0.0
4 2025-09-19 09:05:40 7011 売建 3724 1 NaN
.. ... ... .. ... ... ...
75 2025-09-19 15:15:20 7011 買埋 3682 1 3.0
76 2025-09-19 15:20:26 7011 売建 3688 1 NaN
77 2025-09-19 15:20:43 7011 買埋 3684 1 2.0
78 2025-09-19 15:24:45 7011 売建 3689 1 NaN
79 2025-09-19 15:24:47 7011 買埋 3689 1 -2.0
[80 rows x 6 columns]
一株当りの損益 : -12.0 円
報酬分布
分布に広がりが見られますが、まだ明らかにプラス側に偏っている、というような特徴は確認できません。報酬設計がまだシンプル過ぎるのかもしれませんが、この状態で更に学習を重ねて分布がどのように変わるのかに興味があります。
観測値のトレンド
今回も LONG ポジション(買建)が 1 回も選択されていません。推論に使用したデータ ticks_20250819.xlsx, 7011 の値動きがほぼ下降トレンドのせいもありますが、その割には収益がマイナスになっているのが気になります。
今日のデータを加えて再学習
今日取得したデータ ticks_20251030.xlsx, 7011 を加えた 50 個のデータで(今回学習したモデルに対して)追加学習をして推論パフォーマンスを確認してみます。
学習するティックデータ : ticks_20250819.xlsx モデル models/ppo_7011.zip を読み込みます。 Wrapping the env in a DummyVecEnv. ----------------------------- | time/ | | | fps | 808 | | iterations | 1 | | time_elapsed | 2 | | total_timesteps | 2048 | ----------------------------- ... (以下省略) ...
詳細は、明日まとめます。
本記事は、基本的に結果を貼り付けただけのような内容なので、後日、読み返して説明が足りない部分を補足するようにします。
参考サイト
- マーケットスピード 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









0 件のコメント:
コメントを投稿