2025-10-30

自動売買への道 (2025-10-30)

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

デイトレ用自作アプリ

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

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

楽天証券では、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 |
-----------------------------
...
(以下省略)
...

詳細は、明日まとめます。

本記事は、基本的に結果を貼り付けただけのような内容なので、後日、読み返して説明が足りない部分を補足するようにします。

参考サイト

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

0 件のコメント:

コメントを投稿