SSブログ

テーブル演算を用いない最適パラメータ演算(VBAによる演算) [システムトレード]

トレーディングシステムの最適パラメータを決定するために、エクセルではテーブル演算を利用すると高速に処理することができます。

テーブル演算の利点としましては、演算結果の表示を行いながら高速に処理を進められることですが、データテーブルの全範囲を計算してしまうため、部分的に処理を飛ばして高速化したい、などといった要求への対処は難しくなります。

また、テーブル演算中はシステムがロックされてしまい、演算が終了するまで一切の操作はおろか、処理を中断することもできません。
途中で処理を中止したい場合は、タスクマネージャを開いて強制終了させるしかありません。

VBAを用いれば、それらの問題点を解消することができますが、従来の方法ではシートへの結果の書き出しに時間が掛かり、処理速度的に十分ではありませんでした。
しかし、4月20日のコラムで述べましたように、配列を使って演算結果をシートに書き出せば、テーブル演算と同等の処理速度を得ることが可能となります。

また、テーブルを書き出さずに、単に最適パラメータの演算のみを行うのであれば、処理は更に高速化できます。
具体的な方法はここでは述べませんが、次のシステム改定では、VBAによる最適化演算を取り入れる予定です。

今現在、処理時間を更に短縮し、かつ、最適パラメータを確実に捉えるために、最適なアルゴリズムがないかどうか検討を行っています。
単峰性のパラメータ分布であれば、そのピークを高速に求めるためのアルゴリズムは数多く存在しますが、そうでない場合は非常に困難となります。

例えばKFインデックスの場合ですと、計算結果が"0"となる範囲が多くあるのですが、そのような範囲をできるだけ計算しないで済むようにすれば、大幅な処理速度の向上が図れるわけです。
ただし、分布そのものが非常にクリティカルになる傾向がありますので、徐々に範囲を絞り込む方法では、ピークを取り逃がしてしまう可能性があります。

いずれにしましても、結構厄介な問題ではあります。

ちなみに、VBAによる処理の高速化の話にちょっと触れますと、テーブル演算を代替する場合は、通常、2つの変数(例えばiとj)をFor Next ステートメントで回してやることになります。
その際、iのみの処理に関してはiに関するステートメントの中だけで行い、jに関するステートメントの中には入れないことがポイントです。

例えば、

 For i=a To b
  For j=c To d
   Cells(x,y)=f(i)
   Cells(u,v)=g(j)
  Next j
 Next i

とするのではなく、

 For i=a To b
  Cells(x,y)=f(i)
  For j=c To d
   Cells(u,v)=g(j)
  Next j
 Next i

とするわけです。

最初の例では、f(i)を2重に計算してしまうので、処理時間が後者の2倍ほど掛かってしまいます。よく考えれば当たり前の話なのですが、見栄えに拘ると案外見落としてしまうものです。
私も、最初は同じ間違いをして、処理時間が非常に掛かり頭を悩ませました。

実は、上記の方法よりも更に高速化する方法があります。とは言っても、非常に僅かな差に過ぎませんが。
ヒントは、4月20日のコラムの中にあります。

あと、処理を高速化するためには、シートの書き換えを行わないように設定すればいいのですが、そうすると、処理がどこまで進んでいるのか判らなくなります。
しかし、書き換えを許すと、処理に時間が掛かります。その場合、最小限の書き換えで済ますことで、高速化と進行状況の確認を両立できます。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:

nice! 0

コメント 0

コメントを書く

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

Facebook コメント

トラックバック 0

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