的中率とシャープレシオ (2017/07/06)

的中率とシャープレシオとの間にどのような関係があるかをシミュレーションによって調べてみる。

単純化のため、ここでいくつかの仮定を置く。

先ず、ボラティリティは1.0で固定とする。固定でさえあれば、実際にはどの数値でも結果は変わらない。

次に1年当たりのトレード数を260回とする。これは数値を変えると結果も変わるので動かせない。この数値は1年当たりの営業日が260日であることに基づく。イメージとしては毎日、上がるか下がるかを予測して売買し、1日の損益の絶対値は常に一定、と考えればいい。

最後にコストは考慮していない。

それではシミュレーションを始める。

①この記事で使うライブラリをインポートする。

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

②的中率とそれに対応したシャープレシオを計算する。

start = 50
end = 105
step = 5
n = int((end - start) / step)
accuracy = np.array(range(start, end, step)) / 100
sharpe_ratio = np.empty(n)
volatility = 1.0
trades = 260
for i in range(n):
    ret = ((volatility*accuracy[i]) - (volatility*(1.0-accuracy[i]))) * trades
    risk = volatility * np.sqrt(trades)
    sharpe_ratio[i] = ret / risk

的中率は50-100%の範囲で5%刻みとする。

③グラフを表示する。

plt.plot(accuracy, sharpe_ratio)
plt.xlabel('Accuracy')
plt.ylabel('Sharpe ratio')
plt.xlim(0.5, 1.0)
plt.savefig('sharpe_ratio_accuracy.png', dpi=150)
plt.show()

グラフを見ると、的中率とシャープレシオは比例していることが分かる。

④的中率とシャープレシオの関係を示すモデルを作成する。

def model(accuracy, slope, intercept):
    return slope * accuracy + intercept

上のグラフから以下のような関係を想定している。

シャープレシオ = 傾き * 的中率 + 切片

⑤モデルの傾き、切片を求める。

popt, pcov = curve_fit(model, accuracy, sharpe_ratio)
slope = popt[0]
intercept = popt[1]
print('Sharp Ratio = ', slope, ' * Accuracy + ', intercept)

Sharp Ratio =  32.2490309932  * Accuracy +  -16.1245154966

求められた傾き、切片によると、的中率が5%上昇するだけでシャープレシオは約1.61上昇するということが分かる。的中率で見ると、5%くらい大した違いではないように思うかもしれない。だが、これは大変な改善なのである。

もし的中率が70%であったら、

シャープレシオ = 32.2490309932 * 0.7 + (-16.1245154966) = 6.4498061986399975

となる。

シャープレシオが3.0以上なら、それは素晴らしい戦略だろう。6.0を超えるとなると、もはや尋常ではない。言い換えれば、的中率が70%に達するというのは尋常ではないのである。

機械学習、またはディープラーニングで株価予測的中率が○○%になった、というような話をよく聞く。だが、実際に尋常ではない素晴らしい成果が得られたのか、それとも何らかの間違いを犯していたり、単なる誇大広告であったりしないか、しっかりと吟味する必要がある。