ローソク足のパターン分析をPythonを使ってやってみる(初歩編)
- 本記事は初歩編です。機械学習/FX予想は行いません。パターン抽出のみです。
- Pythonなどの環境構築不要、ブラウザから実行可能(Google Colab利用)
- matplotlibを使って為替レートデータからローソク足チャートを作る方法
- 特定のローソク足のパターンを為替レートのデータから抽出する方法
- ローソク足のパターンは全部で4種類をやります
- 所要時間は10分〜1時間程度で実装可能です
こんばんは、新米データサイエンティスト(@algon_fx)です。気づけば今月もすでに後半戦に突入をしてしまいました。
ここ最近は本業もとても順調で、日々様々なデータ分析/機械学習モデリングを淡々と行なっています。金融系のデータを触ることは滅多にありませんが、動画やら画像やらのデータを分析するのも楽しいです。
FXトレードに関しても、ここ最近はLSTM、ディープラーニングなどを複数使いながら、少しずつ機械学習FXトレードのコツ(?)が解ってきたような気がします。
FX予想のモデリング検証は、ここ最近はランダムフォレストと勾配ブースティングにはまっています。また後日、こちらは記事でまとめたいと思います。
今日は少し変わりネタとして「ローソク足のパターン分析」をPythonを使ってやってみましょう。Twitterでも呟きましたが、ローソク足のパターン分析は非常に強力なツールになり得ると最近は感じています。(一般的なトレードでも機械学習のFX予想でも)
ローソク足って金融工学における日本人最大の貢献ですよね!下手なテクニカル分析なんかより、ローソク足のパターン分析の方がうまくはまったりする。深い、深すぎる!
Pythonでローソク足パターン分析を記事にしようか悩み中です。ニーズあるのかな…#機械学習 #FXトレーダー
— 新米データサイエンティスト (@algon_fx) 2018年8月20日
では、 実際にやってみましょう!
ローソク足 パターン分析とは?
株でもFXでも世界標準として使われている「ローソク足」ですが、これは日本人が開発しました。
ローソク足には「始値」「高値」「安値」「終値」の4種類の為替レートが使われており、それらのレートを1本の足で的確かつ視覚的に理解しやすいように表したものです。チャートがローソクに似ているから「ローソク足」と呼ばれるわけです。
「ローソク足くらい知ってる!」って方も多いかと思います。少し経験値がつくと、「まだローソク足で消耗しているの?俺はもうテクニカル派だぜ」なんてイキってる方もいます。
私もそうでした。
実際にこのブログでも「Pythonでテクニカル指標」なんてシリーズ化して、必死にテクニカル指標を追っていました。事実、今も追っています(笑)
テクニカル指標を活用すること自体はなんら問題はありません。問題があったのは「ローソク足を軽視していた」ことです。実はすごいんです、ローソク足。
ローソク足には「パターン」というものが存在します。ローソク足がこういう形をしたら、相場はこうなると経験則をまとめたようなものです。もはや、これはこれで一種の機械学習・・いや人間学習ですね。
そんなローソク足のパターンを過去の為替レートとPythonを使って分析してみましょう。
STEP1 ライブラリとデータの読み込み
まずは必要なPythonライブラリをインポートしましょう。自分のパソコンで環境構築を行うのが面倒な方は、Google Colabがオススメです。
環境構築が一切不要で、無料で今すぐブラウザからPythonのコードを実行することが可能です。さらに機械学習で必要な大半のライブラリも事前に構築されています。神サービスです。
まずは一般的なライブラリをインポートします。
1 2 3 4 5 6 7 8 9 10 11 12 |
# データ処理のライブラリ import pandas as pd import numpy as np import datetime # Matplotlibのインポート import matplotlib.pyplot as plt import matplotlib.finance as mpf from matplotlib import ticker import matplotlib.dates as mdates |
冒頭でも書きましたが、今回はTa-lib(読み:タリブ)というPythonのオープンソースライブラリを使います。Ta-libはテクニカル指標を計算していくれるライブラリです。インストール方法など、詳しくは「Pythonでテクニカル指標を算出できるライブラリTa-Lib」の記事をご覧ください。
Google Colabを使われている方は、下記のコードを実行してColabに手動でインストールする必要があります。参考までにですが、上記でインポートしたNumpyなどのライブラリは、Colabで事前に構築されています。Talibはマイナーなライブラリなので手動インストールが必要なだけです。
また、Ta-libですがWindowsと相性が悪く、よくインストールが行えない!と仰る方も多いです。Google Colabであれば、簡単にインストールして実行できるので試しに使ってみて下さい。
1 2 3 4 5 6 7 8 9 10 11 |
# Google ColabへTa-Libをインストール !wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz !tar -xzvf ta-lib-0.4.0-src.tar.gz %cd ta-lib !./configure --prefix=/usr !make !make install !pip install Ta-Lib |
4〜5分程度かかりますが、上記のコードをGoogle Colabで実行するとインストールが開始されます。完了すると「Successfully installed Ta-Lib-0.4.17」と出力の最終行に表示されます。
では、Talibもインポートを行いましょう。
1 2 3 4 5 |
# Talibのインポート import talib as ta ta.get_function_groups |
続いて本記事で使うデータを読み込みます。私が事前にOANDA FX APIでドル円の10分足を取得したデータを使いましょう。日付などを綺麗にしています。下記のURLからCSVファイルをダウロードして下さい。
それではデータの読み込みを行いましょう。CSVファイルをJupyter Notebookの起動ディレクトリ以外に保存した場合は、下記コードで保存先のパスを指定する必要があります。
1 2 3 4 5 |
# CSVファイルの読み込み masta = pd.read_csv('usd_10min_api.csv') df = masta.copy() |
Google Colabはサーバーへファイルをアップロードする手順が必要です。下記のコードを実行して下さい。コードを実行すると「ファイル選択」のボタンが出力されます。そちらからCSVファイルを選択してアップロードしましょう。
1 2 3 4 5 |
# Google Colabへファイルをアップロードする from google.colab import files uploaded = files.upload() |
CSVファイルのアップロードが完了したら、上記の「CSVファイルの読み込み」のコードをColab上で実行して下さい。
次にデータの日付をIndexとして使います。加えて不要なカラムも落としましょう。
1 2 3 4 5 6 7 8 |
# データの日付をIndexとして使う df.index = pd.to_datetime(df.time) # 不要なカラムの削除 del df['time'] del df['Unnamed: 0'] |
念のためデータを確認してみましょう。
1 2 3 4 |
# データフレームの最初の5行を表示 df.head() |
1 2 3 4 5 6 7 8 9 10 |
-- 出力 close open high low volume time 2018-03-01 15:40:00 106.792 106.817 106.817 106.777 87 2018-03-01 15:50:00 106.766 106.796 106.796 106.738 111 2018-03-01 16:00:00 106.774 106.769 106.822 106.762 232 2018-03-01 16:10:00 106.815 106.777 106.828 106.765 154 2018-03-01 16:20:00 106.844 106.813 106.864 106.809 207 |
これでオッケーです。参考までにですが、こちらのデータはドル円の10分足が16,422個入ったデータとなっています。
STEP2 ローソク足チャートを作ろう
データの準備が整いましたので、次は為替レートのデータからローソク足チャートを生成する関数を作ります。詳しくは「Pythonでローソク足チャートを作る」の記事をご参考ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# ローソク足チャート def candlechart(data, width=0.8): fig, ax = plt.subplots() # ローソク足 mpf.candlestick2_ohlc(ax, opens=data.open.values, closes=data.close.values, lows=data.low.values, highs=data.high.values, width=width, colorup='r', colordown='b') xdate = data.index ax.xaxis.set_major_locator(ticker.MaxNLocator(20)) def mydate(x, pos): try: return xdate[int(x)] except IndexError: return '' ax.xaxis.set_major_formatter(ticker.FuncFormatter(mydate)) ax.format_xdata = mdates.DateFormatter('%m-%d') fig.autofmt_xdate() fig.tight_layout() return fig, ax |
コードを見ていただくとわかりますが、少し雑です(笑)。というのも、入力するデータのカラム名を決めうちにしています。カラムの名前が少しでも異なると動かなくなるので、他でも使ってみたいと思っている方はお気を付けてください。
STEP3 Ta-Libでローソク足パターンを抽出
では、いよいよ本題であるローソク足のパターンの抽出を行います。今回はローソク足のパターンの基礎となる4種類のパターン抽出を行います。
まずはTalibへデータを渡すため、それぞれのレートの値(終値、始値、高値、安値)をNumpy配列へ変換してあげます。
1 2 3 4 5 6 7 |
# OHLCデータをNumpy配列へ変換 o = np.array(df['open']) c = np.array(df['close']) l = np.array(df['low']) h = np.array(df['high']) |
続いてTa-Libの関数を使って4種類のローソク足パターンをデータから抽出しましょう。
1 2 3 4 5 6 7 |
# 4種類のローソク足パターンを抽出 df['Marubozu'] = ta.CDLMARUBOZU(o, h, l, c) df['Engulfing_Pattern'] = ta.CDLENGULFING(o, h, l, c) df['Hammer'] = ta.CDLHAMMER(o, h, l, c) df['Dragonfly_Doji'] = ta.CDLDRAGONFLYDOJI(o, h, l, c) |
実際に抽出が出来ているのか確認してみましょう。
1 2 3 4 |
# データの確認 df[10:15] |
1 2 3 4 5 6 7 8 9 10 |
-- 出力 close open high low volume Marubozu Engulfing_Pattern Hammer Dragonfly_Doji time 2018-03-01 17:20:00 106.803 106.887 106.887 106.798 171 -100 0 0 0 2018-03-01 17:30:00 106.826 106.800 106.861 106.797 143 0 0 0 0 2018-03-01 17:40:00 106.819 106.823 106.842 106.808 109 0 0 0 0 2018-03-01 17:50:00 106.780 106.818 106.831 106.780 121 0 0 0 0 2018-03-01 18:00:00 106.706 106.777 106.777 106.702 220 -100 0 0 0 |
新たに4種類のローソク足パターンのカラムが追加されています。では、それぞれのパターンを確認してみましょう。
ローソク足パターン その1「丸坊主」
まずは「丸坊主」と呼ばれるパターンを見てみましょう。丸坊主には「陽線丸坊主」と「陰線丸坊主」の2種類あります。ローソク足の形は下記です。

ヒゲが付いていない長いローソク足を丸坊主と呼びます。陽線の丸坊主は「強い買いの勢いがある=相場は上昇へ継続する」、陰線の丸坊主は逆で「強い売り勢力=相場は下降へ継続する」を表しています。
では、実際に丸坊主のローソク足が出現した場所を確認してみましょう。
1 2 3 4 |
#丸坊主のデータを確認 df[(df['Marubozu'] < 0) | (df['Marubozu'] > 0)].head() |
1 2 3 4 5 6 7 8 9 10 |
-- 出力 close open high low volume Marubozu Engulfing_Pattern Hammer Dragonfly_Doji Long_Line_Candle time 2018-03-01 17:20:00 106.803 106.887 106.887 106.798 171 -100 0 0 0 -100 2018-03-01 18:00:00 106.706 106.777 106.777 106.702 220 -100 0 0 0 -100 2018-03-02 03:30:00 106.713 106.768 106.768 106.710 499 -100 0 0 0 -100 2018-03-02 06:20:00 106.234 106.293 106.293 106.232 92 -100 0 0 0 -100 2018-03-02 08:00:00 106.149 106.114 106.150 106.114 180 100 0 0 0 100 |
Ta-Libのローソク足パターン分析では、「-100」「0」「100」の値が戻ってきます。0はパターンが出ていない状態、100は陽線のパターンが検出された場合、-100は陰線のパターンが検出したことを表します。
上の出力のMarubozuのカラムを見てみると、-100と100といった具合に丸坊主が検出されたレコードが表示されています。丸坊主が何個、検出されたか確認します。
1 2 3 4 |
# 丸坊主のカウントを確認 df['Marubozu'][(df['Marubozu'] < 0) | (df['Marubozu'] > 0)].count() |
1 2 3 4 |
-- 出力 983 |
全部で16,442レコードが入っている中、陽線丸坊主と陰線丸坊主は983レコード検出されたみたいです。全体の5.97%が丸坊主??なんか怪しい。
では、実際にローソク足チャートに落として丸坊主を確認して見ます。
1 2 3 4 |
# 丸坊主のデータ確認 df['Marubozu'].loc['2018-03-09 08:10:00'] |
1 2 3 4 |
-- 出力 100 |
上記ですが私が適当に選んだ丸坊主のデータです。2018/3/9の8:10に丸坊主=100、つまり陽線丸坊主が検出された訳です。では、この時間の前後10時間を合わせてローソク足チャートを表示させましょう。
1 2 3 4 5 6 7 |
# 丸坊主 陽線(上昇トレンドが力強い) set_time = datetime.datetime.strptime('2018-03-09 08:10:00', '%Y-%m-%d %H:%M:%S') before = set_time - datetime.timedelta(hours=10) after = set_time + datetime.timedelta(hours=10) candlechart(df.loc[(df.index > before )&(df.index < after)]) |
こちらのローソク足チャートは2018/3/9の8:10に丸坊主の部分へズームインしたものです。丸坊主が出る以前も軽い上昇トレンドでしたが、陽線丸坊主が検出された後から勢いの強い上昇トレンドとなっています。
では、逆に陰線丸坊主(-100)もチャート上で確認して見ましょう。今度は2018/3/9 14:50のデータを使います。
1 2 3 4 5 6 7 |
# 陰線丸坊主が検出されたレコード df['Marubozu'].loc['2018-03-09 14:50:00'] -- 出力 -100 |
では同じようにチャートで表示させて見ます。
1 2 3 4 5 6 7 |
# 丸坊主 陰線(下降トレンドが力強い) set_time = datetime.datetime.strptime('2018-03-09 14:50:00', '%Y-%m-%d %H:%M:%S') before = set_time - datetime.timedelta(hours=10) after = set_time + datetime.timedelta(hours=10) candlechart(df.loc[(df.index > before )&(df.index < after)]) |
あれ・・ぜんぜん下降トレンドじゃない。
当然ではありますが、ローソク足のパターンが全てその意味通りに通用する訳ではありません。むしろ、多くのケースで騙し(参考にしてはいけないデータ)です。
ローソク足パターンを使うには、その時々の為替レートのトレンドや値動きを加味した上で使うことがとても重要です!ローソク足パターンはあくまで、参考指標の一つです。
ローソク足パターン その2「包み線」
次は「包み線」と呼ばれるローソク足パターンを見てみましょう。先ほどの丸坊主では一つのローソク足のみでパターンを読みましたが、包み線は2本のローソク足のパターンを読み取ります。

包み線も陰線と陽線の2種類あります。一本目が陰線で二本目が一本目の値幅を完全に含む陽線を陽線の包み線と呼びます。陽線包み線の意味としては、今まで下降トレンドだったのが強い勢いで上昇トレンドに転換する可能性を示唆しています。つまり相場が安値圏の時のみ意味のあるパターンです。
対して一本目が陽線で二本目が陰線の場合は陰線の包み線と呼びます。上昇トレンドだったのが、売りの勢いが強くなり下降トレンドへ転換する可能性を示唆します。相場が高値圏の時にしか意味をなしません。
では、実際に包み線を検出したデータをローソク足チャートで確認してみます。
1 2 3 4 5 6 7 |
# 陽線包み線(値100)、陰線包み線(値-100)をカウントしてみる df['Engulfing_Pattern'][(df['Engulfing_Pattern'] < 0) | (df['Engulfing_Pattern'] > 0)].count() -- 出力 1686 |
思ったよりも多く検出しているみたいです。では、包み線が検出された2018/3/11 18:40のデータの前後をローソク足にして確認してみます。
1 2 3 4 5 6 7 |
# 陽線 包み線 下降トレンドから上昇トレンドへ set_time = datetime.datetime.strptime('2018-03-12 18:40:00', '%Y-%m-%d %H:%M:%S') before = set_time - datetime.timedelta(hours=10) after = set_time + datetime.timedelta(hours=10) candlechart(df.loc[(df.index > before )&(df.index < after)]) |
これは陽線の包み線が意図した通り為替のレートが動いているケースです。包み線が出るまでは下降トレンドで、包み線が出現した後は上昇トレンドへ転換しています。
では次は逆に陰線の包み線を確認してみましょう。3/5 19:40に陰線の包み線が検出されています。
1 2 3 4 5 6 7 |
# 陰線の包み線 上昇トレンドから下降トレンドへ set_time = datetime.datetime.strptime('2018-03-05 19:40:00', '%Y-%m-%d %H:%M:%S') before = set_time - datetime.timedelta(hours=10) after = set_time + datetime.timedelta(hours=10) candlechart(df.loc[(df.index > before )&(df.index < after)]) |
陰線の包み線では高値圏から下降へ転換することを示唆します。確かに陰線包み線が出た直後は下降はしていますが、すぐに上昇へ転換戻っています。騙しですね。
ローソク足パターン その3 「カラカサ」
三つ目のローソク足パターンは「カラカサ」です。これは1つのローソク足の形状を表したパターンです。カラカサも陽線と陰線の2種類あります。

Ta-LibではCDLHAMMER()の関数では陰線のカラカサを検出できます。相場が高値圏の時に陰線のカラカサが出現すると売り転換のシグナルとなります。
では、実際の為替レートとローソク足チャートで確認してみましょう。陰線のカラカサが検出された3/6 21:10のデータを確認してみます。
1 2 3 4 5 6 7 |
# 陰線 カラカサ (高値圏から下降トレンドへ転換) set_time = datetime.datetime.strptime('2018-03-06 21:10:00', '%Y-%m-%d %H:%M:%S') before = set_time - datetime.timedelta(hours=10) after = set_time + datetime.timedelta(hours=10) candlechart(df.loc[(df.index > before )&(df.index < after)]) |
陰線のカラカサが出現前はレートが上昇トレンドであり、高値圏で陰線カラカサが出現した後は下降トレンドへ転換しています。
ローソク足パターン その4 「トンボ」
続いては寄引同時線から「トンボ」という種類のパターンです。寄引同時線とは、始値と終値がほぼ同じ価格(寄りと引きが同時)のローソク足をさします。
始値と終値がほぼ変わらなかったということは、売りと買いのバランスが拮抗していることを示します。寄引同時線にはいくつか種類がありますが、そのうちの「トンボ」を今回は確認してみましょう。

トンボは上ひげがほとんど無く、下ひげが長い寄引同時線です。トンボが高値圏で出現した時は、高値を更新するほどの買いの勢いが衰えた=つまり下降トレンドへ転換することを示唆します。
では、実際に確認してみましょう。トンボが検出された付近のチャートを表示してみます。
1 2 3 4 5 6 7 |
# トンボ set_time = datetime.datetime.strptime('2018-03-29 18:10:00', '%Y-%m-%d %H:%M:%S') before = set_time - datetime.timedelta(hours=10) after = set_time + datetime.timedelta(hours=10) candlechart(df.loc[(df.index > before )&(df.index < after)]) |
トンボが出現した場所ですが、決して高値圏と呼ぶには微妙な位置ではありますが、その後は下降のトレンドが出ているのが確認できます。
まとめと次の課題
いかがでしたでしょうか?今回は為替レートのデータを使って、ローソク足のパターン分析を行ってみました。
ローソク足のパターン分析ですが、万能ではりませんが他のテクニカル指標やトレンドをしっかりと抑えることで、非常に強力なツールとなり得ます。
今回は初歩編として基本的なパターンを4種類確認してみました。Ta-Libには検出可能なローソク足パターンは50種類以上あります。それぞれのパターンを検出して、どのような意味があるのか勉強をしてみてはいかがでしょうか?
また、Ta-Libを使わなくてもローソク足のパターンの意味がわかれば自分でスクラッチでコーディングをすることも可能です。
私が本番のトレードで使っているローソク足パターン分析ですがTa-Libは使っていません。なぜなら、Ta-Libのパターン検出はノイズを拾ってしまうケースがあるからです。
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません