2025-12-10

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

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

今日の日経平均株価

現在値 50,602.80 -52.30 -0.10% 15:30
前日終値 50,655.10 12/09 高値 51,107.77 09:13
始値 50,878.66 09:00 安値 50,329.27 10:53

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

【関連ニュース】

デイトレ用自作アプリ

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

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

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

取引シミュレーション

強化学習モデルのチューニング作業の優先順位を下げ、しばらくはテクニカル指標のシグナルで取引するアプローチを前面に出しています。

制約条件

現在シミュレーションで設定している制約は下記のとおりです。

  • 売買条件
    • ポジションを解消してから次の売買をする(ナンピン禁止)。
  • 取引回数
    • 上限を 100 回に制限
  • 約定条件
    • スリッページなし

売買判断のための指標

現在利用している指標は下記のとおりです。

  • 2つの移動平均 MA1MA2
    • クロス・シグナルで売買
    • PERIOD_MA_1 = TBD
    • PERIOD_MA_2 = TBD
  • 移動範囲 Moving Range, MR
    • ボラティリティを判定する指標、しきい値以下の時はフラグを立ててエントリしない。
    • PERIOD_MR = 30
    • THRESHOLD_MR = 7
  • ロスカット
    • しきい値以下になったらフラグを立てて建玉を返済、損切り。
    • (現在、無効に設定)
  • 利確
    • 含み益と含み益最大値との比較で建玉を返済、利確する簡単なロジックを導入。
    • (現在、無効に設定)

取引シミュレーションの実験

下記の条件表に沿って、過去のティックデータで取引シミュレーションを実施しました。

条件数 (11 × 11 = 121) が多いので、遡って過去のティックデータ全部を処理するのにかなり時間がかかると見込んでいましたが、早く結果を見たかったので、複数の PC を動員して残っている分を算出してしまいました。😁

シミュレーション中の実験条件 (doe-6)
データ 約 1 秒間隔で取得した株価と出来高のティックデータ
対象銘柄 7011 呼び値が 1 円で出来高が多い、東証プライムの銘柄を選定
対象期間 2025-08-19 〜 2025-12-09 の東証取引日(76 営業日)
実験因子 実験水準 説  明
PERIOD_MA_1 sec 30 45 60 75 90 105 120 135 150 165 180 周期が異なる 2 つの移動平均 MA1 と MA2 のクロス・シグナルを売買ポイントとする。
PERIOD_MA_2 sec 300 360 420 480 540 600 660 720 780 840 900
PERIOD_MR sec 30 ボラティリティを測定する指標として移動範囲を採用。しきい値より低ければ、売買エントリを禁止。
現時点では、少なめの取引数に収まるように、しきい値を高めに設定している。
THRESHOLD_MR tick 7
評価特性 説  明
収益 (total) 円 / 株 1 日の売買シミュレーションで、2 つの移動平均のクロス・シグナルに従って売買した収益。
取引回数 (trade) 【参考値】システム側でナンピン売買を禁止し、取引回数の上限を 100 回に設定。

実験結果(サマリ統計)

実験結果(評価特性は各条件毎の平均値)
  PERIOD_MA_1 PERIOD_MA_2 trade total
0 30 300 31.1 3.67
1 45 300 22.9 -0.28
2 60 300 21.4 1.45
3 75 300 19.1 3.64
4 90 300 17.4 1.32
5 105 300 16.8 0.00
6 120 300 15.3 2.83
7 135 300 14.7 2.20
8 150 300 14.2 1.55
9 165 300 12.8 2.04
10 180 300 12.8 2.08
11 30 360 27.1 3.29
12 45 360 20.7 1.14
13 60 360 19.7 4.74
14 75 360 17.3 6.14
15 90 360 15.3 5.51
16 105 360 14.6 5.78
17 120 360 13.3 6.95
18 135 360 12.9 5.70
19 150 360 11.9 4.66
20 165 360 11.4 6.93
21 180 360 11.1 1.41
22 30 420 24.9 3.54
23 45 420 18.9 3.80
24 60 420 18.7 6.42
25 75 420 16.0 4.58
26 90 420 14.4 5.13
27 105 420 13.0 6.78
28 120 420 12.6 8.03
29 135 420 11.8 8.87
30 150 420 10.9 11.34
31 165 420 10.3 9.03
32 180 420 9.7 6.99
33 30 480 23.8 6.68
34 45 480 17.2 5.95
35 60 480 17.1 7.71
36 75 480 15.1 9.34
37 90 480 13.7 10.07
38 105 480 13.0 7.22
39 120 480 11.6 9.59
40 135 480 10.8 8.04
41 150 480 10.4 8.41
42 165 480 9.6 12.79
43 180 480 9.2 11.70
44 30 540 22.3 9.86
45 45 540 16.6 4.17
46 60 540 16.1 12.33
47 75 540 14.2 13.21
48 90 540 12.9 9.26
49 105 540 12.1 12.36
50 120 540 11.3 9.64
51 135 540 10.5 8.72
52 150 540 9.3 8.21
53 165 540 8.5 8.13
54 180 540 8.7 8.04
55 30 600 21.7 8.07
56 45 600 15.7 10.09
57 60 600 16.0 12.12
58 75 600 13.4 8.74
59 90 600 12.0 9.17
60 105 600 11.4 8.95
61 120 600 10.5 10.11
62 135 600 9.9 7.70
63 150 600 8.4 10.26
64 165 600 8.5 10.83
65 180 600 8.1 6.95
66 30 660 21.1 5.67
67 45 660 15.7 8.86
68 60 660 15.1 9.21
69 75 660 12.9 7.14
70 90 660 11.2 8.25
71 105 660 10.6 7.45
72 120 660 9.9 7.75
73 135 660 9.2 6.16
74 150 660 8.4 8.76
75 165 660 8.0 12.04
76 180 660 7.9 8.20
77 30 720 20.4 3.43
78 45 720 14.9 8.04
79 60 720 14.9 12.22
80 75 720 13.1 6.78
81 90 720 11.7 8.50
82 105 720 10.7 8.78
83 120 720 9.5 8.79
84 135 720 9.1 9.53
85 150 720 8.2 6.47
86 165 720 8.1 3.72
87 180 720 7.9 5.45
88 30 780 20.3 3.18
89 45 780 14.9 8.45
90 60 780 14.4 13.37
91 75 780 12.5 8.43
92 90 780 11.1 5.29
93 105 780 10.3 7.63
94 120 780 9.3 8.33
95 135 780 8.6 4.21
96 150 780 7.8 5.43
97 165 780 7.2 7.14
98 180 780 7.4 6.84
99 30 840 19.4 1.21
100 45 840 14.6 0.67
101 60 840 14.2 5.42
102 75 840 12.2 5.05
103 90 840 10.4 3.95
104 105 840 9.8 10.24
105 120 840 9.0 7.03
106 135 840 8.6 8.33
107 150 840 7.8 8.54
108 165 840 7.1 4.80
109 180 840 7.1 11.17
110 30 900 18.5 2.03
111 45 900 14.2 3.87
112 60 900 13.8 6.72
113 75 900 11.8 5.93
114 90 900 10.5 10.08
115 105 900 9.5 6.64
116 120 900 8.4 11.45
117 135 900 8.2 10.93
118 150 900 7.6 9.28
119 165 900 7.1 6.33
120 180 900 6.9 4.74

平均収益のトレンド

平均収益のトレンドを作成するために、2025-08-19 を起点に、取引日までの平均収益を算出してプロットしました。

最新 (12/9) の平均収益で、高パフォーマンスのトップ 5 の条件は色を変えてプロットしています。一方、平均収益がマイナスになっている条件は黒の実線、その他は薄墨色でプロットしています。

平均収益 × 取引日数 が対象期間の総収益になります。

もし、どの値動きにも通用するベストな条件があって、取引を始めるときにその条件を採用することができれば何も問題がありませんが、現実は、過去のデータを集計すること無しに条件を決めることは不可能です。

では、今、条件を選ばなければならないとすれば、過去データの集計から単にベストな条件を採用して良いのか、と言えばやはり判断に悩みます。

それは、最新の平均収益がトップ 5 のグループに入っている条件でも、過去にマイナスに沈んでいるような時期があるとすれば、特定の値動きに対して得手不得手がはっきりしていると考えられるからです。

概ね上位グループに入っている条件を選ぶとか、過去のばらつきを考慮するなど、評価手段はいろいろありそうです。

上記の懸念は、全てのデータが揃うまで、途中のデータで集計していて感じたことですが、シミュレーション結果が全て揃って集計した結果を眺めると、平均収益が高いグループは対象期間を通じての平均収益も概ね高く推移しています。

ひとまず、ベストな条件でその日のティックデータで取引シミュレーションのパフォーマンスを確認します。

以下に、最新の平均収益トップ 5 の実験条件をまとめました。

最新の平均収益のトップ 5
  PERIOD_MA_1 PERIOD_MA_2 trade total
90 60 780 14.4 13.37
47 75 540 14.2 13.21
42 165 480 9.6 12.79
49 105 540 12.1 12.36
46 60 540 16.1 12.33

平均収益が 10 円ちょっとというのは少なくて残念ですが、できるところから運用を始めて、より良いアルゴリズムに進化させていきます。

最新の平均収益が負になった条件は以下の一条件だけでした。

最新の平均収益が負になった条件
  PERIOD_MA_1 PERIOD_MA_2 trade total
1 45 300 22.9 -0.28

等高線図 (Contour Map)

平均などの集計をせずに生のシミュレーション結果の各日の収益データから等高線図を作成しました。実験点は 、平均収益トップ 5 の条件は 🟢、マイナスの条件は で表示しています。

今のところ、ベストな条件が実験範囲の隅に偏ってはいません。

本日のシミュレーション

前日のベスト条件で、本日のティックデータで取引シミュレーションをしてみました。

【取引明細】
                   注文日時 銘柄コード  売買    約定単価  約定数量    損益
0   2025-12-10 09:01:43  7011  買建  4317.0     1   NaN
1   2025-12-10 09:05:59  7011  売埋  4323.0     1   6.0
2   2025-12-10 09:06:13  7011  買建  4329.0     1   NaN
3   2025-12-10 09:08:38  7011  売埋  4311.0     1 -18.0
4   2025-12-10 09:08:39  7011  売建  4311.0     1   NaN
5   2025-12-10 09:19:17  7011  買埋  4313.0     1  -2.0
6   2025-12-10 09:23:31  7011  売建  4299.0     1   NaN
7   2025-12-10 09:25:48  7011  買埋  4304.0     1  -5.0
8   2025-12-10 09:28:43  7011  売建  4295.0     1   NaN
9   2025-12-10 10:04:12  7011  買埋  4264.0     1  31.0
10  2025-12-10 12:33:30  7011  売建  4209.0     1   NaN
11  2025-12-10 12:46:10  7011  買埋  4198.0     1  11.0
12  2025-12-10 12:47:36  7011  売建  4185.0     1   NaN
13  2025-12-10 13:00:19  7011  買埋  4185.0     1   0.0
取引回数 : 14 回, 一株当りの損益 : 23.0 円

次のステップは検算

時間がかかる過去のティックデータによる取引シミュレーションと集計が終わったので、次はリアルタイムでシャドー・トレードを始めるステップに進みたいのですが、その前に…。

後になって、算出している数値に間違いが見つかれば、間違いの内容次第では心が折れて立ち直れなくなりそうです。

いくら見直してもバグから逃れられる保証はありませんが、ひとまず、明日は Jupyter Lab 上でおこなってきた集計コードを本ブログ上で整理、検算することにします。

参考サイト

  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 件のコメント:

コメントを投稿