2025-12-20

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

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

デイトレ用自作アプリ

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

株価データの流れ(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
  • ロスカット
    • しきい値以下になったらフラグを立てて建玉を返済、損切り。
    • (現在、無効に設定)
  • 利確
    • 含み益と含み益最大値との比較で建玉を返済、利確する簡単なロジックを導入。
    • (現在、無効に設定)

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

下記に、毎日確認をしている実験条件の概略をまとめました。

実験条件 (doe-6) と最適条件判定方法
データ 約 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 回に設定。
最適条件判定方法
  1. 引け後に、当日分ティックデータの取引シミュレーションを実験条件に沿って実施。
  2. 各実験条件に対して、蓄積した日付分の収益の平均(平均収益)を算出。
  3. 原則として平均収益が最も高い条件を、翌日の取引条件に採用する。

今回の評価

取引回数を抑えたかったので、しきい値 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 からの平均収益をチャートにしています。

実験条件別の平均収益トレンド(データは前営業日まで)
平均収益トップ 10 の条件
  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 から当日までのデータのメジアンを算出しています。

実験条件別のメジアン収益トレンド(データは前営業日まで)

メジアンで集計した収益のランキングも、平均収益と同様に作成しました。

メジアン収益トップ 10 の条件
  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)では平均収益がマイナスに沈んでしまった条件はありませんでしたが、この条件ではマイナスになってしまった条件がいくつか存在します。

平均収益トップ 10 の条件
  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 から当日までのデータのメジアンを算出しています。

実験条件別のメジアン収益トレンド(データは前営業日まで)

メジアンで集計した収益のランキングも、平均収益と同様に作成しました。

メジアン収益トップ 10 の条件
  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_1PERIOD_MA_2 をそれぞれ 11 水準の全ての組み合わせ 11 × 11 = 121 通りの条件で取引シミュレーションをしています。過去 84 日分あるので、THRESHOLD_MR からみれば、1 水準あたり 121 × 84 = 10164 個のデータがあることになります。

取引回数および収益の THRESHOLD_MR 依存性を、ヒストグラムにしてざっくり比較しました。今回は見た目で差を確認しただけで、数値化しての比較はしていません。

取引回数分布の比較

しきい値を低くすれば、それだけ取引回数が増える傾向にあることを確認できました。取引回数の上限 100 回に対しては、どちらのしきい値でも余裕があるので、収益が増えるのであれば、しきい値を下げるのもありです。

収益分布の比較

収益分布については、取引回数と同じようにヒストグラムで 2 つの条件を重ねると、ほとんど重なってしまって差がよく判らなかったので、累積度数分布で比較してみました。

それでも、はっきり確認できるほどの差ではないのですが、THRESHOLD_MR = 7 の方が、マイナス側は度数分布曲線が下に(損が小さく)、プラス側では上に(益が大きく)なっていることが僅かに確認できます。

まとめ

総じて、現行条件 POR の方がより少ない取引数で収益性がやや優れていると言えそうです。逆を言えば、取引数が増えると損失が増える可能性が高いとも言えそうです。したがって、取引数が少ないからと言って、殊更、しきい値を微調整する必要はとりあえずなさそうだということです。

しばらくは現行条件をベースにして追加の評価をすることにします。

参考サイト

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

コメントを投稿