Skip to content

International Module

??? example "purchasing_power_parity"

from startup_valuation.international import purchasing_power_parity

result = purchasing_power_parity(
    spot_rate=7.80, inflation_foreign=0.03, inflation_domestic=0.02,
)
print(f"PPP rate: {result.value:.4f}")  # 7.8765

??? example "interest_rate_parity"

from startup_valuation.international import interest_rate_parity

result = interest_rate_parity(
    spot_rate=1.10, rate_foreign=0.02, rate_domestic=0.04,
)
print(f"Forward rate: {result.value:.4f}")  # 1.0788

??? example "currency_adjusted_dcf"

from startup_valuation.international import currency_adjusted_dcf

cash_flows_local = [0, 10_000_000, 20_000_000, 30_000_000]
exchange_rates = [7.80, 7.85, 7.90, 7.95]
result = currency_adjusted_dcf(cash_flows_local, exchange_rates, discount_rate=0.10)
print(f"USD PV: ${result.value:,.0f}")

??? example "country_risk_premium"

from startup_valuation.international import country_risk_premium

result = country_risk_premium(sovereign_yield=0.06, us_treasury_yield=0.04)
print(f"CRP: {result.value:.2%}")  # 2.00%

??? example "country_risk_premium_damodaran"

from startup_valuation.international import country_risk_premium_damodaran

result = country_risk_premium_damodaran(
    default_spread=0.02, equity_volatility=0.25, bond_volatility=0.10,
)
print(f"Damodaran CRP: {result.value:.2%}")  # 5.00%

??? example "adjusted_capm_international"

from startup_valuation.international import adjusted_capm_international

result = adjusted_capm_international(
    risk_free_rate=0.04, beta=1.2, mrp=0.06, crp=0.03,
)
print(f"International CAPM: {result.value:.2%}")  # 14.20%

??? example "after_tax_cash_flow"

from startup_valuation.international import after_tax_cash_flow

result = after_tax_cash_flow(
    pre_tax_cash_flow=10_000_000, tax_local=0.25, tax_withholding=0.10,
)
print(f"After-tax: ${result.value:,.0f}")  # $6,750,000

??? example "sum_of_parts_valuation"

from startup_valuation.international import sum_of_parts_valuation

markets = [
    {"value": 100_000_000, "p_success": 0.60},
    {"value": 50_000_000, "p_success": 0.40},
    {"value": 20_000_000, "p_success": 0.20},
]
result = sum_of_parts_valuation(markets)
print(f"Sum of parts: ${result.value:,.0f}")  # $84,000,000

startup_valuation.international

International valuation methods.

Chapter 12: International Valuation Considerations

Classes

Functions

purchasing_power_parity(spot_rate, inflation_foreign, inflation_domestic)

Calculate PPP-adjusted exchange rate.

Formula: Eₜ = E₀ × (1 + π_foreign) / (1 + π_domestic)

Example

result = purchasing_power_parity(83, 0.05, 0.02) round(result.value, 1) 85.4

Source code in src/startup_valuation/international.py
def purchasing_power_parity(
    spot_rate: float,
    inflation_foreign: float,
    inflation_domestic: float,
) -> ValuationResult:
    """Calculate PPP-adjusted exchange rate.

    Formula: Eₜ = E₀ × (1 + π_foreign) / (1 + π_domestic)

    Example:
        >>> result = purchasing_power_parity(83, 0.05, 0.02)
        >>> round(result.value, 1)
        85.4
    """
    rate = spot_rate * (1 + inflation_foreign) / (1 + inflation_domestic)
    return ValuationResult(
        value=rate,
        method="Purchasing Power Parity",
        inputs={
            "spot_rate": spot_rate,
            "inflation_foreign": inflation_foreign,
            "inflation_domestic": inflation_domestic,
        },
        chapter="12",
    )

interest_rate_parity(spot_rate, rate_foreign, rate_domestic)

Calculate forward rate using interest rate parity.

Formula: F = S × (1 + r_foreign) / (1 + r_domestic)

Source code in src/startup_valuation/international.py
def interest_rate_parity(
    spot_rate: float,
    rate_foreign: float,
    rate_domestic: float,
) -> ValuationResult:
    """Calculate forward rate using interest rate parity.

    Formula: F = S × (1 + r_foreign) / (1 + r_domestic)
    """
    return ValuationResult(
        value=spot_rate * (1 + rate_foreign) / (1 + rate_domestic),
        method="Interest Rate Parity",
        inputs={
            "spot_rate": spot_rate,
            "rate_foreign": rate_foreign,
            "rate_domestic": rate_domestic,
        },
        chapter="12",
    )

currency_adjusted_dcf(cash_flows_local, exchange_rates, discount_rate_usd)

Calculate currency-adjusted DCF.

Formula: PV = Σ[CFₜ^local / Eₜ] / (1 + r_USD)^t

Source code in src/startup_valuation/international.py
def currency_adjusted_dcf(
    cash_flows_local: list[float],
    exchange_rates: list[float],
    discount_rate_usd: float,
) -> ValuationResult:
    """Calculate currency-adjusted DCF.

    Formula: PV = Σ[CFₜ^local / Eₜ] / (1 + r_USD)^t
    """
    if len(cash_flows_local) != len(exchange_rates):
        raise ValueError("cash_flows_local and exchange_rates must have same length")

    pv = sum(
        (cf / e) / ((1 + discount_rate_usd) ** t)
        for t, (cf, e) in enumerate(zip(cash_flows_local, exchange_rates))
    )

    return ValuationResult(
        value=pv,
        method="Currency-Adjusted DCF",
        inputs={
            "cash_flows_local": cash_flows_local,
            "exchange_rates": exchange_rates,
            "discount_rate_usd": discount_rate_usd,
        },
        chapter="12",
    )

country_risk_premium(sovereign_yield, us_treasury_yield)

Calculate country risk premium using sovereign spread.

Formula: CRP = Sovereign Bond Yield_local - US Treasury Yield

Example

result = country_risk_premium(0.105, 0.045) result.value 0.06

Source code in src/startup_valuation/international.py
def country_risk_premium(
    sovereign_yield: float,
    us_treasury_yield: float,
) -> ValuationResult:
    """Calculate country risk premium using sovereign spread.

    Formula: CRP = Sovereign Bond Yield_local - US Treasury Yield

    Example:
        >>> result = country_risk_premium(0.105, 0.045)
        >>> result.value
        0.06
    """
    return ValuationResult(
        value=sovereign_yield - us_treasury_yield,
        method="Country Risk Premium (Sovereign Spread)",
        inputs={"sovereign_yield": sovereign_yield, "us_treasury_yield": us_treasury_yield},
        chapter="12",
    )

country_risk_premium_damodaran(default_spread, equity_volatility, bond_volatility)

Calculate CRP using Damodaran's method.

Formula: CRP = Default Spread × (σ_equity / σ_bond)

Source code in src/startup_valuation/international.py
def country_risk_premium_damodaran(
    default_spread: float,
    equity_volatility: float,
    bond_volatility: float,
) -> ValuationResult:
    """Calculate CRP using Damodaran's method.

    Formula: CRP = Default Spread × (σ_equity / σ_bond)
    """
    if bond_volatility <= 0:
        raise ValueError("bond_volatility must be positive")
    return ValuationResult(
        value=default_spread * (equity_volatility / bond_volatility),
        method="Country Risk Premium (Damodaran)",
        inputs={
            "default_spread": default_spread,
            "equity_volatility": equity_volatility,
            "bond_volatility": bond_volatility,
        },
        chapter="12",
    )

adjusted_capm_international(risk_free_rate, beta, market_risk_premium, crp)

Calculate international adjusted CAPM.

Formula: r = Rf + β × MRP + CRP

Example

result = adjusted_capm_international(0.045, 1.2, 0.06, 0.03) round(result.value, 4) 0.147

Source code in src/startup_valuation/international.py
def adjusted_capm_international(
    risk_free_rate: float,
    beta: float,
    market_risk_premium: float,
    crp: float,
) -> ValuationResult:
    """Calculate international adjusted CAPM.

    Formula: r = Rf + β × MRP + CRP

    Example:
        >>> result = adjusted_capm_international(0.045, 1.2, 0.06, 0.03)
        >>> round(result.value, 4)
        0.147
    """
    return ValuationResult(
        value=risk_free_rate + beta * market_risk_premium + crp,
        method="Adjusted CAPM (International)",
        inputs={
            "risk_free_rate": risk_free_rate,
            "beta": beta,
            "market_risk_premium": market_risk_premium,
            "crp": crp,
        },
        chapter="12",
    )

after_tax_cash_flow(pre_tax_cf, local_tax_rate, withholding_tax_rate=0)

Calculate after-tax cash flow for international operations.

Formula: After-Tax CF = Pre-Tax CF × (1 - Local Tax Rate) × (1 - Withholding Tax Rate)

Source code in src/startup_valuation/international.py
def after_tax_cash_flow(
    pre_tax_cf: float,
    local_tax_rate: float,
    withholding_tax_rate: float = 0,
) -> ValuationResult:
    """Calculate after-tax cash flow for international operations.

    Formula: After-Tax CF = Pre-Tax CF × (1 - Local Tax Rate) × (1 - Withholding Tax Rate)
    """
    return ValuationResult(
        value=pre_tax_cf * (1 - local_tax_rate) * (1 - withholding_tax_rate),
        method="After-Tax Cash Flow",
        inputs={
            "pre_tax_cf": pre_tax_cf,
            "local_tax_rate": local_tax_rate,
            "withholding_tax_rate": withholding_tax_rate,
        },
        chapter="12",
    )

sum_of_parts_valuation(market_values, market_probabilities)

Calculate sum-of-parts valuation across markets.

Formula: Total V = Σ V_market_i × P(success in market i)

Source code in src/startup_valuation/international.py
def sum_of_parts_valuation(
    market_values: list[float],
    market_probabilities: list[float],
) -> ValuationResult:
    """Calculate sum-of-parts valuation across markets.

    Formula: Total V = Σ V_market_i × P(success in market i)
    """
    if len(market_values) != len(market_probabilities):
        raise ValueError("market_values and market_probabilities must have same length")
    total = sum(v * p for v, p in zip(market_values, market_probabilities))
    return ValuationResult(
        value=total,
        method="Sum-of-Parts Valuation",
        inputs={"market_values": market_values, "market_probabilities": market_probabilities},
        chapter="12",
    )