はじめに
株取引を行うために統計を取りたい、と思い、株価のデータの取得方法を調べました。
株価をダウンロードしてプロットするところまでpython で動かせたので、メモします。東京証券取引所で取引されている3銘柄のデータをダウンロードして、こんな感じでプロットできました。
何か大儲け、できないかな。。。。なんて。^^)
Yahoo Finance からデータを取得するライブラリ
方法はGoogle先生に紹介していただいたページを拝見していろいろ調査したのですが、なかなか思うように「ここ1~2年のデータをスクリプトでダウンロードして比べる」という用途に使えなく苦労しました。Quandl, pandas_datareader などをさまよった挙句,
に行きつきました。ソースをみると https://query1.finance.yahoo.com/v8/finance/chart/... の応答をparse している感じです。また、リンクのgithub の READMEに書かれているUsage そのままで動きました。
準備
PIPでインストールできました。
python3 -m pip install yahoo_finance_api2
実装
README にあるUsage を少し変更しただけですが、以下の感じでプロットしました。
メモとしては、
- timestamp はミリ秒、UTCなので、日本標準時間に変更してあげる
- 各エポックについて、Open, High, Low, Close, Volume に数値があり、データが無いところは null となっている。例えば取引が無かった場合、とかでしょうか。
- 取得できる範囲が限られている感じがしました。例えば、以下のプログラムでは、1000週間のデータを要求していますが、1年ちょっとしかデータは得られていません。
import matplotlib.pyplot as plt
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd
data_list = [ \
["4391.T", "LOGIZARD"],
["4755.T", "RAKUTEN"],
["2303.T", "DAWN"]]
fig, ax = plt.subplots(len(data_list), 1, figsize=(16, 8))
for i, (company_code, company_name) in enumerate(data_list):
my_share = share.Share(company_code)
try:
symbol_data = my_share.get_historical(share.PERIOD_TYPE_WEEK, 1000,
share.FREQUENCY_TYPE_DAY, 1)
df = pd.DataFrame(symbol_data.values(), index=symbol_data.keys()).T
df.timestamp = pd.to_datetime(df.timestamp, unit='ms')
df.index = pd.DatetimeIndex(df.timestamp, name='timestamp').tz_localize('UTC').tz_convert('Asia/Tokyo')
ax[i].set_title( "TSE {} ({})".format(company_name, company_code))
ax[i].plot(df.index, df.close, '.')
ax[i].grid(True)
ax[i].set_ylabel("Stock Price [Yen]")
ax[i].label_outer()
if i == (len(data_list) - 1):
ax[i].set_xlabel("Date")
except YahooFinanceError as e:
print(e.message)
pass
plt.show()
とりあえず動いたから良いとする。
- 本件と関係ないですが、ググっていたらTradingView という、使えればすごそうなサイトに出会いました。
- 当初は、Quandl を使おうと頑張りました。pip3 install Quandl
で簡単にインストールでき、ここ にあるとおりに動きます。ただ、最近のデータが取得できませんでした。一方、 https://www.quandl.com/api/v3/datasets/TSE/4391/data.csv
のように、直接悪背うすることもできました。変数を指定して、所望のデータが得られたのかもしれません。