Strasmore Research
学習 Matt Connor著者: Matt Connor ・更新: 2026-08-08 · data as of August 8, 2026 · refreshed weekly

ポートフォリオ配当利回りの加重平均と計算方法

ポートフォリオの配当利回りを、年間配当収入の合計と時価総額から計算します。利回り欄の単純平均が誤解を招く理由と、正しい加重平均も解説します。

ポートフォリオの配当利回りは一つの数字です。保有銘柄が年間に支払う予定の配当総額を、保有銘柄の時価総額で割ったものです。別の言い方をすれば、個別銘柄の利回りを時価総額で加重した平均です。各銘柄のウェートは、ポートフォリオ全体に占めるその銘柄の金額の割合です。証券会社の画面に表示される利回り欄の単純平均は別の数字で、実際のポートフォリオでは、多くの場合こちらの方が見栄えのよい数字になります。

ポートフォリオの配当利回りの計算方法

各ポジションについて、保有株数に年間1株当たり配当金を掛けます。これで、そのポジションの年間配当収入がドル単位で求まります。各ポジションの収入を合計し、全ポジションの株数と株価を掛けた金額の合計で割り、100を掛けます。これが計算のすべてです。保有銘柄が四銘柄でも四十銘柄でも同じです。

次の二つの方法は同じ結果になります。

  • 年間配当収入の合計をポートフォリオ時価総額の合計で割る。
  • 各保有銘柄について、ウェートに利回りを掛けたものを合計する。ウェートはポジション価値をポートフォリオ価値で割ったもの。

二つ目の式を見ると、単純平均がなぜ誤るのかが分かります。どちらの計算にもすべての銘柄が含まれますが、正しい計算では各銘柄に一票ずつではなく、保有金額に応じたウェートを付けます。ポートフォリオの一部として現金を含める場合は、分母にも現金を入れます。現金を除くと、収入が一円も増えないのに表示利回りだけが上がります。単一銘柄について同じ計算をする場合は、配当利回りの計算方法を参照してください。

利回り欄の平均が収入を過大に見せる理由

二つの方法の差は、具体例で見ると分かりやすくなります。以下のスクリプトは、外部モジュールを読み込まない標準的な Python 3のコードです。python3が動く環境なら実行できます。五つのポジションは、違いが明確になるように設定した仮想的な概数です。銘柄名、株数、株価、年間1株当たり配当金を使います。

#!/usr/bin/env python3
# each row: (name, shares, price, annual dividend per share)
holdings = [
    ('A', 200,  50.00, 1.50),
    ('B', 150, 100.00, 2.00),
    ('C', 100,  80.00, 0.80),
    ('D', 300,  20.00, 1.00),
    ('E', 100,  10.00, 0.90),
]

total_value  = sum(sh * px for _, sh, px, _ in holdings)
total_income = sum(sh * dps for _, sh, _, dps in holdings)
naive        = sum(100 * dps / px for _, _, px, dps in holdings) / len(holdings)

print(f'market value      : ${total_value:,.2f}')
print(f'annual income     : ${total_income:,.2f}')
print(f'portfolio yield   : {100 * total_income / total_value:.2f}%')
print(f'average of yields : {naive:.2f}%')

for name, sh, px, dps in holdings:
    value = sh * px
    income = sh * dps
    print(
        f'{name}  weight {100 * value / total_value:5.1f}%'
        f'  yield {100 * dps / px:5.2f}%'
        f'  income ${income:8,.2f}'
        f'  share of income {100 * income / total_income:5.1f}%'
    )

実行すると、二つの主要な数字が大きく食い違います。ポートフォリオの株式保有額は40,000ドルで、年間配当収入は1,070ドルです。時価総額加重利回りは2.68%になります。一方、五つの利回りの単純平均は4.00%と表示され、約1.5倍になります。

すべての理由はポジションEにあります。Eの利回りは9.00%で、ポートフォリオ内で最も高い一方、株式保有額は1,000ドルです。ポートフォリオ価値の2.5%、配当収入の8.4%にすぎません。しかし単純平均では、隣にある15,000ドルのポジションと同じ五分の一の重みを持ちます。利回りは、それを生み出す金額と結び付けて初めて意味を持ちます。

実際の保有銘柄におけるウェート

個人投資家が保有する配当銘柄の利回りには大きな幅があります。そのため、ウェートの選び方が重要になります。以下のパネルでは、各銘柄の過去十二カ月の公表済み1株当たり配当金を合計し、直近の日次終値で割ってトレーリング利回りを算出しています。

クエリ生活必需品10銘柄の直近12カ月配当利回り
各数値の背後にある正確なSQL
WITH
    last_px AS
    (
        SELECT
            ticker,
            toFloat64(argMax(close, date))         AS px,
            formatDateTime(max(date), '%b %e, %Y') AS priced_through
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('AAPL', 'MSFT', 'HD', 'KO', 'PG', 'PEP', 'JNJ', 'XOM', 'CVX', 'VZ')
          AND date >= today() - 30
        GROUP BY ticker
    ),
    ttm_dps AS
    (
        SELECT
            ticker,
            sum(amount) AS dps
        FROM
        (
            SELECT
                ticker,
                id,
                toFloat64(any(cash_amount)) AS amount
            FROM global_markets.stocks_dividends
            WHERE ticker IN ('AAPL', 'MSFT', 'HD', 'KO', 'PG', 'PEP', 'JNJ', 'XOM', 'CVX', 'VZ')
              AND ex_dividend_date >  today() - 365
              AND ex_dividend_date <= today()
            GROUP BY ticker, id
        )
        GROUP BY ticker
    )
SELECT
    p.ticker                     AS symbol,
    round(d.dps, 2)              AS ttm_dividend_usd,
    round(100 * d.dps / p.px, 2) AS yield_pct,
    p.priced_through             AS priced_through
FROM last_px AS p
INNER JOIN ttm_dps AS d ON d.ticker = p.ticker
ORDER BY yield_pct DESC
Run this yourself

10銘柄の利回りは、Aug 7, 2026時点の価格に基づくと、5.96%のVZから0.34%のAAPLまで広がっています。このような利回りの分布を持つ銘柄でポートフォリオを構築すると、各ポジションの金額がたまたま同じでない限り、利回り欄の中間値には近づきません。

ここで、そのうち五銘柄を一定の株数でポートフォリオに組み入れ、二つの数字を並べて見てみます。各銘柄の時価総額に占める割合と、年間配当収入に占める割合です。

クエリ5銘柄ポートフォリオ:価値構成比対収入構成比
各数値の背後にある正確なSQL
WITH
    positions AS
    (
        SELECT
            tupleElement(p, 1)            AS ticker,
            toFloat64(tupleElement(p, 2)) AS shares
        FROM
        (
            SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
        )
    ),
    last_px AS
    (
        SELECT
            ticker,
            toFloat64(argMax(close, date)) AS px
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
          AND date >= today() - 30
        GROUP BY ticker
    ),
    ttm_dps AS
    (
        SELECT
            ticker,
            sum(amount) AS dps
        FROM
        (
            SELECT
                ticker,
                id,
                toFloat64(any(cash_amount)) AS amount
            FROM global_markets.stocks_dividends
            WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
              AND ex_dividend_date >  today() - 365
              AND ex_dividend_date <= today()
            GROUP BY ticker, id
        )
        GROUP BY ticker
    ),
    holding AS
    (
        SELECT
            pos.ticker         AS ticker,
            pos.shares * lp.px AS value_usd,
            pos.shares * d.dps AS income_usd
        FROM positions AS pos
        INNER JOIN last_px AS lp ON lp.ticker = pos.ticker
        INNER JOIN ttm_dps AS d  ON d.ticker  = pos.ticker
    )
SELECT
    h.ticker                                      AS symbol,
    round(100 * h.value_usd  / t.total_value,  1) AS weight_pct,
    round(100 * h.income_usd / t.total_income, 1) AS income_share_pct,
    round(100 * h.income_usd / h.value_usd,    2) AS yield_pct
FROM holding AS h
CROSS JOIN
(
    SELECT
        sum(value_usd)  AS total_value,
        sum(income_usd) AS total_income
    FROM holding
) AS t
ORDER BY weight_pct DESC
Run this yourself

スクリプトで見たパターンは、実際の株価でも繰り返されます。MSFTは時価総額の31.4%を占める最大のポジションですが、利回り0.72%で収入の10%を生み出しています。一方、VZは価値の5.9%を占め、5.96%の利回りで収入の15.7%を支払います。利回りが異なると、ウェートと収入の割合は一致しません。

同じ五銘柄を二通りの方法で平均すると、答えは異なります。

クエリ同じ5銘柄の2つの平均
各数値の背後にある正確なSQL
WITH
    positions AS
    (
        SELECT
            tupleElement(p, 1)            AS ticker,
            toFloat64(tupleElement(p, 2)) AS shares
        FROM
        (
            SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
        )
    ),
    last_px AS
    (
        SELECT
            ticker,
            toFloat64(argMax(close, date)) AS px
        FROM global_markets.stocks_daily_aggs
        WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
          AND date >= today() - 30
        GROUP BY ticker
    ),
    ttm_dps AS
    (
        SELECT
            ticker,
            sum(amount) AS dps
        FROM
        (
            SELECT
                ticker,
                id,
                toFloat64(any(cash_amount)) AS amount
            FROM global_markets.stocks_dividends
            WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
              AND ex_dividend_date >  today() - 365
              AND ex_dividend_date <= today()
            GROUP BY ticker, id
        )
        GROUP BY ticker
    ),
    holding AS
    (
        SELECT
            pos.shares * lp.px AS value_usd,
            pos.shares * d.dps AS income_usd
        FROM positions AS pos
        INNER JOIN last_px AS lp ON lp.ticker = pos.ticker
        INNER JOIN ttm_dps AS d  ON d.ticker  = pos.ticker
    )
SELECT
    tupleElement(m, 1)           AS method,
    round(tupleElement(m, 2), 2) AS yield_pct
FROM
(
    SELECT arrayJoin([
        ('Market-value weighted portfolio yield', weighted_yield),
        ('Simple average of the five yields',     naive_yield)
    ]) AS m
    FROM
    (
        SELECT
            100 * sum(income_usd) / sum(value_usd) AS weighted_yield,
            avg(100 * income_usd / value_usd)      AS naive_yield
        FROM holding
    )
)
ORDER BY yield_pct DESC
Run this yourself

2.93%の高い方の線は、Simple average of the five yieldsの数字です。もう一方は2.24%と表示されます。現金に対応するのは一方だけです。加重利回りにポートフォリオ時価総額を掛けると、年間配当収入を再現できます。単純平均に同じ計算をしても、明細書に表示されることのない数字になります。方向性は構造的に決まります。高利回り銘柄のポジションが小さい場合、単純平均は実際のポートフォリオ利回りを上回ります。高利回り銘柄のポジションが大きい場合は、下回ります。

Yield on costはポートフォリオ利回りではない

Yield on costは、現在の年間配当金を、現在のポジション価値ではなく購入価格で割ったものです。20ドルで購入した銘柄が現在80ドルで取引され、年間1株当たり1.00ドルの配当を続けている場合、現在の利回りは1.25%ですが、Yield on costは5.00%になります。配当金額は同じです。動いたのは分母だけです。

どちらの数字も正しく、それぞれ異なる問いに答えています。分母に現在の時価総額を使うと、現在のポートフォリオ利回りが分かります。これは良好な配当利回りや米国財務省短期証券と比較できる数字です。分母に取得原価を使うと、過去の購入について分かります。問題は、同じポートフォリオ合計の中で両者を混ぜる場合に生じます。最近買った銘柄には現在の利回りを使い、十年間保有している銘柄にはYield on costを使うケースです。この混在によって、インカムポートフォリオの見かけの利回りはしばしば二倍になり、証券会社が報告するどの数字とも一致しなくなります。配当利回りの罠では、大幅な株価下落後に利回りが高く表示される反対側の錯覚を扱っています。

トレーリングかフォワードかで結果は変わる

ここまでのすべての数字は、分子にどの配当金を入れるかによって変わります。トレーリング利回りは、実際に公表された過去十二カ月の配当金を合計します。フォワード利回りは直近の配当金を年率換算します。通常は、直近の四半期配当金に四を掛けます。配当金を変更した銘柄や、年間に特別配当を支払った銘柄では、両者は一致しません。大きなポジションが一つあるだけで、ポートフォリオ全体の数字が大きく動くこともあります。ここで使用しているのはトレーリングの数値です。トレーリング配当利回りとフォワード配当利回りでは、それぞれを選ぶべき場面を説明しています。

利回りは率であり、現金はまとまって入る

加重利回りは年間の率であり、支払日程ではありません。同じ五つのポジションでも、配当金は数カ月に集中して支払われます。米国企業の多くは四半期ごとに権利落ちとなり、支払日程も似通っているためです。

クエリ5銘柄ポートフォリオの配当収入(月別)
各数値の背後にある正確なSQL
WITH
    positions AS
    (
        SELECT
            tupleElement(p, 1)            AS ticker,
            toFloat64(tupleElement(p, 2)) AS shares
        FROM
        (
            SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
        )
    ),
    payments AS
    (
        SELECT
            ticker,
            id,
            any(ex_dividend_date)       AS ex_date,
            toFloat64(any(cash_amount)) AS amount
        FROM global_markets.stocks_dividends
        WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
          AND ex_dividend_date >  today() - 365
          AND ex_dividend_date <= today()
        GROUP BY ticker, id
    )
SELECT
    formatDateTime(toStartOfMonth(pay.ex_date), '%Y-%m') AS month,
    formatDateTime(toStartOfMonth(pay.ex_date), '%b %Y') AS month_label,
    round(sum(pos.shares * pay.amount), 2)               AS income_usd
FROM payments AS pay
INNER JOIN positions AS pos ON pos.ticker = pay.ticker
GROUP BY month, month_label
ORDER BY month
Run this yourself

過去一年間に現金が入ったのは12カ月で、直近はJul 2026の$107.76でした。ポートフォリオ利回りが数%だとしても、どの月に資金が入るかは分かりません。そのため、月次の収入計画には利回りとともに支払日程が必要です。これらのポートフォリオの数字を比較する市場全体の水準については、S&P 500の配当利回りを参照してください。

よくある質問

ポートフォリオ全体の配当利回りはどう計算しますか?

各保有銘柄の年間配当収入(株数に年間1株当たり配当金を掛けたもの)を合計します。次に、各保有銘柄の時価総額(株数に株価を掛けたもの)を合計します。その後、収入合計を時価総額合計で割り、100を掛けます。結果は、保有銘柄の利回りを時価総額で加重した平均です。

保有銘柄の利回りの平均が、ポートフォリオ利回りより高いのはなぜですか?

単純平均では、各ポジションに一票を与えます。ポートフォリオ利回りでは、各ポジションに金額に比例した票を与えます。高利回り銘柄のポジションが最も小さい場合、単純平均は実際にポートフォリオが生み出す利回りを上回ります。差が五割増しになることもあります。

現金はポートフォリオの配当利回りに含めますか?

現金をポートフォリオの一部として扱う場合は、配当金ゼロとして分母に含めます。その結果、利回りは低下します。現金を除くと、投資部分だけの利回りになります。どちらの方法でも構いませんが、測定するたびに同じ方法を使う必要があります。

Yield on costはポートフォリオ利回りと同じですか?

いいえ。Yield on costは、現在の配当金を数年前に支払った購入価格で割るため、株価が上昇するほど高くなります。ポートフォリオ利回りは現在の時価総額を使います。こちらが、現在の保有銘柄が生み出す収入と結び付く数字です。

高利回り銘柄を一つ加えると、ポートフォリオ利回りは大きく上がりますか?

その銘柄に投じた金額に比例する範囲でしか上がりません。ポートフォリオの2.5%を9%の利回りの銘柄で保有すると、加重利回りへの寄与はおよそ0.2ポイントです。計算は0.09に0.025を掛けます。利回り欄の単純平均に与える影響とは関係ありません。


ここにあるすべてのパネルには、生成に使ったSQLが正確に記載されています。そのため、ウェートを行単位で検証できます。自分の銘柄リストと保有株数で同じ計算を実行するには、Strasmore terminalで平易な英語で依頼してください。

#dividend yield#portfolio#weighted average#income#calculation