はじめに
Jupyter Notebookを使って、yfinance
を活用した株価の可視化を行いました。以前、AAPL(Apple)の株価をグラフにする方法は試しましたが、今回はGoogle(GOOGL)、Apple(AAPL)、Microsoft(MSFT)など複数銘柄を比較するグラフを作成しようと挑戦しました。
しかし、意外と一筋縄ではいかず…データのカラム構造に戸惑いながら試行錯誤した過程をまとめてみます。
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単体のグラフを作成するのは問題なし。でも、複数の銘柄を重ねて比較するとなると、新たな課題が出てきました。
実際に作成したグラフ

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 になっていた」と判断しました!
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 の株価を一つのグラフに描画 できました!
実際に作成したグラフ

まとめ
今回の試行錯誤で学んだポイントは以下の通り。
yfinance
で取得したデータのカラム構造は銘柄数やデータの種類によって異なるprint(data.head())
でカラムの確認をするのが大事- MultiIndexの場合、
.xs()
やdroplevel()
を活用して適切にデータを取得
エラーにぶつかるたびに試行錯誤したことで、データの構造をより深く理解できた気がします。
今後は、移動平均線やボリンジャーバンドなどの指標を加えて、さらに分析を深めていこうと思います!
コメント