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