最適レバレッジの近似式の誤差 (2017/04/14)

ケリー基準によって最適レバレッジを計算する近似式にはわずかな誤差がある。その誤差は無視できるのかどうかを考えてみる。

最適レバレッジの近似式

近似式は

最適レバレッジ = リターンの平均 / (リターンの標準偏差 * リターンの標準偏差)

となっている。

本来の式はレバレッジについて級数展開して求める。レバレッジが小さい場合、第3項以降は無視できるほど小さくなる。そこで、近似式では初めの2項のみを用いて求めているのである。

逆に、レバレッジが小さくない場合、近似式はかなり大きな誤差を生じることになる。細かい点については以下のページがとても参考になる。

http://www.geocities.jp/y_infty/management/criterion_3.html

シミュレーション

では、どのくらいの誤差が生じうるかということを調べてみることとする。

ここに1トレード当たりの期待利益が0.1%、リスクが0.5%の戦略があるとする。近似式を用いると、

最適レバレッジ = 0.001 / (0.005 * 0.005) = 40.0

となる。この戦略に基づき、乱数を用いて100回トレードを行うシミュレーションを行ってみる。

以下のコマンドを実行してシミュレーションを行う。

import matplotlib.pyplot as plt
import numpy as np

trades = 100
ret = np.random.normal(0.001, 0.005, trades)
x = np.array(range(1, 101))
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)
kelly = mean / (std * std)
ax=plt.subplot()
plt.plot(x, y)
plt.xlabel('Trades')
plt.ylabel('Equity curve')
plt.text(0.05, 0.9, 'Kelly Approximation = ' + str(kelly),
         transform=ax.transAxes)
plt.savefig('optimal_leverage1.png', dpi=150)
plt.show()
plt.close()

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]
argmax = np.argmax(y)
ax=plt.subplot()
plt.plot(x, y)
plt.axvline(x=kelly, color='green')
plt.axvline(x=x[argmax], color='green')
plt.axhline(y=1.0, color='red')
plt.xlabel('Leverage')
plt.ylabel('Balance')
plt.text(0.05, 0.9, 'Kelly = ' + str(x[argmax]), transform=ax.transAxes)
plt.text(0.05, 0.85, 'Kelly Approximation = ' + str(kelly),
         transform=ax.transAxes)
plt.savefig('optimal_leverage2.png', dpi=150)
plt.show()
plt.close()

乱数を使っているので結果は毎回違う。このシミュレーションを繰り返して誤差の小さいケースと大きいケースとを選んでみた。

誤差の小さいケース

先ずは誤差が小さいケースの例を見てみよう。

誤差は0.01以下である。この程度の誤差であれば無視してもよさそうだ。

誤差の大きいケース

次に誤差が大きいケースを見てみる。

誤差は15以上で小さくない。より問題なのは近似式での最適レバレッジが本来の最適レバレッジでは破産レベルになっていることだ。これはさすがに無視できない。

近似式は使わないべきか

誤差の大きいケースを見ると、近似式は使うべきではないようにも思える。だが、このような誤差は何十回もシミュレーションをして、ようやく1回見かけるくらいのレアなものである。

また、誤差の大きいケースでは本来の最適レバレッジは38.11倍となっている。これが近似式では過大評価されて53.47倍となっている。だが、現在の日本の規制ではレバレッジは25倍までである。

日本の規制にしたがってトレードしている限り、近似式を用いても問題はないように思える。もちろん、最適レバレッジそのものはあくまでも目安である。取りうるリスクの上限と考えるべきだ。