J-Quants APIで日本株データ取得入門【製造メーカー株対応・無料プランあり】

Uncategorized

yfinanceで日本株データが取れなくて詰まったので、J-Quants APIを調べてみた

トヨタとか日立みたいな大型製造メーカーは普通にyfinanceで取れるんですが、中堅メーカーとか上場したての銘柄を調べようとしたら「データがない」か「欠損だらけ」でしょっちゅう詰まってました。。。

「日本株のデータは日本の取引所から取るのが一番だよな」と思って調べていたら、東証が公式で提供しているJ-Quants APIの存在を知りました。無料枠でもそこそこ使えるので、製造メーカー中心に投資している方には特に役立つと思います。コード付きで使い方を整理しました。

J-Quants APIとは

J-Quants APIは日本取引所グループ(JPX)が提供する株価データAPIです。東証上場銘柄の株価・財務情報・指数データを取得できます。個人投資家向けの無料プランでも日次OHLCV(始値・高値・安値・終値・出来高)データを取得できます。

プランと制限

  • Free:12週間分の日次データ、1日あたりAPI呼び出し上限あり(個人利用に十分)
  • Light / Standard / Premium:過去データ・財務データ・リアルタイムに対応(有料)

まず無料プランで試して、必要になったら有料に切り替えるのがおすすめです。

J-Quants APIのセットアップ

1. アカウント登録とAPIトークン取得

J-Quants公式サイト(https://jpx-jquants.com/)でアカウントを作成します。登録後にメールアドレスとパスワードを使ってアクセストークンを取得します。

pip install jquants-api-client pandas

2. 認証トークンの取得

import jquantsapi
import pandas as pd
import os

# 環境変数から認証情報を取得(コードにパスワードを書かないのが安全)
# 事前に設定: export JQUANTS_MAIL="your@mail.com" && export JQUANTS_PASSWORD="yourpass"
mail_address = os.environ.get("JQUANTS_MAIL", "your_mail@example.com")
password     = os.environ.get("JQUANTS_PASSWORD", "your_password")

# クライアント初期化
cli = jquantsapi.Client(mail_address=mail_address, password=password)
print("J-Quants API クライアント初期化完了")

3. 銘柄マスタ(銘柄一覧)を取得する

def get_listed_stocks(cli):
    """上場銘柄一覧を取得"""
    df = cli.get_listed_info()
    # 製造業(業種コード 3000〜3999 / 33業種コードで絞り込むのが確実)
    # 33業種コード: 2000=鉄鋼, 2100=非鉄金属, 3050=電気機器 など
    print(f"全上場銘柄数: {len(df)}")
    return df

stocks_df = get_listed_stocks(cli)

# 製造系銘柄を絞り込む例(33業種コード)
manufacturing_sectors = [
    "2000",  # 鉄鋼
    "2100",  # 非鉄金属
    "2200",  # 金属製品
    "2300",  # 機械
    "2400",  # 電気機器
    "2500",  # 輸送用機器
    "2600",  # 精密機器
    "2700",  # その他製品
]

mfg_stocks = stocks_df[stocks_df["Sector33Code"].astype(str).isin(manufacturing_sectors)]
print(f"\n製造業系上場銘柄数: {len(mfg_stocks)}")
print(mfg_stocks[["Code", "CompanyName", "Sector33CodeName"]].head(10).to_string(index=False))

4. 日次株価データ(OHLCV)の取得

from datetime import datetime, timedelta

def get_price_data(cli, code, days_back=60):
    """
    指定銘柄の日次OHLCVデータを取得
    code: 4桁銘柄コード(例: "7203" = トヨタ自動車)
    """
    date_from = (datetime.today() - timedelta(days=days_back)).strftime("%Y-%m-%d")
    date_to   = datetime.today().strftime("%Y-%m-%d")

    df = cli.get_prices_daily_quotes(
        code=code,
        date_from=date_from,
        date_to=date_to
    )

    if df.empty:
        print(f"銘柄コード {code}: データなし")
        return None

    df["Date"] = pd.to_datetime(df["Date"])
    df = df.sort_values("Date").set_index("Date")

    # 必要なカラムのみ抽出・リネーム
    df = df[["Open", "High", "Low", "Close", "Volume"]].copy()
    df.columns = ["open", "high", "low", "close", "volume"]

    print(f"銘柄コード {code}: {len(df)}日分のデータを取得")
    return df

# トヨタ自動車(7203)の株価を取得してみる
toyota_df = get_price_data(cli, "7203", days_back=60)
if toyota_df is not None:
    print(toyota_df.tail(5))

5. 複数銘柄を一括取得してデータフレームにまとめる

def get_multiple_stocks(cli, codes, days_back=60):
    """複数銘柄の終値データをまとめて取得"""
    prices = {}
    for code in codes:
        df = get_price_data(cli, code, days_back)
        if df is not None and not df.empty:
            prices[code] = df["close"]

    if not prices:
        return pd.DataFrame()

    combined = pd.DataFrame(prices)
    combined.index.name = "Date"
    return combined

# 製造メーカー代表銘柄をまとめて取得
watch_list = {
    "7203": "トヨタ",
    "6501": "日立",
    "5401": "日本製鉄",
    "6752": "パナソニック",
    "7011": "三菱重工",
}

prices_df = get_multiple_stocks(cli, list(watch_list.keys()), days_back=60)
prices_df.columns = [watch_list.get(c, c) for c in prices_df.columns]

print("\n製造メーカー株価(直近5日):")
print(prices_df.tail(5).round(1).to_string())

6. 財務情報の取得(Freeプランでも基本情報は取得可能)

def get_financial_data(cli, code):
    """銘柄の財務情報を取得"""
    try:
        df = cli.get_fins_statements(code=code)
        if df.empty:
            return None
        df = df.sort_values("DisclosedDate", ascending=False)
        latest = df.iloc[0]
        print(f"\n【{code} 最新財務情報】")
        for col in ["FiscalYear", "NetSales", "OperatingProfit", "EarningsPerShare", "BookValuePerShare"]:
            if col in latest.index:
                print(f"  {col}: {latest[col]}")
        return df
    except Exception as e:
        print(f"財務データ取得エラー: {e}")
        return None

# 日本製鉄(5401)の財務情報
_ = get_financial_data(cli, "5401")

まとめ:日本株を触るならJ-Quantsは必須ツールだと思います

yfinanceで詰まってた時間が嘘みたいにすっきりしました。特に東証上場の中堅メーカー(自動車部品・工作機械など)はJ-Quantsの方がデータの欠損が圧倒的に少ないです。

無料プランで12週分しか取れないのが惜しいですが、最初のステップとしては十分だと思います。僕は次に、このデータを使って製造メーカー銘柄間の相関分析をやってみようと思っています。「トヨタが上がると部品メーカーもついてくる」みたいなパターンが統計的に出るか確認してみたいので、興味ある方は一緒にやってみましょう。

タイトルとURLをコピーしました