9
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Python]TA-Libとmplfinaneで、株価とテクニカル指標をグラフ化する

Posted at

はじめに

株価を見るのに、ローソク足に、線を入れたり、オシレータで見たりしたかったので、テクニカル分析ライブラリのTA-Libと、ファイナンスグラフライブラリのmplfinanceでグラフ表示する方法をまとめておきます。

環境

  • Windows 10 home
  • Python(3.7.3)
  • JupyterLab(3.06)
  • TA-Lib(0.4.17)
  • investpy(1.0.3)
  • mplfinance(0.12.7a0)

準備

mplfinanceはpipでインストールします。

pip install mplfinance 

テクニカルを計算するのに、TA-Libを利用します。pipでインストールします

pip install TA-Lib

それぞれimportしておきます。また、データ加工にpandasを利用するのでこれもimportします。

import mplfinance as mpf
import talib as ta
import pandas as pd

サンプルデータ

以前にinvestpyの記事を書いたので、investpyで入手したソニーの株価を表示します。

import investpy
stock_sony = investpy.get_stock_historical_data(stock='6758', country='japan', from_date='01/03/2021', to_date='30/04/2021')

株価を表示する

データは、columnsに'Open', 'High', 'Low', 'Close', Volume'を持っているデータを前提とします。

デフォルトで表示する

mpf.plotで表示させます。デフォルトの設定だと, ohlcバーチャートが表示されます。

mpf.plot(stock_sony)

ohlc_bar_chart.png

ローソク足で表示する

mpf.plotの引数にtype='candle'を指定すると、ローソク足で表示することができます。

mpf.plot(stock_sony, type='candle')

candle.png

出来高を表示する

データに'Volume'列があれば、mpf.plotの引数にvolume=Trueと指定すると、出来高を表示することができます。

mpf.plot(stock_sony, type='candle', volume=True)

volume.png

表示スタイルを変更する

表示スタイルを変えるには、mpf.plotの引数にstyle=を与えます。webページを参考に、好みのstyleを指定しましょう。利用可能なstyleはmpf.available_styles() で出力できます。

mpf.plot(stock_sony, type='candle', style='mike')

mike.png

線を表示させる

移動平均線を入れる

(単純)移動平均を追加するには、mpf.plotの引数にmavを指定します。 tupleかlistで与えれば、複数の期間の移動平均線を出力できます。例では、5と21期間の移動平均線を出力しています。

mpf.plot(stock_sony, type='candle', mav=(5,21))

ma.png

水平線を入れる

mpf.plotの引数にhlines=を指定します。tupleで与えると、複数の線が引けます。各線の線種や色を変えたい場合は、dict形式でlinestyle, widths, colorsを記述します。

#hlinesにtupleで与える
mpf.plot(stock_sony, type='candle', hlines=(10600, 12500))
#hlinesにdictで与える
mpf.plot(stock_sony, type='candle', hlines={'hlines':[10600, 12500], 'linestyle':'dashdot', 'linewidths':[1,10], 'colors':['y', 'g']})

hline.png
hline2.png

トレンドラインを入れる

mpf.plot引数のtlines=に、dict形式で与えます。tlinesキーに、listの日付を与えると、各日付を結ぶ直線を引いてくれます。tline_useキーで指定日付のどの値(終値とか)を参照するかを指定します。linestyle, widths, colorsキーを記載すると、線種、線幅、色を指定することができます。トレンドラインを延長したり、2点のうち一方は安値、もう一方の日は高値を結ぶといった細かなことはできないようです(2021/05時点)。

mpf.plot(stock_sony, type='candle', tlines={'tlines':[('2021/01/30', '2021/04/24')], 'tline_use':['open'], 'linestyle':'dotted', 'linewidths':0.5, 'colors':'c'})

tline2.png

好きな線を入れる

mpf.plotalines=を指定すると、tupleにした日付と株価ペアの2点を結ぶ直線を描くことができます。2点だけでなく3点以上のペアを与えると、各点をつなぐ折れ線を作成します。これもdict形式で与えると、線種、線幅、色を変更することができます。

#線種・線幅・色指定なし。2点のペア
mpf.plot(stock_sony, type='candle', alines=[('2021/02/15', 12800), ('2021/03/19',10500)])
#dictで線種・線幅・色指定し、3点のペアを与える
mpf.plot(stock_sony, type='candle', alines={'alines':[('2021/02/15', 12800), ('2021/03/19',10500), ('2021/04/01', 12400)], 'linestyle':'dashed', 'linewidths':1, 'colors':'k'})

aline.png
aline_multi.png

ボリンジャーバンドを追加する

ボリンジャーバンドの線を追加します。ボリンジャーバンドは、talibで計算したものを利用します。例で、追加するボリンジャーバンドは2σの線です。ボリンジャーバンドを追加するには、mpf.make_addplotで作成したオブジェクトを mpf.plotの引数にaddplot=で与えます。

# TA-Libによるボリンジャーバンド計算
bb_2_upper, bb_2_mid, bb_2_lower = ta.BBANDS(stock_sony.Close, timeperiod=21, nbdevup=2, nbdevdn=2, matype=0)#period:移動平均線期間、nbdevup:上側バンド幅(デフォルト2σ)、nbdevdn:下側バンド幅(デフォルト2σ) matype:移動平均線の種類(0:単純移動平均線)
#ボリンジャーバンドの線をまとめる
bbands_2s = pd.concat([bb_2_upper, bb_2_mid, bb_2_lower], axis=1)
#プロット作成
addplot_2s = mpf.make_addplot(bbands_2s)
#株価に2σのボリンジャーバンドを表示
mpf.plot(stock_sony, type='candle', addplot=addplot_2s)

bbands.png

ボリンジャーバンドの複数の線を追加して、線種・線幅・色を変える

複数の線を追加する場合は、mpf.plotaddplot=に、mpf.make_addplotで作成した複数のオブジェクトをlist化して与えます。この例では、2σに加えて3σのボリンジャーバンドを追加します。mpf.make_addplotでは、線種はlinestyle=、線幅はwidth=、色はcolor=で変更します。

#3σのバンドを計算する
bb_3_upper, bb_3_mid, bb_3_lower = ta.BBANDS(stock_sony.Close, timeperiod=21, nbdevup=3, nbdevdn=3, matype=0)
bbands_3s = pd.concat([bb_3_upper, bb_3_lower],axis=1)
#2σバンド
addplot_2s = mpf.make_addplot(bbands_2s, linestyle='dashed', width=0.4, color='b')
#3σバンド
addplot_3s = mpf.make_addplot(bbands_3s, linestyle='dashdot', width=1.0, color='m')
#センターライン 2σの計算時のものを利用
addplot_mid = mpf.make_addplot(bb_2_mid, linestyle='-', width=1.0, color='y')
#株価に2σと3σのボリンジャーバンド表示
mpf.plot(stock_sony, type='candle', addplot=[addplot_2s, addplot_3s, addplot_mid])

line3.png

株価にオシレータを追加する

MACDを表示する

代表的なオシレータであるMACDを表示させます。TA-Libで計算します。期間は短期12、長期26、シグナル9と標準のものにしました。

mpf.make_addplotを使って、グラフを追加します。mplfinanceにグラフ領域を追加する場合は、mpf.make_addplotの引数にpanel=を指定します。また、secondary_y=を指定して、左右どちらの軸をy軸にするかを指定します。(指定しないと線やヒストグラムがずれました)

#TA-LibによるMACD計算
macd, macdsignal, macdhist = ta.MACD(stock_sony.Close, fastperiod=12, slowperiod=26, signalperiod=9)
#ヒストグラムのプラス側とマイナス側の分離
macdhist_plus = macdhist.where(macdhist>=0, 0)
macdhist_minus = macdhist.where(macdhist<0, 0)
#MACDプロット設定
oscilator_macd = [
    mpf.make_addplot(macdsignal, color='c', width=1, panel=1, secondary_y=False),
    mpf.make_addplot(macd, color='m', width=1, panel=2, secondary_y=False),
    mpf.make_addplot(macdhist_plus, type='bar', color='r', panel=1, secondary_y=True),
    mpf.make_addplot(macdhist_minus, type='bar', color='b', panel=1, secondary_y=True),
                 ]
#株価とMACD表示
mpf.plot(stock_sony, type='candle', volume=True, addplot=oscilator_macd)

macd.png

ストキャスティクスを表示する

買いすぎや売られすぎを判断するストキャスティクスを表示させます。MACDと同様に、TA-Libで計算した数値をmpf.make_addplotを使って、グラフ化します。

#TA-Libでストキャスティクスを計算
slowk, slowd = ta.STOCH(stock_sony.High, stock_sony.Low, stock_sony.Close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
#買われすぎ、売られすぎを判断する80%と20%の基準線を作成
line_80 = pd.Series([80]*len(slowk), index=slowk.index)
line_20 = pd.Series([20]*len(slowk), index=slowk.index)
#ストキャスティクスのプロット作成
oscilator_stoch = [
    mpf.make_addplot(slowk, color='c', width=1, panel=1, ylim=(0,100)),
    mpf.make_addplot(slowd, color='m', width=1, panel=1, ylim=(0, 100)), 
    mpf.make_addplot(line_80, linestyle='dotted', color='r', width=1, panel=1),
    mpf.make_addplot(line_20, linestyle='dotted', color='r', width=1, panel=1)
                 ]
#株価とストキャスティクスを表示
mpf.plot(stock_sony, type='candle', addplot=oscilator_stoch)

stoch_slow.png

複数のオシレータを表示する

mpf.make_addplotの引数panel=を変更すると、表示グラフを増やすことができます。mpf.plotvolume=Trueにした場合、出来高がpanel=1になるので、mpf.make_addplotで追加したい図はpanel=2以降に指定します。

oscilator_mix = [
    #MACD
    mpf.make_addplot(macdsignal, color='c', width=1, panel=2, secondary_y=False),
    mpf.make_addplot(macd, color='m', width=1, panel=2, secondary_y=False),
    mpf.make_addplot(macdhist_plus, type='bar', color='r', panel=2, secondary_y=True),
    mpf.make_addplot(macdhist_minus, type='bar', color='b', panel=2, secondary_y=True),
    #ストキャスティクス   
    mpf.make_addplot(slowk, color='c', width=1, panel=3, ylim=(0, 100)),
    mpf.make_addplot(slowd, color='m', width=1, panel=3, ylim=(0, 100)), 
    mpf.make_addplot(line_80, linestyle='dotted', color='r', width=1, panel=3),
    mpf.make_addplot(line_20, linestyle='dotted', color='r', width=1, panel=3)
                 ]

mpf.plot(stock_sony, type='candle', volume=True, addplot=oscilator_mix)

mix.png

作成した図を保存する

作成した図を保存した場合、mpf.plotの引数savefig=でファイル名を指定します。JupyterLab(or Jupyter Notebook)で表示する場合、savefig=を指定すると、JupyterLab上のグラフが消えますが、closefig=Falseをつけると、JupyterLab上に表示されたままになります。

graphs =[
    #ボリンジャーバンド
    mpf.make_addplot(bbands_2s, linestyle='dashed', width=0.4, color='b')
    mpf.make_addplot(bbands_3s, linestyle='dashdot', width=1.0, color='m')
    mpf.make_addplot(bb_2_mid, linestyle='-', width=1.0, color='y')
    #MACD
    mpf.make_addplot(macdsignal, color='c', width=1, panel=2, secondary_y=False),
    mpf.make_addplot(macd, color='m', width=1, panel=2, secondary_y=False),
    mpf.make_addplot(macdhist_plus, type='bar', color='r', panel=2, secondary_y=True),
    mpf.make_addplot(macdhist_minus, type='bar', color='b', panel=2, secondary_y=True),
    #ストキャスティクス
    mpf.make_addplot(slowk, color='c', width=1, panel=3, ylim=(0, 100)),
    mpf.make_addplot(slowd, color='m', width=1, panel=3, ylim=(0, 100)), 
    mpf.make_addplot(line_80, linestyle='dotted', color='r', width=1, panel=3),
    mpf.make_addplot(line_20, linestyle='dotted', color='r', width=1, panel=3)
]
#グラフ表示して、保存する。
mpf.plot(stock_sony, type='candle', volume=True, addplot=graphs, savefig='graph.png', closefig=False)

graph.png

参考

https://github.com/matplotlib/mplfinance#usage
https://mrjbq7.github.io/ta-lib/
https://saturday-in-the-park.netlify.app/TradingTools/06_PlotDailyChart/

9
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?