Pythonを使ってローソク足を作成する方法

Google Colab

前回、ローソク足の基本的な読み方について学びました。
読み方がわからないという方は以下記事を参考にしてみてください。

株初心者でも分かるローソク足の見方
本記事では、ローソク足の読み方について初心者でも分かるように説明しています。 ローソク足を読めるかどうかは、株式投資をする上でかかせないスキルになるので、ぜひ本記事でマスターしましょう。

今回は、Pythonを使ってローソク足を作成してみたいと思います。
作成方法は、以下2つのライブラリを使った作成方法を紹介します。

  • matplotlib
  • plotly

実行環境はgoogle colaboratoryを使っていきます。
google colaboratoryって何??という方はこちらの記事を参考にしてみてください。

5分で分かるGoogle Colaboratoryの使い方
無料でGPUを使うことができる、Google Colaboratoryの必要最低限の機能紹介、利用方法について紹介してます。

matplotlibを使ったローソク足作成

matplotlibのfinacneというmoduleを使うことで、ローソク足を作成することが可能です。
それでは、さっそくコードを見ていきます。

# coding:utf-8
import pandas_datareader.data as web
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.finance as plf
plt.style.use('ggplot')
# jupyter notebookを使用の場合は以下記述
# %matplotlib inline

# 株価データの取得
df = web.DataReader('F', 'iex', dt.datetime(2018, 8, 1), dt.datetime(2018, 10, 24))

# matplotlibでローソク足作成
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(1,1,1)
plf.candlestick2_ohlc(ax, opens=df.open, closes=df.close,lows=df.low, highs=df.high,
                        colorup='r', colordown='b', width=0.8)

jupyter notebookを使っている方はnotebook内でプロットできるようマジックコマンド %matplotlib inline を忘れずにつけておきましょう。
ちなみにgoogle colabを使う場合は必要ありません。

株価データの取得には、今回は pandas_datareaderを使います。
※ google colabを使う場合は、! pip install pandas-datareader でインストールできます。
また、quandle等を使った株価データ取得方法に関しては、以下記事を参考にしてください。

Pythonで株価データを取得する方法
本記事では、Pythonのライブラリであるquandlとpandas_datareaderを使用した株価データの取得方法について紹介しています。

取得した株価データを見てみましょう。

さてローソク足作成の部分ですが、matplotlib.financecandlestic2_ohlc を使います。

plf.candlestick2_ohlc(ax, opens=df.open, closes=df.close,lows=df.low, highs=df.high,
                        colorup='r', colordown='b', width=0.8)

引数には、始値、終値、安値、高値をそれぞれ指定してあげます。colorupは陽線の色、colordownで陰線の色の指定が可能です。
実際に可視化したものは以下の図になります。

matplotlibを使えば、簡単にローソク足を作成できますが、もう少し手の込んだグラフを作りたいという場合は、plotly を使うと便利です。

plotlyによるローソク足作成方法

plotlyはブラウザ上でグラフを自由にイジることができるので、UI的にもとても便利です。
そして、株価データのプロットに関して言えば、圧倒的に見やすく使いやすいのでこちらをおすすめします!!
まだ、インストールしてない方はpipでインストールしておきましょう。

pip install plotly

※ google colabを使用する場合は、! を先頭につけてpipコマンドを実行してください
それでは、こちらの方もさっそくコードを見ていきましょう。

import plotly

# google colab内で実行するには以下関数の実行が必要
def configure_plotly_browser_state():
  import IPython
  display(IPython.core.display.HTML('''
        <script src="/static/components/requirejs/require.js"></script>
        <script>
          requirejs.config({
            paths: {
              base: '/static/base',
              plotly: 'https://cdn.plot.ly/plotly-latest.min.js?noext',
            },
          });
        </script>
        '''))

configure_plotly_browser_state()

# jupyter notebookで表示する際に使う
plotly.offline.init_notebook_mode(connected=False)

color_1 = 'orangered'
color_2 = 'royalblue'

data = [dict(
    type = 'candlestick',
    open = df.open,
    high = df.high,
    low = df.low,
    close = df.close,
    x = df.index,
    yaxis = 'y2',
    increasing = dict(line = dict(color = color_1)),
    decreasing = dict(line = dict(color = color_2))
    )]

layout=dict()

fig = dict(data=data, layout=layout)

# layoutの設定
fig['layout'] = dict()
fig['layout']['yaxis'] = dict(domain = [0, 0.2], showticklabels = False)
fig['layout']['yaxis2'] = dict(domain = [0.2, 0.8])
fig['layout']['legend'] = dict(orientation = 'h', y=0.9, x=0.3, yanchor='bottom')
fig['layout']['margin'] = dict(t=40, b=40, r=40, l=40)

# 出来高の色分け
colors = []

for i in range(len(df.close)):
    if i != 0:
        if df.close[i] > df.close[i-1]:
            colors.append(color_1)
        else:
            colors.append(color_2)
    else:
        colors.append(color_2)

fig['data'].append(dict(x=df.index, y=df.volume, marker=dict(color=colors), type='bar', yaxis='y', name='Volume'))
plotly.offline.iplot(fig)

データは先程、pandas_datareaderで取得したものを使用してます。
google colab内で可視化をプロットするには以下で定義した関数を実行する必要があるため注意です。

def configure_plotly_browser_state():
  import IPython
  display(IPython.core.display.HTML('''
        <script src="/static/components/requirejs/require.js"></script>
        <script>
          requirejs.config({
            paths: {
              base: '/static/base',
              plotly: 'https://cdn.plot.ly/plotly-latest.min.js?noext',
            },
          });
        </script>
        '''))
configure_plotly_browser_state()

また、jupyter notebook内でプロットするためには別の記述が必要になります。

plotly.offline.init_notebook_mode(connected=False)

こちらはjupyter内部で可視化する際のおまじないですので、必要なければ外してもらって構いません。
この辺りは、自分が使っている環境に合わせて使い分けてください。

さて、plotlyの基本的な使い方ですが、
基本的には、dataとlayoutをもつ辞書型のデータ(上のコードでは、fig という変数)をplotlyに渡してplotさせます。

まず、dataに関しては、type = ‘candlestick’でローソク足を指定してあげ、
その他、始値、終値といった値を入れてあげます。
increasing、decreasingでは陽線と陰線の色を指定することができます。

data = [dict(
    type = 'candlestick',
    open = df.open,
    high = df.high,
    low = df.low,
    close = df.close,
    x = df.index,
    yaxis = 'y2',
    increasing = dict(line = dict(color = color_1)),
    decreasing = dict(line = dict(color = color_2))
    )]

layoutの設定の部分では、軸の指定や凡例の追加などを設定できます。
yaxisは後に追加する出来高の軸、yaxis2がローソク足の軸設定になります。
引数domainによってどの範囲に表示するか0から1の範囲(y軸だと0が下端、1が上端)で指定できます。
例えば、yaxis2のdomainをみると、[0.2, 0.8]となっているため、y軸の下端から0.2上の部分から0.8までにプロットするよう指定していることになります。

# layoutの設定
fig['layout'] = dict()
fig['layout']['yaxis'] = dict(domain = [0, 0.2], showticklabels = False)
fig['layout']['yaxis2'] = dict(domain = [0.2, 0.8])
fig['layout']['legend'] = dict(orientation = 'h', y=0.9, x=0.3, yanchor='bottom')
fig['layout']['margin'] = dict(t=40, b=40, r=40, l=40)

出来高のプロットも追加で表示する際に、出来高の色を前日の終値と比較して、
上がったのか、下がったのかで色分けするために、以下のような処理を行っています。

# 出来高の色分け
colors = []

for i in range(len(df.close)):
    if i != 0:
        if df.close[i] > df.close[i-1]:
            colors.append(color_1)
        else:
            colors.append(color_2)
    else:
        colors.append(color_2)

fig['data'].append(dict(x=df.index, y=df.volume, marker=dict(color=colors), type='bar', yaxis='y', name='Volume'))

最後にプロットするには、plotly.offline.iplot(fig) で行います。
これは、jupyter内(もしくは、google colab内)で表示する場合に使用します。
別のプロット表記としては、plotly.offline.plot(fig) もあり、こちらを使うとhtmlファイルを生成することができます。

それでは作成したグラフを見てみましょう。

はい、綺麗!!笑
このような形で、陽線、陰線の表現、出来高の表示がされていることが分かります。
また、plotlyを使っていることによって、マウスオーバーすることで、その日の株価データの表示ができたり、部分的に拡大したりと、色々操作をすることが可能となっています。
先程のmatplotlibを使用したグラフと比較しても、圧倒的に見やすく洗練されていることが分かります。

なお、plotlyによる、ローソク足チャート作成方法については、
plotlyの公式サイトでも紹介されているので、そちらも参考にしてみてください。
plotly公式ページのリンク

まとめ

本記事では、matplotlibとplotlyを使ってローソク足を作成してみました。
中々自分でローソク足を作る機会ってないと思うんですが、きれいなグラフを簡単に描くことができるので、みなさんも試してみてください。
個人的には、見た目も綺麗なので、plotlyで作ることをおすすめします!

コメント