先月、日本製鉄の決算で含み損になりました。。。子供の世話をしていたら気づいたら−7%で、「なんで買ったんだっけ」と改めて自分のエントリー基準の曖昧さを痛感しました。製造メーカー株が好きなのはわかるんですが、「なんとなく割安そう」という感覚だけで買うのをやめようと思って、Pythonで定量的にスクリーニングする仕組みを作ることにしました。
なぜ製造メーカー株×スクリーニングを作ったか
なぜ僕がこれを調べたかというと、トヨタ・日立・デンソー・日本製鉄といった製造メーカー株は決算のインパクトが大きく、エントリータイミングが重要だと感じていたからです。PERが低い、PBRが1倍割れ、配当利回りが3%超の銘柄は「割安な製造株」の目安になりますが、毎回手動でチェックするのは時間がかかります。yfinanceを使えばPythonで一括スクリーニングができると知ったので、実装してみました。
スクリーニング対象の銘柄リスト
今回は日本の主要製造メーカー株を対象にします。yfinanceでは日本株は「7203.T」のようにティッカーの末尾に「.T」をつけます。
# 主要製造メーカー銘柄リスト
MANUFACTURING_STOCKS = {
"7203.T": "トヨタ自動車",
"6501.T": "日立製作所",
"6702.T": "富士通",
"6752.T": "パナソニック",
"6758.T": "ソニーグループ",
"7267.T": "本田技研工業",
"7269.T": "スズキ",
"5401.T": "日本製鉄",
"6301.T": "小松製作所",
"6857.T": "アドバンテスト",
"6902.T": "デンソー",
"7011.T": "三菱重工業",
"6861.T": "キーエンス",
"6594.T": "日本電産(ニデック)",
}
yfinanceでPER・PBR・配当利回りを一括取得するコード
import yfinance as yf
import pandas as pd
import time
def get_stock_fundamentals(ticker_dict):
"""
製造メーカー株のファンダメンタル指標を一括取得する
ticker_dict: {"ティッカー": "銘柄名"} の辞書
"""
results = []
for ticker, name in ticker_dict.items():
try:
stock = yf.Ticker(ticker)
info = stock.info
current_price = info.get('currentPrice') or info.get('regularMarketPrice')
per = info.get('trailingPE')
per_forward = info.get('forwardPE')
pbr = info.get('priceToBook')
div_yield = info.get('dividendYield')
market_cap = info.get('marketCap')
roe = info.get('returnOnEquity')
results.append({
'ティッカー' : ticker,
'銘柄名' : name,
'現在値' : current_price,
'実績PER' : round(per, 1) if per else None,
'予想PER' : round(per_forward, 1) if per_forward else None,
'PBR' : round(pbr, 2) if pbr else None,
'配当利回り(%)' : round(div_yield * 100, 2) if div_yield else None,
'ROE(%)' : round(roe * 100, 1) if roe else None,
'時価総額(億円)' : round(market_cap / 1e8) if market_cap else None,
})
time.sleep(0.5)
except Exception as e:
print(f"{name}({ticker}) 取得エラー: {e}")
results.append({'ティッカー': ticker, '銘柄名': name,
'現在値': None, '実績PER': None, '予想PER': None,
'PBR': None, '配当利回り(%)': None, 'ROE(%)': None, '時価総額(億円)': None})
return pd.DataFrame(results)
# 実行
print("製造メーカー株のファンダメンタル情報を取得中...")
df = get_stock_fundamentals(MANUFACTURING_STOCKS)
print(df.to_string(index=False))
スクリーニング条件を設定して割安株を抽出する
データが取れたら、割安の条件でフィルタリングします。製造メーカー株の場合、以下の条件を使っています:
def screen_value_stocks(df, max_per=15, max_pbr=1.5, min_div_yield=2.0, min_roe=8.0):
"""
バリュー株スクリーニング
max_per : PERの上限(低いほど割安)
max_pbr : PBRの上限(1.0以下は純資産割れ)
min_div_yield : 最低配当利回り(%)
min_roe : 最低ROE(%、収益性の確認)
"""
filtered = df.copy().dropna(subset=['実績PER', 'PBR', '配当利回り(%)'])
conditions = (
(filtered['実績PER'] <= max_per) &
(filtered['PBR'] <= max_pbr) &
(filtered['配当利回り(%)'] >= min_div_yield)
)
if 'ROE(%)' in filtered.columns:
roe_condition = filtered['ROE(%)'].isna() | (filtered['ROE(%)'] >= min_roe)
conditions = conditions & roe_condition
return filtered[conditions].sort_values('配当利回り(%)', ascending=False)
# スクリーニング実行
print("\n=== バリュースクリーニング結果 ===")
print("条件: PER≤15、PBR≤1.5、配当利回り≥2%、ROE≥8%\n")
screened = screen_value_stocks(df)
if len(screened) == 0:
print("条件を満たす銘柄が見つかりませんでした。条件を緩めてみてください。")
else:
print(screened[['銘柄名', '現在値', '実績PER', 'PBR', '配当利回り(%)', 'ROE(%)']].to_string(index=False))
print(f"\n{len(screened)}銘柄が条件を満たしました")
スクリーニング結果をExcelに出力する
毎週末にこのスクリプトを実行してExcelに保存しておくと、エントリー候補の管理が楽になります。
from datetime import datetime
output_file = f"製造株スクリーニング_{datetime.today().strftime('%Y%m%d')}.xlsx"
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='全銘柄', index=False)
screened.to_excel(writer, sheet_name='スクリーニング結果', index=False)
print(f"\nExcelファイルを保存しました: {output_file}")
まとめ
yfinanceを使えば、日本の主要製造メーカー株のPER・PBR・配当利回りを一括でスクリーニングすることができます。「なんとなく割安そう」という感覚を、数字で確認できるようになったのは大きな進歩だと思っています。
個人的には、このスクリーニングを毎週末に自動実行してメールで受け取る仕組みにしたいと思っています。次回はWindowsタスクスケジューラ+Gmail送信を組み合わせた自動レポートの作り方を書く予定です。製造メーカー株に興味がある方は、ぜひこのコードを動かしてみてください。
