LoginSignup
2
10

More than 3 years have passed since last update.

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

Posted at

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

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