破産レバレッジ


破産レバレッジ

破産させるレバレッジを考えてみる。ここではそれを破産レバレッジと呼ぶことにする。


環境


  • Jupyter Notebook 5.7.4


破産レバレッジの計算式

計算式は

破産レバレッジ >= 1 / 最小リターン * (-1)

とする。

もし最小リターンが-1%だったとする。すると破産レバレッジは1 / (-0.01) * (-1) = 100.0となる。最悪で1%の負けでもレバレッジ100倍なら100%の負け、つまり破産となるわけである。

最悪の負けはすべてのトレードの中で少なくとも1つはある。それがトレードの最初であろうと、最後であろうと、それ以外であろうと関係ない。破産レバレッジでそのトレードが行われた瞬間、たちまち破産する。

もちろん、最小リターンがマイナスでない場合、つまりすべてのトレードで1度も負けがない場合、破産レバレッジは意味をなさない。あくまでも勝つこともあれば負けることもあるトレードというのが前提である。


シミュレーション

さて、破産レバレッジをシミュレーションで確認してみる。ここに1トレード当たりの期待利益が0.1%、リスクが0.5%の戦略があるとする。トレードを100回行うとして実行してみる。

%matplotlib inline

import matplotlib.pyplot as plt
import numpy as np

trades = 100
np.random.seed(0)
ret = np.random.normal(0.001, 0.005, trades)
x = np.array(range(1, trades+1))
y = np.zeros(trades)
for i in range(trades):
if i == 0:
y[i] = 1.0 * (1.0 + ret[i])
else:
y[i] = y[i-1] * (1.0 + ret[i])
if y[i] < 0.0:
y[i] = 0.0
mean = np.mean(ret)
std = np.std(ret)
bankruptcy = 1.0 / np.min(ret) * (-1)

n = 10000
equity_curve = np.empty(trades)
x = np.array(range(n)) / 100
y = np.empty(n)
for j in range(n):
leverage = j / 100
for i in range(trades):
if i == 0:
equity_curve[i] = 1.0 * (1.0 + ret[i] * leverage)
else:
equity_curve[i] = equity_curve[i-1] * (1.0 + ret[i] * leverage)
if equity_curve[i] < 0.0:
equity_curve[i] = 0.0
y[j] = equity_curve[trades-1]
ax=plt.subplot()
plt.plot(x, y)
plt.axvline(x=bankruptcy, color='green')
plt.axhline(y=1.0, color='red')
plt.xlabel('Leverage')
plt.ylabel('Balance')
plt.text(0.05, 0.9, 'Bankruptcy = ' + str(np.round(bankruptcy, 2)),
transform=ax.transAxes)
plt.show()

output_1_0.png

シミュレーション結果によると、破産レバレッジは85.0となっている。


永遠にトレードすれば破産?

ところで、最適レバレッジではトレード数が増えれば、リターンの平均、標準偏差は理論値に収束していく。だが、最小リターンというのは曲者で、わずか1回の発生でも最小リターンとなりうる。つまり、トレード数を1万回、10万回と増やしていけば最小リターンはより小さくなりうるのである。

最小リターンがより小さくなるなら、破産レバレッジもより小さくなるだろう。言い換えると、トレードを永遠に続ければ、いずれは破産するだろう。

ここでトレード数を50万回としたときの破産レバレッジを計算してみる。

trades = 500000

np.random.seed(0)
ret = np.random.normal(0.001, 0.005, trades)
x = np.array(range(1, trades+1))
y = np.zeros(trades)
for i in range(trades):
if i == 0:
y[i] = 1.0 * (1.0 + ret[i])
else:
y[i] = y[i-1] * (1.0 + ret[i])
if y[i] < 0.0:
y[i] = 0.0
mean = np.mean(ret)
std = np.std(ret)
bankruptcy = 1.0 / np.min(ret) * (-1)
print('Bankruptcy = ', np.round(bankruptcy, 2))

Bankruptcy =  41.65

破産レバレッジは41.65となった。トレード数が100回のときは85.0であったから、半分近く小さくなったことが分かる。ただ、日本国内の規制である25倍よりはまだ大きい。

トレーダーは果たして一生のうちに50万回もトレードできるのだろうか。人にもよるだろうが、それほど多くはないだろう。だとすれば、トレードしていればいずれ破産するというのは杞憂と言える。

もちろん、これは1トレード当たりの期待利益が0.1%、リスクが0.5%の戦略であればの話である。期待利益がマイナスの戦略ならレバレッジなどは関係ない。遅かれ早かれ破産するので、トレードはやめたほうがいい。