【Matplotlibの基礎】Pythonでグラフ、図を表示する方法|株チャートを表示

【Matplotlibの基礎】Pythonでグラフ、図を表示する方法|株チャートを表示 学習
【Matplotlibの基礎】Pythonでグラフ、図を表示する方法|株チャートを表示
スポンサーリンク

こんにちは、こがたです。

Pythonはデータ処理に強い言語として有名です。

処理したデータをグラフなどのように可視化するシーンは多くあります!

この記事では「Matplotlib」を使用して描画するための基礎の基礎を説明します。

対象者
  • Python初心者
  • データを見やすくしたい
  • Matplotlibに触れたい
  • 機械学習を学んでいきたい

Pythonでデータを扱う上で使用する「NumPy」「Pandas」については↓↓↓をご覧になってください。

まず簡単な描画の仕方を説明します。
描画するために何が必要なのかを把握してください。

次に応用の効く方法を説明します。
複数の図を表示することができるようになるのでご覧ください。

最後に応用例として「mplfinance」モジュールを使用して昨日のチャートを表示してみます。

こがた
こがた

Pythonを扱う上で図の表示は必ず使うので取っ掛かりにしてもらえたら嬉しいです!

簡単な図の表示

コードはこちらになります。

import matplotlib.pyplot as plt
import numpy as np

# データ生成
x = np.linspace(0, 100, 11)
y = x + np.random.randn(11) * 10

# プロット
plt.plot(x, y, label="test_label")

# ラベルの表示
plt.legend()
# 図の表示
plt.show()
作成した図

xのデータはNumPyのlinespace関数で0〜100を11個に分割したものにしています。

yはランダムな11個の配列に10を掛けてxに加えたものになります。

print('x : ' + str(x))
print('y : ' + str(y))

--------- 出力 ---------
x : [  0.  10.  20.  30.  40.  50.  60.  70.  80.  90. 100.]
y : [  4.58479683   8.17742808  17.9024242   41.43485724  59.84944968
  62.13597762  62.12341211  59.70252323  77.26466045  99.12711721
 109.18143703]

「plot関数」でxデータ、yデータとラベルを渡します。

「legend関数」を実行することでラベルを表示することができます。
(実行しなければラベルが表示されないだけでエラーがでることはありません)

複数の線を描画してみる

先ほどは1つの線を描画しましたが、次は複数の線を描画してみます。

# 2つの線を描画する
for i in range(2):
    label = 'test-' + str(i+1)
    # データ生成
    x = np.linspace(0, 100, 11)
    y = x + np.random.randn(11) * 10

    # プロット
    plt.plot(x, y, label=label)
    
# ラベルの表示
plt.legend()
# 図の表示
plt.show()
複数の線の描画

やり方は変わらないから簡単だねぇ〜

応用できる少しムズカしい書き方

↑と同じ図を別の書き方で表示します。
(yのランダム関数があるので、全く同じにはなりません)

# データ生成
x = np.linspace(0, 100, 11)
y = x + np.random.randn(11) * 10

# 表示領域の作成
fig = plt.figure()

# 配置する領域確保
ax = fig.add_subplot(111) #(1,1,1)でもOK

ax.plot(x, y, label='test_label')

# ラベルの表示
plt.legend()
# 図の表示
plt.show()

「figure関数」は表示する領域を用意するものです。
「add_subplot関数」は図を配置する場所を用意します。

こがた
こがた

「figure」で画用紙を持ってきて、「add_subplot」で描く場所を決めるイメージです!

「add_subplot関数」の引数である「111」は1行1列の1つめに描画することを表しています。
つまり「234」の場合は2行3列の表(6つのマス)を用意して4つ目に表示します。

それぞれを引数にした「1, 1, 1」としても同じように動きます。

複数表示してみる(簡潔に書く)

複数の図を表示してみます。
また、表示領域、配置領域もまとめて設定します

# 表示領域、配置領域の確保
fig, axs = plt.subplots(2,2)
count = 0
for ax in fig.axes:
    count += 1
    # データ生成
    x = np.linspace(0, 100, 11)
    y = x + np.random.randn(11) * 10
    # ラベル名
    label = 'test' + '-' + str(count)

    ax.plot(x, y, label = label)
    # ラベル表示
    ax.legend()

# 図の表示
plt.show()
複数の図を表示

「subplots関数」を利用すれば先ほどの「figure関数」「add_subplot関数」をまとめて実行できます。
引数は(行数,列数)となります。

返り値のaxesは配置領域の配列となっています

チャートの表示

今回はyahoo-finance-api2を使用します。
またローソク足チャートを表示できるモジュール「mplfinance」も読み込みます。

こちらを実行してAPI環境を用意しておきましょう。

pip install yahoo_finance_api2
pip install mplfinance

これはソフトバンク(9434)の昨日のチャートを表示するものです。

import matplotlib.pyplot as plt
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import mplfinance as mpf
import pandas as pd
from datetime import datetime
from datetime import timedelta

code = 9434
company_code = str(code) + '.T'
my_share = share.Share(company_code)
symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY, 2,
                                share.FREQUENCY_TYPE_MINUTE, 1)
df = pd.DataFrame(symbol_data.values(), index=symbol_data.keys()).T
df.timestamp = pd.to_datetime(df.timestamp, unit='ms')
df.index = pd.DatetimeIndex(df.timestamp, name='timestamp').tz_localize('UTC').tz_convert('Asia/Tokyo')

# 昨日のデータを取得
end_time = datetime.now().replace(hour=0,minute=0,second=0,microsecond=0)
start_time = end_time - timedelta(days=1)
df = df[(df['timestamp'] > start_time) & (df['timestamp'] < end_time)]

# データの形を調整
df = df.rename(columns = {
    'open' : 'Open',
    'high' : 'High',
    'low' : 'Low',
    'close' : 'Close',
    'volume' : 'Volume'
})
df = df.fillna(method='ffill')

time = pd.to_datetime(df.index.values)
df.index = time + timedelta(hours=9)

mpf.plot(df, type='candle', ylabel='')

これは2020/12/15のチャートになります。

チャート

コードの説明

まずyahoo-finance-api2から株価データを取得します。

symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY, 2,
                                share.FREQUENCY_TYPE_MINUTE, 1)

ここで取得期間・間隔を設定しています。

yahoo-finance-api2の取得期間・間隔
  • PERIOD_TYPE_(DAY,WEEK,MONTH,YEAR):取得する期間を設定
  • FREQUENCY_TYPE_(MINUTE,DAY,MONTH,YEAR):取得間隔

取得時はUTCの時間なので日本時間に変換しています。
また、昨日のデータだけ抽出しています。

次に「mplfinanceモジュール」に合わせために列名を変更しています。

df = df.fillna(method='ffill')

株式取引では11:30〜12:30は市場が開いていません。
その間は「Nan値」になります。
「fillnaメソッド」でひとつ前のデータをいれてます。

全体でみると面倒くさそうですが、1つ1つを見ると簡単なことしかやっていません。
日足データなどに変えたりして利用してみてください!

最後に

この記事ではPythonのMatplotlibの基礎の基礎とチャート表示について説明しました。

その他にもこのようなものを表示することができます。

表示できる図
  • 棒グラフ
  • 散布図
  • 円グラフ
  • ヒストグラム

状況に合わせて使い分けてみてください!

機械学習でも利用するシーンが多いです。

コメント

タイトルとURLをコピーしました