はじめに
世界に平穏なクリスマスが訪れますように。初めまして自分はGreen_helmetと言います。現在S級botterを目指して絶賛BTC bot開発中です。開発の様子はXtwitterのGreen_helmetの連ツイ「System trade入門するぞい」に投稿中ですので興味があったらご覧ください。さて、今回は前記、連ツイの中からバルサラの破産確率について取り上げ、加筆訂正のうえ投稿します。
バルサラの破産確率とは
バルサラの破産確率とは勝率p、平均損益比PF、一回のトレードでリスクに晒す資金の割合eを与えた時に長期間で破産する確率qを計算する方法です。自分の破産確率を計算したいBotter、トレーダーの役に立つと思います。
さて、バルサラの破産確率については検索すると色々な表が出てきますがpython計算プログラムは掲載されていませんでした。それで自分でプログラムを作ることにしました。
参考文献は下に示します。
計算式
文献から計算式は以下のようになります。
x = p* {x^{(1+k)}} + (1 - p)
(0<x<1)
f(x) = p* x^{(1+k)} - x + ( 1 - p )
とする。
f(x)=0 (0<x<1)
f(x)=0のxに関する解をyとする。f(x)を描いて見ると単調な関数でかつ微分可能なのでニュートン法が使えそうです。解をニュートン法で求めます。ただし、一次微分f’(x)は、
f’(x) = p * (1+k) * x^k - 1
破産確率qは以下で計算できます。
q = y ^ {(n/b)}= y^{(1/e)}
Python関数
と言うわけでPythonプログラムは以下のようになります。
from scipy import optimize
def barsala_bankruptcy_probability(_p, _k, _e):
"""
cc0
入力:
p:勝率、定数(0=<p<=1)
k:平均損益比(PF、ペイオフレシオ)=sum_benfit/sum_loss.定数(0=<k)
b:1回のリスク賭け金
n:総資金
e:一回のトレードでリスクに晒す資金の割合、定数(0<e<=1)
e=b/n
出力:
x:内部変数(0<x<1)
y:特性方程式f(x)の根(0<=y<=1)
q:破産確率(0=<q<=1)
"""
def f(x):
return _p * x**(_k + 1) - x + (1 - _p)
_y = optimize.newton(f, 0.4, fprime=lambda x: _p * (_k + 1) * (x**_k) - 1, tol=1e-14, maxiter=99999)
_q = _y ** (1 / _e)
return _q
もちろん
>pip install scipy
で事前にライブラリscipyをPythonのシステムにインポートしておく必要があります。
結果のサンプル
代表的なe=5%、e=10%で表を作ってみました。
表 e=5%、e=10%、勝率p%、PF(Profit/Loss ratio)に対する破産確率q%
感想1
資金のe=10%を一回に賭ける時、勝率p=60%で平均損益比PF=1.5でも破産確率0.1%はかなり高いのでは?トレードを1000回したら1回は破産するのかね、知らんけど。システムトレードだとすぐに1000回に行きそうだけどなあ。
感想2
勝率90%、PF>2で数年間調子よく稼いでいたbotter、トレーダーが、資産数千万円から1日で突然破産するのはどう説明すれば良いのでしょうか。少し疑問です。
参考文献