Lab Research 企業価値評価の基礎——DCF 法、比較企業分析、バリュエーションの仕組み
目次
「価格はあるが価値がない」——ウォーレン・バフェットの有名な言葉だ。株式投資において、企業の「本当の価値」を見極めることは最も重要なスキルの一つである。本稿では、企業価値評価の主要な手法を数理的な理解とともに体系的に解説する。
企業価値評価の 3 つのアプローチ
| アプローチ | 手法 | 特徴 |
|---|---|---|
| インカムアプローチ | DCF 法、配当割引モデル | 将来キャッシュフローを現在価値化 |
| マーケットアプローチ | 比較企業分析、類似取引分析 | 市場価格を基準に評価 |
| コストアプローチ | 株主資本勘定、正味資産価値 | 資産の積み上げで評価 |
1. 企業価値と株式価値
1.1 企業価値(Enterprise Value, EV)
企業価値は事業全体の価値であり、債権者と株主の両方に帰属する。
企業価値(EV) = 時価総額 + 有利子負債 - 現金・現金同等物
| 構成要素 | 説明 |
|---|---|
| 時価総額 | 株式価値(株主に帰属) |
| 有利子負債 | 銀行借入、社債など(債権者に帰属) |
| 現金 | 余剰現金(事業に不要な現金) |
def calculate_enterprise_value(market_cap, debt, cash):
"""企業価値(EV)の計算"""
return market_cap + debt - cash
# 例:時価総額 1,000 億円、有利子負債 200 億円、現金 100 億円
ev = calculate_enterprise_value(
market_cap=100_000_000_000, # 1,000 億円
debt=20_000_000_000, # 200 億円
cash=10_000_000_000 # 100 億円
)
print(f"企業価値:{ev/1e8:.0f}億円") # 1,100 億円
1.2 株式価値(Equity Value)
株式価値は株主に帰属する価値だ。
株式価値 = 企業価値 - 有利子負債 + 現金
= 時価総額(上場企業の場合)
1.3 なぜ EV を使うのか
| 指標 | 用途 |
|---|---|
| EV/EBITDA | 資本構造の影響を排除した評価 |
| P/E | 株主視点の評価(利子影響あり) |
# EV/EBITDA vs P/E の比較
def compare_multiples(market_cap, ev, net_income, ebitda):
"""マルチプルの比較"""
pe_ratio = market_cap / net_income
ev_ebitda = ev / ebitda
return {
"P/E": pe_ratio,
"EV/EBITDA": ev_ebitda
}
# 例:時価総額 1,000 億円、EV 1,100 億円、純利益 80 億円、EBITDA 150 億円
multiples = compare_multiples(
market_cap=100_000_000_000,
ev=110_000_000_000,
net_income=8_000_000_000,
ebitda=15_000_000_000
)
print(f"P/E: {multiples['P/E']:.1f}倍") # 12.5 倍
print(f"EV/EBITDA: {multiples['EV/EBITDA']:.1f}倍") # 7.3 倍
2. DCF 法(Discounted Cash Flow)
2.1 DCF 法の基本概念
DCF 法は将来のフリーキャッシュフローを割引現在価値する手法だ。
企業価値 = Σ[FCFt / (1+WACC)^t] + 終価 / (1+WACC)^n
ここで:
- FCFt: t 年目のフリーキャッシュフロー
- WACC: 加重平均資本コスト
- n: 予測期間
2.2 フリーキャッシュフローの計算
def calculate_free_cash_flow(
operating_income,
tax_rate,
depreciation,
capex,
change_in_working_capital
):
"""フリーキャッシュフロー(FCFF)の計算"""
# NOPAT(税引後営業利益)
nopat = operating_income * (1 - tax_rate)
# FCF = NOPAT + 減価償却 - 設備投資 - 運転資本増加
fcf = nopat + depreciation - capex - change_in_working_capital
return fcf
# 例:営業利益 100 億円、税率 30%、減価償却 20 億円、設備投資 30 億円、運転資本増 5 億円
fcf = calculate_free_cash_flow(
operating_income=10_000_000_000,
tax_rate=0.30,
depreciation=2_000_000_000,
capex=3_000_000_000,
change_in_working_capital=500_000_000
)
print(f"フリーキャッシュフロー:{fcf/1e8:.0f}億円") # 65 億円
2.3 WACC(加重平均資本コスト)
WACC は負債と株主資本のコストを加重平均したものだ。
WACC = (E/V) × Re + (D/V) × Rd × (1 - T)
ここで:
- E: 株主資本の市場価値
- D: 負債の市場価値
- V = E + D: 企業価値
- Re: 株主資本コスト
- Rd: 負債コスト
- T: 実効税率
def calculate_wacc(equity_value, debt_value, cost_of_equity, cost_of_debt, tax_rate):
"""WACC の計算"""
total_value = equity_value + debt_value
# 資本構成ウェイト
equity_weight = equity_value / total_value
debt_weight = debt_value / total_value
# WACC
wacc = (
equity_weight * cost_of_equity +
debt_weight * cost_of_debt * (1 - tax_rate)
)
return wacc
# 例:株主資本 800 億円、負債 200 億円、株主資本コスト 8%、負債コスト 2%、税率 30%
wacc = calculate_wacc(
equity_value=80_000_000_000,
debt_value=20_000_000_000,
cost_of_equity=0.08,
cost_of_debt=0.02,
tax_rate=0.30
)
print(f"WACC: {wacc*100:.2f}%") # 6.68%
2.4 株主資本コスト(CAPM)
株主資本コストは**CAPM(資本資産価格モデル)**で算出する。
Re = Rf + β × (Rm - Rf)
ここで:
- Rf: リスクフリーレート(国債利回り)
- β: ベータ(市場感応度)
- Rm: 市場期待リターン
- (Rm - Rf): 市場リスクプレミアム
def calculate_cost_of_equity_capm(risk_free_rate, beta, market_return):
"""CAPM による株主資本コストの計算"""
return risk_free_rate + beta * (market_return - risk_free_rate)
# 例:Rf 0.5%、β 1.2、市場リターン 6%
cost_of_equity = calculate_cost_of_equity_capm(
risk_free_rate=0.005,
beta=1.2,
market_return=0.06
)
print(f"株主資本コスト:{cost_of_equity*100:.2f}%") # 6.70%
2.5 終価(Terminal Value)
予測期間後の価値を終価として推算する。
永続成長法(Gordon Growth Model)
終価 = FCF(n+1) / (WACC - g)
= FCFn × (1 + g) / (WACC - g)
ここで:
- g: 永続成長率(通常、名目 GDP 成長率程度)
def calculate_terminal_value_gordon(fcf_final, wacc, perpetual_growth_rate):
"""永続成長法による終価の計算"""
terminal_value = fcf_final * (1 + perpetual_growth_rate) / (wacc - perpetual_growth_rate)
return terminal_value
# 例:最終年 FCF 80 億円、WACC 6.5%、永続成長率 1%
terminal_value = calculate_terminal_value_gordon(
fcf_final=8_000_000_000,
wacc=0.065,
perpetual_growth_rate=0.01
)
print(f"終価:{terminal_value/1e8:.0f}億円") # 1,455 億円
exit 倍率法
終価 = 最終年 EBITDA × Exit EBITDA 倍率
def calculate_terminal_value_exit(exit_ebitda, exit_multiple):
"""Exit 倍率法による終価の計算"""
return exit_ebitda * exit_multiple
# 例:最終年 EBITDA 150 億円、Exit 倍率 8 倍
terminal_value = calculate_terminal_value_exit(
exit_ebitda=15_000_000_000,
exit_multiple=8
)
print(f"終価:{terminal_value/1e8:.0f}億円") # 1,200 億円
2.6 DCF による企業価値計算
def dcf_valuation(
fcf_projections,
wacc,
terminal_value,
debt,
cash
):
"""DCF 法による企業価値・株式価値の計算"""
# 予測期間 FCF の現在価値
pv_fcf = sum(
fcf / (1 + wacc) ** (i + 1)
for i, fcf in enumerate(fcf_projections)
)
# 終価の現在価値
n = len(fcf_projections)
pv_terminal = terminal_value / (1 + wacc) ** n
# 企業価値
enterprise_value = pv_fcf + pv_terminal
# 株式価値
equity_value = enterprise_value - debt + cash
return {
"pv_fcf": pv_fcf,
"pv_terminal": pv_terminal,
"enterprise_value": enterprise_value,
"equity_value": equity_value
}
# 例:5 年間予測、FCF: 60, 65, 70, 75, 80 億円、WACC 6.5%、終価 1,455 億円
fcf_projections = [6, 6.5, 7, 7.5, 8] # 億円
fcf_projections = [x * 1e8 for x in fcf_projections] # 円に変換
result = dcf_valuation(
fcf_projections=fcf_projections,
wacc=0.065,
terminal_value=145_500_000_000, # 1,455 億円
debt=20_000_000_000, # 200 億円
cash=10_000_000_000 # 100 億円
)
print(f"FCF 現在価値:{result['pv_fcf']/1e8:.0f}億円")
print(f"終価現在価値:{result['pv_terminal']/1e8:.0f}億円")
print(f"企業価値:{result['enterprise_value']/1e8:.0f}億円")
print(f"株式価値:{result['equity_value']/1e8:.0f}億円")
# 出力例:
# FCF 現在価値:285 億円
# 終価現在価値:1,062 億円
# 企業価値:1,347 億円
# 株式価値:1,237 億円
2.7 DCF の感応度分析
import numpy as np
def sensitivity_analysis(fcf_projections, terminal_value, debt, cash):
"""WACC と成長率の感応度分析"""
wacc_range = np.arange(0.05, 0.10, 0.005) # 5%-9.5%
growth_range = np.arange(0.005, 0.025, 0.005) # 0.5%-2%
results = np.zeros((len(wacc_range), len(growth_range)))
for i, wacc in enumerate(wacc_range):
for j, g in enumerate(growth_range):
# 終価を再計算
tv = calculate_terminal_value_gordon(
fcf_projections[-1], wacc, g
)
# DCF 計算
result = dcf_valuation(
fcf_projections=fcf_projections,
wacc=wacc,
terminal_value=tv,
debt=debt,
cash=cash
)
results[i, j] = result['equity_value'] / 1e8 # 億円
return wacc_range, growth_range, results
# 感応度分析の実行
wacc_range, growth_range, results = sensitivity_analysis(
fcf_projections=[x * 1e8 for x in [6, 6.5, 7, 7.5, 8]],
terminal_value=145_500_000_000,
debt=20_000_000_000,
cash=10_000_000_000
)
# 結果の表示(ヒートマップとして可視化可能)
print("WACC \\ 成長率 |", end="")
for g in growth_range:
print(f" {g*100:.1f}% |", end="")
print()
for i, wacc in enumerate(wacc_range):
print(f"{wacc*100:.1f}% |", end="")
for j in range(len(growth_range)):
print(f" {results[i,j]:.0f} |", end="")
print()
3. 比較企業分析
3.1 主要バリュエーション・マルチプル
| マルチプル | 計算式 | 用途 |
|---|---|---|
| P/E | 時価総額 / 純利益 | 収益力評価 |
| P/B | 時価総額 / 株主資本 | 資産価値評価 |
| EV/EBITDA | 企業価値 / EBITDA | 営業キャッシュフロー評価 |
| EV/売上 | 企業価値 / 売上高 | 成長企業評価 |
| PEG | P/E / 予想成長率 | 成長調整後評価 |
def calculate_valuation_multiples(market_cap, equity, net_income, ebitda, revenue):
"""主要バリュエーション・マルチプルの計算"""
return {
"P/E": market_cap / net_income if net_income > 0 else None,
"P/B": market_cap / equity if equity > 0 else None,
"EV/EBITDA": None, # EV が必要
"EV/Sales": None, # EV が必要
"ROE": net_income / equity if equity > 0 else None,
"ROA": net_income / (equity + debt) if (equity + debt) > 0 else None
}
# 各マルチプルの意味
MULTIPLE_INTERPRETATION = {
"P/E": "1 円の利益に対して何円の価格がついているか(投資回収年数)",
"P/B": "株主資本の何倍の価格がついているか(解散価値との比較)",
"EV/EBITDA": "事業価値の何年分で企業価値を回収できるか",
"EV/Sales": "売上高の何倍の事業価値か(利益が出ていない企業向け)"
}
3.2 比較企業分析の実践
import pandas as pd
def comparable_company_analysis(target_company, peer_companies):
"""比較企業分析によるバリュエーション"""
# データフレーム作成
df = pd.DataFrame(peer_companies)
# 平均マルチプルを計算(外れ値を除外)
avg_pe = df["P/E"].median()
avg_ev_ebitda = df["EV/EBITDA"].median()
avg_pb = df["P/B"].median()
# ターゲット企業の価値を推算
implied_valuations = {
"P/E ベース": target_company["net_income"] * avg_pe,
"EV/EBITDA ベース": (
target_company["ebitda"] * avg_ev_ebitda
- target_company["debt"]
+ target_company["cash"]
),
"P/B ベース": target_company["equity"] * avg_pb
}
# 平均値
avg_implied_value = np.mean(list(implied_valuations.values()))
return {
"peer_median_multiples": {
"P/E": avg_pe,
"EV/EBITDA": avg_ev_ebitda,
"P/B": avg_pb
},
"implied_valuations": implied_valuations,
"average_implied_value": avg_implied_value
}
# 例:ターゲット企業と比較企業群
target = {
"name": "ターゲット企業",
"net_income": 8_000_000_000, # 80 億円
"ebitda": 15_000_000_000, # 150 億円
"equity": 100_000_000_000, # 1,000 億円
"debt": 20_000_000_000, # 200 億円
"cash": 10_000_000_000 # 100 億円
}
peers = [
{"name": "企業 A", "P/E": 12.5, "EV/EBITDA": 7.0, "P/B": 1.2},
{"name": "企業 B", "P/E": 15.0, "EV/EBITDA": 8.5, "P/B": 1.5},
{"name": "企業 C", "P/E": 10.0, "EV/EBITDA": 6.0, "P/B": 0.9},
{"name": "企業 D", "P/E": 18.0, "EV/EBITDA": 9.0, "P/B": 1.8},
]
result = comparable_company_analysis(target, peers)
print("比較企業中央値マルチプル:")
for mult, value in result["peer_median_multiples"].items():
print(f" {mult}: {value:.1f}倍")
print("\n推算企業価値:")
for method, value in result["implied_valuations"].items():
print(f" {method}: {value/1e8:.0f}億円")
print(f"\n平均推算価値:{result['average_implied_value']/1e8:.0f}億円")
3.3 業種別マルチプルの目安
| 業種 | P/E(倍) | EV/EBITDA(倍) | P/B(倍) |
|---|---|---|---|
| IT(成長) | 25-40 | 15-25 | 5-10 |
| IT(安定) | 15-25 | 10-15 | 3-5 |
| 製造業 | 10-15 | 6-10 | 1-2 |
| 小売業 | 12-18 | 7-12 | 2-4 |
| 金融 | 8-12 | N/A | 0.5-1.5 |
| 公益 | 12-16 | 8-12 | 1-2 |
4. 割引率の計算
4.1 ベータの計算
ベータは市場リターンに対する個別銘柄のリターンの感応度だ。
import numpy as np
from scipy import stats
def calculate_beta(stock_returns, market_returns):
"""過去リターンからのベータ計算"""
# 最小二乗法で回帰分析
slope, intercept, r_value, p_value, std_err = stats.linregress(
market_returns, stock_returns
)
return slope, r_value ** 2 # ベータと R 二乗
# 例:過去 36 ヶ月の月次リターン
stock_returns = np.array([0.02, -0.01, 0.03, 0.015, -0.02, ...]) # 36 個
market_returns = np.array([0.015, -0.005, 0.025, 0.01, -0.015, ...]) # 36 個
beta, r_squared = calculate_beta(stock_returns, market_returns)
print(f"ベータ:{beta:.2f}")
print(f"R 二乗:{r_squared:.3f}")
4.2 国別リスクプレミアム
新興国投資では国別リスクプレミアムを追加する。
Re = Rf + β × (Rm - Rf) + CRP
ここで:
- CRP: Country Risk Premium(国別リスクプレミアム)
| 国 | CRP(目安) |
|---|---|
| 日本 | 0.0% |
| 米国 | 0.0% |
| 中国 | 1.5% |
| インド | 2.5% |
| ブラジル | 4.0% |
5. バリュエーションの落とし穴
5.1 DCF 法の限界
| 問題点 | 説明 | 対策 |
|---|---|---|
| 終価依存 | 企業価値の 60-80% が終価 | 複数の終価計算方法を比較 |
| 入力値の誤差 | WACC、成長率の仮定で結果が大きく変動 | 感応度分析で範囲を示す |
| 予測の精度 | 5 年後の FCF 予測は困難 | シナリオ分析(楽観・基本・悲観) |
5.2 マルチプルの限界
| 問題点 | 説明 | 対策 |
|---|---|---|
| 比較企業の選択 | 真の比較企業は存在しない | 複数の比較企業グループを設定 |
| 会計方針の違い | 減価償却方法などで数値が歪む | 調整後数値を使用 |
| サイクルの影響 | 景気循環でマルチプルが変動 | 平均サイクルで評価 |
5.3 バリュエーションの三角測量
単一手法に依存せず、複数の手法で相互検証する:
DCF 法:1,200 億円
比較企業分析:1,100 億円
LBO 分析:1,000 億円
→ 妥当な範囲:1,000-1,200 億円
→ 結論:1,100 億円が妥当
def triangulate_valuation(dcf_value, comparable_value, lbo_value):
"""バリュエーションの三角測量"""
values = [dcf_value, comparable_value, lbo_value]
return {
"min": min(values),
"max": max(values),
"median": np.median(values),
"mean": np.mean(values),
"range": max(values) - min(values)
}
# 例
result = triangulate_valuation(
dcf_value=120_000_000_000, # 1,200 億円
comparable_value=110_000_000_000, # 1,100 億円
lbo_value=100_000_000_000 # 1,000 億円
)
print(f"評価範囲:{result['min']/1e8:.0f}-{result['max']/1e8:.0f}億円")
print(f"中央値:{result['median']/1e8:.0f}億円")
6. 実戦的バリュエーション
6.1 割安・割高の判定
| 指標 | 割安 | 公正 | 割高 |
|---|---|---|---|
| P/E | <10 倍 | 10-15 倍 | >20 倍 |
| P/B | <0.8 倍 | 0.8-1.5 倍 | >2 倍 |
| EV/EBITDA | <5 倍 | 5-8 倍 | >10 倍 |
| PEG | <0.8 | 0.8-1.2 | >1.5 |
def assess_valuation(pe, pb, ev_ebitda, peg):
"""バリュエーション総合判定"""
scores = {
"P/E": 0,
"P/B": 0,
"EV/EBITDA": 0,
"PEG": 0
}
# P/E 判定
if pe < 10:
scores["P/E"] = 1 # 割安
elif pe > 20:
scores["P/E"] = -1 # 割高
# P/B 判定
if pb < 0.8:
scores["P/B"] = 1
elif pb > 2:
scores["P/B"] = -1
# EV/EBITDA 判定
if ev_ebitda < 5:
scores["EV/EBITDA"] = 1
elif ev_ebitda > 10:
scores["EV/EBITDA"] = -1
# PEG 判定
if peg < 0.8:
scores["PEG"] = 1
elif peg > 1.5:
scores["PEG"] = -1
total_score = sum(scores.values())
if total_score >= 2:
assessment = "割安(買い機会)"
elif total_score <= -2:
assessment = "割高(売却検討)"
else:
assessment = "公正(ホールド)"
return {
"scores": scores,
"total_score": total_score,
"assessment": assessment
}
# 例:P/E 12 倍、P/B 1.0 倍、EV/EBITDA 6 倍、PEG 0.9
assessment = assess_valuation(pe=12, pb=1.0, ev_ebitda=6, peg=0.9)
print(f"総合判定:{assessment['assessment']}")
6.2 マーケット・ディスカウントとプレミアム
| 要因 | ディスカウント | プレミアム |
|---|---|---|
| 規模 | 小型株 | 大型株 |
| 流動性 | 低流動性 | 高流動性 |
| 成長性 | 低成長 | 高成長 |
| 収益性 | 低 ROE | 高 ROE |
| 財務 | 高レバレッジ | 低レバレッジ |
6.3 投資判断への統合
def investment_decision(dcf_value, current_price, margin_of_safety=0.3):
"""DCF ベースの投資判断"""
# 安全域を考慮した買い推奨価格
buy_price = dcff_value * (1 - margin_of_safety)
if current_price < buy_price:
return {
"decision": "買い",
"upside": (dcf_value / current_price - 1) * 100,
"margin_of_safety": (1 - current_price / dcf_value) * 100
}
elif current_price > dcf_value:
return {
"decision": "売り",
"downside": (1 - dcf_value / current_price) * 100
}
else:
return {
"decision": "ホールド",
"fair_value_gap": (dcf_value / current_price - 1) * 100
}
# 例:DCF 価値 1,200 円、現在価格 800 円
decision = investment_decision(
dcff_value=1200,
current_price=800,
margin_of_safety=0.3
)
print(f"投資判断:{decision['decision']}")
print(f"アップサイド:{decision['upside']:.1f}%")
print(f"安全域:{decision['margin_of_safety']:.1f}%")
まとめ
企業価値評価の核心を整理する:
- DCF 法: 将来 FCF を WACC で割引、終価が価値の大部分を占める
- 比較企業分析: 業界マルチプル(P/E、EV/EBITDA、P/B)で相対評価
- WACC 計算: CAPM で株主資本コスト、負債コストと加重平均
- 感応度分析: WACC、成長率の変化で企業価値がどう変動するか確認
- 三角測量: 単一手法に依存せず、複数手法で相互検証
- 安全域: 推算価値にディスカウントを適用して投資判断
バリュエーションは「正確な数字」ではなく「妥当な範囲」を見極める技術だ。複数の手法を組み合わせ、感応度分析でリスクを理解した上で、投資判断に統合することが重要である。
免責事項 — 当記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。投資判断はご自身の責任で行ってください。