スポンサーリンク

【python】yfinanceで株価取得エラーが出たので修正する

python
スポンサーリンク
moomoo証券【WEB】

状況

yfinanceというpythonライブラリを使ったプログラムをいくつか作っています。

うまくいってたのですが、最近株価が取得できなくなったので修正しました。

プログラム環境(25/7/12)

Anaconda promptで「pip show yfinance」と入力

versionは0.2.65 です。

そのほかの環境は以下です。

Python 3.9.7

Anaconda 4.10.3

プログラム例

トヨタの直近株価を取得します。

yfinanceを利用する場合は先にライブラリの導入が必要です。

pip install yfinance
import yfinance as yf

# トヨタのティッカー(東京証券取引所の場合)
ticker = "7203.T"

# データ取得:直近5営業日
data = yf.download(ticker, period="5d", interval="1d")

# 最新日を取得
latest_date = data.index[-1].date()

# 始値と終値(float値)を取得
open_price = data["Open"].iloc[-1]
close_price = data["Close"].iloc[-1]

# 結果の出力
print(f"{latest_date} のトヨタ株価")
print(f"始値: {open_price:.1f} 円")
print(f"終値: {close_price:.1f} 円")

出力結果と検討

TypeError: unsupported format string passed to Series.__format__

んー?こんなエラー出たっけ

open_priceだけprintしてみます。

7203.T    2501.5
Name: 2025-07-11 00:00:00, dtype: float64
2025-07-11 のトヨタ株価

カラムが階層構造になっとるやんけ。。。

以下のコードでもうちょっと確認してみたらやっぱり階層構造になってました。

print(data.columns)
MultiIndex([( 'Close', '7203.T'),
            (  'High', '7203.T'),
            (   'Low', '7203.T'),
            (  'Open', '7203.T'),
            ('Volume', '7203.T')],
           names=['Price', 'Ticker'])

対策

調べてみたら、こうした階層構造から特定の列を抽出できるようです。

xs() は cross section(クロスセクション) の略で、特定のインデックス階層のデータを取り出すためのメソッドとのこと。

data.xs(ticker, axis=1, level=1)
引数意味
ticker取り出したいキー(ここでは "7203.T"
axis=1列方向に対して操作する(axis=0は行方向)
level=1列ラベルが 階層(MultiIndex) のとき、第2階層(インデックス番号1)で検索する

修正後のプログラム

import yfinance as yf

# トヨタのティッカー(東京証券取引所の場合)
ticker = "7203.T"

# データ取得:直近5営業日
data = yf.download(ticker, period="5d", interval="1d")

# 最新日を取得
latest_date = data.index[-1].date()

# 始値と終値(float値)を取得
open_price = data["Open"].iloc[-1]
close_price = data["Close"].iloc[-1]

# 結果の出力
print(f"{latest_date} のトヨタ株価")
print(f"始値: {open_price:.1f} 円")
print(f"終値: {close_price:.1f} 円")

修正結果

2025-07-11 のトヨタ株価
始値: 2501.5 円
終値: 2508.0 円

無事、出力できました。

そのほか気を付けること

yfinanceはけっこう複雑な構成をしているので、急にうまくいかなくなったらアップデートしてみてください。

コメント

タイトルとURLをコピーしました