pandas_datareaderからテクニカル分析指標を計算してグラフにしてみる
pandasの拡張モジュールである pandas_datareader
を使うと、株価、為替レート等のデータを簡単に取得できます。
今回は前回記事の続きで、取得データからローソク足チャートを作成して可視化したり、分析指標の計算をやってみようと思います。
今回話さないこと
株式運用に関する用語や、テクニカル指標を使った取引ルールや売買シグナルの見方などについては話しません。
株価取得
コード9432(東証1部)の株価をstooq
という海外サイトへアクセスしてデータを取得します。
import pandas as pd import datetime as dt import numpy as np import pandas_datareader.data as web start = dt.date(2020,9,1) end = dt.date(2020,12,1) code = '9432.JP' df = web.DataReader(code,'stooq',start,end)
printするとこんな感じ
これをmplfinance
を使ってローソク足チャートを作成してみます。
import mplfinance as mpf df = df.sort_index() mpf.plot(df, title='\nNTT(9432)', type='candle', mav=(5, 25), volume=True, savefig='9432_JP.png')
- type='candle'でローソク足を指定
- mav(5, 25)で移動平均線の期間を指定
- volumeで出来高の表示をTrueに
- savefigで保存先のファイル名を指定
補足
mplfinance
が環境にない場合は事前にインストールしておきましょう。
pip install mplfinance
テクニカル分析指標を計算してグラフに追加してみる
MACD
MACDの計算方法は以下とします。
MACD=短期EMA-長期EMA
MACDシグナル=MACDのEMA
※短期EMA=12、長期EMA=26、MACDシグナル=9に設定する場合が多いようです。
\# MACD計算 exp12 = df['Close'].ewm(span=12, adjust=False).mean() exp26 = df['Close'].ewm(span=26, adjust=False).mean() df['MACD'] = exp12 - exp26 \# シグナル計算 df['Signal'] = df['MACD'].rolling(window=9).mean() \# ヒストグラム(MACD - シグナル) df['Hist'] = df['MACD'] - df['Signal'] \# MACDとシグナルのプロット作成 add_plot = [mpf.make_addplot(df['MACD'], color='m', panel=1, secondary_y=False), mpf.make_addplot(df['Signal'], color='c', panel=1, secondary_y=False), mpf.make_addplot(df['Hist'], type='bar', color='g', panel=1, secondary_y=True)] \# チャート表示 mpf.plot(df, title='\nNTT(9432)', type='candle', mav=(5, 25), volume=True, addplot=add_plot, volume_panel=2, savefig='9432_JP.png')
作成したMACDプロットを追加するために、mpf.plot
の引数addplot
にセットします。
一目均衡表
一目均衡表は5本の線を活用したテクニカル指標の一つで、計算式は以下のとおりです。
- 基準線=(当日を含めた過去26日間の最高値+最安値)÷2
- 転換線=(当日を含めた過去9日間の最高値+最安値)÷2
- 先行スパン1={(転換値+基準値)÷2}を26日先行させて表示
- 先行スパン2={(当日を含めた過去52日間の最高値+最安値)÷2}を26日先行させて表示
- 遅行スパン= 当日の終値を26日遅行させて表示
次のコードでは期間を2020/06/01〜2020/12/01の6ヶ月間のチャートに一目均衡表を追加したグラフを表示するコードを書いてみました。
start = dt.date(2020,6,1) end = dt.date(2020,12,1) \# 9、26、52日間のMAX、MIN値の計算 max_9 = df['High'].rolling(window=9, min_periods=1).max() min_9 = df['Low'].rolling(window=9, min_periods=1).min() max_26 = df['High'].rolling(window=26, min_periods=1).max() min_26 = df['Low'].rolling(window=26, min_periods=1).min() max_52 = df['High'].rolling(window=52).max() min_52 = df['Low'].rolling(window=52).min() \# 5本線の計算 df['tenkan'] = (max_9 + min_9)/2 df['base'] = (max_26 + min_26)/2 df['senkou1'] = ((df['tenkan'] + df['base'])/2).iloc[:-26] df['senkou2'] = ((max_52 + min_52)/2).iloc[:-26] df['chikou'] = df['Close'].iloc[:-26] \# 一目均衡表のプロット作成 add_plot = [mpf.make_addplot(df['base'], color='black'), mpf.make_addplot(df['tenkan'], color='red'), mpf.make_addplot(df['chikou'], color='darkorange') ] \# チャート表示 mpf.plot(df, title='\nNTT(9432)', type='candle', mav=(5, 25), volume=True, addplot=add_plot, returnfig=True, fill_between=dict(y1=df['senkou1'].values, y2=df['senkou2'].values, alpha=0.5, color='gray'), volume_panel=1, savefig='9432_JP.png')
RSI
RSI(相対力指数)の計算は以下となります。
- RS=(n日間の終値の上昇幅の平均)÷(n日間の終値の下落幅の平均)
- RSI= 100 - (100 ÷ (RS+1))
n(パラメータ値)は考案者であるJ.W.ワイルダー氏が最適とする“14”(日足)と設定する場合が多いそうです。
\# 終値の差分 df_diff = df['Close'].diff() \# 値上がり幅と値下がり幅 df_up, df_down = df_diff.copy(), df_diff.copy() df_up[df_up < 0] = 0 df_down[df_down > 0] = 0 df_down = df_down * -1 \# 14日間の単純移動平均 sim14_up = df_up.rolling(window=14).mean() sim14_down = df_down.rolling(window=14).mean() \# RSI df['RSI'] = sim14_up / (sim14_up + sim14_down) * 100 \# MACDとRSIのプロット作成 add_plot = [mpf.make_addplot(df['MACD'], color='m', panel=1, secondary_y=False), mpf.make_addplot(df['Signal'], color='c', panel=1, secondary_y=False), mpf.make_addplot(df['Hist'], type='bar', color='g', panel=1, secondary_y=True), mpf.make_addplot(df['RSI'], panel=2)] \# チャート表示 mpf.plot(df, title='\nNTT(9432)', type='candle', mav=(5, 25), volume=True, addplot=add_plot, volume_panel=3, savefig='9432_JP.png')
ローソク足チャート、MACD、RSIの3つのグラフを合わせて表示してみました。
まとめ
pandas_datareaderとmplfinanceを使って手軽に計算、グラフ表示が数行のコードで書けました。
ここまでの基礎ができれば、機械学習に食わせるデータ作りに発展していけるかもですね。