勝てない戦略の活用 (2017/05/19)

勝てない戦略でも他の戦略と組み合わせると役に立つ場合がある。複数の戦略を組み合わせる場合、勝てる戦略同士を組み合わせなければならないと思い込んでいる人もいるだろう。だが、かならずしもそうでないことを説明する。

期待利益、リスク、シャープレシオ

本題に入る前に、期待利益、リスク、シャープレシオについて簡単に説明しておく。

ここに1年当たり100トレード、1トレード当たりの期待利益が0.1%、リスクが1.0%の戦略Aがあるとする。リスクフリーレートを考慮せずにシャープレシオを求めると、

\[ 戦略Aの1年当たりの期待利益 = 0.1 \times 100 = 10.0 \] \[ 戦略Aの1年当たりのリスク = 1.0 \times \sqrt{100} = 10.0 \] \[ 戦略Aの1年当たりのシャープレシオ = 10.0 \div 10.0 = 1.0 \]

となる。

一方、1年当たり100トレード、1トレード当たりの期待利益が0.2%、リスクが4.0%の戦略Bがあるとする。同様に考えると、

\[ 戦略Bの1年当たりの期待利益 = 0.2 \times 100 = 20.0 \] \[ 戦略Bの1年当たりのリスク = 4.0 \times \sqrt{100} = 40.0 \] \[ 戦略Bの1年当たりのシャープレシオ = 20.0 \div 40.0 = 0.5 \]

となる。

戦略Bの期待利益は戦略Aの2倍である。では戦略Bのほうが優れているかといえばそういうわけではない。1年後の予想利益はリスクも考慮すると、

\[ 戦略Aの1年後の予想利益 = 10.0 \pm 10.0 \] \[ 戦略Bの1年後の予想利益 = 20.0 \pm 40.0 \]

となる。

都合よく考えると、利益は最大で戦略Aは20%、戦略Bは60%の利益だから戦略Bのほうが良さそうに見える。だが、逆に都合悪く考えると、戦略Aは0%、戦略Bは-20%となり、戦略Aは単に利益が出ないだけだが、戦略Bは-20%の損失である。

都合よく考えるのも都合悪く考えるのも正しくない。リスクを等しくして比較する必要がある。

もし戦略Aで戦略Bと同じ4.0%のリスクを覚悟できるなら、投資額を4倍にすればいい。すると、期待利益も4倍になり、

\[ 戦略Aの1年当たりの期待利益 = 0.4 \times 100 = 40.0 \] \[ 戦略Aの1年当たりのリスク = 4.0 \times \sqrt{100} = 40.0 \] \[ 戦略Aの1年後の予想利益 = 40.0 \pm 40.0 \]

となる。つまり、都合よく考えれば80%の利益、都合悪く考えても0%の利益で、いずれの場合も戦略Aは戦略Bより優れている。

勝てない戦略は役に立たないか

では本題に入る。

ここに勝つ場合は+1、負ける場合は-1で一定で、1年当たり12回勝ち、8回負けるという戦略Cがあるとする。Pythonで計算してみると、

import numpy as np

c = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
              -1])
mean_c = np.mean(c)
print('mean_c = ', mean_c)
std_c = np.std(c)
print('std_c = ', std_c)
sharpe_c = mean_c / std_c * np.sqrt(20)
print('sharpe_c = ', sharpe_c)


mean_c =  0.2
std_c =  0.979795897113
sharpe_c =  0.912870929175

で、期待利益は0.2、リスクは0.98、シャープレシオは0.91となる。

一方、勝つ場合は+0.5、負ける場合は-0.5で一定で、戦略Cが勝てば必ず負け、負ければ必ず勝つという戦略Dがあるとする。計算すると

d = np.array([-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5,
            -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5])
mean_d = np.mean(d)
print('mean_d = ', mean_d)
std_d = np.std(d)
print('std_d = ', std_d)
sharpe_d = mean_d / std_d * np.sqrt(20)
print('sharpe_d = ', sharpe_d)


mean_d =  -0.1
std_d =  0.489897948557
sharpe_d =  -0.912870929175

で、期待利益は-0.1、リスクは0.49、シャープレシオは-0.91となる。

戦略Cと戦略Dの相関係数を求めると、

cor_cd = np.corrcoef(c, d)[0][1]
print('cor_cd = ', cor_cd)


cor_cd =  -1.0

で、-1.0となる。勝敗が正反対なのであるから当然である。

ここで戦略Cと戦略Dを合わせた戦略Eを考えてみる。計算すると、

e = c + d
mean_e = np.mean(e)
print('mean_e = ', mean_e)
std_e = np.std(e)
print('std_e = ', std_e)
sharpe_e = mean_e / std_e * np.sqrt(20)
print('sharpe_e = ', sharpe_e)


mean_e =  0.1
std_e =  0.489897948557
sharpe_e =  0.912870929175

で、期待利益は0.1、リスクは0.49、シャープレシオは0.91となる。戦略Cと比べると、期待利益は半減したが、リスクも半減したのでシャープレシオは変わらない。

したがって、戦略Eはシャープレシオにおいて戦略Cと同等である。戦略Eが投資額を倍にして戦略Cと同じリスクを負うなら、期待利益も同じになる。資金の使い方として非効率である点はここでは無視する。

ところで、戦略Dの負けを1つだけ勝ちだったことにしてみる。再計算すると、

d[0] = 0.5
mean_d = np.mean(d)
print('mean_d = ', mean_d)
std_d = np.std(d)
print('std_d = ', std_d)
sharpe_d = mean_d / std_d * np.sqrt(20)
print('sharpe_d = ', sharpe_d)


mean_d =  -0.05
std_d =  0.497493718553
sharpe_d =  -0.449466574975

で、期待利益は-0.05、リスクは0.49、シャープレシオは-0.45となる。元の戦略と比べると、期待利益は増加したが、リスクはそのままなので、シャープレシオも増加している。

戦略Cと新しい戦略Dの相関係数を求めると、

cor_cd = np.corrcoef(c, d)[0][1]
print('cor_cd = ', cor_cd)


cor_cd =  -0.902670933848

で、-0.90となる。勝敗が完全には反対でないので、これも当然である。

そして、戦略Cにこの新しい戦略Dを合わせて新しい戦略Eを考えてみる。再計算すると、

e = c + d
mean_e = np.mean(e)
print('mean_e = ', mean_e)
std_e = np.std(e)
print('std_e = ', std_e)
sharpe_e = mean_e / std_e * np.sqrt(20)
print('sharpe_e = ', sharpe_e)


mean_e =  0.15
std_e =  0.572276157113
sharpe_e =  1.17219699775

で、期待利益は0.15、リスクは0.57、シャープレシオは1.17となる。戦略Cと比べると、期待利益は減少しているが、リスクはそれ以上に減少しているので、シャープレシオは大きくなっている。

新しい戦略Dの期待利益は-0.05であり、マイナスである。にもかかわらず、戦略Cのパフォーマンスを改善していることが分かる。つまり、勝てない戦略でも役に立つことがあるのである。

理屈はそうだが...

長々と説明したが、理屈はそうでも、いざ実行するとなると心理的にかなり抵抗がある。かく言う私も勝てない戦略を活用してみたいとは思うが(在庫はたくさんあるので)、実際にはやっていない(笑)。