SSブログ

指標&パラメータ時系列分析マクロ [エクセル]

指標&パラメータ時系列分析マクロによる処理時間は、先週末時点において、従来の固定期間における最適パラメータ演算の4倍ほど掛かっていたのですが、その後の改良の結果、1.4倍ほどにまで短縮することができました。

日産順張り逆システムについて、時間軸が1993年11月1日~2010年12月24日の4,219期間(空白期間を含む)、パラメータ1が148期間、パラメータ2が50レベル、計31,220,600通りのKFインデックスの演算に要した時間は、57分10秒でした。

これは、KFインデックス一つ当たり0.11ミリ秒に相当します。また、パラメータ一組当たりでは0.46秒となります。
従来手法の延長で同様の計算を行なおうとしますと、(0.46/1.4)/0.00011~3千倍(3千時間)ほどの時間が掛かってしまうことになります。

さて、マクロの改良によって、先週末時点より約3倍の高速化を達成したわけですが、その最大のポイントは「配列」にあります。
マクロによる演算結果をワークシートに一気に書き出す際に、配列を用いれば高速化できるという話は、以前述べたことがあるかと思います。

今回はその逆に、ワークシートの内容を一気にマクロ中の配列に取り込むことで、高速化を実現しています。
以下に、その方法について簡単に説明いたします。

今、ワークシートのA1:A100セルに1万以下の整数データが入力されているものとします。このデータを配列A_DATA()に取り込むことを考えます。
通常であれば、以下のようなマクロを組むのではないでしょうか。

Dim A_DATA(99) As Integer
Dim i As Integer

for i=0 To 99
A_DATA(i)=Cells(i+1,1)
Next i

これに対して、配列を用いる場合は次のようになります。

Dim A_DATA As Variant

A_DATA=Range("A1:A100")

何か不思議な感じがしますね。
実は、このように設定された場合、A_DATAは配列になるんです(A_DATAは必ずVariant型でなければいけません)。試しに、最後にStopを入れた上でマクロを実行後、VBEの表示メニューからローカルウィンドウを開いて、A_DATAの中身を確認してみてください。

それをご覧いただくと分かるように、A_DATAは2次元配列となっています。しかも通常の配列とは異なり、0からではなく1から格納されていることが分かります。
すなわち、得られたA_DATAという配列の中身は、A_DATA(1 to 100, 1 to 1)となるわけです。

このことに注意すれば、取得した配列を演算に用いることも可能となります。例えば、A1:A100セルの各セルに10を掛けてB1:B100セルに、100を掛けてC1:C100セルにコピーするには、次のように行なえばよいことになります。

Dim A_DATA As Variant, i As Integer
Dim CellData(99, 1) As Integer

A_DATA = Range("A1:A100")

For i = 0 To 99
CellData(i, 0) = 10 * A_DATA(i + 1, 1)
CellData(i, 1) = 100 * A_DATA(i + 1, 1)
Next i

Range("B1:C100") = CellData()

このようなテクニックを用いることで、ワークシートを参照したり、データを書き出したりする処理を高速化することができます。
そのような機会がありましたら、ぜひ検討してみてはいかがでしょうか。

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

nice! 0

コメント 0

コメントを書く

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

Facebook コメント

トラックバック 0

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