2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Excel VBAでEAのモンテカルロシミュレーションを行いPF(プロフィットファクター)を分析する

Last updated at Posted at 2021-12-23

 この記事ではEA(自動売買システム)のバックテストデータを使って簡易的なモンテカルロシミュレーションをするツールをExcel VBAで作成していきます。

モンテカルロシミュレーターとは

  1. バックテストのトレード損益データを用意する
  2. そこからランダムにトレードを抽出する
    image.png

 モンテカルロシミュレーションによって得たランダム損益データは__「こんなバックテスト結果もあり得たよね」__という仮想バックテストデータとなります。
 さらにランダム損益データを複数個作成し、ランダム損益データ群を用意します。
image.png

各ランダム損益データはそれぞれプロフィットファクターや最大ドローダウンなどのEAを評価する指標を算出することができます。多くの仮想バックテストデータは「そのシステムの成績がどれくらいばらつくのか」などといった情報を調べることができます。
image.png

VBAでランダム損益データを抽出する

 まずExcelに分析するEAのバックテストの損益データを貼り付け、すぐ隣にランダム損益を入れるマクロを作成します。
image.png

.vb
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個の損益をランダムに抽出するように作りました

これを実行すると
image.png
ランダム損益を抽出することができます。

モンテカルロシミュレーションでPFの傾向を調べる

 ランダム損益を抽出するマクロが作れたらPF(プロフィットファクター)の傾向を調べるモンテカルロシミュレーションのマクロを作っていきます。

  • ランダム損益の抽出(1回目) → PFを算出(1個目)
  • ランダム損益の抽出(2回目) → PFを算出(2個目)
  • ランダム損益の抽出(3回目) → PFを算出(3個目)…

というようにPFを何個も生成します。

さっきのシートにPFを算出する欄を作っておきます
image.png

.vb
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

これを実行すると
image.png
このように複数回のシミュレーションによって、たくさんのPFを算出することができます。

さらにこのような項目を追加してみましょう
image.png

Excelの数式.
[元データの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以外(例えば最大ドローダウンなど)の評価指標も同様に調べることができます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?