楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用して Python であれこれ取り組んでいます。この「自動売買への道」のトピックでは、プログラミングの話題にも踏み込んで、日々の活動をまとめています。
デイトレ用自作アプリ
以下は株価に関連する情報の流れを示しています。
楽天証券では、Python からネットワーク越しに直接取引できるような API が提供されていないので、マーケットスピード II RSS を介して取引をする構成を取っています。
取引シミュレーション
強化学習モデルのチューニング作業の優先順位を下げ、テクニカル指標のシグナルでの取引シミュレーションをしています。
制約条件
現在シミュレーションで設定している制約は下記のとおりです。
- 売買条件
- ポジションを解消してから次の売買をする(ナンピン禁止)。
- 取引回数
- 上限を 100 回に制限
- 約定条件
- スリッページなし
売買判断のための指標
現在利用している指標は下記のとおりです。
- 2つの移動平均 MA1 と MA2
- クロス・シグナルで売買
- PERIOD_MA_1 = TBD
- PERIOD_MA_2 = TBD
- 移動範囲 Moving Range, MR
- ボラティリティを判定する指標、しきい値以下の時はフラグを立ててエントリしない。
- PERIOD_MR = 30
- THRESHOLD_MR = 7
- ロスカット
- しきい値以下になったらフラグを立てて建玉を返済、損切り。
- (現在、無効に設定)
- 利確
- 含み益と含み益最大値との比較で建玉を返済、利確する簡単なロジックを導入。
- (現在、無効に設定)
取引シミュレーションと実験
下記に、毎日確認をしている実験条件の概略をまとめました。
| データ | 約 1 秒間隔で取得した株価と出来高のティックデータ(1 日分) | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 対象銘柄 | 7011 | 呼び値が 1 円で出来高が多い、東証プライムの銘柄を選定 | |||||||||||
| 対象期間 | 2025-08-19 以降、前営業日まで | ||||||||||||
| 実験因子 | 実験水準 | 説 明 | |||||||||||
| PERIOD_MA_1 | sec | 30 | 45 | 60 | 75 | 90 | 105 | 120 | 135 | 150 | 165 | 180 | 周期が異なる移動平均 MA1 と MA2 のクロス・シグナルが売買ポイント |
| PERIOD_MA_2 | sec | 300 | 360 | 420 | 480 | 540 | 600 | 660 | 720 | 780 | 840 | 900 | |
| PERIOD_MR | sec | 30 | ボラティリティを測定する指標として移動範囲を採用。しきい値より低ければ、売買エントリを禁止。現時点では、しきい値を高めに設定。 | ||||||||||
| THRESHOLD_MR | 円 | 6 | 7 | ||||||||||
| 実験計画 | 完全実施要因計画 (Full Factorial Design) | ||||||||||||
| 評価特性 | 説 明 | ||||||||||||
| 収益 (total) | 円 / 株 | 1 日の売買シミュレーションで、2 つの移動平均のクロス・シグナルに従って売買した収益。 | |||||||||||
| 取引回数 (trade) | 回 | 【参考値】システム側でナンピン売買を禁止し、取引回数の上限を 100 回に設定。 | |||||||||||
| 最適条件判定方法 |
|
||||||||||||
今回の評価
取引回数を抑えたかったので、しきい値 THRESHOLD_MR を高めに設定して様子をみてきました。
そこそこのパフォーマンスを確認できたので、少しだけしきい値を下げて取引回数を増やしたら収益はどうなるか、という興味が当然湧きます。そこで、しきい値を少し低くした条件のシミュレーションも並行して実施してきました。ようやく現行条件にシミュレーション結果の数が追いつきました。
そういうわけで、現行条件と、しきい値 THRESHOLD_MR を少しだけ下げた条件とのパフォーマンス差を評価します。
POR (THRESHOLD_MR = 7)
POR = Process Of Record : 定義済み製造手順やプロセス(半導体業界で用いられている用語)、自分には一番しっくりきたので…🙇🏻
まずは、現行条件(しきい値 THRESHOLD_MR = 7)のパフォーマンスをまとめました。
最高収益
file code trade PERIOD_MA_1 PERIOD_MA_2 total
6371 ticks_20251105.xlsx 7011 18 60 720 321.0
最低収益
file code trade PERIOD_MA_1 PERIOD_MA_2 total
5866 ticks_20251029.xlsx 7011 28 75 600 -189.0
実験条件別の平均収益トレンド (THRESHOLD_MR = 7)
前営業日までを集計した平均収益でトップ 5 の条件は色を変えてプロットしています。一方、平均収益がマイナスになっている条件は黒の実線、その他は薄墨色でプロットしています。
なお、母数が少ないうちは平均収益の変動が大きいので、キリが良い 2025-09-01 からの平均収益をチャートにしています。
| PERIOD_MA_1 | PERIOD_MA_2 | trade | total | |
|---|---|---|---|---|
| 47 | 75 | 540 | 13.8 | 15.44 |
| 90 | 60 | 780 | 13.9 | 14.43 |
| 57 | 60 | 600 | 15.5 | 13.96 |
| 49 | 105 | 540 | 11.6 | 13.67 |
| 116 | 120 | 900 | 8.2 | 13.29 |
| 46 | 60 | 540 | 15.6 | 13.21 |
| 79 | 60 | 720 | 14.4 | 13.12 |
| 42 | 165 | 480 | 9.5 | 12.79 |
| 64 | 165 | 600 | 8.3 | 12.58 |
| 117 | 135 | 900 | 8.0 | 12.31 |
実験条件別のメジアン収益トレンド (THRESHOLD_MR = 7)
平均収益の時と同じように、当日のメジアンを算出するには起点の 2025-08-19 から当日までのデータのメジアンを算出しています。
メジアンで集計した収益のランキングも、平均収益と同様に作成しました。
| PERIOD_MA_1 | PERIOD_MA_2 | trade | total | |
|---|---|---|---|---|
| 68 | 60 | 660 | 14.0 | 8.00 |
| 90 | 60 | 780 | 12.0 | 8.00 |
| 117 | 135 | 900 | 7.0 | 7.00 |
| 44 | 30 | 540 | 20.0 | 6.50 |
| 46 | 60 | 540 | 14.0 | 6.50 |
| 29 | 135 | 420 | 10.0 | 6.00 |
| 59 | 90 | 600 | 10.0 | 5.50 |
| 116 | 120 | 900 | 8.0 | 5.50 |
| 79 | 60 | 720 | 14.0 | 5.50 |
| 62 | 135 | 600 | 9.0 | 5.00 |
等高線図 (Contour Map) (THRESHOLD_MR = 7)
過去のティックデータを補完した等高線図を参考に作成しています。実験点は ・、平均収益トップ 10 の条件は 🟢(ただし、トップ 5 を大きく、他を小さくしています)、平均収益がマイナスになった条件があれば ✖ で表示しています。
比較条件 (THRESHOLD_MR = 6)
次は、少しだけしきい値を小さくした条件 (THRESHOLD_MR = 6) のパフォーマンスをまとめました。
最高収益
file code trade PERIOD_MA_1 PERIOD_MA_2 total
6382 ticks_20251105.xlsx 7011 28 60 780 313.0
最低収益
file code trade PERIOD_MA_1 PERIOD_MA_2 total
6080 ticks_20251031.xlsx 7011 32 150 420 -208.0
現行条件(しきい値 THRESHOLD_MR = 7)と比べると、ややパフォーマンスが劣っているように見えます。
実験条件別の平均収益トレンド (THRESHOLD_MR = 6)
前営業日までを集計した平均収益でトップ 5 の条件は色を変えてプロットしています。一方、平均収益がマイナスになっている条件は黒の実線、その他は薄墨色でプロットしています。
なお、母数が少ないうちは平均収益の変動が大きいので、キリが良い 2025-09-01 からの平均収益をチャートにしています。
現行条件(しきい値 THRESHOLD_MR = 7)では平均収益がマイナスに沈んでしまった条件はありませんでしたが、この条件ではマイナスになってしまった条件がいくつか存在します。
| PERIOD_MA_1 | PERIOD_MA_2 | trade | total | |
|---|---|---|---|---|
| 46 | 60 | 540 | 21.8 | 14.80 |
| 47 | 75 | 540 | 18.8 | 14.20 |
| 68 | 60 | 660 | 20.0 | 13.26 |
| 49 | 105 | 540 | 16.1 | 13.10 |
| 116 | 120 | 900 | 11.7 | 12.86 |
| 117 | 135 | 900 | 11.3 | 12.36 |
| 79 | 60 | 720 | 19.6 | 12.35 |
| 64 | 165 | 600 | 11.6 | 12.26 |
| 58 | 75 | 600 | 17.3 | 11.50 |
| 61 | 120 | 600 | 13.9 | 11.48 |
現行条件(しきい値 THRESHOLD_MR = 7)と大差はないのですが、数値を比較する取引回数が増えているのに収益パフォーマンスがやや劣っています。
実験条件別のメジアン収益トレンド (THRESHOLD_MR = 6)
平均収益の時と同じように、当日のメジアンを算出するには起点の 2025-08-19 から当日までのデータのメジアンを算出しています。
メジアンで集計した収益のランキングも、平均収益と同様に作成しました。
| PERIOD_MA_1 | PERIOD_MA_2 | trade | total | |
|---|---|---|---|---|
| 33 | 30 | 480 | 28.0 | 8.00 |
| 58 | 75 | 600 | 16.0 | 7.50 |
| 68 | 60 | 660 | 18.0 | 7.00 |
| 112 | 60 | 900 | 16.0 | 6.50 |
| 46 | 60 | 540 | 20.0 | 6.00 |
| 102 | 75 | 840 | 13.0 | 6.00 |
| 30 | 150 | 420 | 14.0 | 6.00 |
| 31 | 165 | 420 | 12.0 | 6.00 |
| 79 | 60 | 720 | 18.0 | 5.50 |
| 49 | 105 | 540 | 14.0 | 5.00 |
メジアンでは、トップ 10 のパフォーマンス差は、取引回数が増えた以外はほとんど無いと言えます。
等高線図 (Contour Map) (THRESHOLD_MR = 6)
過去のティックデータを補完した等高線図を参考に作成しています。実験点は ・、平均収益トップ 10 の条件は 🟢(ただし、トップ 5 を大きく、他を小さくしています)、平均収益がマイナスになった条件があれば ✖ で表示しています。
条件が違うので等高線は同じになりませんが、トップ 10 に注目すれば、現行条件(しきい値 THRESHOLD_MR = 7)と概ね同じ箇所にあります。この辺りが最適点なのかもしれません。
分布の比較THRESHOLD_MR = 6 vs. 7
DOE(実験計画)と称して、毎日のティックデータを PERIOD_MA_1 と PERIOD_MA_2 をそれぞれ 11 水準の全ての組み合わせ 11 × 11 = 121 通りの条件で取引シミュレーションをしています。過去 84 日分あるので、THRESHOLD_MR からみれば、1 水準あたり 121 × 84 = 10164 個のデータがあることになります。
取引回数および収益の THRESHOLD_MR 依存性を、ヒストグラムにしてざっくり比較しました。今回は見た目で差を確認しただけで、数値化しての比較はしていません。
取引回数分布の比較
しきい値を低くすれば、それだけ取引回数が増える傾向にあることを確認できました。取引回数の上限 100 回に対しては、どちらのしきい値でも余裕があるので、収益が増えるのであれば、しきい値を下げるのもありです。
収益分布の比較
収益分布については、取引回数と同じようにヒストグラムで 2 つの条件を重ねると、ほとんど重なってしまって差がよく判らなかったので、累積度数分布で比較してみました。
それでも、はっきり確認できるほどの差ではないのですが、THRESHOLD_MR = 7 の方が、マイナス側は度数分布曲線が下に(損が小さく)、プラス側では上に(益が大きく)なっていることが僅かに確認できます。
まとめ
総じて、現行条件 POR の方がより少ない取引数で収益性がやや優れていると言えそうです。逆を言えば、取引数が増えると損失が増える可能性が高いとも言えそうです。したがって、取引数が少ないからと言って、殊更、しきい値を微調整する必要はとりあえずなさそうだということです。
しばらくは現行条件をベースにして追加の評価をすることにします。
参考サイト
- マーケットスピード 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 件のコメント:
コメントを投稿