ローソク足のパターンの有効性を確認してみました

7 月からデイトレードをしていますが、負け続けています。 負けている理由を把握するために、根拠にしているローソク足のパターンがどれだけ有効そうなのかを手探りで確認してみました。

環境

  • Ubuntu 18.04 LTS
  • Python 3.6
  • Jupyter Notebook 5.2.0
  • NumPy 1.14.4
  • pandas 0.23.0
  • matplotlib 2.2.2

Hammer

根拠にしていたローソク足は次の形でした。

img

img

これ、いくつか呼び方を見たことがあります。 スパイクとかピンバーとかハンマーとか。

感覚的に“ヒゲが長くて実体が小さい足”程度の認識だったので、この機会に調べてみました。

日本語の Wikipedia では見つけられなかったのですが、英語の Wikipedia に candlestick pattern がありました。 このページでは、このローソク足の形は Hammer と呼ばれていました。 このハンマーについて引用してみます。

In order for a candle to be a valid hammer most traders say the lower wick must be two times greater than the size of the body portion of the candle, and the body of the candle must be at the upper end of the trading range.

Hammer (candlestick pattern) - Wikipedia

有効なハンマーであるためには、下ヒゲが実体の 2 倍以上あって、実体が上端にある、ことが条件らしいです。 ほとんどのトレーダーはそう言っているらしいです(ほとんどのトレーダーって誰かな?)。

When you see the hammer form in a downtrend this is a sign of a potential reversal in the market

Hammer (candlestick pattern) - Wikipedia

ダウントレンドの中でハンマーを確認したら、これは市場における潜在的な反転の兆候(上がる)、のようです。

これを信じていて、 Forex Tester で検証もして、その結果が良かったんです。 それで運用を始めたのですが、実際のトレードでは結果が悪かったんです。 だから、裁量的な Forex Tester での検証じゃなくて、データで、このハンマーがどれだけの数値になるのか確認してみようと思いました。

米ドル/円

以前作ったヒストリカルデータを使います。 ここでは米ドル/円だけでやってみます。

ここから Jupyter Notebook のセルに入力しながら進めます。

最初に必要なモジュールを読み込みました。

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

米ドル/円の日足のヒストリカルデータを読み込みました。

dtype = { 'time': str, 'open': float, 'high': float, 'low': float, 'close': float, 'volume': float }
names = ['time', 'open', 'high', 'low', 'close', 'volume']
df = pd.read_csv('~/Documents/data/d/USDJPY_D.csv', dtype=dtype, header=0, index_col='time', names=names, parse_dates=['time'])
df.head()

ハンマーであることを返す関数を作りました。 ハンマーの条件に該当する行は True になる Series を返します。

def hammer(df):
    min_of_open_or_close = df.loc[:, ['open', 'close']].min(axis=1)
    max_of_open_or_close = df.loc[:, ['open', 'close']].max(axis=1)
    lower_wick = min_of_open_or_close - df['low']
    upper_wick = df['high'] - max_of_open_or_close
    body = max_of_open_or_close - min_of_open_or_close
    trading_range = df['high'] - df['low']
    return (lower_wick / body > 2.0) & (upper_wick / trading_range < 0.05)

下ヒゲと実体の比率は具体的な数値があったのでいいのですけれども。 実体が上端にある、っていう上ヒゲの長さに曖昧さが残ります。 今回は、値幅の 5% 未満という条件にしてみました。

この条件のハンマーはどれくらいあるのか確認してみました。

s = hammer(df)
print('ハンマーの足の数:', s[s == True].count())
print('全体の足の数:', s.count())
print('ハンマーの足の割合:', s[s == True].count() / s.count())

結果です。

ハンマーの足の数: 31
全体の足の数: 3827
ハンマーの足の割合: 0.00810033969166449

4000 本近く日足があって、 31 本しかハンマーはありませんでした。 0.8% でした。 かなり少なく感じます。 一つの時間枠だけで言ったらこんなものでしょうか。 普段は複数の時間枠を見ているから実際はもっとあるように感じるのでしょうか。

ハンマーの次の足の陽線の割合を確認しました。

s21 = df['close'] - df['open']
s22 = s21[s.shift(1).fillna(False)]
s22[s22 > 0].count() / s22.count()

結果です。

0.41935483870967744

41.9% でした。 かなり驚きました。 もっと高いと思っていました。 55% くらいはあるんじゃないかと思っていたのですけれども。

ハンマーの次の足の始値から終値の平均を確認しました。

s22.mean()

結果です。

0.018419354838708695

こちらはプラスでした。 陽線の割合は低いものの、陽線になったときの値幅は陰線になったときの値幅よりも大きいみたいでした。

陽線の値幅(終値-始値)と陰線の値幅(終値-始値)の比率も確認してみました。

s22[s22 > 0].mean() / s22[s22 < 0].abs().mean()

結果です。

1.4646128939359697

1.5 倍もないみたいでした。

21 通貨ペアの平均

21 通貨ペアの平均も確認してみました。

日足だとハンマーのデータの数が少なかったので 1 時間足で確認しました。 次のようになりました。

  • ハンマーの足の数: 1267.380952
  • 全体の足の数: 83329.619048
  • 陽線の割合: 0.446195
  • 始値から終値の平均: -1.210769

ハンマーの次の足の陽線の割合は 44.6% でした。 個別の通貨ペアを見ても 50% を超えるものが一つもありませんでした。

ハンマーの次の足の始値から終値の平均は -1.21 pips でした。 プラスにすらできませんでした。

n 本先の足の終値までの値幅

ハンマーの次の足じゃなくて、さらに n 本先の足の終値まで持った場合も確認してみました。

  • 5 本先の終値まで
    • 陽線の割合: 0.479826
    • 始値から終値の平均: -1.032897
  • 10 本先の終値まで
    • 陽線の割合: 0.486039
    • 始値から終値の平均: -1.123826
  • 20 本先の終値まで
    • 陽線の割合: 0.498421
    • 始値から終値の平均: -0.808150
  • 50 本先の終値まで
    • 陽線の割合: 0.504215
    • 始値から終値の平均: -0.067837
  • 100 本先の終値まで
    • 陽線の割合: 0.504479
    • 始値から終値の平均: -1.044284

50 本先の終値まで持つことで陽線の割合が 50% を超えてきました。 値幅の平均もマイナスではありますが -0.06 pips にまで上がってきています。 100 本先の終値までだと値幅の平均が -1.04 pips に拡大してしまっています。

足の記憶は 100 本後までは残らないということかなあ。 というか感覚的にはローソク足 1 本の根拠でエントリーしたら 10 本先くらいまではその影響と思えます。 けれども 20 本先ともなると、もう根拠にしたローソク足の影響でそうなったとは言えないような気がしています。

See also

Wikipedia の中にハンマーに似た形で Hanging man というのもありました。 これはアップトレンドの中で出たら反転の兆候(下がる)というものらしいです。 同じような形の足なのに、状況によって上がる兆候と下がる兆候というように、異なる兆候を示すみたいです。

ハンマーやハンギングマンの足の逆の形(上ヒゲが長い形)として次の形もありました。

インバーテッドハンマーはダウントレンドの中で出たら反転の兆候(上がる)というものらしいです。 シューティングスターはアップトレンドの中で出たら反転の兆候(下がる)というものらしいです。

同じ形なのに、不思議な感じがします。

終わり

よく、どういう環境で出ているのかが重要だ、って聞きます。 だから、これ単体を確認してもあまり意味はないのかもしれません。

でも、複数の根拠があるところでトレードする、っていうのも聞きます。 ハンマーが根拠の一つになるとしたら、それ単体でも意味のある結果が出るんじゃないかと思いました。 21 通貨ペアの平均が 44.6% とかじゃなくて、せめて 51% とか。

ハンマーをはじめとするローソク足パターンって、バブルと同じように根拠のないもの、ただたくさんの人が信じているだけの迷信なのかなあ?

Gist に Jupyter Notebook のファイルをアップロードしておきました。