Strasmore Research
学習 Matt Connor著者: Matt Connor ・更新: 2026-07-24

月間株式リターンの計算方法

月間の株式リターンは、価格の選択や配当の有無、株式分割の調整によって変動します。実際のデータに基づき計算手法を比較します。

ある銘柄の「6月のパフォーマンス」を尋ねると、情報源によって異なる数値が返されます。しかし、それらはすべて正解です。月間の株式リターンは、一般的には意識されない以下の要素によって決まります。月の開始時と終了時のどの2つの価格を用いるか配当を含めるか、そして株式分割の調整済み価格を用いるかです。このページでは、競合する計算手法を実際の市場データに基づいて並べて比較し、数値の違いの理由を明らかにします。

Close-to-close:標準的な慣行

インデックス・プロバイダー、ファンドの運用報告書、および多くの株価表示ページで使用される慣行です。月間リターンは、前月の最終レギュラーセッション終値から当月の最終終値までの期間で計算されます。5月の最終終値は、6月の計算の起点となります。計算式は、(終値 − 始値) ÷ 始値 の一行のみです。例として、5月末が50.00ドル、6月末が53.50ドルの銘柄を考えます。この銘柄の月間リターンは (53.50 − 50.00) ÷ 50.00 = 0.07、つまり7%となります。このページにあるすべての慣行は、同じ計算式に対して異なる入力値を用います。以下に、2026年6月の実際のデータを用いて、主要な代替手法と比較して示します。

クエリ2026年6月の2つの測定方法 — close-to-close vs open-to-close, NVDAおよびSPY
各数値の背後にある正確なSQL
SELECT ticker,
       round(argMaxIf(cl, day, day <= '2026-05-31'), 2) AS may_final_close,
       round(argMinIf(op, day, day >= '2026-06-01'), 2) AS june_first_open,
       round(argMaxIf(cl, day, day <= '2026-06-30'), 2) AS june_final_close,
       round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))
             / argMaxIf(cl, day, day <= '2026-05-31'), 2) AS close_to_close_pct,
       round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))
             / argMinIf(op, day, day >= '2026-06-01'), 2) AS open_to_close_pct,
       round(abs(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))
                 / argMinIf(op, day, day >= '2026-06-01')
             - 100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))
                 / argMaxIf(cl, day, day <= '2026-05-31')), 2) AS convention_gap_points
FROM (
    SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS day,
               argMinIf(toFloat64(open), window_start, rth) AS op,
               argMaxIf(toFloat64(close), window_start, rth) AS cl
        FROM (
            SELECT ticker, window_start, open, close,
                   toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
                   AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker IN ('NVDA', 'SPY')
              AND window_start >= '2026-05-28 04:00:00'
              AND window_start < '2026-07-01 08:00:00'
        )
        GROUP BY ticker, day
)
GROUP BY ticker
ORDER BY ticker

NVDAの6月のリターンは、close-to-closeでは -5.39% でしたが、6月の最初のレギュラーセッション始値から最終終値までを測定したopen-to-closeでは -7.4% でした。同じ銘柄、同じ月ですが、2つの正確な回答の間には 2.01 パーセントポイントの差があります。この差はすべて、夜間および週末の窓開けによるものです。NVDAは5月に $211.15 で取引を終え、6月に $215.73 で取引を開始しました。この上昇分は、open-to-close慣行では「6月」に含まれますが、close-to-closeでは境界線となります。SPYでも同様の構造がより緩やかに示されています。close-to-closeでは -1.33%、open-to-closeでは -1.2% です。

どちらの数値も間違いではありません。close-to-closeは「継続保有者は月をまたいでどのような結果を得たか」に答えます。open-to-closeは「6月の始値で購入した投資家に対し、その月の取引がどのような結果をもたらしたか」に答えます。市場が境界を越えて窓を開けた場合、両者は異なります。オーバーナイト・ギャップは稀なことではなく、日常的な現象です。

配当金:プライス・リターン vs トータル・リターン

2つ目の選択肢は、その月に支払われた現金を含めるかどうかです。プライス・リターンは配当を含めません。トータル・リターンは配当を再投資したものとして加算します。単月で見れば、その差はわずかです。四半期配当の場合、1四半期あたりの配当額は利回りの約4分の1だからです。しかし、長期間ではこの差は拡大します。2026年6月は、SPYの配当月でした。

クエリSPY 2026年6月 — price return vs total return (6月配当落ちを含む)
各数値の背後にある正確なSQL
WITH px AS (
    SELECT argMaxIf(cl, day, day <= '2026-05-31') AS may_close,
           argMaxIf(cl, day, day <= '2026-06-30') AS jun_close
    FROM (
        SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS day,
               argMinIf(toFloat64(open), window_start, rth) AS op,
               argMaxIf(toFloat64(close), window_start, rth) AS cl
        FROM (
            SELECT ticker, window_start, open, close,
                   toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
                   AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
            FROM global_markets.delayed_stocks_minute_aggs
            WHERE ticker IN ('NVDA', 'SPY')
              AND window_start >= '2026-05-28 04:00:00'
              AND window_start < '2026-07-01 08:00:00'
        )
        GROUP BY ticker, day
    )
    WHERE ticker = 'SPY'
),
dv AS (
    SELECT sum(cash_amount) AS div_per_share
    FROM global_markets.stocks_dividends
    WHERE ticker = 'SPY'
      AND ex_dividend_date >= '2026-06-01'
      AND ex_dividend_date <= '2026-06-30'
)
SELECT round(may_close, 2) AS may_final_close,
       round(jun_close, 2) AS june_final_close,
       round(div_per_share, 4) AS june_dividend_per_share,
       round(100 * (jun_close - may_close) / may_close, 2) AS price_return_pct,
       round(100 * div_per_share / may_close, 2) AS dividend_contribution_pct,
       round(100 * ((jun_close + div_per_share) - may_close) / may_close, 2) AS total_return_pct
FROM px CROSS JOIN dv

SPYの6月のプライス・リターンは-1.33%でした。同月に権利落ちした1株あたり1.9035の分配金を加えると、トータル・リターンは-1.08%に向上します。これは0.25%の現金による寄与です。インデックス・ファミリーは両方の指標を公表しています(一般的に引用される「S&P 500」はプライス・インデックスです)。ファンドのパフォーマンス報告にはトータル・リターンの記載が義務付けられており、スクリーナーではこれらが混在して使用されます。配当支払銘柄において、2つの情報源の数値が0.1%単位で異なる場合、配当が原因である可能性が高いといえます。支払いがどの月に属するかは、権利落ち日によって決まります。

単月の差は0.1%程度です。両者の差を生むのは運用期間です。同じ計算を5年間にわたって行った結果が以下です。

クエリSPY 5年間 (2021年6月〜2026年6月) — price return vs 配当込みリターン
各数値の背後にある正確なSQL
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           argMaxIf(toFloat64(close), window_start,
               toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
               AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND ((window_start >= '2021-06-28 04:00:00' AND window_start < '2021-07-01 08:00:00')
        OR (window_start >= '2026-06-26 04:00:00' AND window_start < '2026-07-01 08:00:00'))
    GROUP BY day
),
px AS (
    SELECT argMaxIf(cl, day, day <= '2021-06-30') AS start_close,
           argMaxIf(cl, day, day <= '2026-06-30') AS end_close
    FROM daily
),
dv AS (
    SELECT round(sum(cash_amount), 2) AS divs_per_share,
           count() AS payments
    FROM global_markets.stocks_dividends
    WHERE ticker = 'SPY'
      AND ex_dividend_date >= '2021-07-01'
      AND ex_dividend_date <= '2026-06-30'
)
SELECT round(start_close, 2) AS june_2021_close,
       round(end_close, 2) AS june_2026_close,
       divs_per_share AS dividends_paid_per_share,
       payments AS dividend_payments,
       round(100 * (end_close - start_close) / start_close, 2) AS five_year_price_return_pct,
       round(100 * ((end_close + divs_per_share) - start_close) / start_close, 2) AS five_year_return_with_divs_pct,
       round(100 * divs_per_share / start_close, 2) AS dividend_points_added
FROM px CROSS JOIN dv

2021年6月の終値428.07から2026年6月の終値746.32まで、SPYの5年間のプライス・リターンは74.35%です。同期間の配当支払額は20回で、合計34.07ドル(1株あたり)でした。この現金を考慮すると、数値は82.3%に上昇します。配当を再投資しない場合、その差は7.96ポイントに達します。真のトータル・リターン・インデックスは、権利落ち日に各配当を再投資するため、再投資された株式によってその差はさらに拡大します。成熟した配当銘柄において、「大きなマージン」とは比喩ではなく、長年の四半期配当によって生じる当然の結果です。

修正後終値と未修正終値:分割による乖離の罠

Yahoo FinanceやGoogle Finance、多くの証券アプリなどのチャートツールは、修正後終値を表示します。これは、過去の価格を株式分割に合わせて割り戻した(一部のプラットフォームでは配当も調整済み)時系列データであり、長期的な比較を可能にするものです。当社のデータベースには、実際に記録された価格(未修正終値)を保存しています。通常の月であれば、両者は一致します。しかし、株式分割が行われた月には、両者は全く異なる数値を示します。2024年6月10日に実施されたNVDAの10対1の株式分割の例を挙げます。

クエリNVDA 2024年6月 — raw close-to-close計算 vs split-adjustedリターン
各数値の背後にある正確なSQL
WITH px AS (
    SELECT argMaxIf(cl, day, day <= '2024-05-31') AS may_close,
           argMaxIf(cl, day, day <= '2024-06-30') AS jun_close
    FROM (
        SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
               argMaxIf(toFloat64(close), window_start,
                   toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
                   AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'NVDA'
          AND window_start >= '2024-05-29 04:00:00'
          AND window_start < '2024-07-01 08:00:00'
        GROUP BY day
    )
),
sp AS (
    SELECT split_to / split_from AS ratio
    FROM global_markets.stocks_splits
    WHERE ticker = 'NVDA'
      AND execution_date >= '2024-06-01'
      AND execution_date <= '2024-06-30'
)
SELECT round(may_close, 2) AS may_final_close_raw,
       round(jun_close, 2) AS june_final_close_raw,
       toInt32(ratio) AS shares_after_split_per_old_share,
       round(100 * (jun_close - may_close) / may_close, 2) AS raw_price_change_pct,
       round(may_close / ratio, 2) AS may_close_split_adjusted,
       round(100 * (jun_close - may_close / ratio) / (may_close / ratio), 2) AS adjusted_return_pct
FROM px CROSS JOIN sp

未修正のデータでは、6月のNVDAは$1097.46から$123.41へ「下落」しており、-88.75%の暴落を示しています。しかし、実際にはそのような事象は発生していません。分割の実行日に、旧株1株は10株の株に変わり、価格はそれに応じて分割されました。これにより、保有資産の価値は維持されています。5月の終値を同じ比率で計算すると、修正後終値は$109.75となり、2024年6月は12.45%のプラスとなります。修正後データを用いるソースは後者の数値に近い結果を報告し、未修正価格で単純計算した場合は前者の結果となります。修正後終値は、月間リターンが異なるソース間で大きく食い違う最も一般的な原因です。数値がどちらの方向にも異常に大きく見える場合は、まず最初に株式分割カレンダーを確認してください。

どの「終値」を指すのか?

慣習の中には、もう一つの境界が存在します。それは終値そのものです。ファクトシートで使用される数値は、東部標準時午後4時の クロージング・オークション によって決定される単一の価格、すなわち公式の終値です。しかし、時間外取引も継続されるため、延長セッションの最終価格は公式終値から乖離することがあります。

クエリ2026年6月30日のSPY — official-close vs extended-hours最終値
各数値の背後にある正確なSQL
SELECT round(argMaxIf(toFloat64(close), window_start, rth), 2) AS regular_session_close,
       round(argMax(toFloat64(close), window_start), 2) AS last_extended_print,
       round(100 * (argMax(toFloat64(close), window_start) - argMaxIf(toFloat64(close), window_start, rth))
             / argMaxIf(toFloat64(close), window_start, rth), 3) AS after_hours_drift_pct
FROM (
    SELECT window_start, close,
           toTimeZone(window_start, 'America/New_York') >= toDateTime('2026-06-30 09:30:00', 'America/New_York')
           AND toTimeZone(window_start, 'America/New_York') < toDateTime('2026-06-30 16:00:00', 'America/New_York') AS rth
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2026-06-30 04:00:00'
      AND window_start < '2026-07-01 08:00:00'
)

6月30日、両者の差は -0.003% でした。その日の夜はわずかな差でしたが、個別銘柄の決算発表日などの場合、延長セッションでは数パーセント規模の変動が起こり得ます。その変動は、公式の月間リターンでは「翌月」の数値として計上されます。詳細については、アフターアワーズおよびプレマーケット取引 をご確認ください。関連する例外として、月末が祝日の短縮セッションと重なる場合があります。その場合、通常の取引は東部標準時午後1時に終了し、公式終値は早めのクロージング・オークションで決定されます。これについては 市場の休日スケジュール に記載されています。

12ヶ月の複利計算

年間の収益率は、12ヶ月の収益率を合計したものではありません。それらの積となります。計算式は、各月の収益率を成長係数(1 + 収益率)に変換し、12個の係数を掛け合わせ、そこから1を引きます。例えば、-5%の月の後に+5%の月が続いた場合、合計はゼロになりますが、複利では 0.95 × 1.05 − 1 = −0.25% となります。以下は、2026年6月までの12ヶ月間におけるSPYの実際の推移です。

クエリSPY 月次close-to-closeリターン — 2026年6月までの12ヶ月間, simpleおよびlog
各数値の背後にある正確なSQL
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           argMaxIf(toFloat64(close), window_start,
               toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
               AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2025-06-24 04:00:00'
      AND window_start < '2026-07-01 08:00:00'
    GROUP BY day
),
monthly AS (
    SELECT toStartOfMonth(day) AS month_start,
           argMax(cl, day) AS month_close
    FROM daily
    GROUP BY month_start
),
rets AS (
    SELECT month_start,
           formatDateTime(month_start, '%Y-%m') AS month,
           round(month_close, 2) AS month_final_close,
           100 * (month_close / lagInFrame(month_close) OVER (ORDER BY month_start) - 1) AS r
    FROM monthly
)
SELECT month,
       month_final_close,
       round(r, 2) AS simple_return_pct,
       round(100 * log(1 + r / 100), 2) AS log_return_pct
FROM rets
WHERE isFinite(r)
ORDER BY month_start

2025-072.28%から2026-06-1.33%までの、終値ベースの12ヶ月間です。最終行は、最初のパネルで測定したSPYの2026年6月の数値と同じです。これら12ヶ月を正しく連結し、単にパーセンテージを合計する簡便な方法と比較します。

クエリ合計 vs 複利 — 3つの手法によるSPY月次リターン12ヶ月分の連結
各数値の背後にある正確なSQL
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           argMaxIf(toFloat64(close), window_start,
               toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
               AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2025-06-24 04:00:00'
      AND window_start < '2026-07-01 08:00:00'
    GROUP BY day
),
monthly AS (
    SELECT toStartOfMonth(day) AS month_start,
           argMax(cl, day) AS month_close
    FROM daily
    GROUP BY month_start
),
rets AS (
    SELECT month_start,
           100 * (month_close / lagInFrame(month_close) OVER (ORDER BY month_start) - 1) AS r
    FROM monthly
),
ends AS (
    SELECT argMin(month_close, month_start) AS base_close,
           argMax(month_close, month_start) AS final_close
    FROM monthly
)
SELECT count() AS months_linked,
       round(sum(r), 2) AS simple_sum_pct,
       round(100 * (exp(sum(log(1 + r / 100))) - 1), 2) AS geometric_compound_pct,
       round(100 * (any(final_close) / any(base_close) - 1), 2) AS direct_twelve_month_pct,
       round(100 * (exp(sum(log(1 + r / 100))) - 1) - sum(r), 2) AS compounding_gap_points,
       round(sum(100 * log(1 + r / 100)), 2) AS sum_of_monthly_log_returns_pct,
       round(100 * log(any(final_close) / any(base_close)), 2) AS twelve_month_log_return_pct
FROM rets CROSS JOIN ends
WHERE isFinite(r)

12ヶ月の合計は19.83%ですが、複利では20.79%となります。また、2025年6月の終値から2026年6月の終値までを直接計算すると20.79%となり、合計値ではなく複利の数値と一致します。この差は、比較的穏やかな1年間において0.96ポイントです。ボラティリティや期間が長くなると、この差は拡大します。月次のパーセンテージを合計することはスプレッドシートでよく行われる習慣ですが、これは誤りです。

最後の2列は、加算用に構築された手法である対数収益率(成長係数の自然対数、ln(1 + return))を示しています。月次の対数収益率の合計は18.89%となり、これは12ヶ月間の対数収益率である18.89%と一致します。これが、アナリストやリスクモデルが対数収益率を使用する理由です。変動の小さい月では、これら2つの手法の差はほとんどありません(2025-11: 0.21%が単純収益率、0.21%が対数収益率)。変動が大きい月ほど、その差は広がります(2026-04: 10.49%が単純収益率、9.97%が対数収益率)。ファンドの運用報告書では単純収益率が記載されますが、対数収益率は研究論文やボラティリティの計算で使用されます。

2つのデータソースを照合するためのチェックリスト

月次リターンが一致しない場合、その原因はほぼ必ず以下の4つの設定のいずれかにあります。

  1. 終値の定義 — Close-to-close(標準)または Open-to-close(当月の取引分のみ)。境界値にギャップが生じると差異が発生します。
  2. 配当の扱い — Price return または Total return。配当落ち日を含む月には差異が生じます。
  3. 調整の有無 — Raw prints または Adjusted-close series。株式分割が行われた月には大きな差異が生じます。
  4. 終値の基準 — Official auction print(標準)または Extended hours を含む Last trade。

両方のデータソースで同じ設定を適用すれば、差異は解消されます。ファンドと指数の比較は、両方の数値がこれら4つの設定で一致している場合にのみ有効です。設定が一つでも異なると、パフォーマンスではなく設定の差異を測定することになります。当社の June 2026 recap では、この理由からあらかじめ基準を明示しています。同レポートのすべての月次数値は、Close-to-close、Official prints、Price returnに基づいています。

月次リターンに関するFAQ

Close-to-closeリターンとは何ですか?

前期間の定時終値から、今期間の最終終値までの変化率です。ファクトシートや指数レポートにおける、日次、月次、年次の株式リターンの標準的な算出方法です。

なぜ同じ銘柄・同じ月に対して、ウェブサイトによってリターンが異なるのですか?

ほとんどの場合、以下の4つの基準のいずれかに起因します。算出期間の違い(close-to-closeかopen-to-closeか)、配当の算入有無、修正前価格か株式分割調整後価格か、あるいは終値のデータソースの違いです。NVDAの2026年6月の場合、これだけで-5.39%または-7.4%の差が生じます。

株式分割は月次リターンの計算に影響しますか?

理論上は影響しません。株式分割は発行済株式数と株価を同時に変化させるため、ポジションの価値は変わりません。しかし、修正前の価格で計算を行うと、数値が大きく狂います。NVDAの2024年6月は、修正前の終値では-88.75%となりますが、10-for-1の株式分割を調整すると12.45%となります。

月次株式リターンには配当が含まれますか?

含まれるのはトータルリターンのみです。S&P 500指数の主要水準を含むプライスリターンには、配当は含まれません。2026年6月、SPYの配当は月次リターンに0.25%の差をもたらしました。これはプライスリターンとトータルリターンの差です。

私の個人ポートフォリオの月次リターンも同じ方法で計算されますか?

現金の入出金がある場合は異なります。このページに掲載されているような単一銘柄のリターンは、時間加重リターンです。入出金がある口座には、資金の動きがパフォーマンスとして誤認されないよう、マネー加重リターン(内部収益率)による計算が必要です。多くの証券会社は、入出金の影響を除外するために、あえて時間加重リターンを報告しています。


上記の数値はすべて、実際の取引データに基づいた保存・バージョン管理されたクエリです。各パネルのSQLを展開するか、Strasmoreターミナルを使用して、任意の基準による任意の銘柄の月次データを測定してください。

#returns#conventions#dividends#splits#education