見出し画像

pythonでYahoo Financeから株価の一分足データを取得する(投資活動日記 2020/06/18)

あいづです。
コロナショックの暴落から株など取引を始めた初心者です。

現在、株・仮想通貨・CFDに触れています。

今日はYahoo Financeから株価の一分足のデータを取得してみます。

以前から購読していたデータ分析とインテリジェンスのブログがNoteに移行しているということでまた読み始めているのですが、「何が目的なのか」が抜けていたなと思ったので、今回からいろいろデータを取得するときは目的を明示して書いていこうと思いました。


一分足データの目的は?

このデータ自体は色々な用途がありますが、今回の目的は 株式デイトレーディングの銘柄選定 です。

中長期で株式投資するのもよいのですが、個人的にデイトレーディングも試したいのでデータを蓄積することにしました。

分析していきたい観点
・銘柄の1日単位のボラティリティ
・1日あたりの取引量
・チャートの窓と窓埋めの動向

・銘柄

まだ知識が追いついてないので観点的には薄いと思いますが。。。あ、あと可視化の方法が未定!

開発・実行環境

・OS:Windows 10 Pro 64bit
・Python:3.7.6
・Python パッケージ管理(?):Anaconda(conda 4.8.3)

Yahoo Financeのデータ取得と

以下のURLでデータが取得できます。

https://query1.finance.yahoo.com/v7/finance/chart/AAPL?range=1d&interval=1m&indicators=quote&includeTimestamps=true

参考ページ

銘柄は AAPL の部分です。これを東証の銘柄コードに変えていきます。なお、Yahoo Financeでは末尾に「.T」がついているのでそれをつければ取得できます。

取得期間は range=1d の部分で 1d なら一日ですが、一分足では最大 7d まで取得できます。私の場合は

・アクセス過多によるBANを防ぐ
・リアルタイム性を求めない

の2点から 7日間のデータを長いインターバルをかけて取得する(3分前後)ようにしています。

リスク:アクセス頻度によってIPがブロックされる?

ググったのですが、日本語で良い情報が見つからなかったので英語でググってみました。

3年前の記事なので精度は落ちますが、以下の問答になってました。

質問

My question is if I will quote all of them for every 5 seconds or 10 seconds - will they block me?

回答

tl;dr - yahoo finace is OK (scraping 2,000 stocks) if you insert pauses in your code
Just to be on a safe side, I put several pauses into my code, for every scrap or navigation on site I added between 5 and 10 seconds. That way I'm slowly scraping data and Yahoo seems to be OK with this :-) It takes about one minute per ticker. I'm running this scrap job (for the first time!) now for over 30 hours lol and I'm currently at ticker that starts with T so I have few more hours to go.

1銘柄に対して約1分くらいで大丈夫だとされています。

取得~CSV変換までのちょっとしたコード

コーディングしだしたら機能が増えてしまったので、本質の部分だけを掲載します。

・GETリクエストする
・レスポンスの内容をStringIOにする
・JSONとして読み込む
・JSONデータから👇のデータを取得する。
  ・タイムスタンプ
  ・始値
  ・終値
  ・高値
  ・安値
・PandasのDataFrameにして to_csvで保存

import json
import requests
from io import StringIO

URL = "ここに銘柄を入れたURL"
CSV_PATH = "ここに保存先のファイル名"

r = requests.get(URL)
s = StringIO(r.text)
j = json.load(s)

df = pd.DataFrame()
df['timestamp'] = j['chart']['result'][0]['timestamp']
df['open'] = j['chart']['result'][0]['indicators']['quote'][0]['open']
df['low'] = j['chart']['result'][0]['indicators']['quote'][0]['low']
df['high'] = j['chart']['result'][0]['indicators']['quote'][0]['high']
df['close'] = j['chart']['result'][0]['indicators']['quote'][0]['close']
df['volume'] = j['chart']['result'][0]['indicators']['quote'][0]['volume']

df.to_csv(csvpath, index=False, encoding='utf8')

これに「以前取得した時間をログしよう」とか「ログに合わせて重複取得を避けよう」とか色々追加して今日はいい感じに完成!

データベースとか使えたらもっとスリムになるんですけど今は自宅作業環境にDBを構築できない(そのあたりスキル不足)ので保留中。この試みがいい感じになったら機会を見つけてGCPとかAzureを使ってみます。


その他参考URL

今回私が使ってない方法もメモ

pandas-datareader

yahoo_finance_api2(ソースを見たら内部的には今回と同じ方法みたいです)


おわり

この記事が気に入ったらサポートをしてみませんか?