Pythonの呼吸 壱ノ型 情報時雨
あるミッションの為に、指定した日から東証全銘柄の株価データ(※)が
欲しくてパイパイを全チューチューして色々探しました(*´ω`*)
よく見つかったのは日本株のヒストリカルデータは取得しにくいという事
それでも取得方法はいくつか見つかりましたが、どれも(※)を取得するには物足りず、これは禁断のスクレイピングするしかないのかと思っていたところ…
APIで1日250?までの制限がある記事がいくつか見つかりました
stooqの場合(APIで1日250?までの制限ありだが一応取得できます)
pdr.DataReader('銘柄コード','取得先','開始日','終了日')
import pandas_datareader.data as pdr
pdr.DataReader("9984.jp","stooq","2021/01/04")
この2行だけで指定日1/4からのデータが取得出来ちゃいます(°_°)
終了日指定しない場合は最新日まで取得可能です
ただ、現在 2/6(土)の結果ですが、稼働日-1までのデータみたいです
2/5(金)のデータが取得できていません
次に https://jp.investing.com/でお馴染みのinvestpy米国株は日付指定できますが、日本株で日付を指定するとエラーになってしまい、その時点で銘柄の制限数までは調べていません
pip install investpy
import investpy
investpy.get_stock_historical_data(stock='AAPL',country='United States',from_date='01/01/2021',to_date='01/02/2021')
日本株は日付指定なしならOK、直近22日くらいだけ取得できます
色々探し回ってそして見つけました!
取得先stooqをyahooにして銘柄コード .jpを .Tに変えたら取得できる事を!
データ取得 DataReader('銘柄コード','取得先','開始日','終了日')
pdr.DataReader(stock,"yahoo",start,end) endなしの場合、最新日まで取得
「pandaspandas_datareader 日本株」で検索しても該当の記事は見つからなかったのであまり知られていないのかも!?(°_°)
数の制限もなし!日付も指定可能(※)の条件もクリアでバッチリです
データは若干遅れていて、正確に測ってませんが多分20分遅れ
pandas_datareaderの詳細を翻訳して見てもそれらしい事は書いてなく、
取得先"stooq"と"investpy"の事は書いてあるっぽかったけどyahooの事は見当たらなかったです
中の方にちょこっとだけyahooって書いてある単語は見つけましたw
Python始めたてでよくわからないけど、モジュールの中でスクレイピングしてるのもあるらしいので、それだと黒に近いグレーになってしまうが、ザラ場でちょっと確認してみたら多分大丈夫じゃないかなーと思いました
1つ目は日本のyahooは今はリアルタイム株価なので、遅延が無いこと
2つ目は表記順がなんか違うっぽいこと
大抵、始値、高値、安値、終値、出来高の順ですが、
高値、安値、始値、終値、出来高の順で表示されている
3つ目は日付の指定が文字で指定する場合は問題ないが、変数で指定する場合は日/月/年と後ろから認識されるのでy/m/dに変換しないといけないこと
以上から米国版YahooFinanceから持って来てるんじゃないかと推測
米国版YahooFinanceのHPで日本株のヒストリカルデータ調べてみたら、
始値、高値、安値、終値、出来高の順で表示されていましたw
ありがたし!
他にもfix_yahoo_financeとか
yahoo finance API
・RapidAPI
・yfinance
・Yahoo_fin
とか色々見つかりましたが、日本版yahooなのか米国版なのか
良いのが見つかったので深く調べていませんw
import datetime
import fix_yahoo_finance as yf
end = datetime.date.today()
start = end - datetime.timedelta(days = 20) # 遡る日数
yf.download("9984.T",start,end)
その後...ある銘柄の計算値が随分違うので調べてみたら、
やはり米国YFのデータから取得している事が判明しました!
9707のユニマット リタイアメント・コミュニティ
2020/4月に株式併合されてるみたいで
日本のYFだと調整された株価で連続性があり形跡が判断できませんが、
米国YFだとそのままの株価のヒストリカルになっていました
日本YF
米国YF
...
pythonで取得したデータ
日本版からのスクレイピングじゃないので少し安心しました(*´ω`*)
時差?(°_°)指定日から最新日まで欲しい場合は問題ないけど、
指定範囲日だけ欲しい場合、終了日が+1になりました
最終日だけの場合は、同じデータが入りました
DataReader('銘柄コード','取得先','開始日','終了日')
21/7月
米国版YahooFinance日付のフォーマット変わって読み込めなくなった?
月日年に変えれば読めるかも?(°_°)パンダスの問題?
https://github.com/pydata/pandas-datareader/issues/868
解決策2つ
・import yfinance as yf を使う
stock = "{}.T".format(code_list[i])
yf.pdr_override() # データ取得をpdrからyfinanceへ変更 2021.7
dt[i] = pdr.get_data_yahoo(stock, start)
今までのやり方にyfinance as yfをインポートしてyf.pdrにオーバーライド
データ取得の
dt[i] = pdr.DataReader(stock, "yahoo", start)を
dt[i] = pdr.get_data_yahoo(stock, start)に変更
・yahoo-finance-api2 を使う
https://chimesness.com/post-136/
Pythonの呼吸 壱ノ型 情報時雨・改
https://note.com/hi_de_bo/n/n96592331febe?magazine_key=m425fc0eb762b