PythonでYahoo!ファイナンスから時系列データをダウンロードする方法


目次

株のデータ収集についての記事一覧をこちらに記載しております。

目的

  • Yahoo!ファイナンスから東京証券取引所に上場している銘柄の時系列データをダウンロードする
  • Pythonのライブラリのインストール手順などは省略しております
  • 時系列データでは始値、高値、安値、終値、出来高、調整後終値が取得できます。

事前準備

  • Yahoo!ファイナンスVIP倶楽部に加入する。(VIP倶楽部に加入すると時系列データをcsvファイル形式でダウンロードすることが可能になります。)
  • 証券コードを取得する為に、事前に日本取引所グループから東証上場銘柄一覧をダウンロードする
  • ダウンロードした東証上場銘柄一覧のコードの列のみをコピーしてファイル名をcodeList.txtとして保存する(ヘッダー行は不要)
codeList.txt
1301
1305
1306
〜
9995
9996
9997

実装

Yahooにログインする

  • Seleniumを使ってYahooにログインします。
  • Seleniumのインストール、webdriverのダウンロードのなどの手順は省略しております。
  • Seleniumのインストール手順などはこちらのサイトが参考になります。
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Firefox(executable_path="./geckodriver")
LOGIN_URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=https://www.yahoo.co.jp"
USER_ID = "yahoo_user_id"
PASSWORD = "yahoo_password"
self.driver.get("https://www.yahoo.co.jp/")
self.driver.get(LOGIN_URL) #Yahooのログインページに遷移
self.driver.find_element_by_id("username").send_keys(USER_ID) #テキストボックスにユーザiDを入力
self.driver.find_element_by_id("btnNext").click() #次へボタンをクリック
self.driver.implicitly_wait(5) #5秒待機
self.driver.find_element_by_id("passwd").send_keys(PASSWORD) #テキストボックスにパスワードを入力
self.driver.find_element_by_id("btnSubmit").click() #ログインボタンをクリック

Yahoo!ファイナンスから時系列データをダウンロード

  • Yahoo!ファイナンスから東証に上場している銘柄の時系列データをダウンロードします。
  • Yahoo!ファイナンス!では時系列データのダウンロードページのURLは証券コードの後に市場略称を付与するルールとなっているようです。
  • Yahoo!ファイナンス!の東証の市場略称はTとなっているので、URLの最後にTを付与します。 https://www.yahoo-help.jp/app/answers/detail/p/546/a_id/45387
SECURITIES_CODE_LIST_PATH = "./codeList.txt" #事前準備で作成したcodeList.txt
with open(SECURITIES_CODE_LIST_PATH, "r") as code_list:
    for code in code_list:
        # 東証のデータのみをダウンロードするので証券コードの後にTを付与
        csv_url = "https://stocks.finance.yahoo.co.jp/stocks/history/?code={0}.T".format(code)
        self.driver.get(csv_url)
        self.driver.implicitly_wait(3)
        try:
            # 指定したURLが存在しない場合はfor文の先頭に戻る
            self.driver.find_element_by_class_name("selectFinTitle")
            time.sleep(1)
            continue
        except NoSuchElementException:
            pass
        try:
            self.driver.find_element_by_css_selector('a.stocksCsvBtn').click() #時系列データをダウンロード(CSV)のボタンをクリック
        except NoSuchElementException:
            pass
        time.sleep(5)