2026-01-08

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

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

今日の日経平均株価

現在値 51,117.26 -844.72 -1.63% 15:30
前日終値 51,961.98 01/07 高値 51,866.19 09:00
始値 51,769.83 09:00 安値 51,052.83 15:23

※ 右の 15 分足チャートは Yahoo! Finance のデータを yfinance で取得して作成しました。

【関連ニュース】

デイトレ用自作アプリ

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

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

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

リアルタイムの取引シミュレーション (7011)

本日のパラメータ
パラメータ 設定値
PERIOD_WARMUP 180 sec
PERIOD_MA_1 60 sec
PERIOD_MA_2 900 sec
PERIOD_SLOPE 5 sec
THRESHOLD_SLOPE 0.08 -
LOSSCUT_1 -25

従来、寄り付き直後のウォームアップ期間を 60 秒に設定していましたが、値動きが激しくて短周期の移動平均線 MA1 が追いついていないので、ウォームアップ期間をパラメータ化して暫定的に 180 秒にしました。また、長周期の移動平均線 MA2900 秒にしてみました。

短周期の移動平均線 MA1 の傾きを算出する処理を変更したので、昨日のティックデータで試してみて、とりあえず 0.08 にしました。

以下は、本日のリアルタイム取引シミュレーション (Simulated Trade) による取引結果です。


本日のリアルタイムの取引シミュレーション (Simulated Trade)

本日のリアルタイムの取引シミュレーション (Simulated Trade) の取引明細(100 株単位)

注文番号 注文日時 銘柄コード 売買 約定単価 約定数量 損益 備考
1 2026-01-08 09:04:48 7011 売建 4278.0 100
2 2026-01-08 09:05:29 7011 買埋 4283.0 100 -500.0
3 2026-01-08 09:13:40 7011 売建 4280.0 100
4 2026-01-08 09:22:05 7011 買埋 4284.0 100 -400.0
5 2026-01-08 09:22:06 7011 買建 4284.0 100
6 2026-01-08 09:24:03 7011 売埋 4279.0 100 -500.0
7 2026-01-08 09:24:04 7011 売建 4279.0 100
8 2026-01-08 09:26:49 7011 買埋 4280.0 100 -100.0
9 2026-01-08 09:26:50 7011 買建 4280.0 100
10 2026-01-08 09:29:11 7011 売埋 4270.0 100 -1000.0
11 2026-01-08 09:29:12 7011 売建 4270.0 100
12 2026-01-08 09:30:34 7011 買埋 4276.0 100 -600.0
13 2026-01-08 09:30:35 7011 買建 4279.0 100
14 2026-01-08 09:44:51 7011 売埋 4287.0 100 800.0
15 2026-01-08 09:44:59 7011 買建 4294.0 100
16 2026-01-08 09:45:14 7011 売埋 4286.0 100 -800.0
17 2026-01-08 10:19:35 7011 買建 4267.0 100
18 2026-01-08 10:20:44 7011 売埋 4258.0 100 -900.0
19 2026-01-08 10:20:45 7011 売建 4258.0 100
20 2026-01-08 10:32:34 7011 買埋 4244.0 100 1400.0
21 2026-01-08 11:05:49 7011 買建 4252.0 100
22 2026-01-08 11:10:41 7011 売埋 4247.0 100 -500.0
23 2026-01-08 11:13:10 7011 売建 4247.0 100
24 2026-01-08 12:42:00 7011 買埋 4228.0 100 1900.0
25 2026-01-08 12:42:01 7011 買建 4230.0 100
26 2026-01-08 12:45:08 7011 売埋 4220.0 100 -1000.0
27 2026-01-08 12:45:09 7011 売建 4221.0 100
28 2026-01-08 12:49:35 7011 買埋 4231.0 100 -1000.0
29 2026-01-08 12:49:36 7011 買建 4232.0 100
30 2026-01-08 13:03:58 7011 売埋 4243.0 100 1100.0
31 2026-01-08 14:28:13 7011 売建 4263.0 100
32 2026-01-08 14:41:01 7011 買埋 4267.0 100 -400.0
33 2026-01-08 15:14:24 7011 買建 4258.0 100
34 2026-01-08 15:24:50 7011 売埋 4265.0 100 700.0
合計損益 -1800.0

オフラインの取引シミュレーション (7011)

本日収集したティックデータによる事後シミュレーションをまとめました。

本日の事後の取引シミュレーションの取引明細(100 株単位)

注文番号 注文日時 銘柄コード 売買 約定単価 約定数量 損益 備考
1 2026-01-08 09:04:48 7011 売建 4278 100
2 2026-01-08 09:05:29 7011 買埋 4283 100 -500
3 2026-01-08 09:13:40 7011 売建 4280 100
4 2026-01-08 09:22:05 7011 買埋 4284 100 -400
5 2026-01-08 09:22:06 7011 買建 4284 100
6 2026-01-08 09:24:03 7011 売埋 4279 100 -500
7 2026-01-08 09:24:04 7011 売建 4279 100
8 2026-01-08 09:26:49 7011 買埋 4280 100 -100
9 2026-01-08 09:26:50 7011 買建 4280 100
10 2026-01-08 09:29:11 7011 売埋 4270 100 -1000
11 2026-01-08 09:29:12 7011 売建 4270 100
12 2026-01-08 09:30:34 7011 買埋 4276 100 -600
13 2026-01-08 09:30:35 7011 買建 4279 100
14 2026-01-08 09:44:51 7011 売埋 4287 100 800
15 2026-01-08 09:44:59 7011 買建 4294 100
16 2026-01-08 09:45:14 7011 売埋 4286 100 -800
17 2026-01-08 10:19:35 7011 買建 4267 100
18 2026-01-08 10:20:44 7011 売埋 4258 100 -900
19 2026-01-08 10:20:45 7011 売建 4258 100
20 2026-01-08 10:32:34 7011 買埋 4244 100 1400
21 2026-01-08 11:05:49 7011 買建 4252 100
22 2026-01-08 11:10:41 7011 売埋 4247 100 -500
23 2026-01-08 11:13:10 7011 売建 4247 100
24 2026-01-08 12:42:00 7011 買埋 4228 100 1900
25 2026-01-08 12:42:01 7011 買建 4230 100
26 2026-01-08 12:45:08 7011 売埋 4220 100 -1000
27 2026-01-08 12:45:09 7011 売建 4221 100
28 2026-01-08 12:49:35 7011 買埋 4231 100 -1000
29 2026-01-08 12:49:36 7011 買建 4232 100
30 2026-01-08 13:03:58 7011 売埋 4243 100 1100
31 2026-01-08 14:28:13 7011 売建 4263 100
32 2026-01-08 14:41:01 7011 買埋 4267 100 -400
33 2026-01-08 15:14:24 7011 買建 4258 100
34 2026-01-08 15:24:49 7011 売埋 4265 100 700
合計損益 -1800

リアルタイムのシミュレーションの取引明細とざっと比較したところ、今回も一致しています。

テクニカル指標の時系列トレンド

環境内で管理している、売買シグナルのソースとなるテクニカル指標と含み損益のトレンドをプロットしました。

縦の赤線は、取引明細の時間から入れたもので、売買をしたタイミングになります。

移動平均系テクニカル指標の時系列トレンドと含み損益

移動平均線 MA1 の傾き

今回から移動平均線 MA1 の傾き(絶対値)の算出方法を変更したので、MA1 の全ポイントの傾き(絶対値)の分布を確認しました。さらに、クロス・シグナル時の傾きの明細も調べる必要がありそうです。

値動きが激しく、頻繁なクロスシグナルが発生する場合のエントリ抑制は他の指標で対応することを検討します。

移動平均線 MA1 の傾き(絶対値)分布

RollingRange の評価

寄り付き直後の値動きの変動がある程度落ち着いた時期を検出できるような指標がないか Microsoft Copilot に相談したところ、いくつか提案してくれました。その中で下記の RollingRange なるものが良さげだったので評価を始めています。

今のところ RollingRange は環境内の観測値として保持しているだけで、売買判定あるいは抑制につながるようなアクションをしていません。

class RollingRange:
    def __init__(self, window_size: int):
        self.window_size = window_size
        self.prices = deque(maxlen=window_size)
        self.current_range = 0.0
        self.current_high = None
        self.current_low = None

    def clear(self):
        self.prices.clear()
        self.current_range = 0.0
        self.current_high = None
        self.current_low = None

    def update(self, price: float) -> float:
        self.prices.append(price)

        # high/low を更新
        if self.current_high is None:
            # 初回
            self.current_high = price
            self.current_low = price
        else:
            # 新規値で更新
            self.current_high = max(self.current_high, price)
            self.current_low = min(self.current_low, price)

        # deque が満杯になったとき、古い値が抜けるので high/low を再計算
        if len(self.prices) == self.window_size:
            oldest = self.prices[0]
            if oldest == self.current_high or oldest == self.current_low:
                # high/low が抜けたので再計算
                self.current_high = max(self.prices)
                self.current_low = min(self.prices)

        self.current_range = self.current_high - self.current_low
        return self.current_range

    def getValue(self) -> float:
        return self.current_range

昨年までとりあえずの指標として採用していた移動範囲 MR と RollingRange との違いを Copilot に整理してもらいました。

MR と RollingRange の違い
指 標 何を測る? トレンド時 レンジ時 特 徴
MR 1 ステップの揺れ 小さい 大きい micro-volatility
RollingRange 区間全体の値幅 大きい 小さい macro-volatility(フェーズ判定向き)

本日取得したティックデータで Rooling Range を算出し、分布をプロットしました。Rooling Range が大きいところではエントリを抑制するというアプローチでうまくいくかもしれません。

Rolling Range の分布

RollingRange を日本語でどう呼ぶのが適切かを Copilot に尋ねたところ「移動値幅」を推してきました。う〜ん、不採用かな。

売買ロジックへのインプット

売買ロジックは Maskable PPO 互換のインターフェイスを持った自作のアルゴリズムを備えた疑似モデルです。

なるべくシンプルなロジックで売買判断できることを目指しているため、現在のところ、[0, 1] あるいは [-1, 0, 1] といった離散的なシグナルをインプットするようにしています。

シグナル名は短縮してしまって意味が判りにくいので、それぞれの機能をまとめました。

  1. クロスS1
    • 移動平均 MA1, MA2 のクロスシグナル。デッドクロス、クロス無し、ゴールデンクロスを -1, 0, 1 としたシグナル。
  2. クロスS2
    • クロスS1の 1 秒遅れのシグナル。反対売買用。
  3. クロ強
    • MA1 の傾き(絶対値)が THRESHOLD_SLOPE より大きい場合に発生するクロス・シグナルの強さを示すシグナル。
  4. ロス1
    • 含み損益が LOSSCUT_1 を下回った時に発生するシグナル。
  5. 建玉
    • ポジション SHORT, NONE, LONG-1, 0, 1 としたシグナル。
売買ロジックにインプットしているシグナル

参考サイト

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

コメントを投稿