2026-04-13

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

楽天証券の口座でデイトレの自動売買に挑戦しようと、Windows / Excel 上で動作する マーケットスピード II RSS を利用した Python アプリ (Kabuto) を開発しています。今月は、来るゴールデン・ウィークに存分に強化学習モデルのバックテストができるように準備を進めています。

今日の日経平均株価

現在値 56,502.77 -421.34 -0.74% 15:45
前日終値 56,924.11 04/10 高値 56,765.72 09:18
始値 56,421.46 09:00 安値 56,232.78 13:07

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

【関連ニュース】

強化学習の沼

月末から始まるゴールデンウィークにゆっくりバックテストができそうなので、それまでにどれだけ強化学習モデルを育てられるかに挑んでみることにしました。

コンソール上で実行できる学習・推論用のプログラムを用意してパフォーマンスを評価しています。

エージェント

学習用のエージェントは、学習環境 TrainingEnv のインスタンスに、Stable-Baselines3 の環境ラッパーを適用しています。

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

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

VecNormalize は、観測 (obs) と報酬 (reward) に対して、Welford’s algorithm のオンライン平均・分散更新を利用して標準化を行うラッパーです。

リアルタイムで収集する株価のティックデータで推論することを考えると、予めデータのレンジが判らないので、観測値を自前で下手なスケーリングをするよりも標準化専用のラッパーを利用した方が安全と考えて、このラッパーを採用しています。

Microsoft Copilot に VecNormalize ラッパーの使用例を示してもらいました。

from stable_baselines3 import PPO
from stable_baselines3.common.env_util import make_vec_env
from stable_baselines3.common.vec_env import VecNormalize

env = make_vec_env("Pendulum-v1", n_envs=4)
env = VecNormalize(env, norm_obs=True, norm_reward=True, clip_obs=10.0)
model = PPO("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=200_000)
# 保存
env.save("vecnormalize.pkl")
model.save("ppo_model")
from stable_baselines3.common.env_util import make_vec_env
from stable_baselines3.common.vec_env import VecNormalize

# ベース環境は再作成する(事前に VecNormalize で包まない)
env = make_vec_env("Pendulum-v1", n_envs=1)
# 保存した統計を読み込むと VecNormalize が内部でラップする
env = VecNormalize.load("vecnormalize.pkl", env)
# 推論では統計を更新しない、報酬の標準化は無効にすることが多い
env.training = False
env.norm_reward = False

モデル(アルゴリズム)

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

学習環境 TrainingEnv(gymnasium.Env)

学習環境の概略です。今まで、株価や移動平均をそのまま観測値にしていましたが、始値との差に変更しました。

行動空間 Action Space
  1. HOLD : 何もしない
  2. BUY  : 「買建」または「返済」
  3. SELL : 「売建」または「返済」
「返済」は環境側で制御、またナンピン禁止を行動マスクで制御
PositionType に対する mask [HOLD, BUY, SELL]
  • WARMUP [True, False, False]
  • NONE   [True, True,  True ]
  • LONG   [True, False, True ]
  • SHORT  [True, True,  False]
観測空間 Observation Space
株価、指数など [-inf, +inf]
  1. Price - price0 : 株価 - 始値
  2. MA1 - price0   : 短周期の移動平均 - 始値
  3. DiffVWAP       : 乖離率 = (MA1 - VWAP) / VWAP
  4. Profit         : 含み損益
カウンタ関連 [0, +inf]
  1. n_trade        : 約定回数
  2. count_negative : 含み損の継続カウンタ
ポジションを One-Hot エンコーディング
  1. SHORT [1. 0. 0.]
  2. NONE  [0. 1. 0.]
  3. LONG  [0. 0. 1.]
報酬 Rewards
  • 建玉なし   : 報酬なし
  • 建玉保持   : 含み損益の一定割合を付与
  • 買建時     : -DiffVWAP を付与
  • 売建時     : +DiffVWAP を付与
  • 返済時     : 直前の含み損益を付与
  • 約定コスト : 建玉、返済時いずれも固定の約定コストを引く
  • 連続含み損 : 許容回数を超えたらペナルティを急激に増大
終了条件 Episode End
  1. terminated
    • "目的を達成した/失敗した" など、エージェント側の原因で終了
    • 終端として扱う(価値は 0)
    1. なし(「約定回数の上限で終了」を評価予定)
  2. truncated
    • 時間制限・ステップ制限・データ終端など “外的理由” で終了
    • 終端ではない(価値を bootstrap)
    1. ティックデータが最終行に達した時
      • 終了時、建玉があれば強制返済。報酬条件、約定コストは同じ

2 つの学習曲線

前日 4/10(橙色)と本日 4/11(水色)のティックデータでそれぞれ 100 エピソード学習させて、その報酬トレンドと収益トレンド、約定回数のトレンドを TensorBoard に表示するようにした結果です。

相関係数を算出せずに見た目だけの印象ですが、モデルへの報酬と(シミュレーション上の)収益の相関が低いのが課題です。ひきつづき試行錯誤を続けます。

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

推論

最後に学習にも使った本日 4/11 のティックデータで推論を実施していますが、以下のように建玉を保持したまま最後に強制返済されて終わるというパターンになります。まだ、収益を追求するための動機付けが足りません。ロスカットのしきい値を超えて付与されるペナルティによる影響だと思われるモデル報酬が激しくマイナスになっているのもよくわかりません。要調査です。💦

   注文番号                  注文日時 銘柄コード  売買  約定単価  約定数量    損益    備考
0     1 2026-04-13 09:14:14.803287029      9984   買建    3699.0         1     NaN      
1     2 2026-04-13 15:24:48.964755058      9984   売埋    3758.0         1    59.0    強制返済
モデル報酬 : -2.5860401193371397e+30,
損益 : 59.0 円, 約定係数 : 2 回

参考サイト

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

コメントを投稿