2026-01-04

自動売買への道 (2026-01-04)

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

デイトレ用自作アプリ

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

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

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

取引シミュレーション

強化学習モデルのチューニング作業の優先順位を下げ、テクニカル指標のシグナルでの取引シミュレーションをしています。

制約条件

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

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

売買判断のためにフラグ化したインプット情報(特徴量)

現在利用しているインプット情報は下記のとおりです。

  • 2つの移動平均 MA1(短周期)と MA2(長周期)のクロス・シグナル
    • [-1 (dead), 0, 1 (golden)]
    • クロス・シグナルで売買(エントリとエグジット)
  • 1 秒遅れのクロス・シグナル
    • [-1 (dead), 0, 1 (golden)]
    • 1 秒後に反対売買できるようにするためのシグナル。
  • MA1MA2 がクロスした時の MA1 の傾き
    • [0, 1]
    • クロス・シグナルの強度の指標。建玉無しで、しきい値より大きい時はフラグを立ててエントリする。
    • 1 秒遅れのクロスシグナルに対しては、強度を再算出。
  • ロスカット
    • [0, 1]
    • しきい値以下になったらフラグを立てて建玉を返済、損切り。
  • ポジション
    • [-1 (SHORT), 0 (NONE), 1 (LONG)]
    • ポジションの状態

現在のところ、売買アルゴリズムを定義したモデルを使用していますが、将来的に強化学習モデル(候補は MaskablePPO)に置き換えられるように設計しています。

強化モデルの設計方針は、多くの情報を闇雲にインプットしてモデルをブラックボックス化してしまうことを避けることです。そのため特徴量エンジニアリングの経験をもっと積むために、現在は離散化(フラグ化)した情報だけで、どこまで売買ロジックを組み立てられるかを、自分が作成したアルゴリズム、すなわち、学習をしない、ハード・コーディングしたモデルで評価しています。

まずはこのアルゴリズムで、そこそこ稼げる自動売買実現を目指し、その上で強化学習のモデル開発に取り組みます。

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

下記に実験条件の概略をまとめました。

実験条件 (doe-9a)
データ 約 1 秒間隔で取得した株価と出来高のティックデータ(1 日分)
対象銘柄 7011 呼び値が 1 円で出来高が多い、東証プライムの銘柄を選定
対象期間 2025-08-19 以降、前営業日まで
実験因子 実験水準
PERIOD_MA_1 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190
PERIOD_MA_2 300 350 400 450 500 550 600 650 700 750 800 850 900 950 1000 1050 1100
PERIOD_SLOPE 5 MA1MA2 がクロスした時の MA1 の傾き。クロス・シグナル時、MA1 の直前数秒の変化量の平均値を、傾きの代替量として使用しているため、その秒数をパラメータに設定。
THRESHOLD_SLOPE - 0.5
LOSSCUT_1 円/株 -25 このぐらいになるとプラテンしないと思われる単純なロスカット閾値(暫定値)。
実験計画 完全実施要因計画 (Full Factorial Design)
評価特性 説  明
損  益 [total] 円/株 収集したティックデータ(1 日分)で売買シミュレーションを実施した損益。
取引回数 [trade] 取引回数の上限を 100 回に設定。【参考値】
最適条件
判定方法
  1. 引け後に、当日分ティックデータの取引シミュレーションを実験条件に沿って実施。
  2. 各実験条件に対して、蓄積した日付分の損益の平均(平均損益)および中央値(メジアン損益)を算出。
  3. 原則として平均損益が最も高い条件を、翌日の取引条件に採用する。

今回は途中経過のまとめ

今までは移動範囲 MR を利用してエントリを抑制しましたが、今回からクロス・シグナル時の短周期移動平均 MA1 の傾きが、しきい値 THRESHOLD_SLOPE を超えた場合、つまり MA1 の変動が一定以上大きければエントリするようにロジックを変更しました。

MA1 の傾きといっても具体的な角度や係数を算出せず、PERIOD_SLOPE で設定した数の直近株価の変動差分の平均値を「傾きの大きさ」として代用しています。これは計算負荷を減らすためにです。

しきい値 THRESHOLD_SLOPE を決めるためにいくつかのティックデータであれこれ試したところで、どの程度に設定すべきかの結論は出そうにありません。だからといって実験パラメータに入れてしまうと結果が出るまでに何日もかかってしまいます。

少しずつ結果を解析したいので、手間はかかりますが、しきい値 THRESHOLD_SLOPE を小さな値から少しずつ大きくして MA1MA2 の周期の組み合わせ実験(シミュレーション)を実施した結果から、妥当と思われるしきい値を決めることにしました。そのため、しばらくは途中経過のまとめを続けることにします。

しきい値 THRESHOLD_SLOPE = 0.1, 0.5 についてはシミュレーションの実験が終わり、THRESHOLD_SLOPE = 1.0 の実験を実施中です。

現在の感触では THRESHOLD_SLOPE をもっと大きくできると見ていますが、シミュレーションの結果、つまりデータにもとづいて結論を導きたいので、現在のところは THRESHOLD_SLOPE = 0.5 の結果についてまとめました。

全体の傾向

実験は 1 日のティックデータについて実験水準の組み合わせ 17 × 17 = 289 条件あり、これに過去のティックデータの日数分をかけたデータがあります。まずは条件に依らずざっくりとした損益と取引回数の全体傾向を確認しました。

損益分布

現在の実験領域は、残念ながら収益分布のピークがマイナス側になっています。

全体の損益分布

取引回数分布

MA1 の変動が一定以上大きいときにエントリするロジックで、取引回数上限に設定している 100 回に達している条件が一定数あるということは、しきい値を大きくできる余地があることを示しています。

全体の取引回数分布

取引回数 vs. 損益

ざっくり全体を眺めると、取引回数が増えれば収益が減っています。しきい値を大きくして取引回数を減らす方針は今のところ問題が無さそうだと判断できます。

取引回数 vs. 損益の散布図

最大・最小収益

実験範囲で収益が最大・最小だったティックデータと条件です。

最高収益
                     file  code  trade  total  PERIOD_MA_1  PERIOD_MA_2
9638  ticks_20251007.xlsx  7011     41  369.0          190          550

最低収益
                      file  code  trade  total  PERIOD_MA_1  PERIOD_MA_2
14481  ticks_20251031.xlsx  7011    100 -246.0          170          350

実験条件別の平均損益トレンド

前営業日までを集計した平均損益でトップ 5 の条件は色を変えてプロットしています。一方、平均損益がマイナスになっている条件は黒の実線、その他は薄墨色でプロットしています。

なお、母数が少ないうちは変動が大きいので、キリが良い 2025-09-01 からの平均損益をチャートにしています。

※ 益はプラス、損はマイナスです、念の為。😁

実験条件別の平均損益トレンド(データは前営業日まで)
平均損益トップ 5 の条件
  PERIOD_MA_1 PERIOD_MA_2 取引回数 平均損益 2025-12-30
81 160 500 58.087912 6.329670 -35.000000
15 180 300 84.615385 6.307692 -13.000000
16 190 300 93.032967 5.879121 -8.000000
99 170 550 54.054945 5.769231 -20.000000
82 170 500 57.780220 5.615385 -28.000000

実験条件別のメジアン損益トレンド

平均損益の時と同じように、当日のメジアンを算出するには起点の 2025-08-19 から当日までのデータのメジアンを算出しています。

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

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

メジアン損益トップ 10 の条件
  PERIOD_MA_1 PERIOD_MA_2 取引回数 メジアン損益 2025-12-30
16 190 300 95.000000 5.000000 -8.000000
15 180 300 84.000000 5.000000 -13.000000
33 190 350 80.000000 3.000000 -7.000000
228 100 950 43.000000 3.000000 15.000000
245 100 1000 41.000000 2.000000 20.000000
63 150 450 56.000000 1.000000 -9.000000
28 140 350 71.000000 1.000000 -40.000000
197 130 850 43.000000 1.000000 -4.000000
263 110 1050 39.000000 1.000000 20.000000
12 150 300 73.000000 0.000000 -13.000000

等高線図 (Contour Map)

過去のティックデータを補完した等高線図を参考に作成しています。実験点は 平均損益トップ 5 の条件は 🟢(ただし、トップ 5 を大きく、他を小さくしています)、平均損益がマイナスになった条件があれば で表示しています。

実験条件範囲の等高線図(データは前営業日まで)

次回使用する条件(パラメータ)

次回のリアルタイムの取引シミュレーション (Simulated Trade) に使用する条件は、平均損益とメジアン損益から勘案してトップに準ずる条件を採用します(下記)。

次回のパラメータ
パラメータ 設定値
PERIOD_MA_1 180 sec
PERIOD_MA_2 300 sec
PERIOD_SLOPE 5 sec
THRESHOLD_SLOPE 0.5 -
LOSSCUT_1 -25

参考サイト

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

コメントを投稿