※当サイトはPRを含みます

【Python株価分析:第3回】JPXのCSVから業種別に銘柄を取得してPlotlyで株価を可視化する方法

2025年6月6日

第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()

まとめ

業種ごとにまとめて分析することで、「セクター全体のパフォーマンス」を見ると、資金の流れや市場のテーマを掴むことができます。

また、移動平均線を重ねると、上昇・下降トレンドの把握も簡単になるので応用してみてください!