この記事ではEA(自動売買システム)のバックテストデータを使って簡易的なモンテカルロシミュレーションをするツールをExcel VBAで作成していきます。
モンテカルロシミュレーターとは
モンテカルロシミュレーションによって得たランダム損益データは__「こんなバックテスト結果もあり得たよね」__という仮想バックテストデータとなります。
さらにランダム損益データを複数個作成し、ランダム損益データ群を用意します。
各ランダム損益データはそれぞれプロフィットファクターや最大ドローダウンなどのEAを評価する指標を算出することができます。多くの仮想バックテストデータは「そのシステムの成績がどれくらいばらつくのか」などといった情報を調べることができます。
VBAでランダム損益データを抽出する
まずExcelに分析するEAのバックテストの損益データを貼り付け、すぐ隣にランダム損益を入れるマクロを作成します。
Sub RandomSampling()
'変数の宣言
Dim x As Integer
Dim y As Integer
'元データの数をカウント
x = WorksheetFunction.CountA(Range("a2:a1048576"))
For i = 1 To 100
y = Int(Rnd * 1000000) Mod x 'この時点ではxは0~[元データの数-1]の乱数
y = y + 1 'これでyは1~[元データの数]の乱数になる
'2列目からなので+1する
Cells(i + 1, 2) = Cells(y + 1, 1).Value
Next i
End Sub
今回の例では100個の損益をランダムに抽出するように作りました
モンテカルロシミュレーションでPFの傾向を調べる
ランダム損益を抽出するマクロが作れたらPF(プロフィットファクター)の傾向を調べるモンテカルロシミュレーションのマクロを作っていきます。
- ランダム損益の抽出(1回目) → PFを算出(1個目)
- ランダム損益の抽出(2回目) → PFを算出(2個目)
- ランダム損益の抽出(3回目) → PFを算出(3個目)…
というようにPFを何個も生成します。
Sub MonteCarlo()
'100回シミュレーションする
Const no_PF As Integer = 100
'トレード損益を100個ランダムに抽出する
Const no_Sa As Integer = 100
Dim RndRange As Range
Set RndRange = Range(Cells(2, 2), Cells(no_Sa - 1, 2))
For i = 1 To no_PF
RandomSampling no_Sa
'勝トレード金額の合計と負トレード金額の合計
go_win = WorksheetFunction.SumIf(RndRange, ">0")
go_lose = WorksheetFunction.SumIf(RndRange, "<0")
'PFの算出
Cells(i + 1, 3) = go_win / go_lose * (-1)
Next i
End Sub
Sub RandomSampling(ByVal nos As Integer)
'変数の宣言
Dim x As Integer
Dim y As Integer
'元データの数をカウント
x = WorksheetFunction.CountA(Range("a2:a1048576"))
For i = 1 To nos
y = Int(Rnd * 1000000) Mod x 'この時点ではxは0~[元データの数-1]の乱数
y = y + 1 'これでyは1~[元データの数]の乱数になる
'2列目からなので+1する
Cells(i + 1, 2) = Cells(y + 1, 1).Value
Next i
End Sub
これを実行すると
このように複数回のシミュレーションによって、たくさんのPFを算出することができます。
[元データのPF] = -SUMIF(A2:A1048576,">0")/SUMIF(A2:A1048576,"<0")
[モンテカルロ平均PF] = AVERAGE(C2:C1048576)
[PFの95%下ぶれ値] =F3-NORMSINV(0.95)*STDEV.P(C2:C1048576)
これはマクロではなく普通のExcelの数式で計算しています。シミュレーション時の平均値や下ぶれしたときの値を算出しています。
シミュレーションの結果、全体の95%は[PFの95%下ぶれ値]より高い数値だったということを示しています。__もしこのEAを運用するのであれば[PFの95%下ぶれ値]くらい悪い結果になることも想定することが必要__だと言えると思います。また、[PFの95%下ぶれ値]よりも悪い数値が実運用時に出たときは「EAの運用を停止する」などの判断の目安になるかもしれません。
今回はモンテカルロシミュレーションでPFの傾向を調べるツールを作ってみましたが、計算式を追加すればPF以外(例えば最大ドローダウンなど)の評価指標も同様に調べることができます。