指標&パラメータ時系列分析マクロ [エクセル]
指標&パラメータ時系列分析マクロによる処理時間は、先週末時点において、従来の固定期間における最適パラメータ演算の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()
このようなテクニックを用いることで、ワークシートを参照したり、データを書き出したりする処理を高速化することができます。
そのような機会がありましたら、ぜひ検討してみてはいかがでしょうか。
日産順張り逆システムについて、時間軸が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()
このようなテクニックを用いることで、ワークシートを参照したり、データを書き出したりする処理を高速化することができます。
そのような機会がありましたら、ぜひ検討してみてはいかがでしょうか。
コメント 0