タートルズ・ブレイクアウト・システムでバックテストしてみました

『タートルズの秘密』を読みました。

タートルズっていうと、『伝説のトレーダー集団 タートル流投資の魔術』の方が有名な印象があります。 評価も高いみたいです。 こちらの本は数年前に読みました。 まだトレードを始めたばかりのころでした。 今となってはあまり記憶に残っていません…。 多分良かったとは思います。

今回の『タートルズの秘密』も良い本でした。 評価はあまり高くはないみたいですけれども。 その理由は、高いからなんじゃないかと思います。 にまんえん…。 それから大型本です。 A3 くらいありました…。 電車の中じゃとても読めません…。

結果、『伝説のトレーダー集団 タートル流投資の魔術』を読めば十分かもしれません。

今回は、この『タートルズの秘密』にあった売買ルールでバックテストしてみました。

トレンドフォロー

最初に、機能する理由を引用しておきます。

なぜトレンドフォローはうまく機能するのか?

  1. それは、バイアスを利用する統計学的な根拠を持つ概念である。
    つまりひと続きの数値の予測不能(ランダム)な流れである。
  2. それはニュートン物理学の法則と同じくらい簡単である。
    動いている物体は動き続け、止まっている物体はそこにとどまる傾向があるのだ。
    トレンドはひと続きの価格変動のモメンタム以上の何ものでもない。
  3. マーケットは少数の人々にのみ利益を上げることを許す。
    そして大多数のトレーダーは、彼らが何を考えているか、あるいは何を言うのかにかかわらず、どうしたら正しくトレンドに乗れるのかを知らない。
  4. マーケットは常に思い通りにはならない。
    これは、大部分のトレーダーが資金の大部分を失い、嫌になって試みをあきらめた後になってはじめて、トレンドが発生することを意味している。
    それ後、トレンドが発生しても、もう誰もその発生を信じられないが、結局はこれらの人々はマーケットに追随しなければならない。
    これこそがトレンドを継続させることになる。

タートルズの秘密 Part 1 基本 The Basics P.14

売買ルールそのものよりも、どういう考えからそうしているのか理解する必要がある気がしています。 表面的にその形だけを真似てみても同じ結果にはならないと考えるからです。 説明してくれたチャートと全く同じチャートは未来には現れないですし。 著者と自分は違いますし。 これから現れるチャートで自分がトレードしなきゃいけないわけですし。

バックテスト

次のような Python のプログラムを作りました。

def test(df, periods1=20, periods2=10, periods3=15, unit=1.0, spread=0.3):
    sp = unit * spread
    last = lambda x: ([0.0] + x.dropna().values.tolist())[-1]
    l = [
        df,
        df['close'].shift(1),
        df['high'].rolling(periods1).max().shift(2),
        df['high'].rolling(periods2).max().shift(2),
        df['low'].rolling(periods1).min().shift(2),
        df['low'].rolling(periods2).min().shift(2),
        atr(df, periods=periods3).shift(2),
    ]
    df2 = pd.concat(l, axis=1)
    pl1 = pd.Series(np.full(df2.index.size, np.nan), index=df2.index, name='pl1')
    pl2 = pd.Series(np.full(df2.index.size, np.nan), index=df2.index, name='pl2')
    ls = entry = stop = np.nan
    for row in df2.itertuples():
        time, open_, high, low, close, close2, high2, high3, low2, low3, atr_ = row
        if np.isnan([close2, high2, high3, low2, low3, atr_]).any():
            continue
        if (0 < ls and close2 < low3) or (ls < 0 and high3 < close2):
            # exit
            p = (open_ - entry) * unit * ls - sp
            if last(pl2) <= 0.0:
                pl1[time] = p
            pl2[time] = p
            ls = entry = stop = np.nan
        if np.isnan(ls) and (high2 < close2 or close2 < low2):
            # entry
            ls = 1 if high2 < close2 else -1
            entry = open_
            stop = open_ - (atr_ * 2.0 * ls)
        if (0 < ls and low <= stop) or (ls < 0 and stop <= high):
            # stop
            p = (stop - entry) * unit * ls - sp
            if last(pl2) <= 0.0:
                pl1[time] = p
            pl2[time] = p
            ls = entry = stop = np.nan
    if not np.isnan(ls):
        p = (close - entry) * unit * ls - sp
        if last(pl2) <= 0.0:
            pl1[time] = p
        pl2[time] = p
        ls = entry = stop = np.nan
    return pd.concat([pl1, pl2], axis=1)

具体的な売買ルールは Gist にアップロードした Jupyter Notebook のファイルに記載しました。

株価指数と通貨の市場でバックテストしていますが、スプレッドだけ考慮に入れています。 株価指数はお手軽に取引できそうな CFD での取引を想定しています。

株価指数

これを Yahoo Finance のヒストリカルデータを使ってバックテストしました。 かなり過去のデータも含まれていましたが(終値だけのもありましたが)、 2000 年から 2017 年までのデータを使いました。

ダウ平均です。

青い損益のラインは P/L フィルターを使ったときの損益です。 赤い損益のラインは P/L フィルターを使わなかったときの損益です。 ダウ平均は P/L フィルターを使った方が利益になったようです。 P/L フィルターについての説明も Gist にアップロードした Jupyter Notebook のファイルに記載してあります。

S&P500 種です。

どちらも損失に終わりました。

NASDAQ 総合です。

P/L フィルターを使ったときに 2,500 ドルくらいの利益になっています。

日経平均です。

P/L フィルターを使わなかったときに 90,000 円くらいの利益になっています。

評価の一覧表です。

  トレード数 勝率(%) 平均利益 平均損失 平均利益÷平均損失 1トレード当たりの平均損益 最大損失額 総損益 期待値
^DJI pl1 (P/L Filter) 103 38.83 43.27 23.68 1.83 2.32 -462.46 238.72 0.10
^DJI pl2 157 35.03 46.81 25.24 1.85 0.00 -498.86 0.07 0.00
^GSPC pl1 (P/L Filter) 114 35.09 43.28 26.80 1.61 -2.21 -432.31 -252.04 -0.08
^GSPC pl2 164 31.10 50.40 27.98 1.80 -3.60 -782.51 -591.10 -0.13
^IXIC pl1 (P/L Filter) 105 40.00 159.59 69.52 2.30 22.12 -1014.90 2322.87 0.32
^IXIC pl2 162 35.80 146.43 73.95 1.98 4.95 -1746.38 802.48 0.07
^N225 pl1 (P/L Filter) 100 32.00 7138.61 3019.04 2.36 231.41 -38850.55 23140.96 0.08
^N225 pl2 158 37.34 7097.03 3344.11 2.12 554.80 -51447.14 87658.12 0.17

期待値が一番良かったのは NASDAQ 総合の P/L フィルターを使ったときでした。 S&P500 種はどちらもマイナスでした。

S&P株価指数の場合も同様に、P/Lフィルターを利用すると期待損益がマイナスからプラスに変わる。 元々、トレンドを形成する要素があまり存在しないマーケットであり、結果的に失敗に終わってしまうトレードの数を大幅に減少させることができるからだ。 ポートフォリオに組み込むには素晴らしいマーケットとは言えないが、マーケットの分散を図る、または特別の状況にある場合などにはポートフォリオに組み込んでもよいと思う。

タートルズの秘密 Part 2 ニュースレター Newsletter Turtle Talk タートル・トーク1994年9月 P.219

P/L フィルターを使うところと使わないところを見極める必要があるみたいです。 タートルズはあまり積極的に S&P500 種をトレードしないみたいですね。

「トレンドを形成する要素があまり存在しないマーケット」だったのかどうかを確認するために、それぞれの終値をラインチャートにしました。

2000 年を 0.00 としたときのパーセンテージで表示しました。 ダウ平均、 S&P500 種、 NASDAQ 総合は、 2009 年あたりからトレンドがあるようにも見えます。 かなり長い期間を見てしまっているからでしょうか。 バックテストをしたタイムフレーム(日足)で見てみたら一時的な下落もかなりあるのかもしれません。 それでうまくシステムのルールに合っていなかったのかもしれません。

通貨

通貨の市場でもバックテストしてみました。 以前作ったヒストリカルデータを使いました。 株価指数のヒストリカルデータほど過去のものがなかったので、 2005 年から 2017 年までのデータを使いました。

ユーロ/米ドルです。

P/L フィルターを使ったときに 5,000 ドルくらいの利益になりました。

米ドル/円です。

P/L フィルターを使ったときに 200,000 円くらいの利益になりました。

ユーロ/円です。

P/L フィルターを使わなかったときに 150,000 円くらいの利益になりました。 P/L フィルターを使っていたとしたら 2008 年から 2009 年あたりに大きな利益を逃してしまうようです。

評価の一覧表です。

  トレード数 勝率(%) 平均利益 平均損失 平均利益÷平均損失 1トレード当たりの平均損益 最大損失額 総損益 期待値
EURJPY pl1 (P/L Filter) 63 34.92 44651.36 22001.99 2.03 1273.79 -274874.76 80248.50 0.06
EURJPY pl2 97 36.08 50087.14 21324.08 2.35 4442.86 -261197.45 430957.15 0.21
EURUSD pl1 (P/L Filter) 72 34.72 383.08 139.67 2.74 41.84 -1675.26 3012.42 0.30
EURUSD pl2 107 33.64 385.50 152.19 2.53 28.71 -2012.07 3072.34 0.19
USDJPY pl1 (P/L Filter) 77 37.66 25646.55 13422.38 1.91 1291.90 -142026.84 99475.97 0.10
USDJPY pl2 113 31.86 26342.50 14331.40 1.84 -1373.34 -276594.32 -155187.93 -0.10

期待値が一番良かったのはユーロ/米ドルの P/L フィルターを使ったときのようでした。

P/Lフィルターを利用する場合としない場合の結果を比較すると、この他にもいくつか浮き上がってくるポイントがある。 1つは、通貨マーケットではP/Lフィルターを利用しない方が利益は大きくなるということである。 そもそも通貨にはトレンドが現れやすいということがあるため、すべてのブレイクアウトに付いていかないと利益機会を逃してしまうことになる。 一方、穀物や金属の場合、P/Lフィルターを利用すると、結果は段違いに向上する。 これらのセクターは歴史的に見てすぐに反転して、大きなトレンドが現れることはまれである。 そのためすべてのブレイクアウトに付いていくことは良策ではない。

タートルズの秘密 Part 2 ニュースレター Newsletter Turtle Talk タートル・トーク1994年9月 P.219

通貨の市場では P/L フィルターを使わない方がいいそうです。 けれども、ユーロ/米ドルと米ドル/円は P/L フィルターを使った方が良い結果みたいでした。

マーケットの魔術師

『マーケットの魔術師』からトレンドフォローについて抜粋してみました。

Q トレンドフォロー・システムは、もう平凡なものになってしまったのかい。

そう思うよ。 どこかの市場で極端な需給のアンバランスでも生じないかぎり、もうトレンドフォロー・システムは通用しなくなってしまったんだ(このインタビューの後すぐに起きた一九八八年の穀物地帯での干ばつ騒ぎは、まさに彼の言う例外的なものだった)。 まあ、深刻なインフレやデフレにでもなったら、別の話だけどね。

マーケットの魔術師 マイケル・マーカス


Q コンピューターを使ったトレンドフォロー・システム(順バリのシステム)が急増していますけど、それがテクニカル分析におけるダマシを多くしている原因だとは思いませんか。

そう思う。 何十億ドルというお金が移動平均線や簡単なパターン認識システムで運用されてきているけど、その動きがダマシを非常に多くしている。 僕もそれと似たようなシステムを開発しているから、そのようなシステムがいつ作動するかわかるけど、そのようなシステム運用のファンドのせいで値段が動いても、ロシア人の買いでブレイクが起こったというのに比べたら、全然面白味がないんだ。

マーケットの魔術師 ブルース・コフナー


Q トレンドフォロー・システムがだんだん広まれば広まるほど、相場に対する同じようなアプローチが増えることになって、逆にその効率は悪くなってきているということなのですか。

そう思う。 すごいインフレの時代でも来ないかぎり単純なトレンドフォロー・システムがうまく機能するのは難しくなってきている。 だから、安定していてインフレ率の低いような期間だと、さまざまなテクニカル・システムがお互いに効果を相殺してしまうようになって、うまくいくはずがないんだ。

マーケットの魔術師 ブルース・コフナー


Q ダマシが多発するというのは、過去五~一〇年の間にコンピューターによるトレンドフォロー・システムの売買が著しい増加を遂げたことに関係があると思いますか。 あまりにも多くの人々が同じことをやって、お互いの邪魔になっているのではありませんか。

そう、それは疑う余地がない。 そして、それはテクニカル・トレーディングがファンダメンタル・トレーディングに勝利したことを示している。 皮肉なことだが、その勝利はテクニカル・トレーディングの価値を低めてしまった。

マーケットの魔術師 リチャード・デニス


Q トレンドフォロー・システムが機能しなくなる日がいつかくると思いますか。

簡単に発見でき、すぐに思いつくトレンドフォロー・システムが有効でなくなる日はやがて来るだろう。 良いシステムを開発するのは一層難しくなるだろう。

マーケットの魔術師 リチャード・デニス


Q あなたはトレーディング・システムをまったく使わないのですか。

我々は公開されているすべてのシステムについて試してみた。 そして本当にうまく機能するシステムを発見した。 それは非常に良いシステムだが、当然詳しい話はできない。

Q どういう種類のものですか。 逆バリとかトレンドフォローとか。

トレンドフォローだ。 そのシステムの前提は相場が動くときには激しく動くというものだ。 もし狭いレンジで動いていた相場が突然その幅を広げたときには、人間は本能的に価格変動を抑え込もうとする。 しかし、レンジの幅が広がったということは、相場はその方向に動き出す準備ができたというサインを我々に送ってくれているんだ。

マーケットの魔術師 ポール・チューダー・ジョーンズ


Q トレンドフォロー・システムについてのあなたの意見を聞かせてください。

トレードを始めたての人にとって、トレンドフォロー・システムがどのように機能するか学ぶことはとても有意義なことだと思う。 トレンドフォロー・システムを使ってトレードすることで、初心者は利食いはゆっくり、損切りは素早くという原則を学ぶことができる。 もしトレンドフォロー・システムを使って、その原則をしっかり身につけることができれば、トレーダーとして成功する可能性がかなり高くなったと言えると思う。

マーケットの魔術師 ゲーリー・ビールフェルド


Q トレンドフォロー・システムの現在と将来の見込みについてどうお考えですか。 トレンドフォロー・システムの普及が、結局はあなたのシステムの首を絞めるという結果になると考えられますか。

いいえ。 すべてのトレードは意識していようがいまいが、何らかの形でシステム・トレードの形態をとっている。 多くの良いシステムは、トレンドに追随することをベースにしている。 生ある者はすべてトレンドに従っているんだ。 鳥は冬に備えて南へ旅立ち、それをずっと続ける。 会社はトレンドを追いかけ、それに従って製品の品ぞろえを変えていく。 小さな原生動物は化学作用と発光の変化に従ったトレンドで活動する。

システム・トレードの収益性には周期があるんだ。 トレンドフォロー・システムが非常にうまく機能している間は、その人気は高まり普及する。 そしてトレンドフォロー・システムのユーザーが増えるにつれ、そして相場がトレンドのある動きから方向性のない動きになると、そのシステムは儲からなくなってくる。 そこで、資金量が少なかったり、経験の浅いトレーダーは振り落とされていく。 長く続けることが成功への鍵なんだ。

マーケットの魔術師 エド・スィコータ

第一章からだけ抜粋しました。 『マーケットの魔術師』が出版されたのは 1988 年のようです。 この時点で、もうトレンドフォローは機能しないと言っている人がかなりいたようでした。

抜粋しながら気づいたことがありました。 初めて『マーケットの魔術師』を読んだときの印象の中に トレンドフォローは機能しない なんてありませんでした。 マーケットの魔術師たちはトレンドフォローでトレードしている印象を持っていた記憶があります。 どこからそんな印象を持ったのだろう?

そして『タートルズの秘密』が出版されたのは 1997 年のようです。 著者はまだトレンドフォローは機能すると言っていました。

チャネル・ブレイクアウトの全体的概念は、一般常識とマネー・マネジメント、そして多少のトレンドフォローのフィルターを組み合わせた統計的に根拠のあるものである。 あなたがすべきこととは、他の誰かがすることを避けることである。 だから私は、トレードを始めてからまもなく、4週間(システム1)から10週間(システム2)に変更した。 そしてまた、すべてのタートルがシステム2を利用し始めた後で数人がシステム1に復帰して、また機能し始めたのである。

タートルズの秘密 Part 2 ニュースレター Newsletter Turtle Talk タートル・トーク1993年4月 P.150

でも、市場が変わることは認識していて、パラメーターを変えることで対応しているようでした。 システム 1 は 4 週間のブレイクアウト、システム 2 は 10 週間のブレイクアウトのようです。

それぞれ言い分があるんだなあと感じます。 結局、どんな売買ルールでも利益を上げられるんだと思います。 ちゃんとそれが合うところで使えば。

終わり

バックテストしたときの Jupyter Notebook のファイルを Gist にアップロードしておきました。