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

#はじめに
Pythonを使うなら、[pandas](https://pypi.org/project/pandas/)と[matplotlib](https://pypi.org/project/matplotlib/)、[numpy](https://pypi.org/project/numpy/)（今回は使わない）等のライブラリも使いこなせないとー
と思い、まだまだ初見ながら一応簡単に試してみました。

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

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


#必要ライブラリのインストール
```bash
$ 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コマンドのインストールはこちら、参考までに〜

https://qiita.com/ichi_zamurai/items/dcbac977c1ff367b9094

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


#データアクセス用のAPIキーを取得
**今回は株価を取得するために、[Alpha Vantage](https://www.alphavantage.co/)からAPIキーを取得します。**
[Claim your Free API Key - Alpha Vantage](https://www.alphavantage.co/support/#api-key)
にアクセスして、各情報を入れるとAPIキーを**無料で発行できます**。

![スクリーンショット 2021-06-03 12.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075243/621b7027-3073-9b00-8f41-f60ab17a7b93.png)

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

**※API Call制限：5 API requests / minute, 500 requests / day**
詳しくはこちらまで=>[Alpha Vantage Support](https://www.alphavantage.co/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
```

https://pandas-datareader.readthedocs.io/en/latest/remote_data.html#remote-data-access


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

##プログラムコード
###`.env`
```text:.env
ALPHA_VANTAGE_API_KEY=xxxxxxxxxxxxxxxx
```

###`config.py`
```python: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`
```python: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()
```

####カラムを絞らずに出力するとこんな感じのデータフレーム
```bash
# 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`だったら、各社の株価を一括取得できるみたいだったから、こっちの方が便利っぽいなあ〜

```python
df_mix = web.DataReader(['AAPL', 'MSFT', 'FB'], 'yahoo', start, end)
```
今度試してみよ・・・orz (API KEY取得後に気づいた)


##出力結果
###コンソール
```bash
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075243/3609aa06-c671-1313-5818-15c5ffad6f19.png)

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

- 5/29：土曜日
- 5/30：日曜日
- 5/31：戦没者追悼記念日

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


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

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

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

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

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