⚙️

yahoo_finance_api2で株価取得

2022/02/06に公開

最近いろいろと手を付けていたらおいている場所がいくつかに分散されてしまったのでまとめて可視化したいと思っていろいろとアプリを探したり、AppSheetで自作してみたりしたのだが、どうにもちょい足りない。
ということで、最終的には自作でどうにかできないかなというところの第一歩として単価を取得する処理を書いてみた。

使ったモジュールはyahoo_finance_api2
https://pypi.org/project/yahoo-finance-api2/

レスポンスの形式が若干使いにくいなとは思うが、それでも割と簡単にデータを取得できるなというのが感想。

from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import datetime as datetime
import pandas as pd

def get_data(code):

  stock = share.Share(code)
  symbol_data = None

  try:
      # get_historical(period_type, period, frequency_type, frequency)
      symbol_data = stock.get_historical(share.PERIOD_TYPE_DAY, 10, share.FREQUENCY_TYPE_DAY, 1)
  except YahooFinanceError as e:
      print(f">>> [{code}] : {e.message}")
      return None

  # 日付処理のためにDataframeに変換
  df_symbol_data = pd.DataFrame(symbol_data)
  # タイムスタンプを変換
  df_symbol_data["datetime"] = pd.to_datetime(df_symbol_data.timestamp, unit="ms")
  # 日本時間へ変換
  df_symbol_data["datetime_jst"] = df_symbol_data["datetime"] + datetime.timedelta(hours=9)
  # 後でキーに使いやすいように日本時間を文字列に変換
  df_symbol_data["datetime_jst_str"] = df_symbol_data["datetime_jst"].apply(lambda x: x.strftime('%Y%m%d'))

  return df_symbol_data

# 日本株については.Tをつける:code + ".T"
stockList = ["AAPL","AMZN","FB","MSFT","sdasd","GOOGL","4661.T"]

# とりあえずの格納先:'code_日付'をキーとし、終値を格納する
# 取得できなかった場合はSKIPする
dic_stock = {}
for code in stockList:
  res = get_data(code)
  if(res is None):
    print(f">>> [{code}] : NoData : SKIP")
    continue

  print(code)
  # 終値
  num = len(res)
  for index in range(len(res)):
    dic_target = res[index:index+1].to_dict()
    dic_stock[code + "_" + dic_target["datetime_jst_str"][index]] = dic_target["close"][index]

print(dic_stock)

上記はColabで作ったのだがこれをgithubに簡単に連携して保存しておけるんだなということを知ったのが今日の一番の収穫。
ローカルに環境を一切おかずにブラウザだけで全部できるというのが今風で便利だなと思う。
https://github.com/RyoNakamae/finance_getdata

あと、ZENに何か投稿してみたかったというのもある。

Discussion