Yahoo.com Financeから株価のCSVを取得する方法

日本のYahoo!では無料では取得できないそうなのですが、アメリカのYahoo.comでは日本企業の株価でもCSVで取得できるということで、どのようにすればダウンロードできるか確認してみました。

最終的には自動で株価データをデータベースに入れて、自動的に毎日グラフを更新できるようにするのが目標だよ。こんな感じね。

一番簡単な方法としては、ブラウザからダウンロードします。例えばANAの場合は、ANA HOLDINGS INC (9202.T) Stock Price, News, Quote & History - Yahoo Financeにアクセスするとページが表示されます。

Untitled

Historical Dataの部分をクリックすると、

Untitled

過去の株価一覧が表示され、CSVへのダウンロードリンクもあります。

Untitled

ダウンロードリンクをそのままコピーするとhttps://query1.finance.yahoo.com/v7/finance/download/9202.T?period1=1602852276&period2=1634388276&interval=1d&events=history&includeAdjustedClose=trueとなりますが、ここから素直にダウンロードしようとすると、うまくダウンロードできません。

1
2
3
4
5
kazu634@digdag02% wget "https://query1.finance.yahoo.com/v7/finance/download/9202.T?period1=946944000&period2=1634083200&interval=1d&events=history&includeAdjustedClose=true"                                                                                --2021-10-16 21:47:53--  https://query1.finance.yahoo.com/v7/finance/download/9202.T?period1=946944000&period2=1634083200&interval=1d&events=history&includeAdjustedClose=true
query1.finance.yahoo.com (query1.finance.yahoo.com) をDNSに問いあわせています... 119.161.5.251, 119.161.5.252, 2406:6e00:108:fe06::2000, ...
query1.finance.yahoo.com (query1.finance.yahoo.com)|119.161.5.251|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 403 Forbidden
2021-10-16 21:47:54 エラー 403: Forbidden。

ユーザーエージェントを指定してあげると、うまくダウンロードできました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
kazu634@digdag02% wget --user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53" "https://query1.finance.yahoo.com/v7/finance/download/9202.T?period1=946944000&period2=1634083200&in5D"
--2021-10-16 21:46:51--  https://query1.finance.yahoo.com/v7/finance/download/9202.T?period1=946944000&period2=1634083200&in5D
query1.finance.yahoo.com (query1.finance.yahoo.com) をDNSに問いあわせています... 119.161.5.252, 119.161.5.251, 2406:2000:a4:9fe::, ...
query1.finance.yahoo.com (query1.finance.yahoo.com)|119.161.5.252|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/csv]
`9202.T?period1=946944000&period2=1634083200&in5D' に保存中

9202.T?period1=946944000&period     [  <=>                                                  ] 417.10K  1.42MB/s    in 0.3s

2021-10-16 21:46:52 (1.42 MB/s) - `9202.T?period1=946944000&period2=1634083200&in5D' へ保存終了 [427112]

渡してあげるパラメータは以下のようです:

  • ID: 会社のID
  • 期間 (開始): 期間の開始日時 (Unixタイムスタンプ)
  • 期間 (終了): 期間の終了日時 (Unixタイムスタンプ)

その辺を考慮すると、以下のようにしてあげると自動的にダウンロードできそうです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash

set -e

BASE="https://query1.finance.yahoo.com/v7/finance/download/"
ID="9202.T"
PARAM1="?period1="
PARAM2="&period2="

PAST=`date --date '7 days ago' '+%s'`
CURRENT=`date '+%s'`

UA="Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML,  like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53"

URL="${BASE}${ID}${PARAM1}${PAST}${PARAM2}${CURRENT}"

wget --user-agent="${UA}" -O ${CURRENT}.csv "${URL}"

ダウンロードまでは自動化できたので、DBに格納するところまで自動化してあげて、BIでお気軽に確認できるようにしようと思います。