📌 この記事でわかること:
- yfinance を使って複数銘柄の株価を比較・可視化する方法
- MultiIndex によるエラー(KeyError: ‘Adj Close’)の原因と対処法
- Pythonコードによる実装とエラー解決の流れ
👤 対象となる読者:
- yfinance を使って複数銘柄のデータを取得したい Python 初心者
- Jupyter Notebook 上で株価の比較グラフを作りたい人
- yfinance のエラーに戸惑った経験がある方
🔧 活用できるシーン:
- 自作の投資ツールで複数企業の株価推移を比較したいとき
- 可視化を通じて、企業ごとのパフォーマンス差を見たいとき
- yfinance のデータ構造に合わせて柔軟にコードを書きたいとき
1. はじめに
株価って、企業ごとにどんな違いがあるのか──それを直感的に知るにはグラフでの比較が便利です。
Pythonを使って株価データを取得し、複数銘柄の動きを1枚のグラフにまとめたい方に向けて、この記事では「yfinance」と「Jupyter Notebook」の使い方を初心者向けに解説します。
今回は、米国の代表的なテクノロジー企業であるGoogle(GOOGL)、Apple(AAPL)、Microsoft(MSFT)を選びました。
どれも同じITセクターに属してはいますが、ビジネスモデルや収益構造には違いがあり、株価の動きにもその差が表れているのか気になったためです。
しかし、意外と一筋縄ではいかず…データのカラム構造に戸惑いながら試行錯誤した過程をまとめてみます。
2. Jupyterでyfinanceを使って株価を可視化する基本
yfinance
を使えば、簡単に株価データを取得できます。基本的な使い方については、こちらの記事 で詳しく解説しています。例えば、Appleの株価を取得してグラフを描くコードはこんな感じです。
import yfinance as yf
import matplotlib.pyplot as plt
data = yf.download("AAPL", start="2023-03-01", end="2024-03-01")
plt.figure(figsize=(12, 6))
plt.plot(data.index, data["Close"], label="AAPL")
plt.title("Apple Stock Price")
plt.xlabel("Date")
plt.ylabel("Close Price")
plt.legend()
plt.grid()
plt.show()
詳細なオプションや仕様は、yfinanceの公式ドキュメント で確認できます。
この方法でAAPL単体のグラフを作成するのは問題なし。
でも、複数の銘柄を重ねて比較するとなると、新たな課題が出てきました。
実際に作成したグラフ

3. yfinanceのエラー発生!複数銘柄のグラフ化に挑戦
最初に試したのは、以下のようなコード。
stocks = ["GOOGL", "AAPL", "MSFT"]
data = yf.download(stocks, start="2023-03-01", end="2024-03-01")["Adj Close"]
しかし、実行すると KeyError: 'Adj Close'
というエラーが発生!
「えっ、‘Adj Close’ って普通にあるはずじゃ…?」と戸惑いつつ、データの中身を print(data.head())
で確認。
すると、取得したデータのカラムは “Price” の中に “Close”, “High”, “Low” などがネストされたMultiIndex になっていました。
出力されたカラム構造
Price Close High \
Ticker AAPL GOOGL MSFT AAPL GOOGL
Date
2023-03-01 143.859222 90.033623 242.414505 145.760051 90.701201
2023-03-02 144.453232 91.667702 247.178711 145.245248 91.946689
この出力を見ると、カラムの一番上に "Price"
があり、その下に "Close"
, "High"
, "Low"
などがネストされているのが分かります。これは MultiIndex(複数階層のインデックス) になっていることを示しています。
通常、yfinance
で取得したデータは "Adj Close"
などの単純なカラム名になることが多い。
しかし、この出力では "Price"
という大カテゴリの中に "Close"
, "High"
, "Low"
などが存在しており、data.columns
が MultiIndex になっている ことが分かる。
つまり、data["Adj Close"]
のような単純なカラム指定ではアクセスできず、data.xs("Close", axis=1, level=0)
のような階層を考慮した取得方法が必要になる。
こうした流れで「MultiIndex になっていた」と判断しました!
💡補足:この 'Adj Close'
エラーの原因と対処法については、以下の記事で詳しく解説しています。
➡ yfinanceで’Adj Close’がない!? KeyErrorの原因と対処法
4. yfinanceのエラー解決!データ構造に合わせた修正方法
原因は、カラムがMultiIndexになっていて、単純に "Adj Close"
を指定するだけではアクセスできなかったこと。
そこで、カラムの構造に応じた条件分岐を追加!
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
# 比較する銘柄(例:Google, Apple, Microsoft)
stocks = ["GOOGL", "AAPL", "MSFT"]
# 期間の指定(過去1年分)
start_date = "2023-03-01"
end_date = "2024-03-01"
# データを取得
data = yf.download(stocks, start=start_date, end=end_date)
# データのカラム構造を確認
print(data.head())
# 'Close' カラムを取得(MultiIndex対応)
if ("Close", "AAPL") in data.columns:
data = data["Close"] # 第一階層が'Close'の場合
else:
data = data["Close"] if "Close" in data else data.xs("Close", axis=1, level=0)
# グラフの描画
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()
Matplotlib を使ったグラフの作成方法については、Matplotlibの公式チュートリアル を参照してください。
これでエラーが解消され、無事に Google・Apple・Microsoft の株価を一つのグラフに描画 できました!
実際に作成したグラフ

グラフからは、いずれの企業も2023年を通じて全体的に株価が上昇傾向にあることがわかります。
特にMicrosoftは緩やかに右肩上がりを続けており、GoogleやAppleも多少の上下はあるものの、比較的安定した動きを見せています。
5. まとめ
今回の試行錯誤で学んだポイントは以下の通り。
yfinance
で取得したデータのカラム構造は銘柄数やデータの種類によって異なるprint(data.head())
でカラムの確認をするのが大事- MultiIndexの場合、
.xs()
やdroplevel()
を活用して適切にデータを取得
エラーにぶつかるたびに試行錯誤したことで、データの構造をより深く理解できた気がします。
今後は、移動平均線やボリンジャーバンドなどの指標を加えて、さらに分析を深めていこうと思います!
気になる銘柄同士で比較してみるだけでも、新たな視点が得られます。
ぜひJupyterを使って、自分だけの投資分析ツールを作ってみてくださいね。
コメント
コメント一覧 (4件)
[…] ➡ Pythonで株価比較!yfinance×Jupyterでグラフ作成 […]
[…] Pythonで株価を比較!yfinance×Jupyterでグラフ作成 […]
[…] 📊 複数銘柄の株価を比較する方法も試してみたい方は、こちらの記事がオススメ!👉 Pythonで複数銘柄の株価を比較!yfinanceとJupyter Notebookでグラフを […]
[…] Pythonで株価を比較!yfinance×Jupyterでグラフ作成 […]