楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用して Python であれこれ取り組んでいます。この「自動売買への道」のトピックでは、プログラミングの話題にも踏み込んで、日々の活動をまとめています。
デイトレ用自作アプリ
以下は株価・取引に関連する情報の流れを示しています。
楽天証券では、Python からネットワーク越しに直接取引できるような API が提供されていないので、マーケットスピード II RSS を介して取引をする構成を取っています。
取引シミュレーション
強化学習モデルのチューニング作業の優先順位を下げ、テクニカル指標のシグナルでの取引シミュレーションをしています。
制約条件
現在シミュレーションで設定している制約は下記のとおりです。
- 売買条件
- ポジションを解消してから次の売買をする(ナンピン禁止)。
- 取引回数
- 上限を 100 回に制限
- 約定条件
- スリッページなし
売買判断のためにフラグ化したインプット情報(特徴量)
現在利用しているインプット情報は下記のとおりです。
- 2つの移動平均 MA1(短周期)と MA2(長周期)のクロス・シグナル
- [-1 (dead), 0, 1 (golden)]
- クロス・シグナルで売買(エントリとエグジット)
- 1 秒遅れのクロス・シグナル
- [-1 (dead), 0, 1 (golden)]
- 1 秒後に反対売買できるようにするためのシグナル。
- MA1 と MA2 がクロスした時の MA1 の傾き
- [0, 1]
- クロス・シグナルの強度の指標。建玉無しで、しきい値より大きい時はフラグを立ててエントリする。
- 1 秒遅れのクロスシグナルに対しては、強度を再算出。
- ロスカット
- [0, 1]
- しきい値以下になったらフラグを立てて建玉を返済、損切り。
- ポジション
- [-1 (SHORT), 0 (NONE), 1 (LONG)]
- ポジションの状態
現在のところ、売買アルゴリズムを定義したモデルを使用していますが、将来的に強化学習モデル(候補は MaskablePPO)に置き換えられるように設計しています。
強化モデルの設計方針は、多くの情報を闇雲にインプットしてモデルをブラックボックス化してしまうことを避けることです。そのため特徴量エンジニアリングの経験をもっと積むために、現在は離散化(フラグ化)した情報だけで、どこまで売買ロジックを組み立てられるかを、自分が作成したアルゴリズム、すなわち、学習をしない、ハード・コーディングしたモデルで評価しています。
まずはこのアルゴリズムで、そこそこ稼げる自動売買実現を目指し、その上で強化学習のモデル開発に取り組みます。
取引シミュレーションと実験
下記に実験条件の概略をまとめました。
| データ | 約 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 | MA1 と MA2 がクロスした時の MA1 の傾き。クロス・シグナル時、MA1 の直前数秒の変化量の平均値を、傾きの代替量として使用しているため、その秒数をパラメータに設定。 | |||||||||||||||||
| THRESHOLD_SLOPE | - | 0.5 | ||||||||||||||||||
| LOSSCUT_1 | 円/株 | -25 | このぐらいになるとプラテンしないと思われる単純なロスカット閾値(暫定値)。 | |||||||||||||||||
| 実験計画 | 完全実施要因計画 (Full Factorial Design) | |||||||||||||||||||
| 評価特性 | 説 明 | |||||||||||||||||||
| 損 益 [total] | 円/株 | 収集したティックデータ(1 日分)で売買シミュレーションを実施した損益。 | ||||||||||||||||||
| 取引回数 [trade] | 回 | 取引回数の上限を 100 回に設定。【参考値】 | ||||||||||||||||||
| 最適条件 判定方法 |
|
|||||||||||||||||||
今回は途中経過のまとめ
今までは移動範囲 MR を利用してエントリを抑制しましたが、今回からクロス・シグナル時の短周期移動平均 MA1 の傾きが、しきい値 THRESHOLD_SLOPE を超えた場合、つまり MA1 の変動が一定以上大きければエントリするようにロジックを変更しました。
MA1 の傾きといっても具体的な角度や係数を算出せず、PERIOD_SLOPE で設定した数の直近株価の変動差分の平均値を「傾きの大きさ」として代用しています。これは計算負荷を減らすためにです。
しきい値 THRESHOLD_SLOPE を決めるためにいくつかのティックデータであれこれ試したところで、どの程度に設定すべきかの結論は出そうにありません。だからといって実験パラメータに入れてしまうと結果が出るまでに何日もかかってしまいます。
少しずつ結果を解析したいので、手間はかかりますが、しきい値 THRESHOLD_SLOPE を小さな値から少しずつ大きくして MA1 と MA2 の周期の組み合わせ実験(シミュレーション)を実施した結果から、妥当と思われるしきい値を決めることにしました。そのため、しばらくは途中経過のまとめを続けることにします。
しきい値 THRESHOLD_SLOPE = 0.1, 0.5 についてはシミュレーションの実験が終わり、THRESHOLD_SLOPE = 1.0 の実験を実施中です。
現在の感触では THRESHOLD_SLOPE をもっと大きくできると見ていますが、シミュレーションの結果、つまりデータにもとづいて結論を導きたいので、現在のところは THRESHOLD_SLOPE = 0.5 の結果についてまとめました。
全体の傾向
実験は 1 日のティックデータについて実験水準の組み合わせ 17 × 17 = 289 条件あり、これに過去のティックデータの日数分をかけたデータがあります。まずは条件に依らずざっくりとした損益と取引回数の全体傾向を確認しました。
損益分布
現在の実験領域は、残念ながら収益分布のピークがマイナス側になっています。
取引回数分布
MA1 の変動が一定以上大きいときにエントリするロジックで、取引回数上限に設定している 100 回に達している条件が一定数あるということは、しきい値を大きくできる余地があることを示しています。
取引回数 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 からの平均損益をチャートにしています。
※ 益はプラス、損はマイナスです、念の為。😁
| 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 から当日までのデータのメジアンを算出しています。
メジアンで集計した損益のランキングも、平均損益と同様に作成しました。
| 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 | 円 |
参考サイト
- マーケットスピード 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 件のコメント:
コメントを投稿