Pythonで株価取得に失敗

 こんにちわ。はりきちです。今回は比較的使いやすいプログラミング言語「Python」の「yfinance」を使用して株価を取得する記事を書く・・・のではなく、失敗したので備忘録として残しておきます。

yfinanceとは

 yfinanceはYahoo! financeのAPIを使って情報を取得するためのPythonライブラリです。詳細は割愛します。ひっぺんさんのブログにあるようにまずは米国株の株価を取得して分析できたらいいなと考えていました。

yfinanceが動かない!

 最初、yfinanceライブラリをインストールして実行しようとしたのですが、次のエラーを吐いて動きませんでした。

Exception in thread Thread-4:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/multitasking/__init__.py", line 104, in _run_via_pool
    return callee(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/yfinance/multi.py", line 201, in _download_one_threaded
    keepna, timeout, many=True)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/yfinance/multi.py", line 218, in _download_one
    many=many)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/yfinance/base.py", line 156, in history
    tz = self._get_ticker_tz(debug_mode, proxy, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/yfinance/base.py", line 339, in _get_ticker_tz
    tkr_tz = utils.cache_lookup_tkr_tz(self.ticker)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/yfinance/utils.py", line 339, in cache_lookup_tkr_tz
    df = _pd.read_csv(fp, index_col="Ticker", on_bad_lines="skip")
TypeError: read_csv() got an unexpected keyword argument 'on_bad_lines'

うーん、Python初心者はりきちにはさっぱりわかりませんね。

エラー原因を特定するために、次の2つを確認していきました。

  • Pythonコードにバグがある
  • Python使用環境がおかしい

 

原因の特定

 該当部分以外のコードにバグがないかを確かめてみます。Google Colaboratoryでコード実行しました。すると、何も問題なく実行できました。ということは、作成したコードでなく使用環境に問題があるということになります。

 はりきちのPython使用環境は下記です。

  • mac OS Catalina version 10.15.7
  • Python 3.7.0

 ここで、Python 3.7.0という部分に注目します。エラーを調べるためにPython 3.7.0 & yfinanceのように色々検索をしてみました。すると1件の記事が引っかかりました

Hello,

Your requirements.txt file allows any version of pandas above 0.24.0.

However, in your utils.py file, you twice invoke the pandas read_csv function with the on_bad_lines argument, an argument which was only introduced in pandas 1.3.0.

As a result, anyone running yfinance with a version of pandas greater than or equal to 0.24.0 but lower than 1.3.0 will experience a crash with the following error:

df = _pd.read_csv(fp, index_col="Ticker", on_bad_lines="skip")

TypeError: parser_f() got an unexpected keyword argument ‘on_bad_lines’
Please bump the version of pandas in your requirements.txt file to say
pandas>=1.3.0

 最後の行に答えが書いてありますが、どうやらpandasのバージョンが古いとyfinanceが動かせないようです。はりきちのバージョンは1.1.5でした。

pandasのbump・・・もできず

 pandasをアップデートしたらいいだけかーと軽く考えていましたが、pipでアップデートをかけても”satisfied”と出て 最新版(1.3.0以上)に出来なかったのです。これは困りました。

 色々調べてみると、Python 3.7.0はpandas 1.1.5以上にできないようです。pandasのupdateだけかと思ったら面倒臭い作業が増えてしまいました。

Python 3.7.0の削除と3.11.0のインストール

 資格マフィアさんの記事を参考に、一旦3.7.0とすべてのパッケージを削除しPython 3.11.0をインストールし直しました。Python 3.11.0のインストール後、yfinanceをはじめすべてのライブラリもインストールしなおし、改めてコードを実行しました。

 ちゃんとできていますね。よかったよかった。