「yfinance でトヨタ取れない…なんで?」──最初につまずいたのはそこだった。ティッカーに「.T」をつけないといけないのを知らなくて30分無駄にした。でもそこさえ突破すれば、日本株の一括スクリーニングが一気にラクになる。
なぜ僕が日本株スクリーニングツールを作ったか
投資対象は日本の製造メーカーが中心だ。トヨタ、日立、デンソー、コマツ……業界的に馴染みがあるし、決算の読み方もなんとなくわかる。でも個別銘柄を一つずつ調べるのは時間がかかる。
子供の世話で時間が削られる中、「気になる銘柄を一気に比較したい」という欲求が強くなった。証券会社のスクリーニングツールでもいいけど、Pythonで作れば自分なりの条件(PERが低くて、かつ過去3ヶ月で株価が下落している、みたいな複合条件)を自由にカスタマイズできる。それが動機だった。
yfinanceで日本株を取得するときの注意点
まず最大の罠から片付ける。yfinanceは米国株なら「AAPL」「TSLA」のようにティッカーシンボルをそのまま入れれば動く。でも日本株は東京証券取引所のコードに「.T」をつける必要がある。
import yfinance as yf
# NG: 数字だけだとデータが取れない
# ticker = yf.Ticker("7203")
# OK: .T をつける(東証)
ticker = yf.Ticker("7203.T") # トヨタ自動車
info = ticker.info
print(info.get("longName")) # Toyota Motor Corporation
print(info.get("trailingPE")) # PER(実績)
print(info.get("priceToBook")) # PBR
print(info.get("dividendYield")) # 配当利回り
ちなみに「.T」は東証(TSE)のサフィックス。名証なら「.NGY」、福証なら「.FKO」という形になるが、日本株の場合は東証上場銘柄がほとんどなので「.T」でほぼカバーできる。
もう一つ注意点:yfinanceの info から取れる財務指標は「リアルタイム更新ではなく、数日〜数週間のタイムラグがある」ことが多い。スクリーニングの参考値として使うには十分だが、最新決算直後のPER/PBRは証券会社の情報と差異が生じることがある。
製造メーカー銘柄を一括スクリーニングするスクリプト
以下は、代表的な製造メーカー銘柄のリストをまとめてyfinanceに投げ、PER・PBR・配当利回り・直近3ヶ月リターンを表示するスクリプトだ。
import yfinance as yf
import pandas as pd
from datetime import datetime, timedelta
import time
# ---- 対象銘柄リスト(製造メーカー中心) ----
TICKERS = {
"7203": "トヨタ自動車",
"6501": "日立製作所",
"6902": "デンソー",
"6301": "コマツ",
"7011": "三菱重工業",
"6752": "パナソニック",
"6954": "ファナック",
"5401": "日本製鉄",
"7201": "日産自動車",
"6471": "日本精工",
}
# ---- データ取得 ----
results = []
end_date = datetime.today()
start_date = end_date - timedelta(days=90)
for code, name in TICKERS.items():
ticker_symbol = f"{code}.T"
try:
ticker = yf.Ticker(ticker_symbol)
info = ticker.info
# 財務指標
per = info.get("trailingPE", None)
pbr = info.get("priceToBook", None)
div_yield = info.get("dividendYield", None)
if div_yield:
div_yield = round(div_yield * 100, 2) # %表示
# 直近3ヶ月リターン
hist = ticker.history(start=start_date.strftime("%Y-%m-%d"),
end=end_date.strftime("%Y-%m-%d"))
if len(hist) >= 2:
ret_3m = (hist["Close"].iloc[-1] / hist["Close"].iloc[0] - 1) * 100
else:
ret_3m = None
results.append({
"銘柄コード": code,
"銘柄名": name,
"PER": round(per, 1) if per else "N/A",
"PBR": round(pbr, 2) if pbr else "N/A",
"配当利回り(%)": div_yield if div_yield else "N/A",
"3ヶ月リターン(%)": round(ret_3m, 1) if ret_3m else "N/A",
})
time.sleep(0.5) # APIへの負荷軽減
except Exception as e:
print(f"{code} ({name}) 取得失敗: {e}")
continue
# ---- DataFrame化して表示 ----
df = pd.DataFrame(results)
print(df.to_string(index=False))
スクリーニング条件でフィルタリングする
データを取得したら、条件に合う銘柄だけに絞り込むのは簡単だ。例えば「PERが15倍以下、かつ直近3ヶ月で株価が下落している(逆張り候補)」という条件でフィルタリングするにはこうする。
# 数値が入っている行だけ対象にする
df_numeric = df[df["PER"] != "N/A"].copy()
df_numeric["PER"] = pd.to_numeric(df_numeric["PER"])
df_numeric["3ヶ月リターン(%)"] = pd.to_numeric(df_numeric["3ヶ月リターン(%)"])
# スクリーニング条件
screened = df_numeric[
(df_numeric["PER"] <= 15) &
(df_numeric["3ヶ月リターン(%)"] < 0)
]
print("=== スクリーニング結果(PER15倍以下 かつ 3ヶ月マイナス) ===")
print(screened[["銘柄コード", "銘柄名", "PER", "3ヶ月リターン(%)"]].to_string(index=False))
このフィルタの条件は自分の投資スタイルに合わせて自由に変えてほしい。例えば「配当利回りが3%以上かつPBRが1倍以下」という割安バリュー株スクリーニングにも応用できる。
複数銘柄の株価を一括ダウンロードするには
個別に Ticker オブジェクトを作って history() を呼ぶ方法は確実だが、複数銘柄を一気にダウンロードするなら yf.download() の方が速い。
# 複数銘柄を一括ダウンロード
symbols = [f"{code}.T" for code in TICKERS.keys()]
bulk = yf.download(symbols, start="2024-01-01", end="2025-12-31",
group_by="ticker", progress=False, auto_adjust=True)
# 特定銘柄の終値を取り出す
toyota_close = bulk["7203.T"]["Close"]
print(toyota_close.tail())
一括ダウンロードはAPIへのリクエスト回数を減らせるので、銘柄数が多い場合(20〜30銘柄以上)はこちらが有利。ただし group_by="ticker" を忘れるとカラム構造がわかりづらくなるので注意。
まとめ
yfinanceで日本株を扱うときは「銘柄コード+.T」を忘れずに。それさえ守れば、証券会社のスクリーナーでは作れないカスタム条件で銘柄を絞り込めるようになる。製造メーカーに絞って毎週自動でスクリーニングを走らせるだけでも、見落としが減って監視の効率が上がった。
個人的には、このスクリーニング結果をCSVに出力して、週1でExcelに読み込んで確認するフローに落ち着いている。次はこのスクリプトをWindowsのタスクスケジューラで毎週月曜朝8時に自動実行する仕組みを整えたい。

