2026-04-07

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

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

今日の日経平均株価

現在値 53,429.56 +15.88 +0.03% 15:45
前日終値 53,413.68 04/06 高値 53,916.35 09:17
始値 53,571.28 09:00 安値 53,156.94 13:14

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

【関連ニュース】

デイトレ用自作アプリ

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

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

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

強化学習へ沼りに行く②

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

TensorBoard を使い始める

強化学習モデルの学習中に、エピソード毎に解析したい情報を引き出す方法について Microsoft Copilot(以降、単に Copilot)に相談していたところ TensorBoard で可視化する話がでたので、突っ込んで聞いてみました。TensorBoard はその名前から TensorFlow の専用ツールだと勝手に思っていたのですが、全くの誤解でした。

Copilot が TensorBoard について下記のようにまとめてくれました。

  • 学習中の指標(episode reward, loss など)をグラフでリアルタイム可視化するツール
  • ブラウザで http://localhost:6006 を開いて眺めるスタイル
  • TensorBoard は TensorFlow 専用ではない
  • ログファイルを読み取るだけの汎用可視化サーバー
  • SB3 は標準で TensorBoard 出力に対応している
  • RL の “見えない内部状態” を可視化する最強ツール

知らない」っていうのは怖いですね。TensorBoard を利用することで RL(強化学習)モデルの学習時の内部状態を(ほぼ)リアルタイムで確認できるようになりました。

Firefox 上の TensorBoard 例(家庭内 LAN においてリモートでアクセス)

やはり、強化学習に沼ってしまったようです。

建玉(ポジション)情報をモデル側に送るのを忘れてしまっていたため、学習環境に手を入れています。コードの整理が終わらず、まだ動作確認中です。

環境

建玉(ポジション)情報を One-Hot エンコーディングして状態に加えました。

問題
  • 報酬の最大化
  • 報酬と収益が概ね比例するように考慮
状態 [Observation]
  1. Price(株価)
  2. Profit(含み損益)
  3. Diff(乖離率 : (MA1 - VWAP) / VWAP)
ポジション SHORT, NONE, LONG を One-Hot エンコーディング
  1. SHORT [1. 0. 0.]
  2. NONE  [0. 1. 0.]
  3. LONG  [0. 0. 1.]
行動 [Action]
  1. HOLD(何もしない)
  2. BUY(買建または返済)
  3. SELL(売建または返済)
返済ロジックは環境側で制御
ナンピン禁止は行動マスクで処理
報酬 [Reward]
  • 建玉時、含み損益の一定割合を付与
  • 買建時、-Diff を付与
  • 売建時、+Diff を付与
  • 返済時、直前の含み損益を付与
  • 約定コスト : 建玉、返済時いずれも固定の約定コストを引く
終了条件
  1. terminated
    • なし
  2. truncated
    • ティックデータが最終行に達した時
    • 終了時、建玉があれば強制返済。報酬条件、約定コストは同じ。

状態空間

ポジション情報を状態(観測値)空間に含めたことで構成を変えました。今までシンプルな状態空間しか使ったことがありませんでしたが、スケーリングをモデル側に委ねるため VecNormalize を使うことになったので、スケーリングを委ねる観測値と、そうでないポジション情報を下記のように区別する必要が出てきました。

self.observation_space = spaces.Dict({
    "market": spaces.Box(low=-np.inf, high=np.inf, shape=(3,), dtype=np.float32),
    "position": spaces.MultiBinary(3),  # one-hot
})

エージェント側

モデル側も対応して、指定した観測値をスケーリングするように調節しています。

    def make_env():
        # 1. Gymnasium 継承の環境クラスのインスタンス
        env_gym = TrainingEnv(code, df)
        # 2. Monitor Wrapper
        env_mon = Monitor(env_gym, dir_logs)
        return env_mon


    # ====== 学習用環境の準備 ======

    # 3. DummyVecEnv Wrapper
    env_dummy = DummyVecEnv([make_env])

    # 4. VecNormalize Wrapper
    env_train = VecNormalize(
        env_dummy,
        norm_obs=True,
        norm_reward=True,
        norm_obs_keys=["market"]
    )

    # モデルの準備
    model = MaskablePPO(
        "MultiInputPolicy",
        env_train,
        verbose=1,
        tensorboard_log=tb_logs,
    )

いろいろな情報を取得できるようになると欲が出てきます。今週のデイトレは全休になるかもしれません。

明日は少しでも成果をまとめたいです。

参考サイト

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

コメントを投稿