楽天証券の口座でデイトレの自動売買に挑戦しようと、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 で取得して作成しました。
【関連ニュース】
- 米CPI、3月は前月比で2022年以来の大幅な伸び-コアは予想下回る - Bloomberg [2026-04-10]
- 米消費者マインド指数、過去最低に低下-インフレ懸念強まる - Bloomberg [2026-04-10]
- 米製造業新規受注、2月は横ばい 航空機需要が急減 | ロイター [2026-04-11]
- 【欧州市況】株上昇、ウクライナでの和平合意進展を好感-国債は下落 - Bloomberg [2026-04-11]
- 【米国市況】S&P500が小反落、和平協議を警戒-CPI受け序盤は堅調 - Bloomberg [2026-04-11]
- 米国株式市場=まちまち、中東交渉控え様子見 ハイテクは高い | ロイター [2026-04-11]
- ソフトバンクが国産AIの新会社設立、NECやホンダなど8社出資 - 日本経済新聞 [2026-04-12]
- 米国とイラン、戦争終結に向けた合意に至らず-週明けの市場注目 - Bloomberg [2026-04-12]
- クレジット市場をけん引するAI関連債-地政学的逆風でも需要衰えず - Bloomberg [2026-04-12]
- トランプ氏、ホルムズ海峡の海上封鎖表明-協議頓挫で緊張高まる - Bloomberg [2026-04-13]
- 中国保険最大手、ソフトウエアに特化したPE資産10億ドルの売却目指す - Bloomberg [2026-04-13]
- 植田日銀総裁、中東情勢の影響注視して見通し実現確度やリスクを点検 - Bloomberg [2026-04-13]
- 日経平均は反落、米・イラン協議不調で揺り戻し | ロイター [2026-04-13]
- 【日本市況】長期金利一時29年ぶり高水準、中東懸念で株式と円も下落 - Bloomberg [2026-04-13]
強化学習の沼
月末から始まるゴールデンウィークにゆっくりバックテストができそうなので、それまでにどれだけ強化学習モデルを育てられるかに挑んでみることにしました。
コンソール上で実行できる学習・推論用のプログラムを用意してパフォーマンスを評価しています。
エージェント
学習用のエージェントは、学習環境 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 のオンライン平均・分散更新を利用して標準化を行うラッパーです。
リアルタイムで収集する株価のティックデータで推論することを考えると、予めデータのレンジが判らないので、観測値を自前で下手なスケーリングをするよりも標準化専用のラッパーを利用した方が安全と考えて、このラッパーを採用しています。
- Monitor Wrapper — Stable Baselines3 documentation
- Vectorized Environments — Stable Baselines3 documentation
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
- HOLD : 何もしない
- BUY : 「買建」または「返済」
- 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]
- Price - price0 : 株価 - 始値
- MA1 - price0 : 短周期の移動平均 - 始値
- DiffVWAP : 乖離率 = (MA1 - VWAP) / VWAP
- Profit : 含み損益
- カウンタ関連 [0, +inf]
- n_trade : 約定回数
- count_negative : 含み損の継続カウンタ
- ポジションを One-Hot エンコーディング
- SHORT [1. 0. 0.]
- NONE [0. 1. 0.]
- LONG [0. 0. 1.]
- 報酬 Rewards
- 建玉なし : 報酬なし
- 建玉保持 : 含み損益の一定割合を付与
- 買建時 : -DiffVWAP を付与
- 売建時 : +DiffVWAP を付与
- 返済時 : 直前の含み損益を付与
- 約定コスト : 建玉、返済時いずれも固定の約定コストを引く
- 連続含み損 : 許容回数を超えたらペナルティを急激に増大
- 終了条件 Episode End
- terminated
- "目的を達成した/失敗した" など、エージェント側の原因で終了
- 終端として扱う(価値は 0)
- なし(「約定回数の上限で終了」を評価予定)
- truncated
- 時間制限・ステップ制限・データ終端など “外的理由” で終了
- 終端ではない(価値を bootstrap)
- ティックデータが最終行に達した時
- 終了時、建玉があれば強制返済。報酬条件、約定コストは同じ
2 つの学習曲線
前日 4/10(橙色)と本日 4/11(水色)のティックデータでそれぞれ 100 エピソード学習させて、その報酬トレンドと収益トレンド、約定回数のトレンドを TensorBoard に表示するようにした結果です。
相関係数を算出せずに見た目だけの印象ですが、モデルへの報酬と(シミュレーション上の)収益の相関が低いのが課題です。ひきつづき試行錯誤を続けます。
推論
最後に学習にも使った本日 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 回
参考サイト
- マーケットスピード II RSS | 楽天証券のトレーディングツール
- マーケットスピード II RSS 関数マニュアル
- 注文 | マーケットスピード II RSS オンラインヘルプ | 楽天証券のトレーディングツール
- PythonでGUIを設計 | Qtの公式Pythonバインディング
- Python in Excel alternative: Open. Self-hosted. No limits.
- Book - xlwings Documentation


0 件のコメント:
コメントを投稿