ここでは、ブック「EXCEL-TRADING」の中に保存されているプロシージャの中でも、特に説明が足りていない箇所を取り上げ、個別に解説いたします。
 
Money_Mng_single と Money_Mng_ATR

 この2つのプロシージャはマネーマネジメントルールを変更するためのプロシージャです。
 Money_Mng_single は、システム検証時に「1回のトレードあたり1枚ずつトレードする」というルールで検証されるものです。Money_Mng_ATR は、市場のボラティリティと資金量、リスクを考慮して売買枚数を決定するものです。おそらく、最も実用的なマネーマネジメントルールではないでしょうか。
 それぞれどちらのルールを採用するかで売買枚数が変化するわけなので、パフォーマンス評価の方法が若干変更されます。
 そのため、「評価シート」内のワークシート関数が書き換えられることになるので、ご注意ください。

所要時間を測る
 
 このプロシージャは、別のプロシージャをサブルーチンとして呼び出し、その実行に要した時間を返すプロシージャです。例えば、下記の例では「ENTRY_SMA_CROSS」というエントリールールを書き換える際に要した時間を返すプロシージャになっています。
 この箇所に別のプロシージャ名を書き込んで、プロシージャ「所要時間を測る」を実行していただければ、呼び出されたサブルーチンの処理に要した時間が返されます。また、呼び出されるサブルーチンの中で、「○○が完了しました」といったようなメッセージボックスが開かれる場合、「OK」をクリックするまでの時間がカウントされてしまいますのでご注意ください。
 
Sub 所要時間を測る()
STIME = Time
ENTRY_SMA_CROSS
ETIME = Time
RTIME = (ETIME - STIME) * 24 * 60 * 60
RTIME = Application.WorksheetFunction.Round(RTIME, 1)
MsgBox "マクロの実行に要した時間は" & RTIME & "秒です。"
End Sub
 0706
↑終了後の画面。メッセージボックス内に処理にかかった時間が返されています。
 
ウォークフォワードテスト

 ウォークフォワードテストとは、過剰な最適化を避けるためのテストの手法のことです。
 ここでは、ウォークフォワードテストを次のように定義してプロシージャを作成いたしました。
 まず、価格データが1から100まであると仮定します。
 1回目は、データの1~25までを使用して、パラメーターの最適化を行い、その後、そのパラメーターを使用して、データ26~35でテストを行い、最適化の結果とデータ26~35での結果を比較します。
 2回目は、データ11~35までを使用して、パラメーターの最適化を行い、その後、そのパラメーターを使用して、データ36~45でテストを行い、最適化の結果とデータ36~45での結果を比較します。
 このように、徐々にデータをずらしていき最終的にはデータ100までテストを行います。
 その結果が記録されるのが、シート「ウォークフォワードテスト」です。

 最適化されたパラメーターで別の期間を用いてテストを行ってみると、必ずしも良い結果がでるとは限らないことがわかります。

以上の結果を踏まえて、算出されるのが、ウォークフォワード効率というものです。

これは、

ウォークフォワード効率
=全ての期間のフォワードテストの結果の平均÷全ての期間の最適化の結果の平均

という式で求めております。

この値により、そのシステムのルールやパラメーターの有効性を測ることが可能になります。
目安としては、0.5以上は欲しいところです。

↑「ウォークフォワードテスト」プロシージャ実行時の画面。

実際に、このプロシージャを使用する手順は、

プロシージャ内の
'ウォークフォワードテストを行うシステムのストラテジーを書き込む。
Call EXIT_ATR
Call ENTRY_SMA_CROSS
Call SheetAdjust_test
Call SheetAdjust_paformance
Call Optimize_contour
の箇所に、テストしたいストラテジーをサブルーチンとして書きこみ、最適化プロシージャのOPTIMIZE_CONTOUR内のステートメントをストラテジーに合わせておきます(※1)。
 
次にプロシージャ「ウォークフォワードテスト」を実行し、インプットボックスにブック「databook」から読みこみたいデータのシート名を書き込んでください。
 
※1・・・最適化したいパラメーターを指定するということです。つまり、2本の移動平均線のパラメーターの最適化ならば、そのパラメーターを変更するようにステートメントを改造します。