プログラミグ学習のモチベーションをキープするには目標を明確に描くことです。 どのようなところに就職したいのか?そのために必要なスキルは何か?そういったことをゴールから逆算することです。 私自身もリクルートへ転職できたのも2年前からそれらを設計していたからです。 現在の自分の実力を知る意味でも「マイナビIT AGENT」にご登録して、プロに無料相談してみてはいかがでしょうか?

SE・プログラマーの転職『マイナビエージェント×IT』

【Pythonでファイナンス分析(株・FX)】日本発祥のテクニカル指標「一目均衡表」の作成方法

一目均衡表

前回までの動画で、ボリンジャーバンドやMACD、RSIといったテクニカル指標を紹介しました。
また、mplfinanceというライブラリを使ってローソク足の作成も行いました。
今回は、日本発祥のテクニカル指標、一目均衡表の作成方法を紹介します。
mplfinanceを使ったローソク足も同時に作成していくので、mplfinanceについて詳しく知りたい方は、前回の動画もご覧ください。

では、一目均衡表について簡単に説明します。

一目均衡表とは、日本発祥のテクニカル指標の一つです。
見た目は少し複雑ですが、主に4つの要素で構成されています。
基準線、転換線、先行スパン、遅行線です。
基準線とは、過去26日間の最高値と最安値の平均を結んだ線です。
例えば、過去26日間の最高値が1000円で最安値が100円だったとすると、その平均は550円なので550円が基準値となります。
この基準値を結んでいくことで基準線になります。
転換線は同様に、過去9日間の最高値と最安値の平均を結んだ線です。
そして、2本の先行スパンに挟まれた領域を雲と呼びます。
ローソク足が雲の上にある時は上昇トレンド、雲の下にある時は下降トレンドであると判断できます。
また、先行スパンが交わるところは雲のねじれとも呼ばれ、トレンドの転換が予測されます。
遅行線は、売り買いのタイミングを判断することができます。
例えば、遅行線がローソク足を上回った場合は買いのタイミング、逆に下回った場合を売りのタイミングと判断できます。

参考:
一目均衡表とは https://info.monex.co.jp/technical-analysis/indicators/004.html
一目均衡表とは https://min-fx.jp/market/main-technicals/ichimoku/
計算方法 https://doz13189.hatenablog.com/entry/2016/10/04/235410

ライブラリインポート

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import mplfinance as mpf
from pandas_datareader import data

では早速、ライブラリをインポートしていきましょう。
まず、pandasをpdという名前でインポートします。
続いてmatplotlibをpltという名前でインポート。
jupyterlab上にグラフを表示させるための記述もします。
そして、前回使用したmplfinanceもインポートします。
最後に、pandas datareaderです。
実行します。
インポートが完了しました。

データ取得

start = '2019-11-01'
end = '2020-11-01'

df = data.DataReader('^N225','yahoo', start, end)

date = df.index

続いて、データを取得するための記述をしていきます。
詳しい説明は、前回までの動画をご覧ください。
今回は、2019年11月1日から1年間の日経平均株価を取得します。
dateという変数には、インデックスの日付を代入します。
実行します。

df.head()

データの中身を確認してみましょう。
データが取得できているようです。

一目均衡表で使用するデータのカラムを追加する

・基準線

high = df['High']
low = df['Low']

max26 = high.rolling(window=26).max()
min26 = low.rolling(window=26).min()

df['basic_line'] = ( max26 + min26 ) / 2

まずは、基準線に使用するデータを作成していきましょう。
highという変数に、データーフレームのHighを、lowという変数にはデータフレームのLowを代入します。
基準線のデータ作成には、pandasのrollingメソッドを使います。
max26という変数に、過去26日間の最高値を代入する記述をします。
先ほど変数に設定したhighと書いてドット、rolling丸括弧の中のwindowという引数に日数を指定します。
26を代入します。
最後に、最大値を意味するmaxを書いて丸括弧です。
同様に最安値の記述もします。
basicアンダーバーlineというカラムに基準線のデータを代入しましょう。
先ほど説明をしましたが、基準線は過去26日間の最高値と最安値の平均を結んだ線です。
従って、最高値のmax26と最安値のmin26を足して、2で割ります。
実行します。

df.tail()

カラムが追加されているか、確認してみましょう。
基準線のカラムが追加されているようです。

plt.figure(figsize=(16,6))
plt.plot(df['basic_line'], label='basic')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
plt.show()

作成した基準線を、matplotlibでグラフにしてみましょう。
matplotlibの詳しい解説は、matplotlib seaborn入門コースをご覧ください。
実行します。
基準線のグラフを作成できました。

・転換線

high9 = high.rolling(window=9).max()
low9 =  low.rolling(window=9).min()

df['turn_line'] = ( high9 + low9 ) / 2

続いて、転換線に使用するデータを作成します。
転換線は、過去9日間の最高値と最安値の平均を結んだ線です。
従って、windowイコール9とします。
turnアンダーバーlineというカラムに転換線のデータを代入します。
実行します。

df.tail()

カラムが追加されているか確認してみましょう。
転換線のカラムが追加されているようです。

plt.figure(figsize=(16,6))
plt.plot(df['basic_line'], label='basic')
plt.plot(df['turn_line'], label='turn')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
plt.show()

先ほどの、基準線のグラフに転換線も追加してみましょう。
実行します。
このようになりました。

・雲(先行スパン1、先行スパン2)

df['span1'] = (df['basic_line'] + df['turn_line']) / 2

次に、一つ目の先行スパンのデータを作成していきます。
これを先行スパン1とします。
先ほど作成した基準線と転換線の平均が、先行スパン1となります。
これをspan1というカラムに代入します。
実行します。

high52 = high.rolling(window=52).max()
low52 =  low.rolling(window=52).min()

df['span2'] = ( high52 + low52 ) / 2

続いて、二つ目の先行スパンのデータを作成していきます。
これを先行スパン2とします。
過去52日間の最高値と最安値の平均が先行スパン2となります。
まず、過去52日間の最高値と最安値のデータを、それぞれhigh52とlow52という変数に代入します。
ここでも、pandasのrollingメソッドを使ってデータを作成します。
さらに、作成された過去52日間の最高値と最安値の平均をspan2というカラムへ代入します。
これで先行スパン2のデータが完成しました。

df.tail()

tailで確認してみましょう。
カラムが追加できているようです。

plt.figure(figsize=(16,6))
plt.plot(df['basic_line'], label='basic')
plt.plot(df['turn_line'], label='turn')
plt.fill_between(date, df['span1'], df['span2'], facecolor="gray", alpha=0.5, label="span")
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
plt.show()

作成した二本の先行スパン、つまり雲のグラフも追加してみましょう。
二本のラインに挟まれた領域を塗りつぶすには、matplotlibのfill betweenというメソッドを使用します。
第一引数には、x軸の日付date、第二引数には先行スパン1のデータ、第三引数には先行スパン2のデータを渡します。
塗りつぶしの色を、facecolorで指定します。
今回はgrayとします。
alphaで塗りつぶしの透明度を指定できます。
ここでは0.5とします。
実行します。
雲を追加できました。

・遅行線

df['slow_line'] = df['Adj Close'].shift(-25)

続いて、遅行線のデータを作成していきます。
当日の終値を26日遅らせてプロットしたものが遅行線となります。
shiftと記述することで、日にちをずらすことができます。
当日を含めて26日前なので、丸括弧の中にはマイナス25を記述します。
これを、slowアンダーバーlineというカラムに代入しましょう。
実行します。

df.head()

headで確認してみます。
カラムが追加されているようです。

plt.figure(figsize=(16,6))
plt.plot(df['basic_line'], label='basic')
plt.plot(df['turn_line'], label='turn')
plt.fill_between(date, df['span1'], df['span2'], facecolor="gray", alpha=0.5, label="span")
plt.plot(df['slow_line'], label='slow')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
plt.show()

遅行線もグラフにプロットしてみましょう。
実行します。
遅行線が追加されました。

ローソク足

mpf.plot(df,type='candle',figsize=(16,6),style='classic', xrotation=0)

最後に、mplfinanceで作成したローソク足を追加します。
前回の動画で、mplfinanceを使ってローソク足を作成しました。
詳しくは前回の動画をご覧ください。
実行します。
ローソク足はこのようになっています。

ローソク足に、これまで作成してきた基準線や転換線を全てプロットしてみましょう。

基準線、転換線、雲、遅行線の追加

lines = [mpf.make_addplot(df['basic_line']), #基準線
        mpf.make_addplot(df['turn_line']),   #転換線
        mpf.make_addplot(df['slow_line']),   #遅行線
       ] 

labels = ["basic","turn","slow","span"]

fig, ax = mpf.plot(df, type='candle', figsize=(16,6), style='classic', xrotation=0, addplot=lines, returnfig=True,
                  fill_between=dict(y1=df['span1'].values, y2=df['span2'].values, alpha=0.5, color='gray') ) 
ax[0].legend(labels)
plt.show()

# mplfinanceに凡例を追加する方法は現状これしかないようです(https://github.com/matplotlib/mplfinance/issues/181)
# mplfinanceのfill_between(https://github.com/matplotlib/mplfinance/blob/master/examples/plot_customizations.ipynb)

mplfinanceのグラフにデータを追加していく方法は、前回の動画で詳しく解説していますので、まだの方はそちらをご覧ください。
基準線、転換線、遅行線のカラムをaddplot丸括弧の中に記述し、linesという変数に代入します。
labelsという変数には、凡例にしたい名前を配列で設定します。
mpfドットplot、丸括弧の中身を記述していきます。
デフォルトではx軸の日付のラベルが斜めに表示されてしまうのて、xrotationイコール0とすることで水平に戻します。
addplotには、先ほど変数で設定したlinesを記述します。
mplfinanceのグラフに凡例を追加するためには、returnfigイコールTrueと記述する必要があります。
また、mplfinanceにはmatplotlibと同じくfill betweenのメソッドが用意されています。
fill betweenと書いてイコール、dict丸括弧の中の第一引数には先行スパン1のカラム、第二引数には先行スパン2の記述をします。
最後に、凡例を追加する記述をして、実行します。
一目均衡表が完成しました。

fig保存

lines = [mpf.make_addplot(df['basic_line']), #基準線
        mpf.make_addplot(df['turn_line']),   #転換線
        mpf.make_addplot(df['slow_line']),   #遅行線
       ] 

labels = ["basic","turn","slow","span"]

fig, ax = mpf.plot(df, type='candle', figsize=(16,6), style='classic', xrotation=0, addplot=lines, returnfig=True,
                  fill_between=dict(y1=df['span1'].values, y2=df['span2'].values, alpha=0.5,color='gray'), savefig='ichimoku.png' ) 
ax[0].legend(labels)

最後にグラフを保存しましょう。
mpf.plotの丸括弧の中に、savefigと記述しイコール、好きな名前をシングルコーテーションでくくります。
今回はpng形式のファイルで保存してみます。
他にも、pdfやjpegなどを指定できます。
実行します。
グラフが保存されました。

参考:
rollingメソッドについてhttps://note.nkmk.me/python-pandas-rolling/
fill_betweenメソッドについてhttps://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.fill_between.html

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」

Jupyter Labのファイルはこちら