pandas_datareaderからテクニカル分析指標を計算してグラフにしてみる

2021.04.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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本の線を活用したテクニカル指標の一つで、計算式は以下のとおりです。

  1. 基準線=(当日を含めた過去26日間の最高値+最安値)÷2
  2. 転換線=(当日を含めた過去9日間の最高値+最安値)÷2
  3. 先行スパン1={(転換値+基準値)÷2}を26日先行させて表示
  4. 先行スパン2={(当日を含めた過去52日間の最高値+最安値)÷2}を26日先行させて表示
  5. 遅行スパン= 当日の終値を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(相対力指数)の計算は以下となります。

  1. RS=(n日間の終値の上昇幅の平均)÷(n日間の終値の下落幅の平均)
  2. 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を使って手軽に計算、グラフ表示が数行のコードで書けました。

ここまでの基礎ができれば、機械学習に食わせるデータ作りに発展していけるかもですね。