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


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

  • 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.columnsMultiIndex になっている ことが分かる。
つまり、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. まとめ

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

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

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

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

気になる銘柄同士で比較してみるだけでも、新たな視点が得られます。
ぜひJupyterを使って、自分だけの投資分析ツールを作ってみてくださいね。

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

この記事を書いた人

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

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

コメント

コメント一覧 (4件)

コメントする

目次