最適な戦略パラメータを見つける。最適化アルゴリズム入門
ダビデ・スカッソラ
2022年6月29日 – 11 読む
目次
取引戦略を構築するプロセスを通じて、あなたの根本的な目標は、あなたのボットの収益性を最大化することです。これを達成するために、あなたは試行錯誤のプロセスを通じて、バックテスターの結果に導かれながら、最適なコードの一部を探します。戦略の背後にある一般的なアイデアが健全であると確信している場合は、小さな変更を適用し、そのさまざまなバリエーションを探ることによってそれを改善しようとします。
ストラテジーの微調整は、特に多くの代替設定を検討する場合、非常に時間がかかることはすでにご存知でしょう(バックテストの実行は瞬間的ではありません)。また、これらの変更は、多くの場合、いくつかの数値パラメータを微調整することで構成されています。
あなたが行っていることは、次のように知られています。 最適化 そして、良いニュースは、いくつかのケースで、それを自動化することができるということです!
この記事では、最適化とそれがどのように取引戦略に適用されるのかについて掘り下げていきます。これから見るように、最適化はデータの力を活用することで、あなたのボットを改善します。
ストラテジー最適化
最適化について話す前に、パラメータとパラメトリック戦略について紹介しなければなりません。パラメータとは、基本的には、値があらかじめ定義されていない戦略の変数のことです。例えば、戦略
(S1) “EMA(期間)時に100$のBTCを買い持ちする。1) > EMA(期間2)、それ以外の場合はポジションを閉じる「は、period1 と period2 という2つのパラメータに依存するパラメトリック戦略です。
この戦略をヒストリカルデータに適用する(つまりバックテスト)と、異なるパフォーマンス指標(例えばPnLやシャープレシオ)を計算することができます。
さて、問題です。
(Q1) パラメトリックな戦略があるとして、どのパラメータの値が私の戦略を儲けさせるか?どれが一番いいのでしょうか?
これに答えようとするのだが、これは難しい問題である。まずは別の質問をしてみましょう。
(問 2)あるパラメトリック戦略と過去のある期間が与えられたとき、どのパラメータの値が最も良いパフォーマ ンスをもたらしたか?
問 2 は、数学的最適化が解決しようとする問題の種類に近い。関数 f(-) があり、その入力を求める。 x が成立するような選択肢の集合から、f(x) が最大化または最小化される。我々の場合、f(-)は与えられた期間に実行されたパラメトリック戦略のパフォーマンスをそのパラメータの関数として表したものである x.パフォーマンスは、例えばトータルリターンやシャープレシオなど、任意の記述的な指標とすることができる。
前の例に戻ると、最適化問題はこのように記述できる。
期間1 と期間2 戦略S1のトータルリターンを最大化する1時間から60日の間”
次のグラフは、ストラテジーS1のトータルリターンが、その2つのパラメータの関数としてどのように見えるかを示しています。
また、異なるシナリオでパフォーマンスの状況がどのように変化するかを観察することもできる。
上記の実験では、BTCの場合、我々の解である最適値は、およそ期間1=17日・期間2=46日分のログを取得2 の戻り≒4。
これらのプロットを生成するために、我々は単純に2つのパラメータについて多くの組み合わせ(36万!)を計算しました。これは、1点の評価に非常に時間がかかる場合や、パラメータが多すぎる場合など、ほとんどのケースで実現不可能なアプローチです。
そのため、よりスマートな方法でパラメータ空間における解を探索する必要があります。この課題に対して、アドバンスト・オプティマイザーは、制限された時間または目的関数の評価回数で、良い解を見つけようとする最適化アルゴリズムです。
オプティマイザ
数え切れないほどの最適化アルゴリズムが開発され、その多くはScipyのような科学ライブラリで利用可能で、人気があります。このように多様な最適化アルゴリズムが開発された背景には、最適化アルゴリズムが、基本的な性質が異なる特定の問題群を解くことに特化しているという事実が一部あります。
局所最適化と全体最適化
局所最適が大域最適でもあるという保証がなくても、局所最適が見つかれば満足できる問題があります。局所最適とは、目的関数が近傍のどの点よりも優れている入力の値である。一方、大域的最適値とは、目的関数が入力領域全体に対して最適な値を持つ値のことである。
局所最適化器の例としては、関数の局所的な改善方向にステップを実行することからなる、平易な勾配降下法がある。
大域的最適化の例としては、シミュレーテッド・アニーリングがあり、あまり詳しくは述べませんが、現在の解からランダムにジャンプして、解を改善することが行われています。
勾配情報の利用可能性
微分可能な関数f(-)は、ある入力が与えられると x という関数f(xでのf(-)の勾配を抽出することができる。 x, ∇f(x) を、f(-) の追加評価なしで、実行します。
勾配情報は,パラメータの数とは無関係に関数がどの方向に改善されるかを教えてくれるので,本当に貴重な情報なのですこれは画期的なことで、パラメータの数が数十億にもなるニューラルネットワーク(ここでは勾配の計算をバックプロパゲーションと呼びます)が大成功した背景には、このような理由があるのです。
例えば、2変数の関数f(-, -)があって、それを点(x1=1, x2=3).f(1, 3)=2.5 となり、また、∇f(1, 3)=(x1=-2, x2=+1.5).これは、関数f(-, -)が、(x1=1, x2=3)の中で、(x1=-2, x2=+1.5)の方向、例えば(x1=1 – 2 * 0.01, x2=3 + 1.5 * 0.01).
勾配情報を利用する最適化器は、しばしば次のように呼ばれます。 グラディエントベース.勾配降下法は、このクラスの最適化の基本的な例です。
勾配情報が利用できない設定は、勾配なし最適化と呼ばれます。 グラディエントフリー最適化 目的関数はよりブラックボックスに近く、多くのパラメータを扱う場合、これらのアルゴリズムはしばしば苦戦を強いられます。シミュレーテッド・アニーリングは、勾配を用いない最適化の一例です。
もう一つの特徴として 滑らかさ 目的関数の滑らかさ、つまり関数にジャンプがあるかどうかです。平滑性は勾配に基づく最適化では必要条件ですが(そうでなければ勾配を計算できない)、勾配なし最適化では厳密には必要ではありません。しかし、最適化の方向性を決定するために勾配の経験的近似に依存するオプティマイザが存在するため、この点には注意が必要です。この近似は、滑らかでない関数では失敗します。
トレーディング戦略に適したオプティマイザーを選択する
問題によって異なるオプティマイザが必要であることはすでに見てきましたが、パラメトリックなトレーディング戦略に最適なオプティマイザはどれでしょうか?
すでに3つの仮定をすることができます。
- 満足できない局所最適が多数存在する可能性があり、大域的最適に到達できるようなオプティマイザが必要である。しかし、局所最適化は大域的最適化と組み合わせても非常に有効です。
- 私たちは、勾配なし最適化を扱っていると言ってよいでしょう。パラメータに関して微分可能なパラメトリック売買戦略を構築することは不可能ではありませんが、特別な注意が必要で、戦略自体にいくつかの制約を伴います。例えば、パラメトリック戦略 S1 のトータルリターンを目的関数 f(period1期間2).この関数は既知の微分を持つ単純な微分可能関数の合成として表現されないので、勾配を計算することができません。また、これは実際に微分可能である保証がないことを意味する。
- 戦略のパラメータに対する非平滑な依存性はよくあることなので、平滑性の仮定を否定した方が無難です。例えば、実数値のパラメータに依存する条件によって取引が引き起こされる場合、取引は実行されるか、されないかのどちらかであり、中間は存在せず、これは非平滑性を構成する。
これらの条件を満たす最適化手法はいくつかあり、その一例と して、グリッドサーチ、ベイズ最適化、シミュレーテッドアニーリング、 パーティクルスウォーム、進化的アルゴリズム、微分進化などが挙げら れます。次のセクションでは、これらのオプティマイザの中から、出発点 となるものをいくつか紹介します。
グリッドサーチ
グリッドサーチは、最も基本的な大域的最適化手法です。多次元格子の各点で関数を評価し、最終的に最良の結果を得るというものです。各パラメータについて、取り得る値の集合のあらゆる組み合わせを試すだけなので、「総当たり最適化」とも呼ばれます。
例を見てみましょう。
関数 f(-,-) で表される取引戦略を想像してください。 p1 と p2に属する実数である。 [0, 24] の区間に属する実数である。
各パラメータについて等間隔に5つの値を取り、それらを組み合わせることで点のグリッドを構築する。
p1 ∈ {0, 6, 12, 18, 24}
p2 ∈ {0, 6, 12, 18, 24}
そこで の値の任意の組み合わせで関数fを評価します。 p1 と p2: f(p1=0, p2=0), f(p1=6, p2=0), …
グリッドサーチを EMA のクロスオーバーの例に適用すると、このようになります。
その根拠は、n個の推測の限界で、均一な方法でパラメータ空間を探索することです。非常に単純なアプローチであるにもかかわらず、目的関数について全く仮定がない場合、これはまだ価値があります。
ベイズ最適化
ベイズ最適化はグリッドサーチに比べるとかなり高度なアプローチですが、そのロジックは他の多くのオプティマイザに比べるとまだ分かりやすいと言えます。
ベイズ最適化は、以下のステップでまとめることができます。
- 確率的モデルfをフィットさせるモデルfの(-)です。 x → f(x) を使って、既に評価された点の集合{(xi, f(xi))}.モデル fモデル(-) は、すべての入力 x を出力可能な値の分布に変換する。
- ポイントを選択する x推測 に対応する分布 fモデル(x) が、現在の最適値よりも最も改善されると期待される。
- f()を評価する。x推測) と2からの繰り返しになります。
これがベイズ最適化の概要ですが、詳しく見ていきましょう。
まず、目的関数f(-)を最大化したいとして、すでに評価点の集合{(xi, f(xi))} (最初にいくつかランダムにサンプリングすることができます)。
適合する確率モデルは通常ガウス過程である。ガウス過程は機械学習モデルであり、各点に対して x は、入力空間の正規分布 N(μ(x), σ(x))をf(-)の推定値とする。関数μ(-)とσ(-)はモデルによって適合されるものである。これはおおよそ最近傍モデルと同じような働きをします:μ(xに近い評価点のf(-)に近い。 x, σ(x) が大きくなるにつれて x は他のどの点からも離れています。つまり、基本的にガウス過程の仮定は、f(x)に近い点のf(-)に近い点xのことである。 xとなり、不確かさが増します。 x は他の評価点から離れている。かなり合理的でしょう?
ここで、モデル fモデル(-)を推定するモデルであれば、次に評価するポイントをどこにするかということが明確になります。を選びたい。 x というように、fモデル(x) は、最大化を行っているので期待値が大きいが、改善の可能性を大きくしたいので、不確実性も大きい。
例えば、現在の最大値が2であれば、f(-)の評価を a ここで、f(a) = N(μ=1.8, σ=5)またはat b ここで、f(b) = N(μ=1.9, σ=0.1)?
最初の選択肢の方が良さそうです。さらに、一般的な判断基準として x は,現在の最大値に対する期待改善度を最大化するものである.選択された基準は、以下のように呼ばれる。 獲得関数 であり、ある点を評価するのに便利であることを教えてくれるものです。そこで、獲得関数g(-)が与えられたとき、最終的に選ぶのは x推測 となるようなg(fモデル(x推測))がベストです。
今度は別の最適化問題に行き着きましたが、こちらはg(fモデル(-)) は評価が速く (f(-) よりはるかに速い)、滑らかで、勾配が利用可能です。ここで、任意のグローバル・オプティマイザでこれを解くことができます(多くの関数評価を実行する必要があるものも同様です)。
EMAのクロスオーバーの例でベイズ最適化がどのように振る舞うか見てみましょう。
このアルゴリズムは、現在の最適解に近い点を推測することと、新しい領域を探索することの両方が可能であることがお分かりいただけると思います。
まとめると、ベイズ最適化の主な利点は以下の通りです。
- 関数の評価数に関して簡略化される。
- 目的関数に対する仮定を必要としない。
- 論理(「確率的」論理)をベースにしているので健全です。
- カスタマイズできる(確率モデル、獲得関数)。
主なデメリットがある一方で
- 手動でのチューニングが必要な場合がある。
- ガウスプロセスは大きな次元(~10以上)には向いていません。
- ガウス過程はオブザベーションの数に対してうまくスケールしない。
- f(-)の評価が高価でない場合には、おそらく有用ではないでしょう。
つまり、ベイズ最適化は、評価にコストがかかる目的関数を扱う場合、パラメータの数が比較的少なく、目的関数について何も仮定したくない場合に最適なのです。このような条件は、取引戦略においてしばしば遭遇するものです。
計算上の考慮点
取引戦略の最適化にはどれくらいのコストがかかるのでしょうか?バックテストの速度とオプティマイザの速度の両方に依存します。
ほとんどのオプティマイザでは、次に評価するポイントの計算には、1回のバックテ ストとは無関係の時間がかかります。そのため、最適化のボトルネックは、ほとんどの場合、バックテ ストになります。それでも、バックテスタが十分に高速であれば、ベイズ最適化 のような、関数評価の回数と次に評価するポイントの計算時間を交換す るような簡略化された方法を避けるという選択が可能です。
まとめ
バックテストのパフォーマンスを最大化するために、ストラテジーのパラメータを最適化する方法を、必ず知っておくべき2つのオプティマイザーに焦点をあてて見てきました。
これは2番目の質問に対する答えですが、最初の質問とはまだかなり異なっています。まだ、次のような答えがありません。良いバックテストは、未知のシナリオでの戦略の良いパフォーマンスを意味するのか?一般に、これは事実ではないので、これを達成し、以下を避けるために、いくつかの側面に多くの注意を払わなければならない。 オーバーフィッティング.
オーバーフィッティングの話題は非常に基本的なものであり、それは独自の記事に値するものですが、我々はまだあなたがあなたの戦略の意義を向上させることができるいくつかの方法を予想することができます。
- データ:様々なシナリオ(強気市場、弱気市場、横ばい市場)で戦略をテストする。
- パラメータ:最適化するパラメータの数は少なくして、パラメータが多くなればなるほど、必要なデータも多くなります。
- 検証: 可能な限り、未知のデータで戦略をテストし、複数の訓練とテストの分割を行う (詳細は ウォークフォワード最適化).
トラリティでは、ユーザーがバックテストでより良い結果を得られるような最適化ツールをプラットフォームで提供できるよう取り組んでいますので、次のアップデートにご期待ください。