2025-12-08

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

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

今日の日経平均株価

現在値 50,581.94 +90.07 +0.18% 15:30
前日終値 50,491.87 12/05 高値 50,678.05 09:00
始値 50,643.09 09:00 安値 50,224.65 09:06

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

【関連ニュース】

デイトレ用自作アプリ

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

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

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

取引シミュレーション

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

制約条件

現在シミュレーションで設定している制約は下記のとおりです。

  • 売買条件
    • ポジションを解消してから次の売買をする(ナンピン禁止)。
  • 取引回数
    • 上限を 100 回に制限
  • 約定条件
    • スリッページなし

売買判断のための指標

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

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

実験計画

仮決め(上記)で利用してきた指標(因子)について、水準を振って、より良さげな条件の組み合わせを探索しています。

現在は、クロス・シグナルで売買判断をするのに利用している 2 つの移動平均 MA1, MA2 の周期 (period) の最適組み合わせを見極めることに注力しています。

なお、実験結果の分析は線形的な手法を利用していますが、実験対象が線形近似できることは自明ではありません。そのため、実験領域を大胆に広げることはせず、小さめの実験領域を少しずつずらしながら評価することにしています。

そのため、納得できるまでは何回でも同じような実験と評価を続けます。

今回の実験計画 (doe-5) 要約
目  的 PERIOD_MA_1 と PERIOD_MA_2 の水準を振って収益を最大化する組み合わせを探索する。
データ 楽天証券マーケットスピード2 RSS から取得した過去のティックデータ(銘柄コード 7011)
実験因子 実験水準 説  明
PERIOD_MA_1 sec 30 60 90 120 150 クロスシグナル判定用移動平均 MA1 の period
PERIOD_MA_2 sec 300 400 500 600 700 クロスシグナル判定用移動平均 MA2 の period
評価特性 説  明
収益 (total) 円 / 株 売買シミュレーションで、2 つの移動平均のクロスシグナルに従った収益。
取引回数 (trade) 【参考値】システム側でナンピン売買を禁止し、取引回数の上限を 100 回に設定。
実験計画 説  明
Full Factorial Design
(完全実施要因計画)
2 因子 5 水準の組み合わせ全て、すなわち 52 = 25 通りの条件。
この組み合わせを過去のティックデータファイルの数だけ、収益シュミレーションを繰り返します。

分析結果

今回は、本日取得したティックデータを含めず、先週までのデータで集計をしています。

['ticks_20250819.csv', 'ticks_20250820.csv', 'ticks_20250821.csv', 'ticks_20250822.csv', 'ticks_20250825.csv', 'ticks_20250826.csv', 'ticks_20250827.csv', 'ticks_20250828.csv', 'ticks_20250829.csv', 'ticks_20250901.csv', 'ticks_20250902.csv', 'ticks_20250903.csv', 'ticks_20250904.csv', 'ticks_20250905.csv', 'ticks_20250908.csv', 'ticks_20250909.csv', 'ticks_20250910.csv', 'ticks_20250911.csv', 'ticks_20250912.csv', 'ticks_20250916.csv', 'ticks_20250917.csv', 'ticks_20250918.csv', 'ticks_20250919.csv', 'ticks_20250922.csv', 'ticks_20250924.csv', 'ticks_20250925.csv', 'ticks_20250926.csv', 'ticks_20250929.csv', 'ticks_20250930.csv', 'ticks_20251001.csv', 'ticks_20251002.csv', 'ticks_20251003.csv', 'ticks_20251006.csv', 'ticks_20251007.csv', 'ticks_20251008.csv', 'ticks_20251009.csv', 'ticks_20251010.csv', 'ticks_20251014.csv', 'ticks_20251015.csv', 'ticks_20251016.csv', 'ticks_20251017.csv', 'ticks_20251020.csv', 'ticks_20251021.csv', 'ticks_20251022.csv', 'ticks_20251023.csv', 'ticks_20251024.csv', 'ticks_20251027.csv', 'ticks_20251028.csv', 'ticks_20251029.csv', 'ticks_20251030.csv', 'ticks_20251031.csv', 'ticks_20251104.csv', 'ticks_20251105.csv', 'ticks_20251106.csv', 'ticks_20251107.csv', 'ticks_20251110.csv', 'ticks_20251111.csv', 'ticks_20251112.csv', 'ticks_20251113.csv', 'ticks_20251114.csv', 'ticks_20251117.csv', 'ticks_20251118.csv', 'ticks_20251119.csv', 'ticks_20251120.csv', 'ticks_20251121.csv', 'ticks_20251125.csv', 'ticks_20251126.csv', 'ticks_20251127.csv', 'ticks_20251128.csv', 'ticks_20251201.csv', 'ticks_20251202.csv', 'ticks_20251203.csv', 'ticks_20251204.csv', 'ticks_20251205.csv']

# of tick files : 74

データの集計(サマリデータ)

  PERIOD_MA_1 PERIOD_MA_2 trade total
0 30 300 31.2 3.41
1 60 300 21.6 0.88
2 90 300 17.5 0.61
3 120 300 15.5 2.38
4 150 300 14.4 1.07
5 30 400 25.6 5.28
6 60 400 18.8 5.04
7 90 400 14.8 2.34
8 120 400 12.4 7.93
9 150 400 11.4 12.62
10 30 500 23.7 9.11
11 60 500 16.9 10.95
12 90 500 13.1 9.15
13 120 500 11.2 9.45
14 150 500 10.1 7.43
15 30 600 21.6 8.11
16 60 600 16.2 11.12
17 90 600 12.1 8.36
18 120 600 10.5 9.68
19 150 600 8.5 10.55
20 30 700 20.5 6.41
21 60 700 14.5 7.31
22 90 700 11.4 8.61
23 120 700 9.6 10.18
24 150 700 8.6 5.16

分散分析 (ANOVA)

サマリデータに対して、主因子と交互作用について分散分析をしました。

=== ANOVA (up to 2-way interactions) ===
                             sum_sq    df          F    PR(>F)
PERIOD_MA_1                3.572392   1.0   0.406769  0.530508
PERIOD_MA_2              107.331048   1.0  12.221195  0.002153
PERIOD_MA_1:PERIOD_MA_2    0.491894   1.0   0.056009  0.815212
Residual                 184.429750  21.0        NaN       NaN

今回の分散分析では PERIOD_MA_2 がやや有意になりました。

主効果

交互作用効果

重回帰分析 (MULREG)

今回の重回帰分析のフィッティング (Adj. R-squared) は 60% を超えておりそこそこフィッティングしています。

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  total   R-squared:                       0.696
Model:                            OLS   Adj. R-squared:                  0.616
Method:                 Least Squares   F-statistic:                     8.713
Date:                Mon, 08 Dec 2025   Prob (F-statistic):           0.000198
Time:                        08:49:30   Log-Likelihood:                -51.462
No. Observations:                  25   AIC:                             114.9
Df Residuals:                      19   BIC:                             122.2
Df Model:                           5                                         
Covariance Type:            nonrobust                                         
===========================================================================================
                              coef    std err          t      P>|t|      [0.025      0.975]
-------------------------------------------------------------------------------------------
Intercept                 -28.4099      7.286     -3.899      0.001     -43.660     -13.160
PERIOD_MA_1                 0.0056      0.064      0.087      0.932      -0.129       0.140
PERIOD_MA_2                 0.1328      0.027      4.922      0.000       0.076       0.189
I(PERIOD_MA_1 ** 2)      8.344e-05      0.000      0.289      0.776      -0.001       0.001
I(PERIOD_MA_2 ** 2)        -0.0001    2.6e-05     -4.463      0.000      -0.000   -6.16e-05
PERIOD_MA_1:PERIOD_MA_2 -2.338e-05   7.25e-05     -0.323      0.751      -0.000       0.000
==============================================================================
Omnibus:                        2.906   Durbin-Watson:                   1.783
Prob(Omnibus):                  0.234   Jarque-Bera (JB):                1.388
Skew:                           0.408   Prob(JB):                        0.500
Kurtosis:                       3.816   Cond. No.                     5.17e+06
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 5.17e+06. This might indicate that there are
strong multicollinearity or other numerical problems.

3D 応答曲面

実験領域で平均収益が高い条件は PERIOD_MA_2 = 500 ~ 600 ぐらいの領域にあることが判ります。

等高線図

平均収益の具体的なレベルを確認するために等高線図を作成して、最新の平均収益トップ 3 の条件点を cyan(水色)の大きめな丸で実験点の黒丸に重ねて表示しています。

平均収益トップ 3 の条件
  PERIOD_MA_1 PERIOD_MA_2 trade total
9 150 400 11.4 12.62
11 60 500 16.9 10.95
16 60 600 16.2 11.12

生データによる等高線図

念の為、生データから Matplotlib の cubic でフィッティングした等高線図も作成しました。

考察と今後の方針

2 つの移動平均 MA1 と MA2 の周期 (period) のベストな組み合わせをあれこれ探索してきましたが、なかなか普遍的な周期の組み合わせは見つかりません。難しいです。そもそも二次多項式モデルでは適切にフィッティングできない可能性も感じています。

しかし、こうやって過去数ヶ月間のティックデータでシミュレーションを続けていると、当然ながら、条件によって平均収益に差が出てきます。収益モデルができなくとも、実用的には平均収益が高い条件を採用すれば良いのでは、と考えるようになりました。

そこで、平均収益を、日付毎および実験条件別に算出して、そのトレンドをプロットしてみました。最新の平均収益トップ 3 には色を付けて、その他の条件は灰色にしています。

なお、ティックデータは 2025-08-19 の分からですが、母数が少ないうちは平均収益の変動が大きくノイズのようになってしまうので、最初の部分は表示せずにキリの良い 2025-09-01 以降の算出分をプロットしています。

平均収益がトップの実験条件は未来永劫不変ではないと思いますが、それでもトレンドを見る限り、頻繁にトップ 3 が入れ替わるような様子ではありません。

引き続き分散分析や重回帰分析を続けるとしても、実績ベースで平均収益がトップグループにある条件を採用してシステムを運用することが現実的と考えます。

次のステップ

今まで水準を選んできた領域を網羅できるように広めに実験範囲を設定して水準も多めに刻んだ実験計画を立てました。少し時間を掛かりますが、過去のティックデータで水準毎のシミュレーション結果のデータを蓄積します。

ベースにする実験計画 (doe-6) の水準案
実験因子 実験水準
PERIOD_MA_1 sec 30 45 60 75 90 105 120 135 150 165 180
PERIOD_MA_2 sec 300 360 420 480 540 600 660 720 780 840 900

実験範囲を広げてしまったので、過去ティックデータのシミュレーション結果の全てを得るには数日かかってしまいます。しかし、ひとたび過去データについて蓄積できてしまえば、あとはその日その日に取得したデータを追加していくだけです。

今のところ 1 銘柄だけを対象にしているので、その日のティックデータに対する DOE 条件のシミュレーションに少々計算時間がかかるとしても継続できそうです。平均収益の母数は概ね 1 年ぐらいの期間でローリングさせようと考えています。

今まで Jupyter Lab 上で分析をしてきましたが、平均収益のトップ 3 ぐらいの条件の直近のトレンドをレビューできるような GUI システムを作って運用できるようにしたいです。

その上で、年内にシャドー・トレードを再開し、少しでも現実の取引を試すことを目指します。

リアルタイムで取引シミュレーションをすることを今まで Dry Run と呼んでいましたが、生成 AI とのやりとりで、どうやらシャドー・トレードと呼んだほうが良さそうだということが判ったので、今後はそう呼ぶことにします。

参考サイト

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

コメントを投稿