| Age | Commit message (Collapse) | Author |
|
- Remove dead _build_dcf_canvas_html (~525 lines, superseded by
_build_dcf_canvas_only_html)
- Remove unused ev_ebit assignment
- Fix FCF yield KPI strip and mini row using dividendYieldTTM as peer
band proxy (pass None — no equivalent peer field for FCF yield)
- Expand st.spinner in _render_historical_ratios to cover get_peers()
and get_ratios_for_tickers() calls
- Collapse _render_all_multiples / _render_multiples_model indirection
into a single function
- Replace Comps fixed 2600px height with max(1900, 1500 + n_peers*80),
saving 400-700px whitespace for typical 5-8 peer sets
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Missing semicolon after pts.forEach() prevented ASI, causing a JS syntax
error that silently killed all chart and matrix rendering. Also bumped
Earnings History iframe height to stop the table from being clipped.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- Key Ratios: 6-KPI snapshot strip with sparklines, 5-category ratio grid
(Valuation, Profitability, Growth, Health, Cash Returns) via components.html()
- Models (DCF): two-column layout — st.slider() rail + prominent verdict chip,
EV→equity bridge, per-share reconciliation, cross-check grid as HTML canvas
- Historical Ratios: SVG line chart (subject vs sector median) + clickable
heatmap matrix that updates the chart via client-side JS
- Comps: 4 percentile rank bars + sortable peer table, all via components.html()
- Multiples: math-flow columns (EV/EBITDA, EV/Revenue, P/Book) with sensitivity
strip and DCF cross-check; HTML range sliders drive JS computation
All redesigned tabs: scrolling=False, string-concat HTML (no f-strings),
XSS-safe (escape_html on all user-supplied strings injected into HTML/JS).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
|
|
tabs
Switch scrolling=True → scrolling=False and increase height estimates so iframe
content never clips. Excess height is invisible whitespace matching page background.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
|
|
tab.
|
|
The sliders live inside the canvas iframe (keeping live JS behavior)
but are now in a narrow left rail column — the same visual layout as
before the live-DCF refactor. The canvas uses a 272px + 1fr grid:
left aside has the header, four range inputs, and the filings panel;
right div has all output sections unchanged.
Removes the horizontal va-controls bar added in the previous commit.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Move all four DCF assumptions (WACC, TG, horizon, FCF growth) from
st.slider widgets into the canvas iframe as native range inputs. A
JavaScript runDCF() engine recomputes the full projection in the browser
on every drag event, updating the verdict, bar chart (Plotly.react),
cash-flow table, bridge, recon strip, and cross-check cell in place
without a Streamlit round-trip.
Python still runs run_dcf() once on page load (using session-state
defaults) to populate dcf_intrinsic for the Multiples cross-check.
The Recompute button in the rail clears API caches and reruns when
fresh filing data is needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- Collapse model picker from 4 tabs → 2: DCF and Multiples, persisted
in session_state["models_view"]
- New Multiples view: summary band, interactive comparison grid (8 math
rows × 3 methods), sensitivity strip, DCF cross-check, footer
- In-canvas sliders with sector marker + typical-band shading; JS
recomputes all derived values live without a Streamlit rerun
- Sector medians computed from peer ratios via FMP; falls back to
reasonable defaults when peer data is unavailable
- DCF intrinsic stored in session_state["dcf_intrinsic"] so the
cross-check on the Multiples tab reads the live DCF value
- P/Book applicability shows ◐ + warning color for asset-light
companies instead of the solid ● used for strong-fit methods
- Fix Recompute button text: target inner <p>/<span> with
color: var(--brass-ink) to override Streamlit's fg-2 default
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Replaces the flat column layout with a two-column inspector design:
left rail holds four st.slider inputs + "From the filings" reference
panel + Reset/Recompute actions; right canvas renders verdict hero,
projection card (Plotly.js bar chart + cash-flow table), EV bridge,
per-share recon, and cross-check via a single components.v1.html block.
Also fixes primary button text color app-wide by targeting the modern
Streamlit selector (stBaseButton-primary) alongside the legacy one.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
typography
Implements the design kit: champagne brass accent (#C2AA7A), deep midnight
backgrounds, EB Garamond italic headings, IBM Plex Sans/Mono body and numbers,
terminal-density KPI cards, restyled sidebar brand mark, flat pill tabs, and a
global Plotly theme so all charts inherit the dark palette automatically.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Use TTM EBITDA (from compute_ttm_ratios) as the single canonical source
for both Key Ratios and DCF EV/EBITDA — eliminates disagreement between tabs
- Remove "Total Equity Gross Minority Interest" from minority_interest fallback
in get_balance_sheet_bridge_items; that yfinance row is total equity (not just
minority portion) and would have massively over-deducted from DCF equity value
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- compute EV consistently as market cap + debt - cash
- derive DCF/EV bridge inputs from balance-sheet rows
- centralize latest price, shares outstanding, and computed market cap helpers
- relabel negative net debt as net cash in valuation UI
- self-compute historical ratios/key metrics instead of relying on vendor ratios
- guard against nonsensical historical EV/EBITDA values
- add methodology/source notes in DCF tab
|
|
The slider tooltip still read info["enterpriseToEbitda"] (the bad yfinance
pre-computed value showing 4998x for DDOG). Now computed as enterpriseValue
/ income statement EBITDA, consistent with the Key Ratios tab fix.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Added compute_ttm_ratios() which derives all 16 TTM ratios directly from
yfinance quarterly income statements, balance sheets, and cash flow:
Valuation: P/E, P/S, P/B, EV/EBITDA, EV/Revenue
Profitability: Gross/Operating/Net Margin, ROE, ROA, ROIC
Leverage: D/E, Current Ratio, Quick Ratio, Interest Coverage
Dividends: Yield, Payout Ratio
get_key_ratios() no longer calls FMP's /ratios-ttm or /key-metrics-ttm
endpoints, saving ~2 FMP API calls per ticker load (including each Comps
peer). Forward P/E still comes from yfinance info dict (analyst estimate).
This also fixes EV/EBITDA for all tickers (DDOG was 4998x from FMP/yfinance
pre-computed values, now correctly 194x from income statement EBITDA).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
FMP and yfinance both return the same bad EV/EBITDA value (4998x for DDOG)
because their pre-computed multiples use a miscalculated EBITDA. Removed
the FMP preference fallback — EV/EBITDA is now always computed directly as
enterpriseValue / get_ebitda_from_income_stmt().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
yfinance's info["ebitda"] is a miscalculated TTM value for many tickers
(e.g. DDOG shows $7.5M when the correct TTM EBITDA is $193.8M). Added
get_ebitda_from_income_stmt() which reads directly from t.income_stmt,
matching the annual and quarterly figures. Key Ratios and DCF EV/EBITDA
valuation now both use this source, with FMP as the preferred override.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Overview:
- Score card: green/yellow/red signals for valuation, growth, profitability,
leverage, momentum (vs 52W high), and short interest
- 52W high/low visual range bar with current price marker and % context
- Short interest metrics row: % of float, days to cover, shares short vs
prior month
- Replaced static 52W High/Low metrics with volume and avg volume
Options tab (new):
- Expiry selector across all available expirations
- Put/call ratio by volume and open interest with bullish/bearish label
- IV smile chart (calls + puts) with ATM marker
- Open interest by strike (calls above, puts mirrored below axis)
- Full chain table (calls/puts) in expandable section
CSV exports:
- Download button on each financial statement (income, balance, cash flow)
- Download button on earnings history table
Also fix top padding cut-off: block-container padding-top 1rem → 3.5rem
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
FMP stable /analyst-estimates returns revenueAvg, epsAvg, ebitdaAvg, etc.
but the code was looking for estimatedRevenueAvg, estimatedEpsAvg, etc.
Updated _build_estimates_table and the EPS chart to read both field name
variants so the Forward Estimates tab now renders correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
FMP free tier caps at 250 req/day; hitting the limit caused the Historical
Ratios tab to show an error. get_historical_ratios_yfinance now computes
margins, ROE, ROA, D/E, P/E, P/B, P/S, and EV/EBITDA directly from
yfinance income statements, balance sheets, and price history. FMP
functions fall back to this automatically when they receive an empty
response.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- services/fmp_service.py: add get_historical_ratios, get_historical_key_metrics,
get_analyst_estimates, get_insider_transactions, get_sec_filings
- components/valuation.py: add Historical Ratios and Forward Estimates subtabs
- components/insiders.py: new — insider buy/sell summary, monthly chart, detail table
- components/filings.py: new — SEC filings with type filter and direct links
- app.py: wire in Insiders and Filings top-level tabs
|
|
|
|
|
|
|
|
override
- DCF model: user-adjustable FCF growth rate slider (defaults to historical median)
- EV/EBITDA valuation section with target multiple slider and implied price
- Analyst Targets tab: price target summary + recommendation breakdown chart
- Earnings History tab: EPS actual vs estimate table and line chart with next earnings date
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
Streamlit app with market bar, price chart, financial statements,
DCF valuation engine, comparable companies, and news feed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|