オールウエザー配当金ポートフォリオ
サブテーマ:安定して年率10%+α(遊び資金)の配当金を受け取りたい
1 初めに
これまで、トータルリターンに優れる高配当投信や毎月分配を紹介してきました。例えばアライアンスバーンスタインの米国成長株投信(以下:AB投信)では配当金は直近年率10%を大幅に超える配当をもらえていますが、下落相場ではもらえない=配当生活が困難!!となる銘柄もあり、安定した配当生活がおくれない問題があるものもあります。
そこで今回は、株価が好調なときも不調な時も安定して年率10%の配当金が受け取れる配当金オールウエザー配当金ポートフォリオを紹介します。
今回のまとめ:
AD投信:JPEI:SCHD =5:4:1
→3000万投資、毎月25万円の配当が受け取れる(年率約10%)
**株価好調な相場も、下落相場でも安定してます!!
今回からアウトプットを重視して、本文はPYTHONコードに触れず結果をご報告します。コード全文は最下部に全文公開しておきます。再現性を確保するため、GoogleColabを使って実行した結果としています。PYTHONを使ってみたい方勉強してみたい方はまずはコピペでぜひ触ってみてください。
2 豆知識
1)SCHDについて
ここでのSCHDは楽天より取り扱いが始まった投資信託 高配当株式・米国ファンド(四半期決算型)についてです。対象の指数がティッカー”SCHD”のETFに連動した投資信託です。
SCHDのリターンについて調査した結果はこちら
2)JEPI,JEPQについて
JEPI,JEPQについてはこちら
3)アライアンスバーンスタイン米国成長株投信Dコース毎月決算型(為替ヘッジなし)予想分配金提示型 (以下略=AD投信)
AD投信の詳細はこちら
NISA対象各月分配Eコースの詳細はこちら
3 実践
1)実施内容
冒頭の通り、組み合わせる各投信の特徴は下記にまとめます。
ようはAD投信は配当はすごいが、下落相場に弱いです。対して、JEPIは直近の相場では配当は8%を切ることもあり、高い配当を受け取れません。これを組み合わせることで、好景気も下落相場も安定して10%を超える配当を目指すということで組み合わせることを提案します。
ただ、この2つ配当10%は狙えても、将来の価値上昇は期待できません。そのため高配当でも増配の優れるSCHDを組み合わせることで、将来の成長代も確保を狙いました。
AD投信:◎好景気の配当金10%超&S&P並みのトータルリターン
〇EコースはNISA対応
×下落相場の配当、株価アップのみで増配は無い
JEPI : 〇S&P500より下落相場に強く、下落相場で安定した配当金
&S&P500並みのトータルリターン
△上昇相場での配当、増配は望み薄
×NISA対象外
SCHD:〇 安定した増配、S&P500に次ぐトータルリターン
△ 配当は年率4%未満
今回3000万円を一括投資して毎年いくら配当金がもらえるかを年当たりに平均したグラフを出力させました。先にそれぞれ保有割合を極端に増やして傾向をあたらめて確認したのち、最適な調整を行っています。
調査期間はJEPIが設定が一番遅いためこの運用が始まった2020年から直近までの配当実績をもとにしています。
2)出力結果 3000万円一括投資
1)JEPI:AD投信:SCHD = 8:1:1
JEPIをメインにすると、安定して25万/月程度の配当は受け取れますが、直近の好調な相場の際には配当金が少なくなる傾向があります。今回の目標の25万円/月にはわずかに未達であるものの、実はこの割合が一番、配当金のばらつきは少なくかつ、下落相場に強いポートフォリオにはなっていますので、真のオールウエザー配当金ポートフォリオはこの割合です。
2)JEPI:AD投信:SCHD = 1:8:1
AD投信をメインにすると、株価が好調な2021年や2024年はかなりの額の配当金がもらえるものの、逆に2022年の下落相場には20万円程度の配当金しかもえらえないことがわかります。配当金は余裕資金として使う方にはこの割合もおすすめです。
3)JEPI:AD投信:SCHD = 1:1:8
SCHDをメイン投資では安定した配当金が受け取ることが可能ですが、毎月の分配額にすると15万強と少し寂しい金額です。ただ、セミFIRE目的の方には、確実に配当が入りつつ、増配による将来の分配金の増加も見込めますので、SCHDをメインとするのも十分一考の余地があると考えます。
4)JEPI:AD投信:SCHD = 5:4:1
これまでの傾向を確認し、毎月25万を受け取れ、かつ好調時にはボーナスとして余裕のある生活が送れる配当割合を算出してみました。
1割ながら成長の見込めるSCHDを組み込んだうえ、毎月25万円をうけとりつつ、相場が好調な時にはボーナスとして余裕資金も受け取ることができるポートフォリオではないでしょうか?
4 最後に
今回はこれまでの配当目的の投資対象を割合を変更することで、株価が好調な時も、不調な時も配当金と遊び資産として年率10%程度の配当金受け取れるオールウエザー配当金ポートフォリオを紹介させていただきましたがいかがでしたでしょうか?今回のコードもこのページ下部に掲載しておきますので、実際はこれら傾向を踏まえたうえで、皆様が重要視する内容に沿った保有割合を検討してみてもらえればと思います。
このサイトでは引き続き金融リテラシー向上及びPYTHONプログラミングに関した情報を発信していきますので、ぜひ応援よろしくお願いします。
記事の感想、要望があれば下記X(旧Twitterまで)
*今後の記事に活用させていただきます!!
以下、過去記事、AI時系列予測等のご紹介
他サイトですがココならで、A I(LSTM)を使った株価予測の販売もやってます。こちらではFREDから、失業率や2年10年金利、銅価格等結果も取得しLSTMモデルで予測するコードとなってますので興味があれば見てみてください。またその他2件も米国株投資とは直接関係はありませんがプログラム入門におすすめです。
チャンネル紹介:Kota@Python&米国株投資チャンネル
過去の掲載記事:興味PYがあればぜひ読んでください。
グラフ化集計の基礎:S &P500と金や米国債を比較してます。
移動平均を使った時系列予測
以下実行コード全文:コピペで実行してみてください。
*AD投信分は、事前にCSVファイルとしてダウンロードして格納してます。
その他データはYahooFinanceから取得して計算
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
from datetime import datetime
# 投資信託のデータを読み込む
file_path = '/content/drive/My Drive/lst_standard_price.csv'
df_mutual = pd.read_csv(file_path, encoding='shift_jis')
# 投資信託データの日付をdatetimeに変換
df_mutual['Date'] = pd.to_datetime(df_mutual['年月日'], format='%Y年%m月%d日')
df_mutual = df_mutual.sort_values('Date')
# 投資信託の識別子(ティッカーのように扱う)
mutual_fund_ticker = 'MutualFund'
# 資産のティッカーと保有割合を設定
asset_allocation = {
'JEPI': 0.5,
'SCHD': 0.1,
mutual_fund_ticker: 0.4, # 投資信託を追加
# 'SPY': 0.0, # 必要に応じて追加
}
# 保有割合の合計が100%であることを確認
if sum(asset_allocation.values()) != 1.0:
raise ValueError("保有割合の合計が100%になるようにしてください。")
# 各資産の開始日と終了日を取得
asset_start_dates = {}
asset_end_dates = {}
for ticker in asset_allocation.keys():
if ticker == mutual_fund_ticker:
# 投資信託の場合
asset_start_dates[ticker] = df_mutual['Date'].min()
asset_end_dates[ticker] = df_mutual['Date'].max()
else:
# ETFの場合
hist = yf.Ticker(ticker).history(period='max')
asset_start_dates[ticker] = hist.index.min().tz_localize(None)
asset_end_dates[ticker] = hist.index.max().tz_localize(None)
# 分析の開始日と終了日を設定(すべての資産が存在する日付範囲)
start_date = max(asset_start_dates.values())
end_date = min(asset_end_dates.values())
# デバッグ用に日付範囲を表示
print(f"開始日: {start_date}, 終了日: {end_date}")
# データ取得と分析のための辞書を初期化
asset_data = {}
# 投資信託のデータを取得
df_mutual_filtered = df_mutual[(df_mutual['Date'] >= start_date) & (df_mutual['Date'] <= end_date)].reset_index(drop=True)
asset_data[mutual_fund_ticker] = df_mutual_filtered
# Yahoo FinanceからETFデータを取得する関数(actions=Trueを追加)
def get_etf_data(ticker, start_date, end_date):
data = yf.download(ticker, start=start_date, end=end_date, actions=True, progress=False)
if 'Dividends' not in data.columns:
data['Dividends'] = 0 # 配当データがない場合は0を設定
return data
# ETFのデータを取得
for ticker in asset_allocation.keys():
if ticker != mutual_fund_ticker:
asset_data[ticker] = get_etf_data(ticker, start_date, end_date)
# 初期投資額
initial_investment = 30000000
# 資産ごとの分析
for ticker in asset_allocation.keys():
allocation = asset_allocation[ticker]
if ticker == mutual_fund_ticker:
# 投資信託の分析
df = asset_data[ticker]
initial_units = (initial_investment * allocation) / df['基準価額(円)'].iloc[0]
df['Units'] = initial_units
df['Dividend_Value'] = df['分配金'].fillna(0) * df['Units'] * 0.8 # 税引き考慮
df['Cumulative_Dividend'] = df['Dividend_Value'].cumsum()
df['Value'] = df['基準価額(円)'] * df['Units']
else:
# ETFの分析
df = asset_data[ticker]
initial_units = (initial_investment * allocation) / df['Adj Close'].iloc[0]
df['Units'] = initial_units
df['Dividend_Value'] = df['Dividends'] * df['Units'] * 0.8 # 税引き考慮
df['Cumulative_Dividend'] = df['Dividend_Value'].cumsum()
df['Value'] = df['Adj Close'] * df['Units']
# ポートフォリオ全体の分析
date_range = pd.date_range(start=start_date, end=end_date, freq='D')
portfolio_data = pd.DataFrame(index=date_range)
# 各資産のデータをポートフォリオにマージ
for ticker in asset_allocation.keys():
df = asset_data[ticker]
if ticker == mutual_fund_ticker:
df = df.set_index('Date')
df = df[[ 'Value', 'Cumulative_Dividend' ]]
else:
df = df[['Value', 'Cumulative_Dividend']]
df = df.rename(columns={
'Value': f'{ticker}_Value',
'Cumulative_Dividend': f'{ticker}_Dividend'
})
portfolio_data = portfolio_data.join(df[[f'{ticker}_Value', f'{ticker}_Dividend']], how='left')
# 欠損値を前方埋め
portfolio_data.fillna(method='ffill', inplace=True)
portfolio_data.fillna(0, inplace=True) # 残りの欠損値を0で埋める
# 総資産価値と累積配当金の計算
value_cols = [col for col in portfolio_data.columns if col.endswith('_Value')]
dividend_cols = [col for col in portfolio_data.columns if col.endswith('_Dividend')]
portfolio_data['Total_Value'] = portfolio_data[value_cols].sum(axis=1)
portfolio_data['Total_Dividend'] = portfolio_data[dividend_cols].sum(axis=1)
# 資産別のデイリーディビデンドを計算
for ticker in asset_allocation.keys():
if f'{ticker}_Dividend' in portfolio_data.columns:
portfolio_data[f'{ticker}_Daily_Dividend'] = portfolio_data[f'{ticker}_Dividend'].diff().fillna(0)
# グラフの描画
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 14))
# トータルリターンの推移
ax1.plot(portfolio_data.index, portfolio_data['Total_Value'], label='ポートフォリオ')
# SPYとの比較
spy_ticker = 'SPY'
spy_start_date = start_date # 分析開始日に合わせる
df_spy = get_etf_data(spy_ticker, spy_start_date, end_date)
spy_initial_units = initial_investment / df_spy['Adj Close'].iloc[0]
df_spy['Value'] = df_spy['Adj Close'] * spy_initial_units
ax1.plot(df_spy.index, df_spy['Value'], label=spy_ticker)
ax1.set_title('トータルリターンの推移')
ax1.set_xlabel('日付')
ax1.set_ylabel('評価額(円)')
ax1.legend()
# 配当金の推移(資産別累積配当金のエリアチャート)
portfolio_data[dividend_cols].plot.area(ax=ax2, stacked=True)
ax2.set_title('累積配当金の推移(資産別)')
ax2.set_xlabel('日付')
ax2.set_ylabel('累積配当金(円)')
ax2.legend()
plt.tight_layout()
plt.show()
# 月次配当金の推移(資産別)
daily_dividend_cols = [col for col in portfolio_data.columns if col.endswith('_Daily_Dividend')]
monthly_dividends = portfolio_data[daily_dividend_cols].resample('M').sum()
monthly_dividends.plot(kind='bar', stacked=True, figsize=(14, 7))
plt.title('月次配当金の推移(資産別)')
plt.xlabel('年月')
plt.ylabel('月次配当金(円)')
plt.legend()
plt.show()
# 年別・月別の配当額の分析
portfolio_data['Year'] = portfolio_data.index.year
portfolio_data['Month'] = portfolio_data.index.month
# 月別の配当金(差分を取ってその月の配当金を取得)
portfolio_data['Monthly_Dividend'] = portfolio_data['Total_Dividend'].diff().fillna(0)
# 年月でグループ化して月別配当金を集計
monthly_total_dividends = portfolio_data.groupby(['Year', 'Month'])['Monthly_Dividend'].sum().unstack(level=0)
print("年別・月別の配当額:")
display(monthly_total_dividends)
# 年毎の月平均配当額のグラフ
plt.figure(figsize=(14, 7))
monthly_total_dividends.mean().plot(kind='bar', color='skyblue')
plt.title('年毎の月平均配当額')
plt.xlabel('年')
plt.ylabel('平均配当額(円)')
plt.grid(True)
plt.show()
# 分析結果の出力
print(f"ポートフォリオ最終評価額: ¥{portfolio_data['Total_Value'].iloc[-1]:,.2f}")
print(f"ポートフォリオ累積配当金: ¥{portfolio_data['Total_Dividend'].iloc[-1]:,.2f}")
print(f"{spy_ticker}最終評価額: ¥{df_spy['Value'].iloc[-1]:,.2f}")
print(f"{spy_ticker}累積配当金: ¥{(df_spy['Dividends'] * spy_initial_units * 0.8).sum():,.2f}")