LoginSignup
6
2

More than 1 year has passed since last update.

【Python】超簡単!pandas-datareaderで株価を取得してグラフ出力するまでを試してみた

Last updated at Posted at 2021-06-03

はじめに

Pythonを使うなら、pandasmatplotlibnumpy(今回は使わない)等のライブラリも使いこなせないとー
と思い、まだまだ初見ながら一応簡単に試してみました。

ちなみに、pandas-datareaderpandasは別物のライブラリです。
元々はpandas.ioというPandasの一部だったらしいですが、Pandasの0.19.0からサポートされなくなったっぽく、pandas-datareaderが独立したそうです。

手順

  • 必要ライブラリのインストール
  • APIキー取得
  • 実行&出力

必要ライブラリのインストール

$ pip install pandas # 1.2.4 
$ pip install pandas_datareader # 0.9.0
$ pip install matplotlib # 3.4.2
$ pip install numpy # 1.20.3 今回使わないけどとりあえず入れたw

※2021/6/3現在のバージョン記載

pipコマンドのインストールはこちら、参考までに〜

各ライブラリの用途

名前 用途
pandas データ読込や並べ替え、欠損値の補完などを行える。データ分析の前処理で使われることが多い
pandas_datareader Web上の様々なソースにアクセスできるPythonライブラリの1つ ※対応サイト後述
NumPy 数値計算や行列演算を行える。複数の数値を配列としてまとめて扱ったり、行列演算を行ったりするのが得意
Matplotlib Pythonで代表的なグラフ描画ライブラリ。2D/3Dなど多種のグラフ描画ができる

データアクセス用のAPIキーを取得

今回は株価を取得するために、Alpha VantageからAPIキーを取得します。
Claim your Free API Key - Alpha Vantage
にアクセスして、各情報を入れるとAPIキーを無料で発行できます

スクリーンショット 2021-06-03 12.31.47.png

※重要:GET FREE API KEYをクリックして発行されたAPI KEYをメモしておきましょう!

※API Call制限:5 API requests / minute, 500 requests / day
詳しくはこちらまで=>Alpha Vantage Support

ちなみに、pandas_datareader 0.9.0でデータ取得できるそれぞれのウェブサイトは下記です。(2021/6/3現在)

Tiingo, IEX, Alpha Vantage, Enigma, Quandl, St.Louis FED (FRED),
Kenneth French’s data library, World Bank, OECD, Eurostat,
Thrift Savings Plan, Nasdaq Trader symbol definitions, Stooq, MOEX, Naver Finance

実行と出力

アプリのディレクトリ構成

pandas-challenge
.
├── config.py # .envから値をセット
├── main.py # mainの実行ファイル
└── seed # 将来的にcsv保存・出力用のディレクトリ

プログラムコード

.env

.env
ALPHA_VANTAGE_API_KEY=xxxxxxxxxxxxxxxx

config.py

config.py
# coding: UTF-8
import os
from os.path import join, dirname
from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

# Alpha Vantage
ALPHA_VANTAGE_API_KEY = os.environ.get("ALPHA_VANTAGE_API_KEY")

main.py

main.py
import pandas as pd
from pandas_datareader import data as web
from matplotlib import pyplot as plt
import datetime as dt
import config as cfg

def main():
    startdate = dt.date(2021,5,27) # 開始日
    enddate = dt.date(2021,6,1) # 終了日
    apikey = cfg.ALPHA_VANTAGE_API_KEY # API Keyをセット
    # Apple, Microsoft, Facebookの株価をそれぞれ取得
    df_appl = web.DataReader('AAPL', 'av-daily', startdate, enddate, api_key=apikey) 
    df_msft = web.DataReader('MSFT', 'av-daily', startdate, enddate, api_key=apikey)
    df_fb = web.DataReader('FB', 'av-daily', startdate, enddate, api_key=apikey)
    print(df_appl.head()['close'])
    print(df_msft.head()['close'])
    print(df_fb.head()['close'])

    #各株価をミックスしたDataframeを作成、終値(closeのカラム)をセット
    df_mix = pd.DataFrame({'Apple': df_appl['close'],'Microsoft': df_msft['close'], 'Facebook': df_fb['close']})

    # グラフの設定と出力
    df_mix.plot(figsize=(8,6),fontsize=18)
    plt.legend(bbox_to_anchor=(0, 1), loc='upper left', borderaxespad=1, fontsize=18)
    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    main()

カラムを絞らずに出力するとこんな感じのデータフレーム

# web.DataReader('AAPL', 'av-daily', startdate, enddate, api_key=apikey)のレスポンス
              open    high     low   close    volume
2021-05-27  126.44  127.64  125.08  125.28  94625601
2021-05-28  125.57  125.80  124.55  124.61  71311109
2021-06-01  125.08  125.35  123.94  124.28  67637118

ちなみに、yahooだったら、各社の株価を一括取得できるみたいだったから、こっちの方が便利っぽいなあ〜

df_mix = web.DataReader(['AAPL', 'MSFT', 'FB'], 'yahoo', start, end)

今度試してみよ・・・orz (API KEY取得後に気づいた)

出力結果

コンソール

$ python main.py
2021-05-27    125.28
2021-05-28    124.61
2021-06-01    124.28
Name: close, dtype: float64
2021-05-27    249.31
2021-05-28    249.68
2021-06-01    247.40
Name: close, dtype: float64
2021-05-27    332.75
2021-05-28    328.73
2021-06-01    329.13
Name: close, dtype: float64

出力グラフ

各社の終値を出力しています。
スクリーンショット 2021-06-03 14.28.00.png

ちゃんと2021/5/27~2021/6/1までの3社の株価がグラフ出力できました!
ちなみに、米国市場休場日なので、以下三日間のデータはありません。

  • 5/29:土曜日
  • 5/30:日曜日
  • 5/31:戦没者追悼記念日

ハマったポイント

  • DataReaderで複数社のデータ一括取得を試したが、Alpha Vantageの場合、どうやってやるかわからなかった
    • 他の記事とか見たところみんなyahooとかで一括取得していた。
    • 多分、Alpha Vantageが用意しているAPI的な問題なんだろうか〜
  • グラフ出力中は、プログラムが終了せずずっと実行中となるので、若干盲点だった。
    • 出力したら終わりみたいにしたいから、今度はpngファイルとかにして出力させるのがいいんじゃないかとか思う。

まとめと感想

ウェブマーケや広告運用やっていたときは、取得したcsvデータをExcelに展開して、手動やマクロでガシガシ加工したり、
TableauなんかのBIツールでデータを可視化して、分析なんかやったりしてましたが、
Pythonでここまでライブラリが揃っていると、わざわざExcelとかじゃなくても色々できそうだと思いました。

Tensorflowなんかを使って、機械学習のモデルに、データを食わせて分析すればめちゃくちゃ面白い分析と予測等ができるんじゃないかと
ワクワクしています。

また、Herokuなんかを使えば、株価の取得を自動化して、気になる銘柄だけ確認するTwitterBotやアプリを作れたりすると思うので、
アイデア次第では、応用の幅がぐんと広がるんじゃないかと思います。

2時間くらいで、本質が理解できたんで、本格的に何かのプロダクトに活かしてまいりたいと思います。

以上、ありがとうございました!

6
2
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
6
2