2025-12-03

自動売買への道 (2025-12-03)

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

今日の日経平均株価

現在値 49,864.68 +561.23 +1.14% 15:30
前日終値 49,303.45 12/02 高値 50,138.60 14:31
始値 49,540.64 09:00 安値 49,521.23 09:00

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

【関連ニュース】

デイトレ用自作アプリ

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

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

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

取引シミュレーション

強化学習モデルのチューニング作業の優先順位を下げ、しばらくはテクニカル指標のシグナルで取引するアプローチを前面に出しています。

現在利用している指標は下記のとおりです。

  • 2つの移動平均 MA (n = 60 sec)MA (n = 600 sec)
    • クロスサインで売買(ナンピン売買禁止)
  • 移動範囲 Moving Range, MR (n = 60 sec)
    • ボラティリティを判定する指標、しきい値以下の時はフラグを立ててエントリしない。
  • ロスカット
    • しきい値以下になったらフラグを立てて建玉を返済、損切り。
  • 利確
    • 含み益と含み益最大値との比較で建玉を返済、利確する簡単なロジックを導入。

実験計画

仮決め(上記)で利用してきた指標(因子)について、水準を振って、より良さげな条件の組み合わせを探索しようとしています。実験因子として水準を振れるような機能をアプリに追加しました。

目的

仮決めで利用してきた指標(因子)の水準の前後で振った範囲内に最低条件が存在するかどうかを確認する。

実験範囲内に最適水準があれば、シミュレーションの使用するパラメータの水準を変更する。

実験範囲外に最適水準がありそうであれば、実験範囲をその方向に広げて最適な条件を探索する。

実験因子

上記のロスカットと利確条件も因子に加えたかったのですが、残念ながら納得できるやりかたに落ち着いていません。ひとまず、この 2 因子の機能はオフ(ロスカット、利確なし)にして実験評価をすることにしました。

  1. PERIOD_MA_1
    • 移動平均 1 の period
    • 水準 : 30, 60, 90 [sec]
  2. PERIOD_MA_2
    • 移動平均 2 の period
    • 水準 : 300, 600, 900 [sec]
  3. PERIOD_MR
    • 移動範囲 の period
    • 水準 : 15, 30, 45 [sec]
  4. THRESHOLD_MR
    • エントリを禁止する移動範囲のしきい値
    • 水準 : 1, 4, 7 [sec]

評価特性

  • 1 株当りの収益
  • [参考評価]100 回を上限としている取引回数

収益シミュレーションの実験

4 因子 3 水準の組み合わせ、34 = 81 通りの条件を、過去のティックデータ 70 日分全て (81 × 70 = 5670 run) に適用して、収益シミュレーションを実施しています。全ての run が完了するのは 12/3 の朝方になると見込んでいます。

残念ながら、最後まで実行できませんでした。

実行させていた PC は CPU の処理能力は大したことがなくとも、消費電力が 8W と低く、プログラムを動かしっぱなしにできるファイルサーバー (AlmaLinux 10) を利用していました。

過去 70 日分のティックデータに対して DOE の 81 条件を 2 日間以上かけて算出させていたのですが、徐々にメモリ使用量が増えてきて、遂には普段は使用量 0 のスワップ領域まで食いつぶしてきました。

Cockpit の Web Console の一部

あわよくば、メモリが尽きる前になんとか計算を終えることができるかもしれないと止めるのを躊躇っていましたが、結局、完了する前にメモリが尽きてしまうことが確実になったのでようやくプログラムを止めました。

全てのティックファイル、DOE 条件のシミュレーションが終わってから一括して結果を出力する、という設計が仇になりました。

とりあえず、ティックデータ(ファイル)毎に DOE の条件を全てシミュレーションし、その結果を保存するようにして、再々トライをしています。

明日は、部分的にせよ、ある程度まとまったデータで実験結果の分析をする予定です。

落穂拾い

プログラムを長時間稼働させるとメモリ使用量が徐々に増えていく問題の原因はいくつか考えられるのですが、そのひとつとして思い当たることがあったので、メモとして残しました。

Matplotlib のチャートを何回も使い回す時の注意

【前提】PySide6 の GUI 上で Matplotlib のチャートを使い回す。

  • ax.cla() (clear)
    • 軸の中身(プロットやラベル)をクリアするだけで、Axes オブジェクト自体は Figure に残り続けます。
    • → つまり「空の軸」が積み重なっていく可能性がある。
    • 繰り返し同じ Axes を使うなら cla() で十分。
  • ax.remove() (remove)
    • Figure から Axes オブジェクトを削除し、参照が切れるので GC の対象になります。
    • → メモリリークを防ぐにはこちらが必須。
    • 新しいレイアウトを作り直すなら remove() が必要。
  • fig.add_subplot や fig.add_gridspec
    • 新しい Axes を追加するたびに Figure の内部リストに積み上がるので、removeAxes を呼ばないと古いものが残り続けます。
def removeAxes(self):
    axs = list(self.fig.axes)  # コピーして安全にループ
    for ax in axs:
        ax.remove()
    # self.ax = dict() で複数の軸を扱う場合
    self.ax.clear()  # ← これを忘れると参照が残る
  • 長時間運用時の確認
    • gc.collect() を明示的に呼んでみる
    • tracemalloc や objgraph で Axes の残存数を監視するとリークの有無が分かる

参考サイト

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

0 件のコメント:

コメントを投稿