SSブログ

INDIRECT関数とOFFSET関数の処理速度比較 [システムトレード]

可変ポジションシステムをベースに、INDIRECT関数をOFFSET関数に置き換える作業が、ようやく終了しました。
それによって処理速度がどう変わるか、最適化演算を行なって処理時間を比較しました。

最適化を行なったシステムは、トヨタ自動車の移動平均システムで、1993年11月1日から2007年12月28日までの期間、KFインデックスを対象にTable1+2の範囲で最適化を行ないました。
また、比較用に従来システム(Ver4.06)でも最適化演算を行ない、可変ポジションシステムになってどの程度処理が重くなったかを調べました。

最適化演算に用いたパソコンはCore2Quad@2.66GHzのGatewayマシンで、VISTA上のエクセル2003で実行しました。
なお、時間の関係で、計測は各1回しか行なっていません。

結果としては、INDIRECT関数をOFFSET関数に置き換えた可変ポジションシステムが7分47秒、現在公開している可変ポジションシステムβ版が7分54秒、そして、可変ポジションでない現行正式システムが4分37秒でした。

さすがに可変ポジションシステムは、そうでないシステムに比べて処理が重く、処理時間は7割増しとなっています。
一方、INDIRECT関数の有無は、処理速度にほとんど影響ないようです。INDIRECT関数を用いない方が若干速いですが、1回しか計測していないため誤差範囲です。

可変ポジションシステムは、まだ列の再配置やマクロの最適化を行なっていないため、更なる高速化の余地はありますが、現行正式システム並みの処理速度を得ることは難しそうです。
これからシステムのオプティマイズ作業を開始しますが、数式の見直し等も含めてできるだけロスを低減するようにしたいと思います。

ちなみに、INDIRECT関数をOFFSET関数に置き換えた理由は、列移動の際に参照先が変わってしまうことを避けるためですが、INDIRECT関数を用いても参照先が変わらない場合があります。
それは、INDIRECT(A1)などのように、セルそのものを指定する場合です。

それに対して、今回問題となったのは、INDIRECT("A"&1)のような表記です。この場合、A列の参照が固定されてしまうため、例えば参照先がB列に移るような時には、正しく参照できなくなります。
KFシステムクリエイターではこの表記を多用していたため、大掛かりな修正が必要となった次第です。

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

nice! 1

コメント 0

コメントを書く

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

Facebook コメント

トラックバック 0

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