mcpField
C
company-valuation

company-valuation

github.com/himself65データ・データベース3.5k3.3k 回インストール3 日前に更新
リポジトリ

company-valuation について

company-valuation は、企業の推定株価を分析するスキルです。DCF、類似企業の倍率、適用可能な場合は SOTP を組み合わせ、感応度とシナリオも分析します。

主な機能

  1. 015年間の FCFF 予測による DCF
  2. 02類似企業の倍率を使った相対評価
  3. 03複数セグメント企業向け SOTP
  4. 04WACC と終価成長率の感応度分析
  5. 05強気・基準・弱気シナリオ

活用シーン

  1. 01企業の推定株価の算出
  2. 02類似企業とのバリュエーション比較
  3. 03前提条件による評価の感応度確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/himself65/finance-skills --skill company-valuation

インストール後、Claude Code で/company-valuationを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
references/
dcf.md
relative_valuation.md
sotp.md
wacc_erp_rates.md

詳細

企業価値評価

ホストが以下のシェルプローブをまだ実行していない場合(たとえば Codex など)、セットアップ方法を選択する前に、シェルツールを使って ! で囲まれたコマンドを実行してください。実際の出力を使用してください。シェルにアクセスできない場合は、その制約を報告してください。

3つの手法で本質的価値を算出し、それらを統合して想定株価を導きます。

  1. DCF — 5年間のFCFF予測を作成し、WACCで割り引いてターミナルバリューを算出します。
  2. 相対評価 — ピアのP/E、EV/売上高、EV/EBITDAの中央値を適用します。
  3. 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年標準的な明示予測期間
ターミナル成長率 g2.5%約 長期の米国GDP
リスクフリーレート rfステップ1の最新10年物米国債利回り。取得できない場合は4.5%現在の資本コストの基準
株式リスクプレミアム erp5.5%Damodaranの中間水準
ベータyfinance の info['beta']市場で観測されたレバード・ベータ
負債コスト kdinterest_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
EBITOperating Income
純利益Net Income
D&ADepreciation And Amortization(キャッシュフロー計算書)
設備投資Capital Expenditure(マイナス値)
ΔNWCChange In Working Capital(キャッシュフロー計算書)
SBCStock 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. 結論の要約 — 加重平均した適正価値、現在価格、上昇率または下落率、最も強気または弱気な評価手法を 1 文で示します。
  2. 概要 — セクター、業種、時価総額、現在価格、3 か月/12 か月の株価変動率、LTM 売上高成長率。
  3. 3 手法の要約 — 3 列の表:手法|示唆価格|加重比率|簡潔な根拠。
  4. DCF の構築 — 前提条件の表(成長経路、利益率、WACC の構成要素、ターミナル手法)+5 年間の FCFF 予測表+EV から株主価値へのブリッジ。
  5. 同業他社との比較 — 同業他社の P/E 予想値、EV/Rev、EV/EBITDA、粗利益率、売上高成長率を示す表。最下段に中央値を記載し、対象企業のプレミアム/ディスカウントを示します。
  6. SOTP(該当する場合)— セグメント表+調整項目+株主価値。
  7. 感応度マトリクス — WACC × g のグリッド(5×5)。ベースケースを強調表示します。
  8. シナリオ — 強気/ベース/弱気の表。調整要因と示唆価格を記載します。
  9. 主なリスク — どの前提条件が評価結果に最も影響するか、また投資仮説が崩れる可能性のある要因を示します。
エラー処理
欠損データ/例外ケース対応
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 ベンチマーク、セクター標準ベータ

コメント