本文へ移動
目次(8件)

分配金再投資基準価額の計算方法


投資信託のパフォーマンスを評価する際、通常の基準価額だけでは、過去に支払われた分配金の影響によって運用成果を正しく把握できない。このため、ファンドの運用実績を比較する場合には、分配金をその都度再投資したと仮定した分配金再投資基準価額が広く用いられる。

運用会社や投資信託の情報提供サイトなどから基準価額の時系列データを取得できても、分配金再投資基準価額までは収録されていない場合がある。そのような場合でも、通常の基準価額と分配金があれば、自分で分配金再投資基準価額を算出してパフォーマンス計算に利用できる。

本記事では、その基本的な考え方とExcelによる分配金再投資基準価額の計算方法を整理する。記事末尾では、実務的な応用としてSQLによる計算方法も付録として紹介する。

1. 分配金再投資基準価額とは

分配金再投資基準価額とは、ファンドから支払われる分配金を受け取らず、分配落ち後の基準価額で全額再投資したと仮定した場合の基準価額である。

例えば、基準価額10,000円のファンドが200円の分配を行ったとする。分配以外の価格変動がなければ、分配によってファンドの資産が流出するため、分配落ち後の基準価額は9,800円程度となる。

通常の基準価額だけを見ると、

10,000円 → 9,800円

となり、2%下落したように見える。

しかし、投資家は200円の分配金を受け取っているため、ファンドの運用成果そのものが2%悪化したわけではない。さらに、その200円を9,800円の基準価額で再投資したと考えれば、分配後もファンドへの投資を継続した場合の運用成果を表すことができる。

分配金再投資基準価額は、こうした分配の影響を調整し、分配金を再投資した場合のファンドのパフォーマンスを時系列で表した基準価額である。

2. 分配金再投資基準価額の基本的な考え方

分配金再投資基準価額の計算方法は、大きく2つの考え方に分けられる。

1つ目は、分配金を含めた日次収益率を計算し、前日の分配金再投資基準価額から順次計算していく方法である。

2つ目は、分配金が発生するたびに「再投資によって保有口数が何倍になったか」を計算し、その倍率を累積する方法である。

両者は計算の見方が異なるだけで、最終的には同じ結果となる。

2.1 日次収益率から計算する方法

日付 t の基準価額を NAVt、当日の分配金を Dt とすると、分配金を考慮した日次収益率 Rt は次のように計算できる。

Rt = NAVt + Dt NAVt-1 - 1

したがって、分配金再投資基準価額を TRNAVt とすると、

TRNAVt = TRNAVt-1 × NAVt + Dt NAVt-1

で計算できる。

分配金がない日は Dt = 0 であるため、

TRNAVt = TRNAVt-1 × NAVt NAVt-1

となり、通常の基準価額と同じ騰落率で推移する。

一方、分配落ち日には基準価額に分配金を加えた値を使用することで、分配による基準価額の低下を調整する。

2.2 再投資係数から計算する方法

もう1つの方法は、分配金を再投資したことによる保有口数の増加を計算する方法である。

分配落ち日の再投資係数を Ft とすると、

Ft = 1 + Dt NAVt

となる。

ここでNAVtには、分配落ち後の基準価額を使用する。

例えば、分配落ち後基準価額が9,800円、分配金が200円の場合、

Ft = 1 + 200 9,800 = 1.020408...

となる。

保有口数を1と正規化して考えると、分配金を再投資することによって、

1 → 約1.020408

となる。つまり、分配金を再投資することで、保有口数が約2.04%増加したことを表している。

分配が複数回行われている場合は、それぞれの再投資係数を掛け合わせる。分配のない日は Di = 0 となるため、再投資係数は1となり、累積結果には影響しない。

累積再投資係数t = Πi=1t ( 1 + Di NAVi )

したがって、ある時点の分配金再投資基準価額は、

TRNAVt = NAVt × Πi=1t ( 1 + Di NAVi )

で求めることができる。

2.3 2つの方法は同じ計算になる

日次収益率から順次計算する方法と、再投資係数を累積する方法は、数学的には同じ計算である。

日次計算を期間全体に展開すると、

NAV0 × NAV1 + D1 NAV0 × NAV2 + D2 NAV1 × …

となる。

ここで、

NAVi + Di = NAVi × ( 1 + Di NAVi )

と分解する。

すると、

NAV0 × NAV1 NAV0 × ( 1 + D1 NAV1 ) × NAV2 NAV1 × ( 1 + D2 NAV2 ) × …

と書き換えることができる。

この形にすると途中のNAV同士が順次相殺されるため、最終的には、

TRNAVt = NAVt × Πi=1t ( 1 + Di NAVi )

となる。

つまり、日次計算法は「分配金込みの日次収益率を幾何リンクする方法」、再投資係数法は「分配によって増加した保有口数を累積する方法」と考えることができる。

3. 日次で分配金再投資基準価額を計算する

例えば、次のような基準価額データがあったとする。

日付 基準価額 分配金
1月1日 10,000 0
1月2日 10,100 0
1月3日 9,950 200
1月4日 10,000 0

1月1日の分配金再投資基準価額を10,000とする。

1月2日は分配金がないため、

10,000 × 10,100 10,000 = 10,100

となる。

1月3日は200円の分配金が発生する分配落ち日であるため、

10,100 × 9,950 + 200 10,100 = 10,150

となる。

1月4日は再び分配金がないため、

10,150 × 10,000 9,950 ≒ 10,201.01

となる。

結果は次のようになる。

日付 基準価額 分配金 分配金再投資基準価額
1月1日 10,000 0 10,000.00
1月2日 10,100 0 10,100.00
1月3日 9,950 200 10,150.00
1月4日 10,000 0 10,201.01

分配落ち日以外は通常の基準価額と同じ騰落率で推移し、分配落ち日にのみ分配金が収益率へ加算される。

4. Excelで計算する方法

Excelでは、日次計算する方法と再投資係数を累積する方法のどちらでも計算できる。

4.1 日次で順次計算する方法

例えば、

列 内容
A列 日付
B列 基準価額
C列 分配金
D列 分配金再投資基準価額

とする。

最初の日は、

=B2

として通常の基準価額と同じ値から開始する。

翌日以降は、

=D2*(B3+C3)/B2

とする。

この数式を下方向へコピーすれば、全期間の分配金再投資基準価額を計算できる。

分配金のない日はC列が0となるため、分配落ち日かどうかによって数式を変更する必要はない。

4.2 再投資係数を累積する方法

再投資係数を使う場合は、例えば、

列 内容
A列 日付
B列 基準価額
C列 分配金
D列 再投資係数
E列 累積再投資係数
F列 分配金再投資基準価額

とする。

各日の再投資係数は、

=1+C2/B2

で計算できる。

ただし、計算開始日の累積再投資係数は、

=1

とする。

これは、計算開始日の分配金再投資基準価額を、その日の通常の基準価額と一致させて系列を開始するためである。

したがって、

E2=1

とし、翌日以降は、

=E2*D3

として累積する。

分配金再投資基準価額は、

=B2*E2

で求められる。

計算開始日に分配金が存在する場合、その分配金を再投資対象に含めるかどうかは系列の定義によって異なる。本記事では、計算開始日の累積再投資係数を1とし、翌日以降に発生した分配金を再投資するものとする。

ExcelのPRODUCT関数を使用する場合も、同じ考え方で計算開始日の翌日から再投資係数を累積すればよい。

例えば3行目以降について、

=PRODUCT($D$3:D3)

とすることで、計算開始日以降の累積再投資係数を求めることができる。

ただし、日次データを上から順番に計算するのであれば、前日の累積再投資係数に当日の再投資係数を掛ける方法の方が単純である。

5. 任意の日付を10,000として指数化する場合

長期間運用されているファンドについて、途中の日付を10,000としてパフォーマンス系列を作りたい場合もある。

この場合は、まず通常どおり分配金再投資基準価額を算出したうえで、

指数化基準価額t = TRNAVt TRNAV0 × 10,000

とすればよい。

これにより、任意の日付を10,000とした分配金再投資ベースのパフォーマンス系列を作成できる。

6. 実務上の注意点

6.1 基準価額と分配金の単位をそろえる

国内公募投信では、基準価額と分配金がいずれも1万口当たりで管理されているケースが一般的である。

この場合は、

1 + 分配金 基準価額

をそのまま使用できる。

一方、データベース上で基準価額と分配金の単位が異なる場合は、計算前に単位をそろえる必要がある。

6.2 再投資係数には分配落ち後の基準価額を使用する

再投資係数、

1 + 分配金 基準価額

の基準価額には、分配落ち後の基準価額を使用する。

分配金を、その時点の基準価額でファンドへ再投資すると考えるためである。

データベースや外部データベンダーによって分配金の日付や基準価額との対応方法が異なる可能性があるため、実際に計算する際にはデータ仕様を確認する必要がある。

6.3 税引前・税引後を明確にする

ファンドの運用実績を示すための分配金再投資基準価額では、一般に税引前分配金を再投資する前提が用いられる。

一方、実際の投資家が受け取った金額を再現したい場合は、税金の影響を考慮することもある。

したがって、分配金再投資基準価額を作成する場合は、使用する分配金が税引前か税引後かを明確にしておく必要がある。

7. まとめ

分配金再投資基準価額は、基準価額と分配金があれば計算できる。

最も基本的な方法は、

TRNAVt = TRNAVt-1 × NAVt + Dt NAVt-1

として、分配金を含めた日次収益率を順番に幾何リンクしていく方法である。

一方、分配金の再投資による保有口数の増加に着目すれば、

TRNAVt = NAVt × Πi=1t ( 1 + Di NAVi )

として計算することもできる。

両者は数学的には同じ計算であり、前者は日次のパフォーマンス計算、後者は分配金再投資による保有口数の累積という観点から分配金再投資基準価額を捉えたものである。

Excelでは、前日の分配金再投資基準価額から順次計算する方法が簡単である。日付・基準価額・分配金の時系列データがあれば、比較的容易に分配金再投資基準価額を作成できる。

基準価額と分配金という基本的なデータから算出できるため、分配金再投資基準価額はファンドのパフォーマンス計測における基本的な計算系列の一つである。


付録:SQLで分配金再投資基準価額を計算する

ここからは、基準価額と分配金をデータベースで管理している場合のSQL実装例を紹介する。

Excelで計算する場合や、分配金再投資基準価額の計算ロジックのみを確認したい場合は、この付録は読み飛ばして問題ない。

ここでは、次のような基準価額テーブルを想定する。

fund_nav

fund_code      -- ファンドコード
nav_date       -- 基準価額日
nav            -- 基準価額
distribution   -- 分配金

まずは、

WHERE fund_code = 'FUND001'

のように、対象となる1ファンドを指定して計算するケースを考える。

A.1 LOG・EXPを使って累積積を計算する

分配金再投資基準価額を再投資係数から算出する場合、次の累積積を求める必要がある。

Πi=1t ( 1 + Di NAVi )

しかし、SQLではExcelのPRODUCT関数に相当する累積積を直接計算できる関数が用意されていない場合がある。

そこで、対数の性質を利用する。

log(a × b × c) = log(a) + log(b) + log(c)

であるため、

a × b × c = exp(log(a) + log(b) + log(c))

と変換できる。

これを再投資係数へ適用すると、

累積再投資係数 = EXP ( SUM ( LOGまたはLN ( 1 + 分配金 基準価額 ) ) )

となる。

つまり、PRODUCT相当の関数を使用しなくても、SUM・LOGまたはLN・EXPを組み合わせれば累積積を計算できる。

A.2 日次の累積値をウィンドウ関数で計算する

日々の分配金再投資基準価額を作成する場合は、各基準価額日について「計算開始日から当日まで」の再投資係数を累積する必要がある。

SQLでは、

SUM(...)
OVER (
    ORDER BY nav_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)

と記述することで、この累積計算を行える。

この構文は見慣れない場合もあるが、処理内容は単純である。

ORDER BY nav_date

で基準価額日順に並べ、

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

で「最初の行から現在の行まで」を計算対象とする。

例えば、

日付 値 累積SUM
1月1日 0.01 0.01
1月2日 0.02 0.03
1月3日 -0.01 0.02

のような計算である。

分配金再投資基準価額では、この「値」の部分が次の計算になる。

LOG ( 1 + 分配金 基準価額 )

その累積値をEXP()で元に戻せば、その日までの累積再投資係数となる。

なお、以下のSQLでは、取得対象となった最初の行についても再投資係数を計算している。任意の日付を起点として、その日の分配金を再投資対象に含めず系列を開始する場合は、計算開始日の再投資係数を1として扱う必要がある。

A.2.1 SQL Server

SQL Serverでは、自然対数をLOG()、指数関数をEXP()で計算できる。

SELECT
    nav_date,
    nav,
    distribution,
    nav
    * EXP(
        SUM(
            LOG(
                1.0
                + 1.0 * COALESCE(distribution, 0) / NULLIF(nav, 0)
            )
        ) OVER (
            ORDER BY nav_date
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        )
    ) AS reinvested_nav
FROM fund_nav
WHERE fund_code = 'FUND001'
ORDER BY nav_date;

主な処理を分解すると、

WHERE fund_code = 'FUND001'

で対象ファンドを1本に絞る。

COALESCE(distribution, 0)

は、分配金がNULLの場合に0として扱うための処理である。

再投資係数は、

1.0
+ 1.0 * COALESCE(distribution, 0) / NULLIF(nav, 0)

で計算している。

SQL Serverでは、distributionとnavが整数型の場合、そのまま、

distribution / nav

とすると整数除算となり、小数部分が切り捨てられる。

例えば、

200 9,800

が0として計算される可能性がある。

そのため、

1.0 * COALESCE(distribution, 0)

とすることで、整数除算を避け、小数を保持したまま除算している。

NULLIF(nav, 0)は、基準価額が0の場合の0除算を防ぐために使用している。ただし、基準価額が0となるレコードは通常想定されないため、実際の処理では単純にNULLとして計算を継続するのではなく、異常データとして確認することが望ましい。

その再投資係数をLOG()で自然対数へ変換し、

SUM(...) OVER (...)

によって計算開始日から当日まで累積する。

最後にEXP()で対数から元の累積積へ戻し、

基準価額 × 累積再投資係数

とすることで、その日の分配金再投資基準価額を算出している。

A.2.2 Oracle

Oracleでは、自然対数をLN()、指数関数をEXP()で計算する。

SELECT
    nav_date,
    nav,
    distribution,
    nav
    * EXP(
        SUM(
            LN(
                1
                + NVL(distribution, 0) / NULLIF(nav, 0)
            )
        ) OVER (
            ORDER BY nav_date
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        )
    ) AS reinvested_nav
FROM fund_nav
WHERE fund_code = 'FUND001'
ORDER BY nav_date;

Oracleでは、NULLを0へ置き換えるためにNVL()を使用している。その他の計算ロジックはSQL Serverと同じである。

A.2.3 PostgreSQL

PostgreSQLでは、整数型同士をそのまま除算すると整数除算になるため、型変換を行う必要がある。

ここではdistributionをnumericへ変換している。

SELECT
    nav_date,
    nav,
    distribution,
    nav
    * EXP(
        SUM(
            LN(
                1
                + COALESCE(distribution, 0)::numeric
                  / NULLIF(nav, 0)
            )
        ) OVER (
            ORDER BY nav_date
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        )
    ) AS reinvested_nav
FROM fund_nav
WHERE fund_code = 'FUND001'
ORDER BY nav_date;
COALESCE(distribution, 0)::numeric

とすることで、分配金をnumeric型として除算し、小数部分を保持する。

A.2.4 MySQL

MySQL 8.0以降ではウィンドウ関数を使用できるため、同様の方法で計算できる。

SELECT
    nav_date,
    nav,
    distribution,
    nav
    * EXP(
        SUM(
            LN(
                1
                + COALESCE(distribution, 0) / NULLIF(nav, 0)
            )
        ) OVER (
            ORDER BY nav_date
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        )
    ) AS reinvested_nav
FROM fund_nav
WHERE fund_code = 'FUND001'
ORDER BY nav_date;

SQL Server、Oracle、PostgreSQL、MySQLでは関数名やデータ型の扱いに多少の違いがあるが、計算ロジック自体は同じである。

A.3 複数ファンドを一括して計算する場合

これまでの例では、

WHERE fund_code = 'FUND001'

によって1ファンドだけを対象としている。

複数ファンドについて分配金再投資基準価額を一括計算したい場合は、ウィンドウ関数内でPARTITION BYを使用できる。

SQL Serverでは、例えば次のように記述できる。

SELECT
    fund_code,
    nav_date,
    nav,
    distribution,
    nav
    * EXP(
        SUM(
            LOG(
                1.0
                + 1.0 * COALESCE(distribution, 0) / NULLIF(nav, 0)
            )
        ) OVER (
            PARTITION BY fund_code
            ORDER BY nav_date
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        )
    ) AS reinvested_nav
FROM fund_nav
ORDER BY
    fund_code,
    nav_date;
PARTITION BY fund_code

は、ファンドコードごとにウィンドウ関数の計算対象を分けるための指定である。

例えば、

FUND001
FUND001
FUND001
FUND002
FUND002
FUND002

というデータがある場合、FUND001とFUND002の累積計算がそれぞれ独立して行われる。

1ファンドだけを計算する場合はWHEREで対象を絞ればよいため、PARTITION BYは必要ない。

A.4 自己結合とGROUP BYを使って計算する方法

日次の分配金再投資基準価額は、ウィンドウ関数だけでなく、自己結合とGROUP BYを組み合わせて計算することもできる。

GROUP BYや自己結合を普段から使っている担当者にとっては、こちらの方が処理内容を追いやすい場合もある。

SQL Serverでは、例えば次のように記述できる。

SELECT
    a.nav_date,
    a.nav,
    a.distribution,
    a.nav
    * EXP(
        SUM(
            LOG(
                1.0
                + 1.0 * COALESCE(b.distribution, 0) / NULLIF(b.nav, 0)
            )
        )
    ) AS reinvested_nav
FROM fund_nav a
INNER JOIN fund_nav b
    ON b.fund_code = a.fund_code
   AND b.nav_date <= a.nav_date
WHERE
    a.fund_code = 'FUND001'
GROUP BY
    a.nav_date,
    a.nav,
    a.distribution
ORDER BY
    a.nav_date;

同じfund_navテーブルをaとbという2つの別名で使用している。これを自己結合という。

ここでは、aを「計算対象となる当日の行」、bを「その日までの過去データ」と考えると分かりやすい。

例えば1月3日の分配金再投資基準価額を計算する場合、

b.nav_date <= a.nav_date

という条件によって、1月1日、1月2日、1月3日のデータがb側から結合される。

その後、

GROUP BY
    a.nav_date,
    a.nav,
    a.distribution

によって1月3日の行にまとめ、

SUM(LOG(...))

で1月3日までの再投資係数を累積する。

1月4日であれば1月1日から1月4日まで、1月5日であれば1月1日から1月5日までが計算対象となる。

この方法は、自己結合やGROUP BYに馴染みのある担当者にとって、累積計算の仕組みを理解しやすい場合がある。

特に、

b.nav_date <= a.nav_date

という条件によって「当日までのデータを集める」ことが明示されるため、どのデータを集計対象としているのかを追いやすい。

一方、累積期間が長くなるほど結合対象となる行数が増えるため、データ量が多い場合は処理負荷が大きくなりやすい。

これに対して、ウィンドウ関数を使った、

SUM(...)
OVER (
    ORDER BY nav_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)

という書き方では、「基準価額日順に現在行まで累積する」という処理をSQL上で直接表現できる。

そのため、処理効率や記述の簡潔さを重視する場合はウィンドウ関数、馴染みのあるSQL構文で処理内容を追いやすくしたい場合は自己結合+GROUP BY、という見方ができる。

新規にSQLを作成するのであればウィンドウ関数を使う方法が素直だが、既存システムでは自己結合とGROUP BYによる実装も十分考えられる。既存ロジックを確認する際には、両方の計算方法を理解しておくとよい。

A.5 ある1時点の値だけを計算する場合

日次系列を作る必要がなく、ある時点までの累積再投資係数だけを求めるのであれば、ウィンドウ関数や自己結合は必要ない。

SQL Serverであれば、例えば次のように計算できる。

SELECT
    EXP(
        SUM(
            LOG(
                1.0
                + 1.0 * COALESCE(distribution, 0) / NULLIF(nav, 0)
            )
        )
    ) AS cumulative_reinvestment_factor
FROM fund_nav
WHERE
    fund_code = 'FUND001'
    AND nav_date <= '2026-09-28';

このSQLで求めているのは、

Πi=1t ( 1 + Di NAVi )

という指定日までの累積再投資係数である。

対象日時点の基準価額を掛ければ、その時点の分配金再投資基準価額を求めることができる。

日次系列が必要なのか、ある1時点の値だけが必要なのかによって、SQLを使い分けるとよい。

このサイトについて

Asset Management Notesは、資産運用業界で働く運営者が、実務にまつわるさまざまなテーマを取り上げる個人運営サイトです。

日々の業務で得た知識や、気になって調べたこと、整理しておきたい仕組みや考え方などを、分野を問わず書き留めています。

運営者について

資産運用会社に勤務しています。日々の業務で培った経験を生かしながら、記事を執筆しています。ご意見・お問い合わせは、お問い合わせフォームからお寄せください。

記事について

記事の作成にあたっては、公表資料や各種データを参照し、できる限り正確でわかりやすい内容を心がけています。なお、掲載内容は運営者個人の見解であり、所属する組織の見解を示すものではありません。