毎月の配当収入を増やしたい、安定した高配当ポートフォリオを作りたい——そんな投資家向けに、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で高配当スクリーニングを自動化すれば、手動で探すよりずっと効率的です。配当利回りだけでなく、配当性向・連続増配年数も確認して持続可能な高配当銘柄を選びましょう。

