2025-12-07

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

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

デイトレ用自作アプリ

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

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

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

取引シミュレーション

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

制約条件

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

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

売買判断のための指標

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

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

実験計画

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

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

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

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

今回の実験計画 (doe-4) 要約
目  的 PERIOD_MA_1 と PERIOD_MA_2 の水準を振って収益を最大化する組み合わせを探索する。
データ 楽天証券マーケットスピード2 RSS から取得した過去のティックデータ(銘柄コード 7011)
実験因子 実験水準 説  明
PERIOD_MA_1 sec 60 90 120 150 180 クロスシグナル判定用移動平均 MA1 の period
PERIOD_MA_2 sec 500 600 700 800 900 クロスシグナル判定用移動平均 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 60 500 16.9 10.95
1 60 600 16.2 11.12
2 60 700 14.5 7.31
3 60 800 14.8 11.49
4 60 900 13.9 6.12
5 90 500 13.1 9.15
6 90 600 12.1 8.36
7 90 700 11.4 8.61
8 90 800 10.9 5.19
9 90 900 10.5 9.54
10 120 500 11.2 9.45
11 120 600 10.5 9.68
12 120 700 9.6 10.18
13 120 800 9.4 8.89
14 120 900 8.4 11.58
15 150 500 10.1 7.43
16 150 600 8.5 10.55
17 150 700 8.6 5.16
18 150 800 7.9 6.70
19 150 900 7.7 9.41
20 180 500 8.8 12.49
21 180 600 8.1 6.97
22 180 700 8.1 3.35
23 180 800 7.4 8.85
24 180 900 6.9 4.76

分散分析 (ANOVA)

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

=== ANOVA (up to 2-way interactions) ===
                             sum_sq    df         F    PR(>F)
PERIOD_MA_1               10.332812   1.0  1.880931  0.184706
PERIOD_MA_2                9.396698   1.0  1.710525  0.205054
PERIOD_MA_1:PERIOD_MA_2    0.373090   1.0  0.067915  0.796935
Residual                 115.362600  21.0       NaN       NaN

今回の分散分析では有意な因子はありませんでした。

主効果

交互作用効果

重回帰分析 (MULREG)

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  total   R-squared:                       0.230
Model:                            OLS   Adj. R-squared:                  0.028
Method:                 Least Squares   F-statistic:                     1.136
Date:                Sun, 07 Dec 2025   Prob (F-statistic):              0.376
Time:                        04:52:11   Log-Likelihood:                -53.327
No. Observations:                  25   AIC:                             118.7
Df Residuals:                      19   BIC:                             126.0
Df Model:                           5                                         
Covariance Type:            nonrobust                                         
===========================================================================================
                              coef    std err          t      P>|t|      [0.025      0.975]
-------------------------------------------------------------------------------------------
Intercept                  25.6926     15.459      1.662      0.113      -6.663      58.048
PERIOD_MA_1                 0.0480      0.093      0.515      0.612      -0.147       0.243
PERIOD_MA_2                -0.0513      0.040     -1.268      0.220      -0.136       0.033
I(PERIOD_MA_1 ** 2)        -0.0002      0.000     -0.655      0.520      -0.001       0.000
I(PERIOD_MA_2 ** 2)      3.529e-05    2.8e-05      1.260      0.223   -2.33e-05    9.39e-05
PERIOD_MA_1:PERIOD_MA_2 -2.036e-05   7.81e-05     -0.261      0.797      -0.000       0.000
==============================================================================
Omnibus:                        3.710   Durbin-Watson:                   2.558
Prob(Omnibus):                  0.156   Jarque-Bera (JB):                1.443
Skew:                          -0.010   Prob(JB):                        0.486
Kurtosis:                       1.823   Cond. No.                     1.83e+07
==============================================================================

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

今回の重回帰分析のフィッティング (Adj. R-squared) は低く、モデルの予測は正確ではありません。

3D 応答曲面

等高線図

等高線図の中で収益が最も高い領域にある実験点のパフォーマンスを確認しました。まずまずのパフォーマンスです。

  PERIOD_MA_1 PERIOD_MA_2 trade total
5 90 500 13.1 9.15

生データによる等高線図

等高線図の中で収益が最も高い領域にある実験点のパフォーマンスを確認しました。これもまずまずのパフォーマンスです。

  PERIOD_MA_1 PERIOD_MA_2 trade total
0 60 500 16.9 10.95

まとめ

今回実験した領域での最適点の収益は、近傍の実験点の収益と比較するとまずまずではありますが、相変わらずベストな条件が実験領域の端にある、という点が気に入りません。

今回のサマリデータは、どの条件でも収益がプラスになっています。つまり、今回の実験領域は比較的パフォーマンスが良い領域だったと言えます。一方で、パラメータをどの方向に動かせば悪くなるのか、この辺りが本当に良いパフォーマンスを得られる領域であるか否かの判断、評価ができません。

さらに実験領域をずらして評価を進めます。ひとまず水準幅を維持しますが、同じような結果しか出なければ、思い切って水準幅を広げてみます。

次のステップ

次回の実験計画 (doe-5) の水準案
実験因子 実験水準
PERIOD_MA_1 sec 30 60 90 120 150
PERIOD_MA_2 sec 300 400 500 600 700

参考サイト

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

コメントを投稿