【証券分析7-2】理論株価を考える(配当割引モデル2)

ファイナンス理論

2段階配当割引モデルとは?

2段階配当割引モデルは、配当が2つの異なる成長段階を経て成長すると仮定し、株価を評価するモデルです。このモデルは、企業が最初の高成長期を経て、その後に安定成長期に移行すると仮定します。このような成長パターンは、企業が初期の急成長を経て成熟する過程を反映しています。

モデルの概要

2段階配当割引モデルは次のように構成されます。

  1. 初期の高成長期:一定期間(例えば、n年間)にわたって高い成長率 で配当が成長します。
  2. 安定成長期:高成長期の後、成長率が低下し、一定の安定成長率 で永続的に成長します。

2段階配当割引モデルの計算

モデルは以下のステップで計算されます。

  1. 高成長期の配当の現在価値を計算
    高成長期の各年の配当を現在価値に割引いて合計します。

    ここで、
    は現在の理論株価
    は現在の配当
    は初期の高成長率
    は投資家の要求収益率
    は高成長期の年数

  2. 安定成長期の配当の現在価値を計算
    安定成長期の初年度の配当を計算し、ゴードン成長モデルを使用して安定成長期の配当の現在価値を計算します。



    ここで、
    は安定成長率
    は高成長期終了時点での株価

  3. 安定成長期の株価の現在価値を計算
    高成長期終了時点の株価を現在価値に割引きます。

具体例

例えば、現在の配当 が100円、初期の高成長率 が10%、高成長期が3年、安定成長率 が4%、要求収益率 が8%の場合を考えます。

  1. 高成長期の配当の現在価値




  2. 安定成長期の配当と株価


  3. 安定成長期の株価の現在価値


一応Pythonでこれを計算してみます。

# 与えられた値を定義する
D0 = 100  # 初期配当
g1 = 0.10  # 初期の高成長率
n = 3  # 高成長期間の年数
g2 = 0.04  # 安定成長率
k = 0.08  # 必要な収益率

# 高成長期間中の配当の現在価値を計算する
高成長期間の配当現在価値 = sum([D0 * (1 + g1)**t / (1 + k)**t for t in range(1, n + 1)])

# 高成長期間終了時の配当を計算する
Dn = D0 * (1 + g1)**n

# 高成長期間終了時の株価をゴードン成長モデルを用いて計算する
Pn = Dn * (1 + g2) / (k - g2)

# 高成長期間終了時の株価の現在価値を計算する
Pn_present_value = Pn / (1 + k)**n

# 現在の株価を計算する(全体の現在価値)
P0 = 高成長期間の配当現在価値 + Pn_present_value

# 結果を出力する
print(f"高成長期間の配当現在価値: {高成長期間の配当現在価値:.2f}")
print(f"高成長期間終了時の配当: {Dn:.2f}")
print(f"高成長期間終了時の株価: {Pn:.2f}")
print(f"高成長期間終了時の株価の現在価値: {Pn_present_value:.2f}")
print(f"現在の株価 (全体の現在価値): {P0:.2f}")

多段階モデルへの拡張

さて、ここまでで、ゼロ成長、定率成長、2段階成長とみてきました。ですので、最後はやはり多段階成長を考えてみたいと思います。
さすがに数式で展開していくのは大変なので、多段階成長の場合の理論価格を計算するためのPythonコードを作りたいと思います。

def multi_stage_dividend_discount_model(D0, k, g_list, n_list, g_infinite=None):
    total_pv = 0.0

    # 各段階の配当の現在価値を計算する
    for g, n in zip(g_list, n_list):
        stage_pv = sum([D0 * (1 + g)**t / (1 + k)**t for t in range(1, n + 1)])
        total_pv += stage_pv
        D0 *= (1 + g)**n  # 次の段階のためにD0を更新する

    # 無限期間の成長率が指定されている場合は、定常成長モデルを適用する
    if g_infinite is not None:
        D_infinite = D0 * (1 + g_infinite) / (k - g_infinite)
        P_infinite = D_infinite / (1 + k)**n_list[-1]
        total_pv += P_infinite

    return total_pv

# 初期の配当
D0 = 100  
# 要求収益率
k = 0.08  
# 各段階の成長率のリスト
g_list = [0.10]  
# 各段階の成長率が適用される年数のリスト
n_list = [3]  
# 無限期間の成長率
g_infinite = 0.04

# 実際の計算を行う
current_stock_price = multi_stage_dividend_discount_model(D0, k, g_list, n_list, g_infinite)
print(f"現在の株価: {current_stock_price:.2f}")

上記の例は先ほどの2段階モデルの場合の例を使って計算しています。
どちらも同じ3058.38円になります。

コード解説

簡単にコードの内容を解説しておきます。
解説は不要でコードを動かしたいという場合は、最後にGoogleColabのリンクもあるので、そちらも併せてみてください。

  • multi_stage_dividend_discount_model 関数は、与えられた初期の配当 D0、要求収益率 k、各段階の成長率のリスト g_list、各段階の成長率が適用される年数のリスト n_list、およびオプションの無限期間の成長率 g_infinite を受け取ります。
  • total_pv 変数は、全体の現在価値を累積するための変数です。

各段階の配当の現在価値の計算

次に、各段階の配当の現在価値を計算するループがあります。

# 各段階の配当の現在価値を計算する
for g, n in zip(g_list, n_list):
    stage_pv = sum([D0 * (1 + g)**t / (1 + k)**t for t in range(1, n + 1)])
    total_pv += stage_pv
    D0 *= (1 + g)**n  # 次の段階のためにD0を更新する
  • zip(g_list, n_list) を使って、各段階の成長率とその適用期間をペアで取得します。
  • sum([D0 * (1 + g)**t / (1 + k)**t for t in range(1, n + 1)]) により、各段階での配当の現在価値を計算し、stage_pv に加算します。
  • D0 *= (1 + g)**n で、次の段階のために D0 を更新します。

無限期間の成長率の考慮

最後に、もし g_infinite が指定されていれば、無限期間の成長率を考慮して定常成長モデルを適用します。

# 無限期間の成長率が指定されている場合は、定常成長モデルを適用する
if g_infinite is not None:
    D_infinite = D0 * (1 + g_infinite) / (k - g_infinite)
    P_infinite = D_infinite / (1 + k)**n_list[-1]
    total_pv += P_infinite
  • D_infinite = D0 * (1 + g_infinite) / (k - g_infinite) により、無限期間の配当を計算します。
  • P_infinite = D_infinite / (1 + k)**n_list[-1] で、無限期間の株価の現在価値を計算します。
  • total_pv += P_infinite で、無限期間の成長率を考慮した現在価値を全体の現在価値に加算します。

コードはこちらのGoogleColabでうごかせます。

まとめ

さて、ここまで2回にわたって、配当割引モデルという理論的な株価を求める方法を見てきました。これがわかれば、理論株価と実際の株価との乖離から、銘柄の割安割高を評価できるかも!?
とはいえ、実際には利益をすべて配当で支払っている企業は少なく、また、全く配当を支払っていない企業も多くあります。このような場合にはこの配当モデルは使えません。そこでそのような場合にも使える、他のモデルについても今後見ていきます。

タイトルとURLをコピーしました