Pythonで日本製造メーカー株をスクリーニング|PER・PBR・配当利回りで割安株を自動抽出

Python実装・コード

先月、日本製鉄の決算で含み損になりました。。。子供の世話をしていたら気づいたら−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送信を組み合わせた自動レポートの作り方を書く予定です。製造メーカー株に興味がある方は、ぜひこのコードを動かしてみてください。

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