【Python株価分析:第3回】JPXのCSVから業種別に銘柄を取得してPlotlyで株価を可視化する方法
第1回はこちら↓
はじめに
日本株の銘柄を分析するうえで、業種ごとの株価動向を比較したいという場面はよくあります。
今回は、JPX(日本取引所)の公式CSVを使って業種別に銘柄リストを取得し、Plotlyでインタラクティブな株価チャートを作成する方法を紹介します。
✅ このチュートリアルでできること
・凡例に「銘柄コード+銘柄名」を表示
・JPXが公表するExcel形式の銘柄一覧から、業種別に銘柄コードを自動取得
・業種ごとの上位10銘柄の株価(終値)を yfinance で取得
・Plotlyを使って、業種別に株価チャートをドロップダウンで切り替え可能
必要なライブラリのインストール
Google Colab または Jupyter Notebook 上で以下を実行します。
pip install yfinance plotly openpyxl
JPXの銘柄一覧CSVを確認
JPX(日本取引所)はこちらのページで「東証上場銘柄一覧」をExcelファイル(.xls
)形式で公開しています。

Pythonでこのファイルを直接読み込むことで、銘柄コード・銘柄名・業種などの情報を取得できます。
Pythonコード:業種別の株価をPlotlyで可視化
それでは実際に可視化していきますが、先に実行結果をお見せします。

水産・農林業や医薬品など業種をプルダウンで選んで、各業種の上位10企業のチャートを表示しています。
plotlyを使っているのでカーソル上にあるデータの詳細や、グラフの拡大なども可能です!
こちらがPythonコードになります。
import pandas as pd
import yfinance as yf
import plotly.graph_objects as go
# --- 1. JPX銘柄一覧をCSVから読み込み ---
url = "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls"
df_jpx = pd.read_excel(url)#, engine='openpyxl')
# 必要な列だけ抽出・整形
df_jpx = df_jpx[["コード", "銘柄名", "33業種区分"]]
df_jpx["コード"] = df_jpx["コード"].astype(str).str.zfill(4)
df_jpx["ticker"] = df_jpx["コード"] + ".T"
# --- 2. 業種ごとに上位10銘柄を抽出 ---
grouped = df_jpx.groupby("33業種区分").head(10) # 各業種から最大10件取得
industries = grouped["33業種区分"].unique()
# --- 3. 株価データ取得 ---
industry_data = {}
for industry in industries:
tickers = grouped[grouped["33業種区分"] == industry]["ticker"].tolist()
df = yf.download(tickers, start="2023-01-01", end="2024-12-31")["Close"]
industry_data[industry] = df
# --- 4. Plotlyグラフ作成 ---
# ticker → 銘柄コード+銘柄名 の辞書作成
ticker_to_name = {
row["ticker"]: f"{row['コード']} {row['銘柄名']}" for _, row in df_jpx.iterrows()
}
fig = go.Figure()
buttons = []
trace_count = 0
for i, (industry, df) in enumerate(industry_data.items()):
for col in df.columns:
display_name = ticker_to_name.get(col, col) # 例: "7203 トヨタ自動車"
fig.add_trace(go.Scatter(
x=df.index,
y=df[col],
mode="lines",
name=f"{display_name} ({industry})",
visible=(i == 0)
))
visible = [False] * trace_count + [True] * len(df.columns) + \
[False] * (len(industry_data) * 10 - trace_count - len(df.columns))
trace_count += len(df.columns)
buttons.append(dict(
label=industry,
method="update",
args=[{"visible": visible},
{"title": f"{industry} 業種の株価チャート"}]
))
buttons.append(dict(
label="すべて表示",
method="update",
args=[{"visible": [True] * trace_count},
{"title": "すべての業種を表示"}]
))
# --- 5. レイアウト設定 ---
fig.update_layout(
title=f"{industries[0]} 業種の株価チャート",
xaxis_title="Date",
yaxis_title="Price (JPY)",
hovermode="x unified",
updatemenus=[dict(
buttons=buttons,
direction="down",
x=0,
xanchor="left",
y=1.15,
yanchor="top"
)],
width=1000,
height=600
)
fig.show()
まとめ
業種ごとにまとめて分析することで、「セクター全体のパフォーマンス」を見ると、資金の流れや市場のテーマを掴むことができます。
また、移動平均線を重ねると、上昇・下降トレンドの把握も簡単になるので応用してみてください!
ディスカッション
コメント一覧
まだ、コメントがありません