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


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

実行環境

  • MacOS
  • VSCode
  • Python3.7.7(anaconda)

【Python入門】プログラミングで自分だけの株価データを手に入れよう
Python3 Yahoo Finance APIを試す
pythonでYahoo Financeから株価の一分足データを取得する(投資活動日記 2020/06/18)

事前準備

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

pip install yahoo-finance-api2

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

実際のコード

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
こちらのリンクから、公式サイトにアクセスできまして、公式サイトが大体の雛形を作っていますので、使うと良いかと思われます。

コードの解説

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

大体の雛形

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などに変えて自分用にすると良いかと思います。

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

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を相互変換
こちらの記事にある、UNIX時間を表しているのかなと思いました。

そこで、

datetime.utcfromtimestamp(int(data[i]/1000))

こちらのコードを書くことで、通常の日時に変更することができます。
1000で割っているのは、ミリ秒表示されてしまっており、単位を合わせるために割っているとのことです。

そのあとは、timestampprice転置させて行列の形にしました。

データをcsvファイルに保存する

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

print(data['0'])

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

まとめ

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