この記事で分かること
結論:構造はExcelとまったく同じ。Pythonの武器は「再 現性」
PythonでDCF(Discounted Cash Flow:割引キャッシュフロー法)を組むと聞くと高度に感じますが、計算構造はExcelのDCFモデルと完全に同じです。フリー・キャッシュフロー(FCF)を予測し、割引率(WACC)で現在価値に割り引き、継続価値(Terminal Value)を加えて企業価値(Enterprise Value、EV)を求めます。この流れをセルの代わりにコードで書くだけです。
違いが出るのは再現性と自動化です。コードは「どの数値をどう計算したか」が1行ずつ残るため、前提を変えた再計算や、100社分の一括計算が数秒で終わります。DCFの理論そのものを確認したい方は先にDCF法の解説記事を、Python自体が初めての方はPython for Finance入門をご覧ください。
PythonによるDCF計算の全体像
本記事では次の設例を最後まで使います。FCF予測は1年目から5年目まで100・110・120・130・140百万円、割引率(WACC)10%、継続成長率(g)2%。この前提での企業価値は1,556.04百万円になります。まず計算フローの全体像を図で確認しましょう。
DCFの構成要素の復習
コードを書く前に、計算式を確認します。企業価値(EV)は次の2つの部分の合計です(n=予測最終年、本記事ではn=5)。
EV = Σ FCFt ÷ (1+WACC)t + TV ÷ (1+WACC)n
継続価値(TV:Terminal Value)は永久成長モデル(Gordon Growth Model)で求めます。
TV = FCFn × (1+g) ÷ (WACC-g)
分子は「最終予測年の翌年のFCF」、分母は「割引率から成長率を引いた差」です。WACC(Weighted Average Cost of Capital:加重平均資本コスト)が10%、gが2%なら分母は0.08。符号と分母の順序(WACC-g)を逆にしないことが、実装でも最初のチェックポイントになります。
コード例:FCF予測→割引→EVをpandasで書く
設例(FCF 100・110・120・130・140百万円、WACC10%、g2%)をそのままコードにします。
import pandas as pd
fcf = [100, 110, 120, 130, 140] # FCF予測(百万円)
wacc = 0.10 # 割引率(WACC)
g = 0.02 # 継続成長率
df = pd.DataFrame({"year": [1, 2, 3, 4, 5], "fcf": fcf})
df["pv"] = df["fcf"] / (1 + wacc) ** df["year"]
pv_fcf = df["pv"].sum() # → 447.70(百万円)
tv = fcf[-1] * (1 + g) / (wacc - g) # → 1785.00(百万円)
pv_tv = tv / (1 + wacc) ** 5 # → 1108.34(百万円)
ev = pv_fcf + pv_tv # → 1556.04(百万円)実行結果を表で確認します。割引係数は(1.10)tです。
| 年(t) | FCF(百万円) | 割引係数 (1.10)^t | 現在価値PV(百万円) |
|---|---|---|---|
| 1 | 100 | 1.1000 | 90.91 |
| 2 | 110 | 1.2100 | 90.91 |
| 3 | 120 | 1.3310 | 90.16 |
| 4 | 130 | 1.4641 | 88.79 |
| 5 | 140 | 1.6105 | 86.93 |
| PV合計 | 447.70 | ||
| 継続価値TVのPV | 1.6105 | 1,108.34 | |
| 企業価値(EV) | 1,556.04 |
手計算でも検証できます。1年目は100÷1.10=90.91、2年目は110÷1.21=90.91、5年目は140÷1.61051=86.93で、5年分の合計が447.70百万円。TVは140×1.02÷(0.10-0.02)=1,785.00百万円、その現在価値は1,785.00÷1.61051=1,108.34百万円。したがってEV=447.70+1,108.34=1,556.04百万円となり、図・表・コードの結果が一致します。
感応度分析をループで回す
Pythonの真価が出るのが感応度分析(Sensitivity Analysis)です。Excelではデータテーブルで作る部分を、二重ループで書けます。
rows = {}
for w in [0.09, 0.10, 0.11]: # WACC
row = {}
for gr in [0.01, 0.02, 0.03]: # 継続成長率g
pv = sum(f / (1 + w) ** t for t, f in zip(range(1, 6), fcf))
tv = fcf[-1] * (1 + gr) / (w - gr)
row[gr] = round(pv + tv / (1 + w) ** 5, 1)
rows[w] = row
sens = pd.DataFrame(rows).T # 行=WACC、列=g| EV(百万円) | g=1% | g=2% | g=3% |
|---|---|---|---|
| WACC=9% | 1,608.8 | 1,785.9 | 2,022.1 |
| WACC=10% | 1,423.2 | 1,556.0 | 1,726.8 |
| WACC=11% | 1,275.0 | 1,377.4 | 1,505.5 |
中心ケース(WACC10%×g2%)の1,556.0百万円に対し、前提を1%ポイント動かすだけでEVは1,275.0〜2,022.1百万円まで振れます。DCFの結論は前提の関数であることがひと目で分かります。表の設計の考え方は感応度分析の記事で詳しく解説しています。
Excelとの使い分けと、Pythonの限界
実務での使い分けは次のとおりです。
Excelが向く場面:案件ごとの一回性のモデル(M&Aの交渉資料など)、セルを指させばレビューできる監査性が必要な場面、相手方や上司とファイルで共有する場面。日本のIB・PE・FASの案件実務は現在もExcel中心です。手を動かして学びたい方はExcelでDCFモデルを組むチュートリアルを参照してください。
Pythonが向く場面:多数銘柄の一括バリュエーション、毎月・毎四半期の定型計算の自動化、モンテカルロ法など大量の反復計算、Gitでの変更履歴管理。一方で限界もあります。コードを読めない関係者にはブラックボックスに見えること、セル単位の監査証跡を求める現場では説明コストがかかることです。「Excelを置き換える」のではなく「Excelで固めたロジックを、量と頻度が必要な場面でPythonに移す」のが現実的な使い方です。
面接での答え方(30秒回答例)
Q:財務モデリングにPythonを使う利点と限界を教えてください。
「計算構造はExcelと同じで、FCFを予測しWACCで割り引いて継続価値を加える流れをコードで書きます。利点は再現性と自動化で、前提を変えた再計算や多数企業への横展開が高速に行えます。限界は監査性と共有で、セルを指させるExcelと違い関係者がレビューしづらいため、案件の交渉資料はExcel、定型・大量の分析はPythonと使い分けるのが実務的だと考えています。」
よくある質問(FAQ)
PythonでDCFを組めるようになれば、Excelは不要になりますか?
なりません。日本の投資銀行・PE・FASの案件実務は、監査性と共有のしやすさからExcelが標準です。Pythonは定型化・大量処理・再現性が必要な場面での補完ツールと位置づけ、まずExcelでモデルの構造を理解するのが近道です。
numpy-financialなどの専用ライブラリを使うべきですか?
学習段階では本記事のように素のPythonとpandasだけで書くことを勧めます。割引や継続価値を自分で書くと計算構造が身につくためです。実務でIRRやNPVを多用する段階になれば、numpy-financial等の関数で置き換えると簡潔になります。
まとめ
PythonによるDCFは、FCF予測→割引→継続価値→EVというExcelと同一の構造を、リストとpandasの数行で表現するものです。設例(FCF100〜140百万円・WACC10%・g2%)ではEVは1,556.04百万円となり、手計算でも検証できました。感応度分析をループで自動化できる再現性がPythonの武器ですが、実務ではExcelの監査性・共有性と使い分けることが重要です。まずは本記事のコードを自分の手で実行し、数値が一致することを確かめてみてください。
出典・参考(2026-07-19確認)
- pandas公式ドキュメント(pandas.pydata.org)— DataFrameの演算・集計
- Python公式ドキュメント(docs.python.org)— 数値演算・内包表記
- Aswath Damodaran(NYU Stern)公開講義資料(pages.stern.nyu.edu)— DCFバリュエーションの構成要素と継続価値
※本記事は教育目的の一般的な解説であり、法務・税務・投資助言ではありません。設例は理解のための仮設例です。