2025-09-21

自動売買への道 (2025-09-21)

楽天証券の口座でデイトレの自動売買に挑戦しようと Windows / Excel 上で利用できる マーケットスピード II RSS を活用して Python であれこれ取り組んでいます。この「自動売買への道」のトピックでは、プログラミングの話題にも踏み込んで、日々の活動をまとめていきます。

デイトレ用自作アプリ

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

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

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

強化学習のシステム作成

GPT-5 をはじめとした生成 AI に PPO エージェントのサンプルを提案してもらって、運良く良さげな学習効果が得られるものがあれば、そのコードを徹底的にレビューして、自分で使いこなせるようにしようという都合の良いことを考えていました。

運良く学習が進むエージェントが得られたので、これをベースにあれこれチューニングを始めています。

特徴量の設計[試案 3]

Price は 前の株価との差額÷呼び値、Volume は前の出来高との差の対数に定数を乗じて桁数を調整したものにしました。テクニカル指標については、現在のところどのぐらい役に立っているかを評価できていませんが、とりあえず入れています。ただし、ティックデータの前処理や、算出した数値のスケーリングなどを加えています。

7011 2025-08-19 のティックデータの場合

まずは、いままでと同じティックデータ(1 株あたりの期待収益はざっくり 100 円+)で、元データと特徴量をプロットして確認しました。

200 回繰り返したときの学習曲線です。

今回は、取引明細を残せるように環境クラスに機能を追加したのですが、あまりにも売買回数が多かったので、その売買回数のトレンドも集計しました。

今回使用したティックデータは 19,270 秒分のデータがあります。これを約 6,800 回の売買をしているということは 2 - 3 秒に 1 回の頻度で建玉を売買していることになります。人間の感覚では売買頻度がとても高いように思います。

GPT-5 に相談

GPT-5 にいろいろ相談をしたのですが、その一部を抜き出しました。

ちなみに、今回は株価を特徴量に使わずに、株価の差分を使用しました。これが高頻度の原因になっている可能性もあります。
「差分(ΔPrice)を特徴量に使った」ことが高頻度取引に影響している可能性は十分にあります。以下、原因の整理、なぜそうなるかの直感、実務で取れる対策(特徴量側・環境/報酬側・学習側)と具体的な実験案をまとめます。
  1. なぜ ΔPrice(差分)が高頻度化を招くのか — 直感
    • 差分は 短期ノイズに感度が高い:ティックごとの小さな上下で信号が反転しやすく、方策は「すぐに反応して利鞘を拾う」行動を学びがちです。
    • 差分は ゼロ付近を振動しやすい(平均は 0 に近く、符号がコロコロ変わる)。これが「頻繁にBUY/SELLをトリガーする閾値」を容易に作ってしまう。
    • 生の price レベルが無いと「トレンドの向き(レジスタンス/サポート)」など長期の情報が失われ、短期の瞬発的な信号のみで判断するようになる。

  2. 対策(優先度順)
    1. 特徴量の変更(まずここを試す)
      1. 価格レベルを復活させる
        • price(あるいは log(price))を観測に加えるだけで、方策は「どの程度の価格水準か」を把握でき、短期ノイズに振り回されにくくなります。
      2. 差分のスムージング(ノイズ除去)
        • 単純移動平均(SMA)や指数移動平均(EMA)で ΔPrice を平滑化:Δ_smooth = EMA(Δ, alpha)。
        • あるいは n-ティックの累積差分(n_tick_sum)にして小刻みな往復を抑制。
      3. 比率・対数差分(リターン)を検討
        • log_return = log(p_t) - log(p_{t-1}) はスケール不変で有用。
      4. マルチスケールの差分を入れる
        • 短期 Δ(1 tick)、中期 Δ(5 tick), 長期 Δ(60 tick)のように複数を与えると、短期ノイズと中長期トレンドを同時に扱える。
      5. ボラティリティや累積方向性
        • rolling std, cum_sign = sum(sign(Δ) over window) などで「一貫した方向性」を特徴量化。
    2. 環境 / 報酬側の対策(必須に近い)
      1. trade penalty(既に検討中):取引ごとに小さな負荷を加える。高頻度を抑える最も直接的な方法。
      2. min_hold_ticks:建玉後に最低保持期間を課す(短期往復を物理的に禁止)。
      3. action-change penalty:直前アクションと異なる(方向転換)ときに追加ペナルティを与える。これで「頻繁に反転する」行動が減る。
      4. 保有時間ボーナス/ペナルティ:短時間で決済すると小ペナルティ、一定以上でボーナス。
    3. 学習側の工夫
      • 報酬スケール:短期の小さな realized profit をそのまま与えると分散が極大化するので、スケーリング/クリッピングを行う。
      • entropy を上げる/下げる:exploration の程度を調整して「短期小利を乱発」するかどうかをコントロール。
      • 行動マスク:環境で無効なアクションをマスク(BUY の直後にもう一度 BUY を禁止する等)。

  3. 具体的な短期実験案(優先順)
    1. [最小変更] price を観測に追加
      • そのまま学習して取引回数が下がるか確認(最も効果が出やすくコストが小さい)。
    2. Δ の EMA を使う
      • 例えば EMA_Δ_α = 0.2 を計算して差分の代わりに使用。比較して取引回数とPnL/Tradeを確認。
    3. min_hold_ticks を入れて試す
      • 試験値: 5, 10, 20 ticks。それぞれで PnL, Trades, PnL/Trade を比較。
    4. trade_penalty のグリッド探索(あなたが興味のあるもの)
      • λ = [0, 0.01, 0.02, 0.05] などで学習数エポックだけ回す。
    5. Combine:price + EMA_Δ + min_hold で最終評価。

  4. すぐ使えるコード断片(特徴量側)
    • ...
    • (省略)
    • ...

  5. 評価指標(必ず見る)
    • total_trades / epoch
    • PnL / epoch
    • PnL per trade = PnL / trades ← 重要
    • avg_hold_time(ticks)
    • これらを横並びにプロットして「trade penalty / min_hold が増えると PnL per trade がどう変わるか」を見ると取捨選択しやすいです。

  6. 最後に:実務的な注意
    • 手数料ゼロでも スリッページと遅延を必ず試験的にシミュレートしてください。高頻度はスリッページで壊滅的に損をする場合があります。
    • 高頻度を許容するなら監視・アラートと緊急停止を本番前に必ず整備すること。

 

GPT-5 はもっともらしい提案を即座にいくつも示してくれます。しかし、その通りに進めていけば良い結果が得られると考えるのは幻想に過ぎません。やりとりから役に立ちそうなものを消化不良にならない程度にピックアップして進めていく予定です。

環境クラス

参考に、今回使用した環境クラスを以下に掲載しました。

trading_env_20250920.py

参考サイト

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

0 件のコメント:

コメントを投稿