楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用して Python であれこれ取り組んでいます。この「自動売買への道」のトピックでは、プログラミングの話題にも踏み込んで、日々の活動をまとめていきます。
今日の日経平均株価
| 現在値 | 51,028.42 | +1,163.74 | +2.33% | 15:30 | |
|---|---|---|---|---|---|
| 前日終値 | 49,864.68 | 12/03 | 高値 | 51,028.42 | 15:30 |
| 始値 | 49,942.94 | 09:00 | 安値 | 49,910.06 | 09:01 |
※ 右の 15 分足チャートは Yahoo! Finance のデータを yfinance で取得して作成しました。
【関連ニュース】
- 5秒で全面測定…浜松ホトニクス、半導体製造向け膜厚計|ニュースイッチ by 日刊工業新聞社 [2025-12-03]
- 米国株式市場=続伸、指標受け利下げ観測継続 マイクロソフトは下落 | ロイター [2025-12-04]
- 中立金利は推計に幅、政策金利の到達点に「若干の不確実性」=日銀総裁 | ロイター [2025-12-04]
- 東京株式市場・大引け=3日続伸、1000円超高 AI関連株高が押し上げ | ロイター [2025-12-04]
デイトレ用自作アプリ
以下は株価に関連する情報の流れを示しています。
楽天証券では、Python からネットワーク越しに直接取引できるような API が提供されていないので、マーケットスピード II RSS を介して取引をする構成を取っています。
取引シミュレーション
強化学習モデルのチューニング作業の優先順位を下げ、しばらくはテクニカル指標のシグナルで取引するアプローチを前面に出しています。
現在利用している指標は下記のとおりです。
- 2つの移動平均 MA (n = 60 sec) と MA (n = 600 sec)
- クロスサインで売買(ナンピン売買禁止)
- 移動範囲 Moving Range, MR (n = 60 sec)
- ボラティリティを判定する指標、しきい値以下の時はフラグを立ててエントリしない。
- ロスカット
- しきい値以下になったらフラグを立てて建玉を返済、損切り。
- 利確
- 含み益と含み益最大値との比較で建玉を返済、利確する簡単なロジックを導入。
実験計画
仮決め(上記)で利用してきた指標(因子)について、水準を振って、より良さげな条件の組み合わせを探索しようとしています。実験因子として水準を振れるような機能をアプリに追加しました。
| 目 的 | 仮決めで利用してきた指標(因子)の条件前後で振った範囲内に、より最適な条件が存在するかを確認する。 | ||||
|---|---|---|---|---|---|
| データ | 楽天証券マーケットスピード2 RSS から取得した過去のティックデータ(銘柄コード 7011) | ||||
| 実験因子 | 実験水準 | 説 明 | |||
| PERIOD_MA_1 | sec | 30 | 60 | 90 | クロスシグナル判定用の移動平均 1 の period |
| PERIOD_MA_2 | sec | 300 | 600 | 900 | クロスシグナル判定用の移動平均 2 の period |
| PERIOD_MR | sec | 15 | 30 | 45 | ボラティリティ判定用の移動範囲 の period |
| THRESHOLD_MR | tick | 1 | 4 | 7 | エントリを禁止する移動範囲のしきい値 |
| 評価特性 | 説 明 | ||||
| 収益 | 円 / 株 | 売買シミュレーションで、移動平均のクロスシグナルに従った売買結果の収益(スリッページなし)。 | |||
| 取引回数 | 回 | システム側で、ナンピン売買を禁止し、取引回数の上限を 100 回に設定。 | |||
| 実験計画 | 説 明 | ||||
| Full Factorial Design (完全実施要因計画) |
4 因子 3 水準の組み合わせ全て、すなわち、34 = 81 通り。この組み合わせを過去のティックデータファイルの数だけ、収益シュミレーションを繰り返します。 | ||||
| 補足説明 |
本実験は 4 因子 3 水準の全ての組み合わせについて収益シミュレーションを実施しますが、特に下記の交互作用について最適な水準の組み合わせが存在するかどうかを確認することが目的です。
そのため、上記 2 つの交互作用について分析することがメインになりますが、もしも予測もしなかった有意な交互作用が他に確認されれば、それも評価します。 |
||||
取引回数の上限について
確実に自動取引ができるようになるまでは取引回数に上限を設定しています。100 回というのはとりあえずの上限で、上限に達しない程度に収まることを期待しています。高頻度取引 (HFT) に挑戦するのはずいぶん先の話と考えています。
分析結果
対象期間
# of tick files : 73
2025-08-19 以降、本日 (2025-12-04) 分までのティックデータ
収益
収益は、(当然ながら)高いほど良い条件になります。
【収益】分散分析
ここでは主効果と交互作用について分散分析をしました。THRESHOLD_MR と、かろうじて有意性がありそうな PERIOD_MA_2 以外は有意になりませんでした。
=== ANOVA (up to 2-way interactions) ===
sum_sq df F PR(>F)
PERIOD_MA_1 1.846576e+03 1.0 0.457193 0.498965
PERIOD_MA_2 1.946667e+04 1.0 4.819739 0.028174
PERIOD_MR 9.225391e+02 1.0 0.228411 0.632722
THRESHOLD_MR 5.934476e+04 1.0 14.693128 0.000128
PERIOD_MA_1:PERIOD_MA_2 5.997298e+03 1.0 1.484867 0.223063
PERIOD_MA_1:PERIOD_MR 1.202924e+03 1.0 0.297831 0.585266
PERIOD_MA_1:THRESHOLD_MR 1.380908e+03 1.0 0.341898 0.558758
PERIOD_MA_2:PERIOD_MR 1.227641e+02 1.0 0.030395 0.861603
PERIOD_MA_2:THRESHOLD_MR 1.148086e+03 1.0 0.284254 0.593947
PERIOD_MR:THRESHOLD_MR 4.604262e-02 1.0 0.000011 0.997306
Residual 2.383786e+07 5902.0 NaN NaN
各水準の収益を平均値などで集計してから分散分析をすれば有意性のある因子を確認できると思いますが、有意性を確認することが目的ではないので、この程度にします。
【収益】主効果と交互作用
交互作用に効果は、分散分析の結果が有意でないので、傾向をみる程度にします。
クロス・シグナルで売買判断をする 2 つの移動平均では、短周期 (PERIOD_MA_1)、長周期 (PERIOD_MA_2) ともに現行の 60, 600 sec の組み合わせで収益が最も高いことを示しています。
低ボラティリティ時にエントリを抑制するための移動範囲では、周期に依存性はなく、しきい値が低くすると収益も低くなることを示しています。
【収益】興味がある2因子の等高線図 (Contour Map)
実験数を節約せずに Full Factorial Design にしたのは、等高線図を作成すること意識していたからです。
クロス・シグナルで売買判断をする 2 つの移動平均では、短周期 period=90 と 長周期 period=600 の方が、現行条件 (60, 600) より収益が高くなることを示しています。
低ボラティリティ時にエントリを抑制するための移動範囲では、中心の現行条件からチャート左上の方向 (PERIOD_MR = 15, THRESHOLD_MR = 7) の方向に向けた領域が収益が低い領域になっています。
しきい値が低い方向も等高線では収益が高くなっていますが、小さいしきい値 ⇒ 取引回数が増加するのであれば良い条件ではありません。
取引回数
取引回数は、上限が 100 で制限されているので、半分の 50 回程度に収まる条件を良しとします。
【取引回数】分散分析
なんなんだろう?取引回数の分散分析では、ほとんどの因子が有意になりました。😵💫
=== ANOVA (up to 2-way interactions) ===
sum_sq df F PR(>F)
PERIOD_MA_1 1.717241e+05 1.0 671.665790 2.395917e-140
PERIOD_MA_2 1.923189e+05 1.0 752.218528 5.603456e-156
PERIOD_MR 4.483840e+05 1.0 1753.768019 0.000000e+00
THRESHOLD_MR 5.979881e+06 1.0 23389.155420 0.000000e+00
PERIOD_MA_1:PERIOD_MA_2 4.321499e+03 1.0 16.902715 3.987924e-05
PERIOD_MA_1:PERIOD_MR 5.108408e+03 1.0 19.980557 7.969697e-06
PERIOD_MA_1:THRESHOLD_MR 2.228463e+01 1.0 0.087162 7.678269e-01
PERIOD_MA_2:PERIOD_MR 7.988860e+03 1.0 31.246893 2.373883e-08
PERIOD_MA_2:THRESHOLD_MR 7.373151e+02 1.0 2.883866 8.952367e-02
PERIOD_MR:THRESHOLD_MR 6.304733e+04 1.0 246.597535 1.792893e-54
Residual 1.508958e+06 5902.0 NaN NaN
【取引回数】主効果と交互作用
取引回数と移動平均との間になにか関係があるか?と考えてもよく判りませんが、収益のときと同じようにプロットしてみました。
さすがに、移動平均と取引回数とで大きな相関関係はなさそうです。
一方、移動範囲関連の因子、特にしきい値とは強い相関があります。この領域では、移動範囲の周期 (period) は現状 (period = 30) のままでも良いのかもしれません。
【取引回数】興味がある2因子の等高線図 (Contour Map)
取引回数は離散量なので等高線図にする意味はあまりないのですが、傾向把握には役に立ちそうなので、参考にプロットしてみました。
クロス・シグナルで売買判断をする 2 つの移動平均では、収益が高くなる方向と同様に、短周期 period=90 と 長周期 period=600 の方が、現行条件 (60, 600) より取引回数を抑えられる方向を示していて、高収益、低取引回数の望ましい方向と言えます。
移動範囲の周期 (period) を大きくするほど、しきい値を大きくするほうが取引回数を抑えられる、という関係がありそうです。移動範囲の周期 (period) が 30 秒程度で抑えられる方が楽なので、しきい値で制御できるのであれば、周期は固定したいです。
収益の等高線図で検討した、小さいしきい値 ⇒ 取引回数の増加する方向がこのプロットで確認できるので、小さなしきい値は良い条件とは言えません。
まとめ
実験結果を一つの表にするにはデータ数が多すぎるので、取引回数 (trade) と収益 (total) の平均値を計算して、ちょっと長いですが表にしました。分析の結果から良さげな水準組み合わせについて、薄緑の背景色をつけてみました。
| PERIOD_MA_1 | PERIOD_MA_2 | PERIOD_MR | THRESHOLD_MR | trade | total | |
|---|---|---|---|---|---|---|
| 0 | 30 | 300 | 15 | 1 | 100.0 | -8.53 |
| 1 | 30 | 300 | 15 | 4 | 43.6 | -0.88 |
| 2 | 30 | 300 | 15 | 7 | 10.7 | 4.44 |
| 3 | 30 | 300 | 30 | 1 | 100.0 | -9.36 |
| 4 | 30 | 300 | 30 | 4 | 81.9 | 0.88 |
| 5 | 30 | 300 | 30 | 7 | 31.4 | 3.34 |
| 6 | 30 | 300 | 45 | 1 | 100.0 | -9.07 |
| 7 | 30 | 300 | 45 | 4 | 90.4 | -2.95 |
| 8 | 30 | 300 | 45 | 7 | 43.5 | 3.23 |
| 9 | 30 | 600 | 15 | 1 | 100.0 | -0.41 |
| 10 | 30 | 600 | 15 | 4 | 29.8 | 12.29 |
| 11 | 30 | 600 | 15 | 7 | 7.8 | 9.23 |
| 12 | 30 | 600 | 30 | 1 | 100.0 | -1.23 |
| 13 | 30 | 600 | 30 | 4 | 64.1 | 5.82 |
| 14 | 30 | 600 | 30 | 7 | 21.8 | 8.23 |
| 15 | 30 | 600 | 45 | 1 | 100.0 | -1.42 |
| 16 | 30 | 600 | 45 | 4 | 78.1 | 8.60 |
| 17 | 30 | 600 | 45 | 7 | 31.8 | 4.92 |
| 18 | 30 | 900 | 15 | 1 | 97.6 | -4.56 |
| 19 | 30 | 900 | 15 | 4 | 25.0 | 4.75 |
| 20 | 30 | 900 | 15 | 7 | 6.9 | 4.29 |
| 21 | 30 | 900 | 30 | 1 | 98.8 | -3.95 |
| 22 | 30 | 900 | 30 | 4 | 56.2 | -4.23 |
| 23 | 30 | 900 | 30 | 7 | 18.6 | 2.33 |
| 24 | 30 | 900 | 45 | 1 | 98.9 | -3.85 |
| 25 | 30 | 900 | 45 | 4 | 67.9 | -2.26 |
| 26 | 30 | 900 | 45 | 7 | 28.1 | -0.08 |
| 27 | 60 | 300 | 15 | 1 | 100.0 | -6.70 |
| 28 | 60 | 300 | 15 | 4 | 32.3 | 1.84 |
| 29 | 60 | 300 | 15 | 7 | 8.5 | 7.45 |
| 30 | 60 | 300 | 30 | 1 | 100.0 | -5.38 |
| 31 | 60 | 300 | 30 | 4 | 63.3 | 1.86 |
| 32 | 60 | 300 | 30 | 7 | 21.7 | 0.96 |
| 33 | 60 | 300 | 45 | 1 | 100.0 | -5.53 |
| 34 | 60 | 300 | 45 | 4 | 81.8 | 3.58 |
| 35 | 60 | 300 | 45 | 7 | 36.4 | 2.21 |
| 36 | 60 | 600 | 15 | 1 | 97.7 | 4.08 |
| 37 | 60 | 600 | 15 | 4 | 21.6 | 9.63 |
| 38 | 60 | 600 | 15 | 7 | 6.1 | 9.62 |
| 39 | 60 | 600 | 30 | 1 | 98.8 | 2.70 |
| 40 | 60 | 600 | 30 | 4 | 44.8 | 10.64 |
| 41 | 60 | 600 | 30 | 7 | 16.3 | 11.40 |
| 42 | 60 | 600 | 45 | 1 | 98.9 | 2.78 |
| 43 | 60 | 600 | 45 | 4 | 61.9 | 8.22 |
| 44 | 60 | 600 | 45 | 7 | 25.1 | 11.42 |
| 45 | 60 | 900 | 15 | 1 | 87.9 | 0.18 |
| 46 | 60 | 900 | 15 | 4 | 18.4 | 8.86 |
| 47 | 60 | 900 | 15 | 7 | 5.9 | 4.67 |
| 48 | 60 | 900 | 30 | 1 | 91.2 | -0.07 |
| 49 | 60 | 900 | 30 | 4 | 36.7 | 9.45 |
| 50 | 60 | 900 | 30 | 7 | 13.9 | 6.67 |
| 51 | 60 | 900 | 45 | 1 | 91.8 | 0.34 |
| 52 | 60 | 900 | 45 | 4 | 51.8 | 4.14 |
| 53 | 60 | 900 | 45 | 7 | 22.2 | 8.99 |
| 54 | 90 | 300 | 15 | 1 | 100.0 | -3.70 |
| 55 | 90 | 300 | 15 | 4 | 24.9 | -3.03 |
| 56 | 90 | 300 | 15 | 7 | 6.2 | -0.95 |
| 57 | 90 | 300 | 30 | 1 | 100.0 | -6.30 |
| 58 | 90 | 300 | 30 | 4 | 52.8 | -2.29 |
| 59 | 90 | 300 | 30 | 7 | 17.6 | 0.73 |
| 60 | 90 | 300 | 45 | 1 | 100.0 | -6.60 |
| 61 | 90 | 300 | 45 | 4 | 72.2 | -1.79 |
| 62 | 90 | 300 | 45 | 7 | 28.8 | -1.05 |
| 63 | 90 | 600 | 15 | 1 | 91.7 | -0.56 |
| 64 | 90 | 600 | 15 | 4 | 16.9 | 6.67 |
| 65 | 90 | 600 | 15 | 7 | 4.4 | 4.90 |
| 66 | 90 | 600 | 30 | 1 | 94.9 | 0.44 |
| 67 | 90 | 600 | 30 | 4 | 35.4 | 2.05 |
| 68 | 90 | 600 | 30 | 7 | 12.1 | 8.84 |
| 69 | 90 | 600 | 45 | 1 | 95.4 | 0.47 |
| 70 | 90 | 600 | 45 | 4 | 50.0 | 9.47 |
| 71 | 90 | 600 | 45 | 7 | 20.0 | 8.52 |
| 72 | 90 | 900 | 15 | 1 | 75.4 | 1.41 |
| 73 | 90 | 900 | 15 | 4 | 14.4 | 9.26 |
| 74 | 90 | 900 | 15 | 7 | 4.2 | 4.23 |
| 75 | 90 | 900 | 30 | 1 | 80.4 | -0.16 |
| 76 | 90 | 900 | 30 | 4 | 29.1 | 5.68 |
| 77 | 90 | 900 | 30 | 7 | 10.5 | 10.19 |
| 78 | 90 | 900 | 45 | 1 | 81.4 | -0.62 |
| 79 | 90 | 900 | 45 | 4 | 40.3 | 5.55 |
| 80 | 90 | 900 | 45 | 7 | 17.2 | 5.18 |
次のステップ
PERIOD_MA_1 の実験水準をずらし、PERIOD_MR を 30 sec に固定(実験因子から除外)して、次の実験をする予定です。実験因子をひとつ減らしたので。3 因子 × 3 水準 = 27 条件の実験になるので、全体のシミュレーション時間も短くできそうです。
| 実験因子 | 実験水準 | |||
|---|---|---|---|---|
| PERIOD_MA_1 | sec | 60 | 90 | 120 |
| PERIOD_MA_2 | sec | 300 | 600 | 900 |
| PERIOD_MR | sec | 30 | ||
| THRESHOLD_MR | tick | 3 | 5 | 7 |
参考サイト
- マーケットスピード II RSS | 楽天証券のトレーディングツール
- マーケットスピード II RSS 関数マニュアル
- 注文 | マーケットスピード II RSS オンラインヘルプ | 楽天証券のトレーディングツール
- Gymnasium Documentation
- Stable-Baselines3 Docs - Reliable Reinforcement Learning Implementations
- Maskable PPO — Stable Baselines3 - documentation
- PyTorch documentation
- PythonでGUIを設計 | Qtの公式Pythonバインディング
- Python in Excel alternative: Open. Self-hosted. No limits.
- Book - xlwings Documentation









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