ローソク足分析手法「酒田五法」をPythonで実装する方法
こんばんは、新米データサイエンティスト(@algon_fx)です。相変わらず本業は鬼のように忙しいですが、毎日がやりがいのある仕事で本当に充実しています(別の意味のリア充ですw)。
先日に「ローソク足のパターン分析をPythonを使ってやってみる(初歩編)」という記事を公開したのですが、嬉しいことにTwitterのフォロワーさんからの反応が良かったです。
そこで、本日のネタは「Pythonでローソク足分析 酒田五法」です!
前回は初歩編としてPythonでテクニカル指標が簡単に算出できるTa-libのライブラリのローソク足分析を使いました。Ta-libですが、非常に便利なツールではありますが柔軟にカスタマイズが出来ない点、また計算が所々怪しい点などデメリットもあります。
そこで今回はPythonのみを使ってローソク足を分析する方法です。具体的には「酒田五法」と呼ばれるローソク足分析手法をPythonを使って行う方法をまとめました。
Pythonのちょっとした知識があれば、どなたでも実装が可能です!また本記事はGoogle Colabを使う前提で書かれています。pythonやライブラリの環境構築は不要です。お手持ちのPCとブラウザのみで本記事の全てが実装可能です!(参考:知らないと損をするGoogle Colabの隠し技と基本操作)
ぜひ、プログラミング初心者の方も挑戦してみてください!
ローソク足分析の定番「酒田五法」とは
時代は遡り徳川8代目将軍吉宗の時代、本間宗久という基台の米相場師がおったそうな。え?なに?昔話?って思うかもしれませんが、これガチリアルです。
多くのFXや株の書籍にも載っていますが、ローソク足を開発したのもこの天才相場師の本間氏と言われています。そうなんです、ローソク足の起源はなんと日本なんです!
この天才相場師がローソク足と共に己の相場読みルールと経験を予測法として気づいたのが「酒田五法」です。酒田とは本間氏の出身、山形県の酒田から来ています。なんか感動する話ですよね。
酒田五法ですが、日本のみならず世界中で使われています。五法とあるようにローソク足の分析を「三山」「三川」「三空」「三兵」「三法」と名付けています。
下記をご覧ください。

このようにローソク足のパターンを基準として、相場の動きを予測するものです。酒田五法ですが、下手なテクニカル分析なんかより、使い方をしっかりマスターすればよっぽど役に立ちます。
売買シグナルとして強力な「三兵」
ディープラーニングなんて手法が世の中に出回る遥か昔に考えられた酒田五法ですが、その中でも特に私が気に入っているのが「三兵」です。
三兵とはトレンドを読んだ順張りの売買シグナルです。下の図をみてください。
三兵には2種類あります。右側がローソク足の3つの陽線から成り立つ「赤三兵(あかさんぺい)」と呼ばれるものです。考え方は至極単純です。この赤三兵が安値圏で出現したら、強い上昇のトレンドの発生とみられ「買いのシグナル」となります。
対して右側は3つの陰線から成り立つ「黒三兵(くろさんぺい)」と呼ばれます。これが高値圏で出現した場合、「売りのシグナル」となります。
個人的にはこのシンプルな考えも非常に好きです。実際に安値圏・高値圏で三兵が出現すると、うまく利益が出ることも多々あります(個人談)。
今回はこの酒田五法の「三兵」をPythonを使って実装してみましょう。
STEP1 実行完了とデータ
冒頭でも触れましたが、本記事はGoogle Colabを使う前提で進めます。ブラウザのみで5分もあれば機械学習の実行環境が整います。基本的な使い方は「知らないと損をするGoogle Colabの隠し技と基本操作」をご覧ください。
酒田五法を実装するのに過去為替レートのデータが必要です。下記のリンクからCSVファイルのダウンロード可能です。こちらは私がOANDA FX APIから作成したデータです。
【使うCSVファイル】
usd_10min_api.csv
これで準備完了です!次のステップへ行きましょう。
STEP2 ライブラリとデータの読み込み
Google ColabでJupyterノートブックは立ち上がりましたか?本記事はPython3を使いますので、Google ColabのノートブックのタイプがPython2の方はPython3へ変更しましょう。
まずは酒田語法を算出するのに必要なpythonのライブラリをインポートします。下記のコードをgoogle colabのコードセルへ入力して「Shift + Enter」で実行してください。
1 2 3 4 5 6 7 8 9 10 11 |
# ライブラリのインポート import pandas as pd import numpy as np # ローソク足描写 import matplotlib.pyplot as plt import matplotlib.finance as mpf from matplotlib.finance import candlestick2_ohlc %matplotlib inline |
続いてドル円の過去為替レートのCSVファイルをPythonで読み込みましょう。STEP1でダウンロードしたusd_10min_api.csvをGoogle Colabへアップロードしてから、下記のコードを実行してください。
1 2 3 4 5 6 7 8 |
# データの読み込み df = pd.read_csv("usd_10min_api.csv") # 不要なカラムを削除 del df['Unnamed: 0'] del df['volume'] |
これで為替レートのデータ読み込み完了です。念のためこれらのレートのデータをローソク足チャートに落とし込んでみましょう。
1 2 3 4 5 6 7 |
# ローソク足表示 fig = plt.figure(figsize=(18, 9)) ax = plt.subplot(1, 1, 1) candle_temp = df[1000:1250] candlestick2_ohlc(ax, candle_temp["open"], candle_temp["high"], candle_temp["low"], candle_temp["close"], width=0.9, colorup="r", colordown="b") |
matplotlibのcnadlestick2_ohlcを使うととても簡単にローソク足チャートが引けます。では次のステップへ移りましょう。
STEP3 データの前処理
次は酒田五法の三兵を算出するために、簡単なデータの前処理を行ってあげましょう。読み込んだデータは終値(close)、始値(open)、高値(high)、安値(low)の生データです。
これはOANDAのAPIからドル円の10分足データを取得してCSVに書き出したものです。まずはcloseやらopenとカラム名が長いと面倒なので短くしてあげましょう。
1 2 3 4 5 |
# カラム名を変更 df.columns = ['t', 'c', 'o', 'h', 'l'] df.head() |
1 2 3 4 5 6 7 8 9 |
--出力 t c o h l 0 2018/03/01 15:40:00 106.792 106.817 106.817 106.777 1 2018/03/01 15:50:00 106.766 106.796 106.796 106.738 2 2018/03/01 16:00:00 106.774 106.769 106.822 106.762 3 2018/03/01 16:10:00 106.815 106.777 106.828 106.765 4 2018/03/01 16:20:00 106.844 106.813 106.864 106.809 |
三兵は3つの連続するローソク足を使います。ですので、今現在を基準として10分前(c1)、20分前(c2)、30分前(c3)を算出しましょう。Pandasのshiftメソッドを使うと簡単にデータをずらすことが可能です。
1 2 3 4 5 6 |
# 終値を10〜30分シフトさせる df['c1'] = df['c'].shift(1) df['c2'] = df['c'].shift(2) df['c3'] = df['c'].shift(3) |
続いてローソク足が陰線か陽線かを判断しなくてはいけません。ローソク足の陰線と陽線ですが、下記の図を見るとわかりやすいです。

つまり陰線か陽線かを見分けるには終値だけではなく始値も必要なわけです。先ほどと同じ要領で始値も10〜30分ずらしてあげましょう。
1 2 3 4 5 6 |
# 始値(open)を10〜30分ずらす df['o1'] = df['o'].shift(1) df['o2'] = df['o'].shift(2) df['o3'] = df['o'].shift(3) |
少しデータの可視性を上げるため、カラムの並び替えと不要なカラムの削除を行いましょう。
1 2 3 4 5 6 7 8 9 |
# カラムの並び替えと削除 df = df[[ 't', 'c', 'c1', 'c2', 'c3', 'o', 'o1', 'o2', 'o3','h', 'l' ]] df.head() |
1 2 3 4 5 6 7 8 9 |
--出力 t c c1 c2 c3 o o1 o2 o3 h l 0 2018/03/01 15:40:00 106.792 NaN NaN NaN 106.817 NaN NaN NaN 106.817 106.777 1 2018/03/01 15:50:00 106.766 106.792 NaN NaN 106.796 106.817 NaN NaN 106.796 106.738 2 2018/03/01 16:00:00 106.774 106.766 106.792 NaN 106.769 106.796 106.817 NaN 106.822 106.762 3 2018/03/01 16:10:00 106.815 106.774 106.766 106.792 106.777 106.769 106.796 106.817 106.828 106.765 4 2018/03/01 16:20:00 106.844 106.815 106.774 106.766 106.813 106.777 106.769 106.796 106.864 106.809 |
これで大丈夫そうですね。試しに16:10:00のデータをみてください。この時間の終値(c)は106.815で、10分前(c1)は106.774としっかり時間軸がずれているのが確認できます。
STEP4 安値圏と高値圏の検出方法
酒田五法の説明でも書いた通り「三兵」は安値圏・高値圏のみで効力がある売買シグナルです。つまり、単純に三つの陽線(または陰線)をデータから検出しただけでは意味がありません。
相場の安値・高値をデータから判断する方法はたくさんあります。今回は最もシンプルな考え方の一つ「ボリンジャーバンド」を使うことにしましょう。
ボリンジャーバンドとはFXのテクニカル指標で人気の高い指標の一つです。詳しくは「Pythonでボリンジャーバンドを作る方法」をご覧ください。
ボリンジャーバンドを簡単に説明をすると「上」「真ん中」「下」の線を使い分析する手法です。ボリンジャーバンドの「下」に相場レートが近いと「安値圏」、「上」に近いと「高値圏」と捉えることが可能です。
では、実際に為替レートからボリンジャーバンドを算出してみましょう。今回はボリンジャーバンドの期間を「20」としています。期間はパラメータの一つですので、各自色々と調整してみてください。
1 2 3 4 5 6 7 |
# ボリンジャーバンドの計算 df['mean'] = df['c'].rolling(window=20).mean() df['std'] = df['c'].rolling(window=20).std() df['upper'] = df['mean'] + (df['std'] * 2) df['lower'] = df['mean'] - (df['std'] * 2) |
ボリンジャーバンドは期間20ですので、データの最初の19行にはデータが算出できません。それらのデータを削除して、改めてインデックスを振り直してあげましょう。
1 2 3 4 5 6 |
# 最初の19行を削除してインデックスをリセット df = df[19:] df = df.reset_index(drop=True) df.head() |
1 2 3 4 5 6 7 8 9 |
--出力 c c1 c2 c3 o o1 o2 o3 h l mean std upper lower 0 2018/03/01 18:50:00 106.769 106.741 106.763 106.787 106.740 106.761 106.790 106.760 106.775 106.732 106.79460 0.041563 106.877727 106.711473 1 2018/03/01 19:00:00 106.792 106.769 106.741 106.763 106.767 106.740 106.761 106.790 106.816 106.753 106.79460 0.041563 106.877727 106.711473 2 2018/03/01 19:10:00 106.775 106.792 106.769 106.741 106.789 106.767 106.740 106.761 106.820 106.774 106.79505 0.041285 106.877620 106.712480 3 2018/03/01 19:20:00 106.780 106.775 106.792 106.769 106.773 106.789 106.767 106.740 106.808 106.744 106.79535 0.041146 106.877642 106.713058 4 2018/03/01 19:30:00 106.790 106.780 106.775 106.792 106.783 106.773 106.789 106.767 106.816 106.777 106.79410 0.040896 106.875893 106.712307 |
これで大丈夫そうですね。念のためボリンジャーバンドがしっかり算出できているかローソク足チャートに落とし込んでみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# ローソク足表示 with MACD fig = plt.figure(figsize=(18, 9)) ax = plt.subplot(1, 1, 1) candle_temp = df[550:750] candle_temp = candle_temp.reset_index() candlestick2_ohlc( ax, candle_temp["o"], candle_temp["h"], candle_temp["l"], candle_temp["c"], width=0.9, colorup="r", colordown="b" ) ax.plot(candle_temp['mean']) ax.plot(candle_temp['upper']) ax.plot(candle_temp['lower']) |
大丈夫そうですね!上が黄色線、真ん中が青線、下が緑線です。相場が黄色線に近づくと高値圏(下がる可能性が高い)、逆に相場が緑線に近づくと安値圏(上がる可能性が高い)を表しています。
上のローソク足チャートもそのような傾向がみて取れます。
STEP5 酒田五法 赤三兵を検出する
データの簡単な前処理、さらに高値圏・安値圏をデータとして扱えるようにボリンジャーバンドの値を算出しました。
いよいよ本題でもある酒田五法の三兵をデータから検出してみましょう。今回は安値圏で陽線が三つ並ぶ「赤三兵=買いシグナル」を検出します。
三兵の検出ルールとして2つ考えましょう。赤三兵の一つ目のルールが「安値圏」です。今回はシンプルに赤三兵の最初のローソク足の終値がボリンジャーバンドの下線よりも低いというルールとします。
ボリンジャーバンドの下線よりも低い、つまり相場が安値圏に入っている可能性がある、という考えです。ではPythonでそのルールを実装してあげましょう。
1 2 3 4 5 6 |
# ルールその1 C3 < lower df['rule_1'] = 0 rule_1_mask = df['c3'] < df['lower'] df['rule_1'][rule_1_mask] = 1 |
ルールその1として、赤三兵の最初のローソク足の終値(C3)がボリンジャーバンドの下線(lower)よりも値が低ければ「1」、高ければ「0」となるように算出しました。
続いて、ルールその2です。赤三兵は「3つの陽線が出現する」という大事なルールがあります。陽線というのは、データで表すと「始値 – 終値 = 負の数」です。では、ルール2もデータから算出してみましょう。
1 2 3 4 5 6 |
# ルールその2 df['rule_2'] = 0 rule_2_mask = (df['o'] - df['c'] < 0) & (df['o1'] - df['c1'] < 0) & (df['o2'] - df['c2'] < 0) df['rule_2'][rule_2_mask] = 1 |
醜いコードですが我慢ください(笑)。何事も最初は泥臭く書くことで、細かい調整などができるわけです。上のコードでは20分前、10分前、現在の10分足が続けて三連続で陽線であれば「1」、一つでも条件が外れたら「0」となります。
これで酒田五法の赤三兵の算出は完了です!次のステップで結果を確認してみましょう!
STEP6 検出した赤三兵をローソク足チャートで確認
前のステップで赤三兵を算出する2つのルールを作ってデータ解析を行いました。では、実際に赤三兵が算出できているのかローソク足チャートを使って確認してみましょう。
データからルール1とルール2が該当するレコードを探します。つまり「安値圏(ボリンジャーバンドの下線より下)で3つの陽線が出現する箇所」です。
1 2 3 4 |
# ルール1とルール2が該当するレコードを探す df[(df['rule_1'] == 1.0) & (df['rule_2'] == 1.0)][0:5] |
1 2 3 4 5 6 7 8 9 |
--出力 t c c1 c2 c3 o o1 o2 o3 h l mean std upper lower rule_1 rule_2 1421 2018/03/15 14:40:00 105.935 105.893 105.850 105.811 105.891 105.853 105.809 105.957 105.953 105.873 105.97235 0.061012 106.094374 105.850326 1 1 1527 2018/03/16 08:20:00 106.347 106.340 106.314 106.298 106.343 106.315 106.300 106.333 106.376 106.343 106.33935 0.020374 106.380097 106.298603 1 1 1820 2018/03/20 09:10:00 106.062 106.055 106.025 105.946 106.053 106.026 105.948 105.978 106.085 106.013 106.03850 0.032615 106.103730 105.973270 1 1 3073 2018/03/31 02:00:00 106.230 106.224 106.221 106.207 106.226 106.223 106.209 106.228 106.231 106.212 106.22465 0.006983 106.238617 106.210683 1 1 3581 2018/04/05 15:00:00 106.924 106.908 106.877 106.863 106.910 106.880 106.861 106.922 106.924 106.877 106.93765 0.034355 107.006359 106.868941 1 1 |
2つの条件が該当するレコードが見つかりましたね!では試しにいくつかローソク足チャートで出してみましょう。まずは2018/03/20 09:10:00の前後を確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 酒田五法 赤三兵の確認 その1 fig = plt.figure(figsize=(18, 9)) ax = plt.subplot(1, 1, 1) candle_temp = df[1800:1840] candle_temp = candle_temp.reset_index() candlestick2_ohlc( ax, candle_temp["o"], candle_temp["h"], candle_temp["l"], candle_temp["c"], width=0.9, colorup="r", colordown="b" ) ax.plot(candle_temp['mean']) ax.plot(candle_temp['upper']) ax.plot(candle_temp['lower']) #ax.plot(candle_temp['lowmd']) |
おおおお!これは感動ですね!見事、安値圏と思われる位置で赤三兵を検出して、シグナル通り相場は上昇しているのが確認できます。
では、別のレコードも確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 酒田五法 赤三兵の確認 その2 fig = plt.figure(figsize=(18, 9)) ax = plt.subplot(1, 1, 1) candle_temp = df[3053:3093] candle_temp = candle_temp.reset_index() candlestick2_ohlc( ax, candle_temp["o"], candle_temp["h"], candle_temp["l"], candle_temp["c"], width=0.9, colorup="r", colordown="b" ) ax.plot(candle_temp['mean']) ax.plot(candle_temp['upper']) ax.plot(candle_temp['lower']) #ax.plot(candle_temp['lowmd']) |
こちらもばっちしです!一つ目よりギリギリな赤三兵(特に真ん中が)でしたが、シグナル通りその後の相場はしっかり上がっているのが確認できます!
まとめと次の課題
如何でしたでしょうか?今回はPythonとドル円の為替レートのデータを使って、ローソク足分析の酒田五法の「三兵」を検出する方法をやってみました。
今回紹介した手法はあくまで初歩中の初歩です。自動売買ロジックや機械学習FXで活用するには、より深くデータを解析して実装する必要があります。
検証するポイントとしては、「赤三兵の陽線の度合い(始値と終値の差分)」や「高値圏・安値圏の算出方法」などがあります。今回は単純にボリンジャーバンドの下線を安値圏と決めましたが、これが最善な手法ではありません。
FXで機械学習を使うための初心者向けチュートリアルもまとめています!Pythonの初歩的な知識があれば実装が可能ですので、興味がある方は是非ご覧ください!
決定木を使ってFX予想をやってみる
FXトレードでロジスティック回帰を独自テクニカル指標として活用する方法
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません