トレード戦略の種類

基本的なトレード戦略の種類について述べる。下のSlideShareによると、5つの基本的なクオンツ戦略があるという。

http://www.slideshare.net/JessStauth/d-30965323(p4)

これによると、戦略は

  1. 平均回帰戦略:上がるものは下がる。

  2. モメンタム戦略:トレンドは友である。

  3. バリュー戦略:安く買って高く売る。

  4. センチメント戦略:噂で買って事実で売る。

  5. 季節性戦略:5月に売る。

の5種類に分類される。

ここでは私の独断と偏見による解釈を用いて、各戦略について簡単に説明する。

平均回帰戦略(上がるものは下がる)

上がるものも永遠に上がり続けることはない。いつかは必ず下がるものである。下がるものも永遠に下がり続けることはない。いつかは必ず上がるものである。

上がったものは下がり、下がったものは上がって、いずれ平均に戻ってくる。そこで、平均より下がれば買い、上がれば売る。これが平均回帰戦略であり、つまりは逆張りである。

ところで、平均回帰戦略について、平均の下で買い、上で売れば必ず勝てるのではないか、と勘違いする初心者が時々いる。だが、実際にはそうはいかない。平均自体も動くからである。

例えば、平均の下で買っても平均が下がり続けることがある。そして、価格が平均に戻ったときには平均は買った価格より下になっていることもあるのである。

また、平均の上で売っても平均が上がり続けることがある。そして、価格が平均に戻ったときには平均は売った価格より上になっていることもあるのである。

平均回帰戦略で勝つためには平均自体の動きが水平に近くなるタイミングを測る必要がある。

モメンタム戦略(トレンドは友である)

トレンドは友、というのはtrendとfriendをかけた洒落である。米国の投資家ジョージ・ソロスの言葉らしい。トレンドとは仲良くしろ、逆らうな、従え、ということのようだ。つまりはトレンドフォロー、順張りである。

平均回帰戦略の逆で、上がれば、その勢い、つまりモメンタムに付いて行って買い、下がれば、そのモメンタムに付いて行って売るのである。では、順張りと逆張り、どちらの戦略が正しいのだろうか。

順張りは正しいが、逆張りは間違っている、というような意見をよく見かける。だが、それは違うと私は考えている。値動きというのは時には平均回帰的であり、時にはモメンタム的であるものだ。したがって状況に合った戦略を採用しなければならない。とはいえ、言うは易く行うは難し、ではある。

バリュー戦略(安く買って高く売る)

「安く買って高く売る」を「下がったら買って上がったら売る」と解してはいけないのだろう。それだと平均回帰戦略と変わらない。「価格が本来の価値より安ければ買い、高ければ売る」と解すべきなのだろう。

本来の価値を知るためには価格以外の指標が必要である。この辺が過去の価格さえ分かればよい平均回帰戦略との違いである。FXの場合、各国の経済指標などを見ることになるのだろうか。

経済指標は少なくとも短期トレードでは使いにくい。取引する通貨ペア以外の通貨ペアの価格を用い、取引する通貨ペアのあるべき価格を算出するというのはどうか。私はそれより高いか安いかで売買するという手法をバリュー戦略としてもいいのではないかと考えている。

センチメント戦略(噂で買って事実で売る)

「噂で買って事実で売る」とは、例えば米国の利上げ観測が持ち上がったらドルが高くなるだろうと予測して買う。そして、実際に利上げが決まったらもはやこれ以上は高くならないだろうと予測して売るのである。

だが、センチメントをどのように測るかというのは簡単ではない。テキストなどを用いた定性分析も必要になるだろう。

季節性戦略(5月に売る)

「5月に売る」というのは株価は5月以降に下がる傾向があるので、5月になったら売るということである。実際に5月以降に下がる傾向があるのかは怪しい。だが、年、四半期、月、週、日などを通した周期性があると考えて、それに基づいた売買を行うのが季節性戦略である。

単に時期によって上がりやすい、下がりやすいということだけが季節性ではない。平均回帰的である、モメンタム的である、というのも季節性である。

商品市場では農作物やエネルギーなど、季節によって需要や供給が大きく変化するものがあるだろう。そのような場合、季節性を期待できる。

FXにおける季節性は商慣習に基づくものが多いのではないだろうか。日本の仲値やロンドンフィキシングなどである。しかし、商慣習も一定不変というわけではないことには注意が必要である。

(2017/03/09更新)

平均回帰戦略とボラティリティ

ボラティリティが平均回帰戦略にどのような影響を与えるかを調べてみる。

検証に当たっては「トレード戦略」カテゴリの「基本的な平均回帰戦略」を用いた。シグナルはそのままとして、指定したボラティリティを超えた部分をカットしてパフォーマンスがどうなるかを見てみる。

ボラティリティは平均回帰戦略に悪影響か

先ずリターンの標準偏差を求め、標準偏差の0.5、1.0、1.5、2.0の4つのパターンで調べる。

In [1]:
import forex_system as fs
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime

fs.remove_temp_folder()

symbol = 'USDJPY'
timeframe = 5
period = 10
spread = 0.0
position = 2
start = datetime.strptime('2016.01.01 00:00', '%Y.%m.%d %H:%M')
end = datetime.strptime('2016.12.31 23:59', '%Y.%m.%d %H:%M')

entry_threshold = 1.5
filter_threshold = 10

zscore1 = fs.i_zscore(symbol, timeframe, period, 'MODE_SMA', 1)
bandwalk1 = fs.i_bandwalk(symbol, timeframe, period, 'MODE_SMA', 1)
buy_entry = (zscore1 <= -entry_threshold) & (bandwalk1 <= -filter_threshold)
buy_exit = zscore1 >= 0.0
sell_entry = (zscore1 >= entry_threshold) & (bandwalk1 >= filter_threshold)
sell_exit = zscore1 <= 0.0
data = symbol, timeframe, buy_entry, buy_exit, sell_entry, sell_exit, 0.1, 0, 0
signal, lots = fs.calc_signal(data)
ret = fs.calc_ret(symbol, timeframe, signal, spread, position, start, end)
cumret = (ret + 1.0).cumprod() - 1.0
sharpe = fs.calc_sharpe(ret, start, end)
print('std\t', 'sharpe ratio')
print('org\t', sharpe)
plt.plot(cumret, label='org')

op = fs.i_open(symbol, timeframe, 0)
std = np.std(op.shift(-1)/op-1.0)
for i in range (4):
    rnd = (i + 1) * 0.5
    ret2 = ret.copy()
    ret2[ret2/std>=rnd] = std * rnd
    ret2[ret2/std<=-rnd] = std * (-rnd)
    cumret = (ret2 + 1.0).cumprod() - 1.0
    sharpe = fs.calc_sharpe(ret2, start, end)
    print(str(rnd), '\t', sharpe)
    plt.plot(cumret, label=str(rnd))

plt.title('Mean Reversion and Volatility')
plt.xlabel('Date')
plt.ylabel('Cumulative Return')
plt.legend(loc='upper left')
ax=plt.subplot()
ax.set_xticklabels(cumret.index, rotation=45)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.tight_layout()
plt.savefig('mean_reversion_and_volatility.png', dpi=150)

fs.remove_temp_folder()


std      sharpe ratio
org      2.22657550743
0.5      5.68911369135
1.0      4.93028818462
1.5      4.02796478075
2.0      3.48310576555


指定したボラティリティで超えた部分をカットした場合、いずれも元の戦略のシャープレシオを超えている。また、カットする部分が多いほどシャープレシオは高くなっている。

グラフを見ると、標準偏差1.0以上の場合では累積リターンでも元の戦略を超えている。標準偏差0.5の場合ではさすがにカットされる部分が大きすぎるようだが、それでも累積リターンは元の戦略と大差ない。

指定したボラティリティを超えた部分をカットした場合、カットされるのは損失だけではなく、利益もである。にもかかわらず、カットしたことによって累積リターンが増えたのはなぜか。これは損失のときのほうが利益のときよりボラティリティが大きく、カットされる部分がより大きいからだろう。

この結果はボラティリティが平均回帰戦略に悪影響を与えていることを示唆しているようにも思える。だが、そうだと断定するのは早計だろう。別の角度からも検証するべきかと思う

ボラティリティは避けるべきか

私は数時間程度の時間軸では為替レートは平均回帰的であるが、ファンダメンタルによる変化は回帰しないというイメージを持っている。ファンダメンタルの変化は往々にして大きなボラティリティをもたらす。こうして起きた変動は多少は戻すこともあるだろうが、基本的に戻らないと考えるのである。

すると、ボラティリティが拡大する局面でトレードを避けたならば、平均回帰戦略のパフォーマンスを向上させることができるのではないかということは容易に思いつく。この想定に基づいて、いろいろ検証してはいるのだが、今のところ、結果は出ていない。

現時点ではボラティリティはやはり避けたほうが無難だと考えている。だが、単純に避けるだけではパフォーマンスを向上させることはできず、さらに工夫を加える必要がある。

(2017/03/09更新)