2025-06-22

自動売買への道 (2025-06-22)

(楽天証券の口座で取引する前提で)デイトレ自動売買を実現するには、Windows / Excel 上で マーケットスピード II RSS を利用することがまずは確実な方法だと考えました。そこで、Windows / Excel / VBA で自動売買のためのマクロを作ってリアルタイムの取引シミュレーションを始めており、Python で検証をしています。

現在の開発状況を更新しました。

フェーズ 開 始 状 況 目 的 成  果
Phase 1 2024-12-10 終了 実現可能性
(feasibility)
  • やっつけでコーディング ✓
  • 下記を実証 (PoC) ✓
    • ループ処理による単純シミュレーション
    • リアルタイム・シミュレーション (Dry Run)
Phase 2 2024-12-16 終了 マクロ再構成
  • 単一ワークシート上に機能集約 ✓
  • マクロを再構成 ✓
  • Phase 1 と同じ機能レベルまで実現 ✓
  • ベンチマーク計測を追加 ✓
Phase 3 2024-12-31 取りやめ 実装
  • 機能を複数ワークシート上に再配置 ✓
  • Dry Run 実施 ✓
  • 売買アルゴリズムの改良 ✓
  • Python シミュレータで評価 ✓
  • RSS による売買を、テスト用マクロで確認
Phase 4 2025-03-09 開発中 評価・実装
  • ティックデータへ Parabolic SAR を適用 ✓
    • VBA に実装(データ収集のみ、Dry Run 機能は未実装)
    • Python によるシミュレーション環境の整備
  • Python シミュレータで評価とパラメータ・チューニング ✓
    1. スムージング処理の追加
    2. エントリ条件の検討
    3. 利確条件の検討
    4. ロスカット条件の検討
Phase 5 2025-05-17 開発中 再評価・再実装
  • メイン・アプリを Python へ
    • アプリの作り直し
      • xlwings パッケージの評価
      • PyQtGraph パッケージの評価
      • リアルタイムに対応させるためのスレッド化
      • RealtimePSAR クラスの改良
      • 楽天証券との実取引のサンプルワーク
  • リアルタイムデータ収集アプリ作成
    • 取引アプリは同時 3 銘柄のモニターに固定し、これとは別に 20 銘柄程度、リアルタイムデータ収集に特化したアプリを用意して、デイトレ銘柄の選定の分析に使えるようにしたいと思って作り始めました。
Phase 6 2025-07-?? 未着手 本運用
  • ...

Python で作っている自作のデイトレアプリで、ゆくゆくは自動売買に挑戦するために取り組んでいます。しかし自動売買実現までの道のりは長いので、まずはセミオート操作で売買ができるように進めています。以下は株価などの情報の流れを示しています。

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

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

リアルタイムデータ向け Parabolic SAR(RealtimePSAR クラス)の改良

6/16 の週は自作アプリで取引シュミレーションを続けましたが、特に最初のエントリ部分で損失を重ねて、トレーディング・センスの無さを晒け出してしまいました。😮‍💨

センスが無いことは重々自覚しています。鋼のような揺るがない精神力を持てるよう精進して、設定したルール通りにトレードできる優秀なトレーダーを目指すつもりは毛頭ありません。その代わり、センスの無さを排除できる自動取引アルゴリズムを作ろうとしています。

ということで、面倒そうなので後回しにしていましたが、最初のエントリを自動化することこそが最優先事項だと考え直し、この週末は RealtimePSAR クラスの改良に取り組みました。

方針は、ベストなエントリ・ポイントを探ることではなく、寄り付き後にそこそこ妥当なトレンド方向を示して、それに従ってそこそこまともな取引をすることです。完璧な目標を設定すると計画倒れに終わる可能性があるので、実現できそうなところから始めました。😅

Google Gemini との作業

いままで使用してきた Parabolic SAR のクラスは、参考サイト [7] で紹介したものとほぼ同じアルゴリズムです。最初のトレンドはとりあえず最初の 2 点の株価の大小で決めてしまっています。

最近は Google Gemini(以降、単に Gemini)と一緒にコーディングをすることが多くなり、便利過ぎて手放せなくなってしまいました。もちろん、今回も手伝ってもらっています。

この RealtimePSAR クラスを Gemini と共有すると、ご丁寧にも最初のトレンド判定は敏感過ぎるとアドバイスをしてくれます(ちょっとムッとしますが、ここは堪えます)。それでは、ロバストな判定をするためにはどうすれば良いかと尋ねると、下記のような提案とサンプルコードまで示してくれました。

  1. 移動平均線 (Moving Average) の利用
  2. リニア回帰 (Linear Regression) の傾き
  3. ボリンジャーバンド (Bollinger Bands) や標準偏差の利用
  4. 高値・安値の更新パターン

もっともらしい提案だったので、少しは付き合ってもいいかなと心が動きましたが、たぶん時間の無駄になります。そこで、いままで温めていた案をぶつけることにしました。それは多数決のアルゴリズムです。

少ない点でそこそこ妥当なトレンドを決めるのに、線形的なアプローチは要らないと考えました。寄り付き後の最低 30 秒(= 30 点)をトレンド決定のために使うと決めて、長い長い Gemini との議論と Jupyter Lab での検証作業が始まりました。

多数決アルゴリズムを加えた Parabolic SAR

長い長い議論を経て、使えそうな多数決アルゴリズムにたどり着くことができたので、改良した RealtimePSAR クラスについて Gemini に要約してもらいました。少し文章を編集して掲載しています。

RealtimePSAR クラスの主要な特徴

この RealtimePSAR クラスは、Parabolic SAR (PSAR) をリアルタイムのティックデータに適用し、特に寄り付き直後の初期トレンド決定に焦点を当てています。その特徴は以下の通りです。

リアルタイムデータ処理:

add(price: float) メソッドを通じて、新しい価格ティックが、リアルタイムにほぼ等間隔(約 1 秒)で追加されることを前提として設計されています。内部で PSARObject を管理し、トレンド、EP (Extreme Point)、AF (Acceleration Factor)、PSAR 値などをティックごとに更新します。

初期トレンド多数決ロジック:

判定基準:

寄り付き直後の PSAR の初期トレンドを決定するために、decide_first_trend メソッドに多数決ロジックを実装しています。このロジックは、期間内の各価格が最新の価格に対して高いか低いかを基準に投票を行います。

  • p < price ならば「低い票」としてカウントします。
  • price < p ならば「高い票」としてカウントします。
  • p == price の場合は投票に含めません。

トレンドの解釈:

低いデータが多い場合(「低い票」が優勢)は上昇トレンド、高いデータが多い場合(「高い票」が優勢)は下降トレンド」と判断します。これは、過去の価格分布から現在の価格がどの方向へ推移してきたかを捉えるものです。

固定長データ期間:

多数決の評価には collections.deque を使用し、固定長の n ティック分(デフォルトは 30 ティック)の価格データを効率的に保持・利用します。これによりデータ管理が最適化されています。

多数決の閾値:

トレンドを決定するためには、特定方向の票数(「低い票」または「高い票」)が投票総数の 2/3(約66.6%)を超える必要があります。

PSAREP の初期値設定:

初期トレンドが決定されると、PSAR の初期値は決定されたトレンドと反対方向の収集期間内の極値に、EP は決定されたトレンド方向の収集期間内の極値に設定されます。これにより、PSAR が価格から適度に離れた位置から始まり、寄り付き直後のノイズによる急激な反転を抑制し、安定した追従を促します。

未決定時の挙動:

固定長の n ティックのデータが揃っていない場合、または多数決の閾値を満たすほど明確なトレンドが見られない場合は、トレンドを決定せず obj.trend0 のままとなります。この場合、PSAR は表示されません。

最初のエントリの比較

金曜日の 7011 について、寄り付きから 20 分間のトレンドを、改修前後の RealtimePSAR クラスで比較しました。ほんの些細ま差です。しかし、これによって自動化の道が少し開けてきました。

従来の RealtimePSAR クラスの場合
多数決ロジックを追加した RealtimePSAR クラスの場合

多数決を取るデータ数や多数決を採る 2:1 の閾値は、えいやっで決めていますので、しばらく使ってみて良さげであれば、最適条件の探索を検討したいです。

これから、アプリの GUI の変更に取りかかります。明日、東京市場が始まるまでにどこまでできるか…。

参考サイト

  1. マーケットスピード II RSS | 楽天証券のトレーディングツール
  2. マーケットスピード II RSS 関数マニュアル
  3. PythonでGUIを設計 | Qtの公式Pythonバインディング
  4. PyQtGraph - Scientific Graphics and GUI Library for Python
  5. Python in Excel alternative: Open. Self-hosted. No limits.
  6. Book - xlwings Documentation
  7. 私の株日記: Realtime Parabolic SAR
にほんブログ村 株ブログ 株日記へ
PVアクセスランキング にほんブログ村

0 件のコメント:

コメントを投稿