APIで取得した株価データをcsvファイルに保存する方法

今回は、`1分足や5分足のような小刻みの株価データ`を取得したいなと考えておりまして、こちらのタイトルに挑戦することになりました。

# 実行環境
* MacOS
* VSCode
* Python3.7.7(anaconda)


[【Python入門】プログラミングで自分だけの株価データを手に入れよう](https://blog.codecamp.jp/programming-python-stockprice)
[Python3 Yahoo Finance APIを試す](http://min117.hatenablog.com/entry/2020/12/30/121157)
[pythonでYahoo Financeから株価の一分足データを取得する(投資活動日記 2020/06/18)](https://note.com/aiduudia/n/na9ea4f90e255)


# 事前準備
まず、事前準備として、APIを使うためのライブラリをインストールする必要があります。
特に難しいことはなく、

```
pip install yahoo-finance-api2
```

こちらのコードをターミナルで打ち込むだけで、使えるようになります。

# 実際のコード

```python
from datetime import datetime
import pandas as pd
import sys
import numpy as np
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError

my_share = share.Share('MSFT')
symbol_data = None

try:
    symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY,
                                        60,
                                        share.FREQUENCY_TYPE_MINUTE,
                                        5)
except YahooFinanceError as e:
    print(e.message)
    sys.exit(1)

data = symbol_data['timestamp']
price = symbol_data['close']

new_data = [datetime.utcfromtimestamp(int(data[i]/1000)) for i in range(len(data))]
all_data = np.array([new_data, price]).T
all_data = pd.DataFrame(all_data)

all_data.to_csv('deep_5m.csv', mode='w', header=True)
data = pd.read_csv('deep_5m.csv')

print(data['0'])
```

そこまで長くないコードかと思われます。


[yahoo-finance-api2 0.0.11](https://pypi.org/project/yahoo-finance-api2/)
こちらのリンクから、公式サイトにアクセスできまして、公式サイトが大体の雛形を作っていますので、使うと良いかと思われます。

# コードの解説
順にコードを解説していきたいと思います。

## 大体の雛形

```python
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError

my_share = share.Share('MSFT')
symbol_data = None

try:
    symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY,
                                        60,
                                        share.FREQUENCY_TYPE_MINUTE,
                                        5)
except YahooFinanceError as e:
    print(e.message)
    sys.exit(1)
```

まず、こちらのコードですが、こちらはほとんど公式サイトをパクったやつなので、そこまで人によって違うということはないかと思われます。

`share.FREQUENCY_TYPE_MINUTE`の後ろが`5`になっておりますが、これは5分毎の株価データを取得していることになります。
こちらの数字を変更して、自分用にアレンジすると良いかと思います。

また、`share.PERIOD_TYPE_DAY`の後ろが`60`になっておりますが、こちらは60日分のデータを取得していることになります。こちらも数字を変えたり、`DAY`の部分を`YEAR`などに変えて自分用にすると良いかと思います。

## 取得したデータをカスタマイズ

```python
data = symbol_data['timestamp']
price = symbol_data['close']

new_data = [datetime.utcfromtimestamp(int(data[i]/1000)) for i in range(len(data))]
all_data = np.array([new_data, price]).T
all_data = pd.DataFrame(all_data)
```

取得したデータは、辞書型で格納されており、`キー`は全部で、**timestamp, open, high, low, close, adj_close, volume**を含まれておりまして、`値はリスト型`で格納されております。


なので、まずは`'timestamp'`と`'close'`をキーにして、日時と終値を取得します。

#### timestampの表示を変更
`timestamp`は何も変更しないと、`1614589500000`みたいな数字の羅列で格納されています。
自分も詳しいことはわからないのですが、
[PythonでUNIX時間（エポック秒）と日時datetimeを相互変換](https://note.nkmk.me/python-unix-time-datetime/)
こちらの記事にある、`UNIX時間`を表しているのかなと思いました。

そこで、

```python
datetime.utcfromtimestamp(int(data[i]/1000))
```
こちらのコードを書くことで、通常の日時に変更することができます。
1000で割っているのは、`ミリ秒`表示されてしまっており、単位を合わせるために割っているとのことです。

そのあとは、`timestamp`と`price`を`転置させて行列`の形にしました。

## データをcsvファイルに保存する
```python
all_data.to_csv('deep_5m.csv', mode='w', header=True)
data = pd.read_csv('deep_5m.csv')

print(data['0'])
```

こちらは、そこまで難しくないかと思います。

# まとめ
APIはなんか面倒くさそうだなと思って、毛嫌いしていたのですが、やってみたら意外と簡単にできました。
アクセスする頻度を調整する必要があるみたいですが、しっかり使えれば便利だなと思いました。