📌 この記事でわかること:
- 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
のデフォルト値がFalse
→True
に変更 - 変更されたバージョン:
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でグラフ作成
コメント
コメント一覧 (3件)
[…] ➡ yfinanceで’Adj Close’がない!? KeyErrorの原因と対処法 […]
[…] 「突然グラフが出なくなった!」そんな経験ありませんか?それ、実は Adj Close が取得できないことが原因かも…。 ➡ yfinanceで’Adj Close’がない!? KeyErrorの原因と対処法 […]
[…] ➡ yfinanceで’Adj Close’がない!? KeyErrorの原因と対処法 […]