SSブログ

エクセルのちょっといい話(19) [システムトレード]

KFシステムクリエイターにおいて、最適パラメータの値を時系列で求めると、それらは階段状に推移していることが分かります。
最適パラメータはけして連続的に推移するのではなく、一定期間毎に遷移を繰り返すのです。

最適パラメータの決定に当たって、最初はKFインデックスなどの特定の最適化対象指標における最適パラメータを採択していましたが、その後、時系列分析が可能になると、それ以外の指標でも最適パラメータがより安定していれば採択するように変更しました。

すなわち、直近継続期間が最も長い最適パラメータを最優先で採択する、ということです。ここで、「最優先で」としたのは、そのようにして決定した最適パラメータにおけるシステム性能が、必ずしも良好であるとは限らない場合があるからです。

例えば、勝率やPF、損益レシオなどは、その値の最大化が必ずしもシステム性能の最良化とはなりません。そのため、それらの最適化対象指標において最適パラメータの直近継続期間が最長であったとしても、その最適パラメータを採択することが最善とはなりません。

どの最適化対象指標を採用するかについては、もう少し検討する必要がありますが、優先度を明確にし、それを反映した最適パラメータを一意的に決定する必要があると考えます。

最初は、KFインデックスを最大化するパラメータ群を最適パラメータとすることで、この一意性を担保していました。
しかし、時系列分析により最適化対象指標の選択に任意性が生じると、それは同時に、この一意性を損なう結果となってしまいました。

今、最適化対象指標の自由度を上げると共に、再びこの一意性を取り戻す手段として、最適パラメータの直近継続期間を算出し、それが最長となる最適化対象指標とその最適パラメータを、エクセルのワークシート上のみで一意的に決定する方法について考えます。

そのためには、各最適化対象指標における最適パラメータの時系列データが揃っている必要があります。これらのデータを用いて、直近継続期間を算出します。

次図は、あるシステムの最適パラメータの時系列推移です。KFシステムクリエイターにおいては、時系列分析を実行することによって、このような結果を得ることが出来ます。

200911a.png

図中、赤線で区切った部分が、最適パラメータの遷移個所となります。これらの中から直近の遷移個所を検出すれば、最適パラメータの直近継続期間を求めることが出来ます。

マクロを使わずにこれをワークシートの中だけで求めようとすると、少なくとも他に演算用の列が必要になります。逆順に列を走査して、値が変わったところのアドレスを返す、といった関数があれば良いのですが、残念ながらそれは用意されていません。

そこで常套手段となりますが、列内の隣り合うセル(行)間の差分を取れば、それが"0"である場合は最適パラメータが変化していないということが言えます。
すなわち、この差分が最も直近で変化したアドレスが分かれば、最適パラメータの直近継続期間を求めることが出来るわけです。

さて、普通に差分を取っただけでは、値が"0"でないセルのアドレスを「逆順で」求めることは出来ません。先頭からならMatch関数で容易に求めることが可能ですが、残念ながら「逆順」オプションは無いようです(最新のエクセルの場合は分かりません、あくまでエクセル2003の場合です)。

そこで一工夫してみます。
今、ある最適化対象指標の最適パラメータが、C列18行目以降に記述されているものとします。そして、E列を用いて、C列の最適パラメータの直近継続期間を求めます。

E18セルに次式を入力し、それを最下行(直近行)までコピーします。

  =IF(C17="",0,IF(C18-C17=0,E17,E17+1))

すると、C列の値が変わる毎に、E列の値が"1"ずつ増えることになります。そして、E列最下行の値が継続している期間が、最適パラメータの直近継続期間と言うことになります。
同直近継続期間を求めるには、任意のセル、例えばE16セルに次式を入力します。

  =COUNTIF(E18:INDIRECT(ADDRESS(COUNT(C18:C65536)+17,5)),
   INDIRECT(ADDRESS(COUNT(C18:C65536)+17,5)))

ここで、「COUNT(C18:C65536)+17」はC列の直近行の値を返します。ただし、C列の18行目以降は、必ず数値で埋まっている必要があります。
これらのセルに数値以外のテキストや数式が入力されている場合は、COUNTA関数を用いる必要があります。ただし、""(空白)はどちらでもカウントされませんので、注意が必要です。

ADDRESS関数は、行番号と列番号で指定したセル番地を返します。この例の場合は、E列の最終行のセル番地を求めています。ただし、これはテキストとして求められますので、これをセル参照するためには、更にINDIRECT関数を適用する必要があります。

そして最後に、COUNTIF関数でE列最終行の値と同じ値を持つセルの個数を数えています。これが最適パラメータの直近継続期間に他なりません。
後は、同様に全ての最適化対象指標の最適パラメターでこの直近継続期間を求めれば、それが最大となる最適化対象指標の最適パラメータが目的の解となるわけです。

この解は、一意的に決定することが出来ます。すなわち、最も安定した最適パラメータを一意的に求めることが出来るわけです。
ただし、最適化対象指標によっては、こうして得られた最適パラメータが最良の性能をもたらすとは限りません。これについては、まだまだ改善する余地が残されています。

今回用いた直近継続期間を求める方法は、例えば簿価基準の資産残高推移を求める際などにも利用することが出来ます。このような階段状に推移する時系列データを扱う場合に、非常に有用です。

余談ですが、前述したADDRESS関数の例では、通常この部分を別のセルに記述しておいて、それを参照した方が分かりやすく、計算負荷も小さくて済みます。
更には、INDIREC関数の部分も同様です。シート上のレイアウトに余裕があるならば、そのように分けて記述した方が良いでしょう。

逆に、元々分けて記述していた数式を統合することも可能です。その場合は、参照元のセルの数式の"="以降をコピーし、参照先のセルの同セル番地部分に貼り付ければOKです。
ただし、参照先の数式によっては引用部分全体を()で囲む必要がありますし、予期しないエラーの原因にもなりかねませんので細心の注意が必要です。

直近継続期間の算出によって、最適パラメータの決定に際する客観性を高めることが可能になりました。ただし、それがシステム性能を最良化するかというと、必ずしもそうではない可能性があることは、既に述べた通りです。
これについては、直近継続期間だけでなく、最適パラメータの遷移回数の多少の影響もあるかもしれません。

遷移回数が多すぎると、印象としてはシステムが不安定なのではないかという懸念が生じます。ただ、直近継続期間が十分に長ければ、それ以前の遷移回数を問題にする理由はないのかもしれません。
最適化対象指標の選定と、遷移回数の問題については、今後の検討課題といたします。

nice!(0)  コメント(0) 
共通テーマ:

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。