yfinanceで’Adj Close’がない!? KeyErrorの原因と対処法

yfinanceで発生するKeyErrorの対処法を解説するPython記事のサムネイル画像

📌 この記事でわかること:

  • yfinanceで「Adj Close」がないときのエラー原因
  • 仕様変更の詳細(auto_adjustのデフォルト値)
  • 正しいデータ取得&グラフ描画のコード例

👤 対象となる読者:

  • Pythonで株価グラフを描いていてエラーが出た人
  • yfinanceのアップデート内容に追いつけていない人
  • 「Adj Close」が突然使えなくなって困っている人

🔧 活用できるシーン:

  • 過去コードが動かなくなったときのトラブルシューティング
  • グラフを描く前に、データの中身を正しく把握したいとき
  • エラーの背景まで知って、学びを深めたいとき
目次

1. はじめに

※この記事で紹介するコードは、以下の記事で使用したものがベースになっています:

   ➡ Pythonで株価比較!yfinance×Jupyterでグラフ作成

昨日まで動いてたコードが、急に動かない…!?
そんな体験をしたのは、Jupyter Notebookで以下のようなコードを実行したときでした:

import yfinance as yf
stocks = ["GOOGL", "AAPL", "MSFT"]
data = yf.download(stocks, start="2023-03-01", end="2024-03-01")
plt.plot(data["Adj Close"])  # ここでエラー

すると出てきたのが、このエラー:

KeyError: 'Adj Close'

「あれ? ‘Adj Close’ カラムがない??」

最初はコードの書き間違いかと思いましたが、調べてみると──
原因は、yfinanceの仕様変更。

この記事では、私が実際にこのエラーに遭遇した体験をもとに、

  • なぜこのエラーが起きるのか
  • どう対処すればよいか
  • そしてこの知識をどう応用できるか

を、Python初心者にもわかりやすく解説していきます。


2. 原因を調査してみた

初心者にとって、yfinance エラーは特に原因がわかりづらく、つまずきやすいポイントです。
データの構造をdata.head()で確認してみると、そもそもAdj Closeなんてカラムがない!?

🔍 コード①:エラーが出た当初のコード
import yfinance as yf
import matplotlib.pyplot as plt

stocks = ["GOOGL", "AAPL", "MSFT"]
start_date = "2023-03-01"
end_date = "2024-03-01"

data = yf.download(stocks, start=start_date, end=end_date)
plt.plot(data["Adj Close"])  # ここでエラー
❌ エラー内容(KeyError)
KeyError: 'Adj Close'
🧪 試したこと:
  • .head().columnsで中身を確認 → Adj Close が存在しない
  • .xs("Adj Close", level=0, axis=1).loc[:, "Adj Close"] での抽出 → 同じく失敗
  • type(data.columns) を確認 → pandas.MultiIndex

📸 実際に data.head() を表示した結果(マルチインデックス構造)。
ご覧の通り 'Adj Close' は含まれておらず、代わりに 'Close', 'Open', 'High' などが見えます。

最初は自分の書き方が悪いのかと思って調べていましたが、意外にも「ライブラリの仕様変更」が原因。
Pythonの外部ライブラリは頻繁にアップデートされるため、「以前のコードが動かない」というケースは他にも多いと実感しました。


3. 原因は「仕様変更」だった

.head()でカラムを確認しても "Adj Close" が見当たらない。
その理由を突き止めるべく、yfinanceの公式リポジトリやGitHub Issueを探してみると、 重要な変更が行われていたことがわかりました。

🔧 仕様変更の概要

  • 対象関数: yf.download()
  • 変更点: auto_adjust のデフォルト値が FalseTrue に変更
  • 変更されたバージョン: v0.2.51
  • リリース日: 2024年12月20日

📌 ソース

今後、グラフ描画や株価分析を行う際は、auto_adjust の設定に応じて「Close に含まれているか」を意識する必要があります。
過去のコードを再利用する際にも、ライブラリのバージョン差異を確認する習慣が大切だと改めて感じました。

📣 GitHubのコメントより(翻訳)

「yfinanceでは、Close が実質 Adj Close を意味するようになりました。Yahoo Finance のチャートが Close を基準にしていることと混同しないよう注意が必要です。」

つまり、auto_adjust=True の場合は Close調整済み価格として扱われるようになったということ。 これまで Adj Close を参照していたコードは、Close に切り替える必要があります。


4. 「Close」と「Adj Close」の違いって?

初心者の方には少しややこしい「Close」と「Adj Close」の違い。 ここでは、それぞれの意味と役割をわかりやすく整理します。

📊 用語の比較表

カラム名意味使いどころ
Closeその日の終値。株式市場での実際の取引終了価格短期の価格推移やチャート表示向け
Adj Close分割・配当などの企業アクションを考慮した調整終値長期トレンド分析・リターン計算など

📌「配当」「株式分割」「逆分割」などがあると、CloseとAdj Closeの値はずれることがあります。

💡 例:株式分割があった場合

たとえば、ある銘柄が 1株 → 2株の分割 を行ったとします。

  • 実際の終値(Close):100ドル
  • 分割を考慮した調整後(Adj Close):50ドル(理論値)

このように、過去データを比較可能にするために、Adj Closeは存在するのです。


🔄 yfinanceの仕様変更後は?

# 旧:明示的にAdj Closeを参照
data = yf.download("AAPL", start="2023-01-01", end="2024-01-01")
adj_close = data["Adj Close"]

# 新:auto_adjust=True により、Closeが調整済み価格になる
close = data["Close"]

つまり、auto_adjust=True の状態では、Close = 実質Adj Close なので、 あえて Adj Close を使わなくても調整後価格が取得できるわけです。

✅ 補足:auto_adjust=False にすれば、従来通り Adj Close カラムが含まれるようになります。


5. 最終的に動いたコード

試行錯誤の末、ついにyfinance エラーを回避して正しく株価比較グラフを描画できるようになったコードがこちらです:

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# 比較する銘柄
stocks = ["GOOGL", "AAPL", "MSFT"]
start_date = "2023-03-01"
end_date = "2024-03-01"

# データ取得(auto_adjust=True がデフォルト)
data = yf.download(stocks, start=start_date, end=end_date)

# ⬇ 'Close'カラムを使用(実質Adj Close)
data = data["Close"]

# グラフ描画
plt.figure(figsize=(12, 6))
for stock in stocks:
    plt.plot(data.index, data[stock], label=stock)

plt.title("Stock Price Comparison")
plt.xlabel("Date")
plt.ylabel("Close Price")
plt.legend()
plt.grid()
plt.show()

✅ 修正ポイント

  • data["Adj Close"]data["Close"] に変更
  • auto_adjust=True の仕様を踏まえた処理に変更

📸 グラフ結果は以下の記事で紹介しています

Pythonで株価比較!yfinance×Jupyterでグラフ作成


6. 教訓と対策

今回のように「突然コードが動かなくなった!」という経験、Pythonやデータ分析に慣れてきた頃にありがちです。 筆者も思わず手が止まりましたが、振り返ってみると貴重な学びの機会でもありました。

🧠 学んだことまとめ

教訓内容
ライブラリの仕様変更は常に起こるauto_adjust=True のように、バージョンアップで挙動が変わることも多い
.head().columnsで確認する癖をデータ構造が違うかも?と感じたらまず中身を見る
ドキュメントやGitHubは強い味方英語でも怖がらずに検索すれば、IssueやPRで「なぜそうなったか」がわかる

✅ これからできる対策

  • 公式リリースノートを読む習慣をつける(特に動かなくなったとき)
  • データの中身は毎回 .head() で確認(思い込みでコードを書かない)
  • エラー文はよく読んでググる(KeyErrorがヒントになることも多い)

yfinance エラーを回避するには、仕様変更に気づき、正しいデータの取り扱い方を知ることが重要です。

このような経験を積み重ねることで、少しずつエラーに強くなっていきます。

「ライブラリは生きている」という意識を持つことが、Python上達の近道かもしれません。

7. 同じエラーで困っている人も多数

GitHubのIssueでも報告されているように、最近のアップデートで新たなyfinance エラーが発生するケースが増えています。
今回の KeyError: 'Adj Close' エラー、実は筆者だけでなく多くの人が同じように困っていました。

🗣 GitHub Issue より

“デフォルトの auto_adjust=True のせいで Adj Close が消えて、既存のコードが壊れました。”

“仕様変更により、調整済み価格は Close に含まれ、Adj Close は省略されます。”

このように、GitHub上でも実際に議論が交わされており、筆者と同じ混乱を経験した人が多数いることがわかります。


8. まとめ

本記事では、yfinanceを使った株価グラフ作成中に発生した KeyError: 'Adj Close' の原因と対処法について、実体験をもとに紹介してきました。

今回のポイントを振り返ります:

  • エラーの原因は仕様変更(auto_adjust=True)
  • 従来の ‘Adj Close’ カラムが出力されなくなったが、’Close’ がその代わりになる
  • 正しいカラムにアクセスすれば問題は解消する
  • GitHubのIssueやPRを見ると、他の人も同じ問題に直面していた

今回のように、ライブラリの仕様変更によって突然コードが動かなくなることは、Pythonでは珍しくありません。
でも、原因を一つずつ追っていけば、解決策はきっと見つかります。

この Adj Close エラーも、理由さえわかれば対応はシンプルでした。
「auto_adjust」オプションの意味を理解すれば、今後の分析にもきっと役立つはずです。

こうした小さなつまずきも、知識と経験に変えることで、次の成長につながります。
この記事が、同じようなトラブルで悩んでいた方の助けになれば嬉しいです。

📌 関連記事:Pythonで株価比較!yfinance×Jupyterでグラフ作成


よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Python・投資・業務効率化をテーマにしたブログを運営しています。
本業では社内ツール・アプリの運営・開発をしており、趣味はキャンプや食べ歩きです。

このブログでは、実体験や実務で役立った知識をベースに、
初心者でも再現できる情報発信を心がけています。

コメント

コメント一覧 (3件)

コメントする

目次