company-valuation について
company-valuation は、企業の推定株価を分析するスキルです。DCF、類似企業の倍率、適用可能な場合は SOTP を組み合わせ、感応度とシナリオも分析します。
主な機能
- 015年間の FCFF 予測による DCF
- 02類似企業の倍率を使った相対評価
- 03複数セグメント企業向け SOTP
- 04WACC と終価成長率の感応度分析
- 05強気・基準・弱気シナリオ
活用シーン
- 01企業の推定株価の算出
- 02類似企業とのバリュエーション比較
- 03前提条件による評価の感応度確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ himself65/ finance-skills --skill company-valuationインストール後、Claude Code で/company-valuationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdreferences/dcf.mdrelative_valuation.mdsotp.mdwacc_erp_rates.md詳細
企業価値評価
ホストが以下のシェルプローブをまだ実行していない場合(たとえば Codex など)、セットアップ方法を選択する前に、シェルツールを使って ! で囲まれたコマンドを実行してください。実際の出力を使用してください。シェルにアクセスできない場合は、その制約を報告してください。
3つの手法で本質的価値を算出し、それらを統合して想定株価を導きます。
- DCF — 5年間のFCFF予測を作成し、WACCで割り引いてターミナルバリューを算出します。
- 相対評価 — ピアのP/E、EV/売上高、EV/EBITDAの中央値を適用します。
- SOTP — 2つ以上の異なる報告セグメントが存在する場合、各セグメントを専業ピアの倍率で評価します。
必ずWACC × ターミナル成長率の感応度分析表と、強気/ベース/弱気のシナリオを提示してください。
免責事項:調査・教育目的の出力です。投資助言ではありません。
ステップ1:検出フロー
データソースとランタイム依存関係を検出します。このスキルでは2つの方法をサポートしています。利用可能な中で最も充実した方法を選択してください。
環境ステータス:
!`python3 -c "exec('try:\n import yfinance, numpy, pandas\n print(\'YFIN_OK\')\nexcept Exception:\n print(\'YFIN_MISSING\')')"`
!`python3 -c "exec('try:\n import yfinance as yf\n t=yf.Ticker(\'^TNX\')\n p=t.fast_info.last_price\n print(f\'RF_10Y={p/100:.4f}\')\nexcept Exception:\n print(\'RF_FETCH_FAIL\')')"`
決定木:
| 条件 | 方法 |
|---|---|
YFIN_OK | 方法A(優先):財務データとピア倍率に yfinance を使用 |
YFIN_MISSING | 方法B:yfinance を pip でインストールし、方法Aを使用。python3 -m pip install -q yfinance numpy pandas |
RF_FETCH_FAIL | デフォルトの rf = 0.045 を使用し、出力でリスクフリーレートが古い可能性に言及 |
RF_10Y= が出力された場合、ステップ4dではハードコードされた4.5%の代わりに、その値を rf として使用してください。
ステップ2:手法を選択し、デフォルト値を設定
手法の適用性
| 企業の種類 | DCF | 相対評価 | SOTP | 代替手法 |
|---|---|---|---|---|
| 成熟したキャッシュフロー企業(CPG、通信、公益事業) | ✅ 主手法 | ✅ | ❌ | — |
| 高成長SaaS/ソフトウェア | ✅ 慎重に適用 | ✅ 主手法 | ❌ | EV/売上高+Rule of 40を使用 |
| 複数セグメントを持つコングロマリット | ✅ | ✅ | ✅ 主手法 | references/sotp.md を参照 |
| 銀行/保険 | ❌ | ✅(P/B、P/TBV) | ❌ | DDMまたは超過収益法。出力で言及 |
| 売上前の企業 | ❌ | EV/売上高のみ | ❌ | 信頼度が低いことを明示 |
| REIT | ❌ | ✅(P/FFO、P/AFFO) | ❌ | NAVベース |
| 景気循環株(エネルギー、半導体、工業) | ✅ 景気中立水準で適用 | ✅ | 場合による | サイクルを通じて正常化 |
デフォルト値の表
データを取得する前にすべてのパラメーターを確定してください。ユーザーが変更を指定しない限り、以下のデフォルト値を適用します。
| パラメーター | デフォルト | 根拠 |
|---|---|---|
| 予測期間 | 5年 | 標準的な明示予測期間 |
ターミナル成長率 g | 2.5% | 約 長期の米国GDP |
リスクフリーレート rf | ステップ1の最新10年物米国債利回り。取得できない場合は4.5% | 現在の資本コストの基準 |
株式リスクプレミアム erp | 5.5% | Damodaranの中間水準 |
| ベータ | yfinance の info['beta'] | 市場で観測されたレバード・ベータ |
負債コスト kd | interest_expense / total_debt。取得できない場合は5.5% | 実効金利。代替値は投資適格債スプレッド |
| 税率 | 3年間の実効税率の中央値。下限15%、上限30% | 一時的要因を除外 |
| マージンの前提 | 各比率の3年間の中央値 | 景気循環によるノイズを平滑化 |
| SBCの扱い | ソフトウェア/SaaSは現金扱い、工業/CPGは非現金扱い | 業界慣行 |
| ピア数 | 4~6社 | シグナルとノイズのバランス |
| ピア倍率 | 平均ではなく中央値 | 外れ値の影響を抑える |
| 手法の重み(SOTPなし) | DCF 50%/相対評価 50% | 均等に統合 |
| 手法の重み(SOTPあり) | DCF 40%/相対評価 30%/SOTP 30% | 該当する場合はSOTPに重みを付与 |
| 感応度分析グリッド | WACC ±1%を0.5%刻み × gを1.5~3.5%の0.5%刻み | 5×5のマトリックス |
最新のリスクフリーレート、ERP表、セクター別WACCベンチマークについては references/wacc_erp_rates.md を参照してください。
ステップ3:データを取得
import yfinance as yf
import numpy as np
import pandas as pd
TICKER = "AAPL" # replace
t = yf.Ticker(TICKER)
info = t.info
income_a = t.income_stmt
cashflow_a = t.cashflow
balance_a = t.balance_sheet
income_q = t.quarterly_income_stmt
cashflow_q = t.quarterly_cashflow
earnings_est = t.earnings_estimate
revenue_est = t.revenue_estimate
price = info.get("currentPrice") or info.get("regularMarketPrice")
market_cap = info.get("marketCap")
shares_out = info.get("sharesOutstanding")
total_debt = info.get("totalDebt") or 0
cash = info.get("totalCash") or 0
beta = info.get("beta") or 1.0
sector = info.get("sector")
industry = info.get("industry")
主要な財務諸表の項目(yfinanceのラベル):
| 必要項目 | 行 |
|---|---|
| 売上高 | Total Revenue |
| EBIT | Operating Income |
| 純利益 | Net Income |
| D&A | Depreciation And Amortization(キャッシュフロー計算書) |
| 設備投資 | Capital Expenditure(マイナス値) |
| ΔNWC | Change In Working Capital(キャッシュフロー計算書) |
| SBC | Stock Based Compensation(キャッシュフロー計算書) |
ステップ 4:DCF の構築
詳しい方法論と業界固有の調整については、references/dcf.md を参照してください。簡易版の骨組み:
# 4a. Revenue growth path — fade from Y1 (consensus or hist CAGR) to terminal g
rev = income_a.loc["Total Revenue"].dropna().iloc[::-1].values # yfinance columns are newest-first; reverse to oldest -> newest
hist_cagr = (rev[-1] / rev[0]) ** (1 / (len(rev)-1)) - 1
y1 = float(revenue_est.loc["+1y", "growth"]) if "+1y" in revenue_est.index else hist_cagr
g_terminal = 0.025
growth_path = np.linspace(y1, g_terminal + 0.01, 5)
# 4b. Margins — 3y median
ebit_margin = float((income_a.loc["Operating Income"] / income_a.loc["Total Revenue"]).iloc[:3].median())
da_pct = float((cashflow_a.loc["Depreciation And Amortization"] / income_a.loc["Total Revenue"]).iloc[:3].median())
capex_pct = float((cashflow_a.loc["Capital Expenditure"].abs() / income_a.loc["Total Revenue"]).iloc[:3].median())
nwc_pct = float((cashflow_a.loc["Change In Working Capital"].abs() / income_a.loc["Total Revenue"]).iloc[:3].median())
eff_tax = (income_a.loc["Tax Provision"] / income_a.loc["Pretax Income"]).iloc[:3].median()
tax_rate = float(min(0.30, max(0.15, eff_tax))) if pd.notna(eff_tax) else 0.21 # 3y median effective, floored 15%, capped 30%
# 4c. FCFF per year
rev_t = [float(income_a.loc["Total Revenue"].iloc[0])]
fcff = []
for g in growth_path:
rev_t.append(rev_t[-1] * (1 + g))
ebit = rev_t[-1] * ebit_margin
nopat = ebit * (1 - tax_rate)
fcff.append(nopat + rev_t[-1]*da_pct - rev_t[-1]*capex_pct - rev_t[-1]*nwc_pct)
# 4d. WACC
rf, erp, kd = 0.045, 0.055, 0.055 # override rf with live value from Step 1
ke = rf + beta * erp
e_v = market_cap / (market_cap + total_debt)
d_v = 1 - e_v
wacc = e_v*ke + d_v*kd*(1 - tax_rate)
# 4e. Terminal value — compute both, use midpoint
tv_gordon = fcff[-1] * (1 + g_terminal) / (wacc - g_terminal)
tv_exit = (rev_t[-1] * ebit_margin + rev_t[-1] * da_pct) * 15 # peer median EV/EBITDA
tv_base = 0.5 * (tv_gordon + tv_exit)
# 4f. Bridge to equity
pv_fcff = sum(f / (1+wacc)**(i+1) for i, f in enumerate(fcff))
pv_tv = tv_base / (1+wacc)**5
ev = pv_fcff + pv_tv
equity = ev + cash - total_debt
implied_price_dcf = equity / shares_out
チェック項目: (a)wacc <= g_terminal の場合は中止します。g が高すぎます。(b)pv_tv / ev > 0.85 または < 0.45 の場合はフラグを立て、両方の TV 手法を示します。(c)wacc が references/wacc_erp_rates.md のセクター別妥当性の範囲外の場合は、その旨を記載します。
ステップ 5:相対評価
同業他社を 4~6 社選びます。同業他社の選定マップと調整ルールについては、references/relative_valuation.md を参照してください。
PEERS = ["MSFT", "ORCL", "CRM", "NOW", "SAP", "WDAY"] # pick by industry
multiples = {}
for p in PEERS:
pi = yf.Ticker(p).info
multiples[p] = {
"pe_fwd": pi.get("forwardPE"),
"ev_rev": pi.get("enterpriseToRevenue"),
"ev_ebitda": pi.get("enterpriseToEbitda"),
"ps": pi.get("priceToSalesTrailing12Months"),
}
med_pe = np.nanmedian([v["pe_fwd"] for v in multiples.values()])
med_ev_rev = np.nanmedian([v["ev_rev"] for v in multiples.values()])
med_ev_eb = np.nanmedian([v["ev_ebitda"] for v in multiples.values()])
eps_ttm = float(income_q.loc["Diluted EPS"].iloc[:4].sum())
rev_ttm = float(income_q.loc["Total Revenue"].iloc[:4].sum())
ebitda_ttm = float(income_q.loc["EBIT"].iloc[:4].sum()) + float(cashflow_q.loc["Depreciation And Amortization"].iloc[:4].sum())
net_debt = total_debt - cash
implied_pe = med_pe * eps_ttm
implied_ev_rev = (med_ev_rev * rev_ttm - net_debt) / shares_out
implied_ev_ebit = (med_ev_eb * ebitda_ttm - net_debt) / shares_out
implied_price_rel = np.nanmedian([implied_pe, implied_ev_rev, implied_ev_ebit])
対象企業の成長率または利益率の特性が同業他社と大きく異なる場合は、同業他社の中央値を±10~30%調整します。調整内容と理由は必ず記載してください。SaaS の Rule of 40 の基準については、references/relative_valuation.md を参照してください。
ステップ 6:SOTP(複数セグメントの場合のみ)
10-K に経済性の異なる事業セグメントが 2 つ以上記載されている場合を除き、省略します。yfinance ではセグメントデータを取得できないため、ユーザーが提供するか、提出書類から解析する必要があります。詳しい方法論については、references/sotp.md を参照してください。
- セグメントと、それぞれの専業同業他社を特定します
- 同業他社の EV/EBITDA 中央値(成長セグメントの場合は EV/Rev)を適用します
- 配賦されていない本社費用を差し引きます(不明な場合は売上高の 2~5%を上限とします)
- 純有利子負債と非支配持分を差し引き、株式数で割ります
SOTP ディスカウント =(SOTP 株価 − 市場価格)/ SOTP 株価。20%を超える場合はフラグを立てます(コングロマリット・ディスカウント)。
ステップ 7:評価の突き合わせ、感応度、シナリオ
# Blended implied price
if sotp_price is None:
blended = 0.5*implied_price_dcf + 0.5*implied_price_rel
else:
blended = 0.4*implied_price_dcf + 0.3*implied_price_rel + 0.3*sotp_price
# 5x5 sensitivity grid
wacc_grid = [wacc + dx for dx in (-0.01, -0.005, 0, 0.005, 0.01)]
g_grid = [0.015, 0.020, 0.025, 0.030, 0.035]
sens = {}
for w in wacc_grid:
for g in g_grid:
tv = fcff[-1]*(1+g)/(w-g)
pv = sum(f/(1+w)**(i+1) for i,f in enumerate(fcff)) + tv/(1+w)**5
sens[(w,g)] = (pv + cash - total_debt) / shares_out
さらに、強気/ベース/弱気のシナリオも作成します。売上高成長率を±300bps、EBIT 利益率を±200bps、WACC を∓100bps、ターミナル成長率を 3.0%/2.5%/1.5%に変化させます。
ステップ 8:ユーザーへの回答
次の順序で評価結果を提示します。
- 結論の要約 — 加重平均した適正価値、現在価格、上昇率または下落率、最も強気または弱気な評価手法を 1 文で示します。
- 概要 — セクター、業種、時価総額、現在価格、3 か月/12 か月の株価変動率、LTM 売上高成長率。
- 3 手法の要約 — 3 列の表:手法|示唆価格|加重比率|簡潔な根拠。
- DCF の構築 — 前提条件の表(成長経路、利益率、WACC の構成要素、ターミナル手法)+5 年間の FCFF 予測表+EV から株主価値へのブリッジ。
- 同業他社との比較 — 同業他社の P/E 予想値、EV/Rev、EV/EBITDA、粗利益率、売上高成長率を示す表。最下段に中央値を記載し、対象企業のプレミアム/ディスカウントを示します。
- SOTP(該当する場合)— セグメント表+調整項目+株主価値。
- 感応度マトリクス — WACC × g のグリッド(5×5)。ベースケースを強調表示します。
- シナリオ — 強気/ベース/弱気の表。調整要因と示唆価格を記載します。
- 主なリスク — どの前提条件が評価結果に最も影響するか、また投資仮説が崩れる可能性のある要因を示します。
エラー処理
| 欠損データ/例外ケース | 対応 |
|---|---|
yfinance がベータ値として None を返す | references/wacc_erp_rates.md のセクター標準ベータを使用します |
| LTM EBITDA がマイナス | EV/EBITDA 倍率を省略し、EV/Revenue と DCF に依拠します |
| LTM EPS がマイナス | P/E 倍率を省略します。予想 P/E がプラスなら使用し、そうでなければ省略します |
| ゴードン成長モデルで成長率が WACC を上回る | g = wacc − 0.5% に上限を設定し、フラグを立てます |
| 過去データが 3 年未満 | 利用可能なデータを使用し、データの信頼度を「低」と記載します |
| 同業他社データの取得に失敗 | その同業他社を中央値の算出から除外し、出力にその旨を記載します |
| SOTP 用のセグメントデータがない | セクション 6 を省略し、DCF と相対評価のみで進めます |
含めるべき注意事項
- TTM データにはリアルタイムとのタイムラグがあります。同業他社の倍率は市場心理を反映するため、行き過ぎることがあります。
- DCF は入力値の質に左右されます。単一の推定値よりも感応度が重要です。
- yfinance のデータは公式ではありません。意思決定の前に、一次資料で必ず照合してください。
- 財務上の助言ではありません。
参考ファイル
references/dcf.md— DCF の方法論と業界固有のガイダンス(ソフトウェア、小売、金融、ヘルスケア、エネルギー、製造、CPG、通信、REIT、ストリーミング)references/relative_valuation.md— 同業他社の選定、倍率調整ルール、Rule of 40、テーマ別の同業他社グループreferences/sotp.md— サム・オブ・ザ・パーツの方法論、コングロマリット・ディスカウントの検出、カタリストreferences/wacc_erp_rates.md— 無リスク金利、株式リスクプレミアム、セクター別 WACC ベンチマーク、セクター標準ベータ