🔍

自動売買ロジックの正しい「パラメータの最適化」とは具体的にどういうことか?

2024/07/09に公開

はじめまして、botter初心者のmakioと申します。

最近自己流に検証して放流したbotって本当に大丈夫なんだっけ?っていうのが気になって一般的なパラメータ最適化の方法を調べてみた。
結論から言うと良くないやり方で作成していることがわかり、見直しが必要なことがわかった。

この記事では調べた内容をまとめておく。

自動売買におけるパラメータ、最適化とは

例えばある値段で買ったあとn%価格が上昇したら売るという売買戦略があるとする。
この売買戦略におけるパラメータとはnのことで、パラメータの最適化とは未来(未知)のデータに対しても安定して利益を出せそうなnの数値を決めること。

では、どうやってこのnを決めるのかというと、適当なnを設定して過去データで売買シミュレーションする。
結果から得られた利益を参考に良さそうな値を採用する。

ちなみに、利益以外にも戦略を評価するための指標は以下のようなものもある。
https://tomatosauce.jp/backtest-performance-indicators/

悪いパラメータの決め方

で、このとき気をつけなければならないのが過去データを全部使ってシミュレーションして、一番利益が高かったnを採用してはならない。
#俺はこれをやっていた。。

richman氏のATR売買戦略で一番利益が取れるn分足はどれかを過去データ全部使って右肩上がりになるものを採用していた。

この場合、過去の値動きパターンでしか利益を上げることができないゴミ戦略が完成してしまう。
一般的な言葉でいうと過剰最適化、過学習、オーバフィッティングしていると言う。

極端な例にはなるが、以下のような過去データだったとして、一番良いタイミングで買って30%上昇付近で売れば一番利益が取れるからってことで、nを30にして運用するみたいなもの。
悪いパラメータの決め方

過去データでは利益をMAXで取れるが、未来のデータで同じパターンの価格推移をするかはわからない。

また、戦略を構成するパラメータが多ければ多いほど過学習が進みやすいと言われてる。
戦略が複雑になればパラメータが増えるので過去データにフィットしすぎた戦略が完成してしまう。
買う条件、売る条件が複雑になるので過去データと全く同じパターンの値動きをしないと想定した売買をしてくれないということ。

EAに関する本で「戦略はシンプルにすべき」というのを目にしたことがあるが、こういう背景があるからだと理解した。

正しいパラメータの決め方

どの期間でも安定した一定の利益を上げることができるパラメータを決める必要がある。
そのために「パラメータを決める方法」を検証して、その方法が問題ないことを確認してからパラメータを決める。ということをする。
パラメータを決める方法の例)
「nに5〜30を設定して売買シミュレーションし、一番利益が良かったnを採用する」

では、どうやって「パラメータを決める方法」の検証をするのか。

それは、過去データを「パラメータを決めるためのデータ(学習データ)」と「パラメータを決めるのに利用しない未知データ(検証データ)」に分けて、学習データでパラメータを決めたあとに検証データでも利益を上げることができるかを調べることで検証する。
このようにデータを分割してを検証する方法をバリデーションという。
バリデーションの方法は以下のようなものがあり、一番確実に検証できる方法は「CPCV」である。

  • ウォークフォワード
  • Kfold
  • CPCV

以下のような流れで検証することになる。

  1. パラメータを決める方法を定義する
     例)「nに5〜30を設定して売買シミュレーションし、一番利益が良かったnを採用する」等
  2. 1.で決まったnで検証データを利用した売買シミュレーションをする
    例)
    一番良かったnが30だとしたらn=30の売買ロジックで検証データを利用した売買シミュレーションをする。
  3. 2.の検証結果によって以下を実施。
    • 確認観点
      • 検証結果でも利益を上げることができているか
      • シミュレーションで利用したデータと、検証データの利益差異が大きくないか
    • 結果が問題無い場合
      過去データ全部で「パラメータを決める方法」を利用して運用で利用するパラメータを決める。
    • 結果が問題ありな場合
      パラメータを決める方法を見直して再度2.から再検証。
      例)
      最良結果ではなく、その付近の値を採用する等。

テストデータも別途準備しておこう

最終的に決まったパラメータで問題なさそうかを検証するためにバリデーションするデータとは別に「テストデータ」も別途取っておくと良い。
そのテストデータでの検証で運用してもよいか最終確認を行う。
知らず知らずのうちにバリデーションの検証データの結果が良いものを採用してしまい、過学習してしまう可能性があるのでその問題に気づくことができる。

参考文献

https://note.com/aisaki180507/n/n9984a75de3a3#49b34974-80f7-4a41-b3c1-36223b81acbc
https://qiita.com/c60evaporator/items/ca7eb70e1508d2ba5359#24-クロスバリデーション

GitHubで編集を提案

Discussion