Skip to content

Fundamental Analysis

Financial ratios, valuation models, and stock screening.

Financial Ratios

from financelib.fundamental import FinancialRatios

fr = FinancialRatios("THYAO.IS")
ratios = fr.all_ratios()  # 19 ratios

print(f"P/E: {ratios['pe_ratio']}")
print(f"P/B: {ratios['pb_ratio']}")
print(f"ROE: {ratios['roe']:.2%}")
print(f"Debt/Equity: {ratios['debt_to_equity']}")

# Human-readable summary
print(fr.summary())

Available ratios: pe_ratio, forward_pe, pb_ratio, ps_ratio, ev_ebitda, ev_revenue, peg_ratio, roe, roa, profit_margin, operating_margin, gross_margin, current_ratio, quick_ratio, debt_to_equity, dividend_yield, payout_ratio, earnings_growth, revenue_growth.

DCF Valuation

from financelib.fundamental import dcf_valuation

result = dcf_valuation(
    free_cash_flows=[100, 110, 121, 133, 146],  # 5 years projected
    discount_rate=0.10,                          # WACC
    terminal_growth_rate=0.03,                   # Perpetual growth
    shares_outstanding=1000,
)
print(f"Intrinsic value: {result['intrinsic_value_per_share']:.2f}")
print(f"Enterprise value: {result['enterprise_value']:,.0f}")

Gordon Growth Model

from financelib.fundamental import gordon_growth_model

value = gordon_growth_model(dividend=5.0, growth_rate=0.05, required_return=0.12)
print(f"Fair value: {value:.2f}")  # 75.00

Relative Valuation

from financelib.fundamental.valuation import relative_valuation

# Target EPS = 5.0, peer P/E ratios
result = relative_valuation(5.0, [12, 15, 18, 14, 16])
print(f"Implied value: {result['implied_value']:.2f}")
print(f"Peer median P/E: {result['peer_median']}")

Stock Screening

from financelib.fundamental import StockScreener

screener = StockScreener()  # Defaults to BIST common stocks

# Screen by criteria
results = screener.screen(pe_max=15, min_roe=0.10)
for r in results:
    print(f"{r['symbol']}: P/E={r['pe_ratio']}, ROE={r['roe']:.1%}")

# Sector screening
banking = screener.screen(sector="Banking")
airlines = screener.screen(sector="Airlines")

# Available sectors
print(StockScreener.available_sectors())
# ['Banking', 'Airlines', 'Automotive', 'Defense', 'Energy', ...]