MENU

Pythonで複数銘柄の株価を比較!yfinanceとJupyter Notebookでグラフを描く

目次

はじめに

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.columnsMultiIndex になっている ことが分かる。つまり、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 の株価を一つのグラフに描画 できました!

実際に作成したグラフ

まとめ

今回の試行錯誤で学んだポイントは以下の通り。

  1. yfinance で取得したデータのカラム構造は銘柄数やデータの種類によって異なる
  2. print(data.head()) でカラムの確認をするのが大事
  3. MultiIndexの場合、 .xs()droplevel() を活用して適切にデータを取得

エラーにぶつかるたびに試行錯誤したことで、データの構造をより深く理解できた気がします。

今後は、移動平均線やボリンジャーバンドなどの指標を加えて、さらに分析を深めていこうと思います!

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

この記事を書いた人

コメント

コメントする

目次