FXトレードの破産確率を文系でもわかる高校数学で理解してみよう!(2)前回の記事の続きです。今回はより実践的なFXトレードでの破産確率の公式を紹介し、さらにpythonを使って実際に破産確率を計算します。今回の内容は、前回の「基本公式」が前提となっているため、なぜ以下の式が導き出せるのかわからない方は、先に前回の記事を読むことを推奨します。前回の記事では、「勝ったら1円の利益」「負けたら1円の損失」というトレードを無限に繰り返した場合に、勝率(P)と資金(N)がどのように破産確率に影響を与えるか、を確認しました。実際のトレードでは、当然、賭け金は1円ではありません。そこで、まずは以下のような条件での破産確率の公式を考えてみましょう。前提条件1)勝ったら1000円の利益、負けたら1000円の損失というトレード2)市場の資金は無限と仮定する3)勝率は50%を超えていると仮定する実はこの場合の破産確率の公式は「めちゃめちゃ簡単」です。以下のように変形するだけでいいのです。}}}$$要するに、右上の指数の「資金量」を「1トレードあたりの損失額」で割ればOKです。公式からわかること上記の公式から、同じ勝率でも1トレードあたりの損失額(=賭け金)が大きければ大きいほど、破産確率は大きくなることがわかります。勝率が50%を超えるという前提条件があるため、()の中身は必ず1未満の数字になります。そのため、右上の指数は大きければ大きいほど、破産確率は小さくなります。資金量が多ければ多いほど、同じ勝率でも破産確率は低くなります。逆に右上の指数が小さくなると、破産確率は大きくなってしまいます。そのため、1回のトレードの賭け金の額を増やすと、破産確率は大きくなります。賭け金の定義ちなみにトレードにおける「賭け金」の定義をここで整理しておいてください。賭け金はエントリー価格やサイズのことではありません。最終的に1回のトレードで失う証拠金(例えば、損切り幅)のことです。「ポジションを持つために投入した金額」ではないので注意してください。初期資金10万円で「勝ったら1000円の利益」「負けたら1000円の損失」のトレードをすることは、初期資金100円で「勝ったら1円の利益」「負けたら1円の損失」のトレードの破産確率を計算するのと全く同じです。賭け金の額が大きい場合は、その分だけ口座資金を小さくして考えれば、前回に学習したのと同じ「勝ったら+1円」「負けたら-1円」のゲームに変換することができます。この考え方は、これから先の破産確率の公式でも全て同じです。どんな条件でも、基本的には「資金額」の方をうまく調整して、すべて「1円ゲーム」に換算して考えます。以下のような条件を考えてみてください。・破産ラインを0円ではなく20万円と定義するこの場合は、以下のような式を計算します。}}}$$つまり以下です。考えればいいだけです。2.利益と損失の割合が違う場合の公式もちろん実際のトレードでは、1回の利益と損失の額は同じではありません。そこで、以下のような利益と損失の割合が異なる場合を考えてみましょう。1.9%これはどちらの数字を使っても構いません。さきほども説明したように、どちらにしても「1円ゲーム」に換算して考えるので同じです。以下のような条件で破産確率を考えます。K円の利益、負けたら1円の損失というトレード3)市場の資金は無限と仮定する4)期待値が0円を超えている最初の2つのどちらを使っても、損益レシオKは同じになります。どちらを使っても構いません。2)「平均利益」と「損益レシオ」に注意ここでの平均利益を平均リターンと混同しないよう注意してください。一般的にいう平均リターン(期待値)は、すべての平均利益と平均損失を通算した平均値です。ここでいう「平均利益」は、純粋に利益が出た場合のみの平均値です。損益レシオとプロフィットファクター(PF)を混同しないでください。総損失」ですが、この数字にはすでに勝率が含まれています。損益レシオは、勝率とは関係のない数字です。「1円ゲームに換算するのは同じ」といいましたが、公式はかなり違った姿になります。結論からいうと、この場合の公式は以下になります。}}$$この記事から読み始めてくださった方は、「いきなり難しそうな方程式が....」と思ったかもしれませんね(笑)しかし前回の記事を読んでくださった方であれば、何となく見覚えがあるのではないかと思います。この式は、実は前回の記事で出てきた「特性方程式」と(k+1)の部分以外は全く同じです。注意なお、上記の公式の「1回あたりの損失額」は、実際のトレードではなかなか定義できません。具体的な損失額はそのときのBTC価格やロット数によって変動するからです。ここは後ほど説明するので今は気にしないでください。4)上記の式になる理由では本当に上記のような公式になるのか確認していきましょう。途中までは前回の記事と全く同じ流れなので、重複する箇所は説明を端折ります。わからない方は、前回の記事を読んでください。ある資金額n円で破産する確率をQ(n)とします。現在の資金額を100円とします。Q(100)は以下のような確率の合計で表すことができます。}$$これを前回と同様に一般化して漸化式にします。}$$さらに特性方程式を作ります。負ける確率)をベースにした公式になったわけですね。}}$$なぜ特性方程式の解からこの式が導き出せるのかは(しつこいですが)前回の記事で長々と説明しているので、そちらを参考にしてください><全く同じ理由で、この方程式を解いてその解をRとしたときも、「Rの資金乗」が、そのまま破産確率になります。2次方程式だったので、解は2つしかありませんでした。今回はk+1次の方程式なので解は2つとは限りません。そこで、以下のような2つの前提条件を思い出してください。1)破産確率は、確率の関数である2)「期待値は0を超えている」という前提があるQ(n)は、破産する確率を計算する関数です。確率は0~1までの範囲に必ず収まらなければなりません。0≦R≦1の範囲でなければなりません。Rがマイナスの値や1を超える値を取ると、上記の公式では確率が0%を下回ったり、100%を超えてしまうからです。「期待値が0を超えている」という条件を満たす場合、解のRは必ず0~1の範囲に1つ存在します。これは色々説明するよりも、実際に上記の方程式をpythonで描画してみた方がイメージが湧きやすいでしょう。このブログはpythonの実践ブログなので、実際に上記の方程式をpythonで解いてみましょう!3.Pythonコードで方程式を解こう!今回は以下のようなBOTの破産確率を考えます。「1回あたりの損失額」以外は、すべて実際のドンチャン・チャネルブレイクアウトBOTの成績をそのまま使います。・1回の負けトレードの損失額1万円まずは先ほどの漸化式から導いた特性方程式をpythonで関数にしてみましょう。xこれは先ほどの特性方程式の左辺をそのまま書いただけです。この関数に適当なxの値を渡せば、以下の式の計算結果を返します。-x$$特性方程式を解くためには、この関数から「0」が返ってくるような0≦x≦1の範囲内のxを探し出せばいいわけです。その前に、本当に0~1の間に解が1つだけ存在するのか、この関数をプロットして確認してみましょう。2)グラフで描画するpythonでは、matplotlibというライブラリを使って関数を描画することができます。以下のようなコードを書いて、上記の特性方程式の関数を描画してみましょう。)plt.show()上記のコードでやっていることは、以下です。1)np.linespace()で、0~1.2の範囲で等間隔な100個の数字を作る2)それをxとして片っ端から特性方程式の関数に与える3)返ってきた値をyとして、plt.plot(x,y)をグラフに描画するつまり0~1.2の範囲の100コの数字をxとし、それに対応する100コの計算結果をyとし、xとyを描画したらグラフの形状がわかるわけです。見やすいように、axvhline()でy=1の水平線、axvline()でx=1の垂直線をセットで描画しています。場合の特性方程式は、上記のような形状になることがわかりました。この方程式を解くということは、y=0と交わるxを探すということです。0≦x≦1の範囲に、X=1と0<R<1を満たす2つの解が存在していることがわかります。期待値が0円を下回る場合では、次に期待値が0円を下回る場合を考えてみましょう。ちなみに期待値が0を下回るかどうかは、以下のような式を満たすかどうかで確認できます。勝率}$$これは以下の期待値の計算式を展開すればわかります。気になる方は自身で確認してみてください。0}$$では、以下のような期待値が0を下回るケースを考えてみましょう。2.21このケースは、計算してみるとわかりますが、ぎりぎり期待値が0を下回ります。これで特性方程式の関数のグラフの形状を確認してみましょう。解Rがかなり1に接近して0<R<1の範囲におさまるか怪しくなってきました。なり、1以下におさまっていません(解き方は後述します)。1.75これは明らかに期待値がマイナスですが、グラフを確認してみましょう。このように解Rは1とは反対側にいってしまい、0<R<1を満たす解Rは存在しないことがわかります。ちなみにこのときの解R=1.2851999です。これで、さきほどの確率の公式に「期待値が0を上回るとき」という条件が付いている理由が理解できたと思います。特定方程式の意味これで特性方程式の解が何を意味する数字なのか、少しイメージできたのではないでしょうか?要するに特定方程式の解Rは、損益レシオと勝率という2つの成績指標を加味して0~1の範囲の数値に換算したものなのです(小さければ小さいほど良い数値で、1を超えると期待値が0円を下回ります)。そこに資金量を乗じることで破産確率が計算できます。3)方程式を解くでは次に実際に、この特性方程式を解いて破産確率を計算してみましょう!さきほどのコードに2つほど関数を付け加えます。epythonのようなプログラムが方程式を解く場合、人間のように因数分解や微分をしてスマートに解くよりも、ゴリゴリと片っ端から数字を代入しまくって近い数字を探すほうが得意です。今回のように、解が0<R<1の範囲とわかっているような場合は尚更です。そのため上記のプログラムでは、0から順番に0.0001単位で数字を代入しまくって、最もy=0に近い数を返すようにしています。このときのxは、ピッタリ厳密なy=0ではありませんが、どのみち、実際にトレードで何らかの指標として使う際には四捨五入しますので、近似値で問題ありません。無理数(ルートなど)で答えを返されても使えないからです。範囲に必ず解は存在することがわかっています。加算していき、計算結(y)が0を下回った時点でループを止めます。