今回は、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で割っているのは、ミリ秒
表示されてしまっており、単位を合わせるために割っているとのことです。
そのあとは、timestamp
とprice
を転置させて行列
の形にしました。
データをcsvファイルに保存する
all_data.to_csv('deep_5m.csv', mode='w', header=True)
data = pd.read_csv('deep_5m.csv')
print(data['0'])
こちらは、そこまで難しくないかと思います。
まとめ
APIはなんか面倒くさそうだなと思って、毛嫌いしていたのですが、やってみたら意外と簡単にできました。
アクセスする頻度を調整する必要があるみたいですが、しっかり使えれば便利だなと思いました。