一目均衡表の使い方や計算式、PythonのTheano + Numpy + Pandasを使って書いてみた
こんにちは、新米データサイエンティスト(@algon_fx)です。やっとのこと新期も始まり一週間が終わりました。今週の週末は本業でK近傍法とMatrix Factorizationあたりを使ってデータをゴネゴネしなくてはいけないのですが、一先ず時間を見つけて機械学習FXの勉強もやります。
さて、今日も昨日に引き続き特徴量としてのテクニカル指標シリーズとして、「一目均衡表」(英語:Ichimoku Kinkou Hyou)のざっくりとした使い方や計算式、さらにはPythonのTheano + Numpy + Pandasを使って書いていきます。
【人気記事】
一目均衡表とは?
金融系の指標やチャートなどの起源はロウソク足などを代表例として日本発信のものが実は多いのですが、この一目均衡表も戦前に一目仙人というペンネームの方が開発したテクニカル指標となっています。
一目均衡表の一番コアとなっている考え方として、「為替レートは時間軸に影響して動いている」ということです。つまり、為替レートは過去の値動きの影響を受けており、過去の値動きの周期性やリズム、パターンなどを解析してレートの動きを予測してみようという考えが一目均衡表な訳です。
また一目均衡表が他のテクニカル指標と大きく異なる点として「雲」を使う部分かと。FX業者によっては一目均衡表を「Ichimoku Clowd(一目雲)」と表記があったりします。
一目均衡表の計算方法
為替レートの値動きに対して時間軸で分析をしたのが一目均衡表。計算方法は以外にも難しくなく、単純です。一目均衡表は下記の6つのパーツで構成されます。
転換値 当日を含む過去9日間の高値と安値の中間値


一目均衡表と言えば、この雲ですよね。海外のFX掲示板などを見ていても、「Oh Ichimoku!」的な感じで、よく使われています。では、次は、この一目均衡表の使い方を二つのパートに分けて見て行きましょう。
一目均衡表の使い方
上の計算式を見ればわかりますが、一目均衡表では「高値」と「安値」、さらに「時間軸」が重要な役割を果たしています。例えば単純移動平均は「終値」を基準として計算していましたよね?
一目均衡表のメジャーな使い方ですが、「基準線」「転換線」を変化や位置関係を使う方法と、「雲」をみる方法があります。両方とも簡単に見てみましょう。
基準線と転換線を使う方法
下のチャートですが、一日足に一目均衡表の「基準線(赤)」と「転換線(青)」を表示させたものです。
赤丸の部分に注目をしてみると、為替レート(ロウソク足)が転換線を上から下に突き抜けているのが分かります。つまり過去9日間の高値と安値の中間値を現在のレートが割り込んだ=今が売りだ!売れーーー!って事です。
また、基準線と転換線の「傾き」に注目をする使い方もあります。青矢印の部分では、両方の線ともに下向きとなっています。つまり、過去の安値を更新して現在の相場が下落してる=売れ!!今売るんだ!って事ですよね。
またチャート上に印は付いていませんが、一番右端のレートが途切れる部分で、転換線が基準線を突き破っています。つまり早い指標(転換線9日)が遅い指標(基準線26日)を抜けているので、いわゆる「ゴールデンクロス」=「買いのサイン」ってやつですね。チャートは途切れていますが、確か上昇のトレンドにありそうな値動きをしています。
一目雲の使い方
さて、次は「雲」の使い方について見てみましょう。簡単にいうと、下降トレンド時は雲の上限や加減がレジスタンスゾーンになり、上昇トレンドでは雲がサーポトになるといった使い方をします。
赤矢印の場所をみていただくと、レジスタンス、サポートといった意味が分かりやすいですよね。また、雲と現在の為替レートの位置関係も使われます。下図の赤い雲の部分であ雲お為替レートの幅が大きく開いていますよね?
その後、レートが上昇し始めて、雲と為替レートがぶつかっています(青矢印部分)。このような場合、雲は為替レートの上昇の目安として使われます。つまり、青矢印のポイントからさらに上昇するかどうか見極めが必要だよねっていうシグナルです。
一目均衡表も、色々と考えてみると面白いですよね。機械学習では、先行スパン1と先行スパン2のレンジをとって、現在の為替レートとの距離を特徴量にしてみても面白いかもですね。(適当w)
さて、一目均衡表の使い方も理解出たかと思いますので、次はいよいよPythonで一目均衡表を書いてみましょう。
Python(Theano + Numpy + Pandas)で一目均衡表を書く
では、早速やってみましょう。まず今回使うデータですが、coinmarketcap.comからビットコインのレートをスクレイピングして使います。
まずは必要なライブラリのインポートからしちゃいましょう。使うライブラリは下記です。ローカルでインストールされていない方は、まずはインストールが必要です。
- Pandas(大量なデータを効率よく扱う)
- Numpy(小難しい計算しちゃう)
- Ta-Lib(テクニカル指標をチャチャッと吐き出す)
- theano(もっと難しい計算もしちゃう)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#ライブラリのインポート import pandas as pd import numpy as np import talib as ta ta.get_function_groups import time import datetime import theano from theano import tensor as T from theano import function %matplotlib qt |
1 2 3 4 5 6 7 8 |
# データをスクレイピング bt = pd.read_html("https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20130428&end="+time.strftime("%Y%m%d"))[0] bt = bitcoin_market_info.assign(Date=pd.to_datetime(bitcoin_market_info['Date'])) # データフレームを確認 bt.head() |

参考までにですが、coinmarketcapではAPIも提供しています。またスクレピングに関しても、現状は問題ないと明記してありました。なんて寛容なサイトなんでしょう。
では、早速、本題の一目均衡表をPythonで書いてみましょう。まずは転換値の計算です。転換値は当日を含む過去9日間の高値と安値の中間値でしたね。Pandasで rolling_max と rolling_min という超絶便利な関数があるので、こちらを利用します。計算を処理したら、 tenkan としてPandasのシリーズへ入れてあげましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 転換値を計算 nine_period_high = pd.rolling_max(bt.High, window=9) nine_period_low = pd.rolling_min(bt.Low, window=9) nph = T.dvector('nph') npl = T.dvector('npl') t = ( nph + npl ) / 2 tenkan_func = function([nph, npl], t) tenkan = tenkan_func(nine_period_high, nine_period_low) tenkan = pd.Series(tenkan) #念のため8行〜18行を表示 tenkan[7:17] |
では、次は基準値を計算しましょう。基準値は過去26日間の高値と安値の中間値です。
1 2 3 4 5 6 7 8 9 10 |
# 基準値の計算 twenty_six_period_high = pd.rolling_max(bt.High, window=26) twenty_six_period_low = pd.rolling_min(bt.Low, window=26) tsph = T.dvector('tsph') tspl = T.dvector('tspl') k = ( tsph + tspl ) / 2 kijun_func = function([tsph, tspl], k) kijun = pd.Series(kijun_func(twenty_six_period_high, twenty_six_period_low)) |
次は遅行スパンを計算してあげましょう。遅行スパンは単純に各日付のレートを26日間遅らせた値です。Pandasのシリーズの shift を使ってデータをずらしてあげます。
1 2 3 4 5 |
# 遅行スパンの計算 chikou = pd.Series(bt.Close).shift(-26) chikou[0],bt['Close'][26] |
(9578.6299999999992, 9578.6299999999992)
しっかり元データから26日分ずれていますね。これで遅行スパンもオッケーです。次は先行スパン1と先行スパン2を処理してあげましょう。スパン1は転換線と基準線の中間値を26日先にずらしたもの、スパン2は当日を含む52日間の高値と安値の中間値を26日先にずらしたものでしたね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# 先行スパン1の計算 tenkanS = tenkan.shift(-26) kijunS = kijun.shift(-26) t = T.dvector('t') k = T.dvector('k') sa = (( t + k ) / 2) sen1 = function([t,k], sa) senkou_1 = pd.Series(sen1(tenkanS, kijunS)) #先行スパン2の計算 fifty_two_period_high = pd.rolling_max(bt.High, window=52) fifty_two_period_low = pd.rolling_min(bt.Low, window=52) ftph = T.dvector('ftph') ftpl = T.dvector('ftpl') sb = ( ftph + ftpl ) / 2 sen2 = function([ftph, ftpl], sb) senkou_2 = pd.Series(sen2(fifty_two_period_high, fifty_two_period_low)).shift(26) |
オッケーですね!これで一目均衡表で使われる指標が全て揃いました。今回は今後のことを考えて、各指標をシリーズに切り分けましたが、最後にフレームワークとしてまとめて、簡単にプロットしてみましょう。
1 2 3 4 5 6 7 8 9 10 |
# シリーズからフレームワークへ bt_ichimoku = pd.DataFrame() bt_ichimoku['close'] = bt['Close'] bt_ichimoku['tenkan'] = tenkan bt_ichimoku['kijun'] = kijun bt_ichimoku['chikou'] = chikou bt_ichimoku['senkou_1'] = senkou_1 bt_ichimoku['senkou_2'] = senkou_2 |
本来ならMatplotlibを使って雲も表現してみたいところですが、実際の機械学習では雲は数値なので…面倒なので手を抜きましょう笑。ひとまずPandasの plot() を使って確認してみましょう。
1 2 3 4 |
# ビットコインの一目均衡表をプロット bt_ichimoku.plot(grid=True) |
うわぁ…見辛い。プロットのズーム機能を利用して、一部分をズームインしてみましょう。
まぁ相変わらず見辛い表ですが、Pandasの Plot() のお手軽さに免じてこのままにしておきましょう(嘘です、感謝してます)。
上の赤矢印の部分をみてみると、為替レート(青)が転換線(黄)を上から下に抜けている、つまり売りのサインが出ていますね。実際にその後の為替レート(青)は下降トレンドに転じています。
まとめと次の課題
少し長い記事になりましたが、いかがでしたか?今回の記事では、一目均衡表の計算式や使い方、さらにはPythonのTheano+Numpy+Pandasを使って一目均衡表を書いてみました。
日本発信のテクニカル指標という事もあり、実際に一目雲をみながらトレードされている方も多いかと思います。これが…果たしてFX予測の機械学習の特徴量にどのように約立つかは解りませんが…まぁやり方を覚えておいても損ではないですよね。
以上です!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
大変すばらしい内容で、すごい参考になります。
私もこれがやりたくて0からPython勉強中です。
既に使えないrolling_maxとrolling_min の代わりに以下としました。
nine_period_high = bt[‘High’].rolling(period).max()
nine_period_low = bt[‘Low’].rolling(period).min()