2026-04-08

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

楽天証券の口座でデイトレの自動売買に挑戦しようと、Windows / Excel 上で動作する マーケットスピード II RSS を利用した Python アプリ (Kabuto) を開発しています。未だ安心して自動売買できるレベルにまで到達していませんが、経験値を上げるため、セミオートでデイトレードを始めています。

今日の日経平均株価

現在値 56,308.42 +2,878.86 +5.39% 15:45
前日終値 53,429.56 04/07 高値 56,424.63 14:55
始値 54,386.65 09:00 安値 54,380.02 09:00

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

【関連ニュース】

デイトレ用自作アプリ

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

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

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

強化学習へ沼りに行く④

今日もひきつづき強化学習モデルの開発を優先して、デイトレはお休みです。

学習環境 TrainingEnv(gymnasium.Env)

学習環境の概略です。ひとつひとつ学習効果を確認したいので、現時点では超シンプルな観測空間や報酬の構成になっています。

行動空間 Action Space
  1. HOLD : 何もしない
  2. BUY  : 「買建」または「返済」
  3. SELL : 「売建」または「返済」
「返済」は環境側で制御、またナンピン禁止を行動マスクで制御
観測空間 Observation Space
  1. Price  : 株価
  2. Diff   : 乖離率 = (MA1 - VWAP) / VWAP
  3. Profit : 含み損益
ポジションを One-Hot エンコーディング
  1. SHORT [1. 0. 0.]
  2. NONE  [0. 1. 0.]
  3. LONG  [0. 0. 1.]
報酬 Rewards
  • 建玉なし   : 報酬なし
  • 建玉保持   : 含み損益の一定割合を付与
  • 買建時     : -Diff を付与
  • 売建時     : +Diff を付与
  • 返済時     : 直前の含み損益を付与
  • 約定コスト : 建玉、返済時いずれも固定の約定コストを引く
終了条件 Episode End
  1. terminated
    • "目的を達成した/失敗した" など、エージェント側の原因で終了
    • 終端として扱う(価値は 0)
    1. なし
  2. truncated
    • 時間制限・ステップ制限・データ終端など “外的理由” で終了
    • 終端ではない(価値を bootstrap)
    1. ティックデータが最終行に達した時
      • 終了時、建玉があれば強制返済。報酬条件、約定コストは同じ

エージェント

学習用のエージェントでは、学習環境 TrainingEnv のインスタンスに、Stable-Baselines3 の環境ラッパーを下記のように適用しています(本ブログで Mermaid を使えるようにしました)。

graph LR
    subgraph make_env
        A[TrainingEnv] --> B[[Monitor]]
    end
    B --> C[[DummyVecEnv]]
    C --> D[[VecNormalize]]

Monitor ラッパーを適用したのは、エピソードの終わりに報酬情報をログで取得するためです。

DummyVecEnv ラッパーで環境をベクトル化して VecNormalize ラッパーを適用しているのは、観測空間の特徴量のスケーリングを個別に(自力で)調節するのではなく、環境側に委ねたかったからです。

モデル(アルゴリズム)

デイトレの自動売買の設計では、ナンピン売買を禁止にしたかったので、建玉に応じて許容できる行動にマスクできる機能を持った MaskablePPO を利用しています。

報酬 vs. 損益

学習モデルの開発初期ですので、今のところ単一のティックファイル 20260401_9984.csv(4/1 の 9984 の 2 秒間隔のティックデータ)を何度も使いまわしながら、分析に必要な機能の追加をしています。

最初に確認したかったのがモデルに付与する報酬と、売買シミュレーションによる損益との関係です。

報酬と損益を 1 対 1 の関係にできれば良いのですが、モデルの売買行動を報酬(マイナスであればペナルティ)で誘導しているので、損益と完全に一致させることはできません。しかし、報酬を最大化することで損益も最大化するようにはできるはずです。

今日収集したティックデータから、ソフトバンクグループ (9984) について (20260408_9984.csv)、100 エピソード分学習させました。

TensorBoard でエピソード毎の報酬と、シミュレーション上の損益、約定回数のトレンドをカスタム表示できるようにしました。

100 エピソード分の学習における報酬、損益、約定回数トレンド

エピソード毎の詳細な報酬と損益データをログに残せるようにしたので、JupyterLab で集計してみました。下記は最後のエピソードの集計結果です。

エピソード 99 における報酬と損益

約定回数 (contract) が 62 回はちと多いですが、約定回数の制約を設定していない状況でここまで下がってきたのは上出来なのかもしれません。

それよりも、報酬の累積 Reward (cumsum) と累積損益は逆相関しているように見えることの方が問題です。少しは同じような傾向があることを期待していました。

現在の設定では含み損益の 1% を建玉を保持している時の報酬としてモデルに付与しているつもりなのですが、小さすぎるのか大きすぎるのか、あるいは計算間違い(バグ)があるのかを調べます。

参考サイト

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

0 件のコメント:

コメントを投稿