高配当株スクリーニングツールをPythonで自作する方法

Python実装・コード

毎月の配当収入を増やしたい、安定した高配当ポートフォリオを作りたい——そんな投資家向けに、Pythonで高配当株を自動スクリーニングするツールを作ります。

高配当スクリーニングの基準

  • 配当利回り:3%以上
  • 配当性向:80%以下(持続可能性)
  • 連続増配年数:5年以上
  • 自己資本比率:30%以上
  • PER:25倍以下

日本株の高配当スクリーニング

import yfinance as yf
import pandas as pd
import numpy as np

# 日本の主要高配当候補銘柄リスト
jp_candidates = [
    "8306.T",  # 三菱UFJ
    "8316.T",  # 三井住友
    "8411.T",  # みずほ
    "9432.T",  # NTT
    "9433.T",  # KDDI
    "5020.T",  # ENEOSホールディングス
    "8031.T",  # 三井物産
    "8058.T",  # 三菱商事
    "1925.T",  # 大和ハウス工業
    "4502.T",  # 武田薬品
    "6501.T",  # 日立製作所
    "7201.T",  # 日産自動車
    "8725.T",  # MS&ADインシュアランス
    "8766.T",  # 東京海上ホールディングス
]

def screen_high_dividend_jp(tickers):
    results = []
    for t in tickers:
        try:
            info = yf.Ticker(t).info
            div_yield = (info.get("dividendYield", 0) or 0) * 100
            payout = (info.get("payoutRatio", 0) or 0) * 100
            per = info.get("trailingPE", None)
            pbr = info.get("priceToBook", None)
            market_cap = (info.get("marketCap", 0) or 0) / 1e8
            
            results.append({
                "Ticker": t,
                "銘柄名": info.get("longName", t)[:15],
                "配当利回り(%)": round(div_yield, 2),
                "配当性向(%)": round(payout, 1),
                "PER": round(per, 1) if per else "N/A",
                "PBR": round(pbr, 2) if pbr else "N/A",
                "時価総額(億)": round(market_cap, 0),
            })
        except Exception as e:
            pass
    
    df = pd.DataFrame(results).set_index("Ticker")
    # スクリーニング条件を適用
    mask = (df["配当利回り(%)"] >= 3.0) & (df["配当性向(%)"] <= 80)
    screened = df[mask].sort_values("配当利回り(%)", ascending=False)
    return screened

result = screen_high_dividend_jp(jp_candidates)
print(result.to_string())

米国高配当ETF・銘柄のスクリーニング

# 米国高配当関連銘柄
us_candidates = [
    "T",    # AT&T
    "VZ",   # Verizon
    "XOM",  # Exxon Mobil
    "CVX",  # Chevron
    "PFE",  # Pfizer
    "MO",   # Altria
    "PM",   # Philip Morris
    "O",    # Realty Income(月次配当)
    "MAIN", # Main Street Capital
    "SCHD", # Schwab US Dividend Equity ETF
    "VYM",  # Vanguard High Dividend Yield ETF
    "HDV",  # iShares Core High Dividend ETF
]

def screen_high_dividend_us(tickers, min_yield=3.0, max_payout=80):
    results = []
    for t in tickers:
        try:
            info = yf.Ticker(t).info
            div_yield = (info.get("dividendYield", 0) or 0) * 100
            payout = (info.get("payoutRatio", 0) or 0) * 100
            
            if div_yield >= min_yield:
                results.append({
                    "Ticker": t,
                    "名称": info.get("longName", t)[:20],
                    "配当利回り(%)": round(div_yield, 2),
                    "配当性向(%)": round(payout, 1) if payout > 0 else "ETF",
                    "セクター": info.get("sector", "ETF"),
                    "PER": round(info.get("trailingPE", 0) or 0, 1),
                })
        except:
            pass
    
    df = pd.DataFrame(results).set_index("Ticker")
    return df.sort_values("配当利回り(%)", ascending=False)

us_result = screen_high_dividend_us(us_candidates)
print(us_result.to_string())

配当の継続性チェック

def check_dividend_history(ticker_symbol, years=5):
    """過去N年分の配当履歴を確認"""
    ticker = yf.Ticker(ticker_symbol)
    dividends = ticker.dividends
    
    if len(dividends) == 0:
        print(f"{ticker_symbol}: 配当履歴なし")
        return None
    
    # 年次配当額を計算
    div_by_year = dividends.resample("Y").sum()
    
    print(f"\n=== {ticker_symbol} 配当履歴 ===")
    print(div_by_year.tail(years))
    
    # 増配しているか確認
    recent = div_by_year.tail(years)
    is_growing = all(recent.iloc[i] <= recent.iloc[i+1] for i in range(len(recent)-1))
    print(f"連続増配({years}年): {is_growing}")
    
    # CAGR計算
    if len(recent) >= 2 and recent.iloc[0] > 0:
        cagr = (recent.iloc[-1] / recent.iloc[0]) ** (1/(len(recent)-1)) - 1
        print(f"配当CAGR: {cagr:.1%}")
    
    return div_by_year

check_dividend_history("KDDI", 5)

高配当ポートフォリオシミュレーション

def simulate_dividend_portfolio(holdings, years=10, reinvest=True):
    """
    高配当ポートフォリオの将来シミュレーション
    holdings: {ticker: 投資額(万円)} の辞書
    """
    print(f"\n=== 高配当ポートフォリオシミュレーション ===")
    print(f"運用期間: {years}年, 配当再投資: {reinvest}")
    
    total_investment = sum(holdings.values())
    annual_income = 0
    
    for ticker, amount in holdings.items():
        info = yf.Ticker(ticker).info
        div_yield = (info.get("dividendYield", 0) or 0)
        annual_div = amount * div_yield
        annual_income += annual_div
        print(f"  {ticker}: {amount}万円 x {div_yield:.1%} = 年間{annual_div:.1f}万円")
    
    print(f"\n初期投資額: {total_investment}万円")
    print(f"初年度配当収入: {annual_income:.1f}万円")
    print(f"配当利回り: {annual_income/total_investment:.1%}")
    
    # 複利シミュレーション
    if reinvest:
        portfolio_value = float(total_investment)
        avg_yield = annual_income / total_investment
        for year in range(1, years+1):
            portfolio_value *= (1 + avg_yield)
        growth = portfolio_value / total_investment
        print(f"\n{years}年後の試算額: {portfolio_value:.0f}万円({growth:.1f}倍)")

# 使用例
holdings = {
    "9433.T": 100,  # KDDI 100万円
    "8316.T": 100,  # 三井住友 100万円
    "SCHD": 100,    # 米国高配当ETF 100万円
}
simulate_dividend_portfolio(holdings)

まとめ

Pythonで高配当スクリーニングを自動化すれば、手動で探すよりずっと効率的です。配当利回りだけでなく、配当性向・連続増配年数も確認して持続可能な高配当銘柄を選びましょう。

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