| Age | Commit message (Collapse) | Author |
|
Adds a save/remove toggle below the company snapshot, a watchlist section
(capped at 10 tickers) that renders sym · price · Δ% rows above Top Movers,
and an empty-state placeholder. Clicking a watchlist row loads that ticker.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
- overview: use json_for_script for inline payload/meta to prevent
</script> break-out from yfinance-sourced strings; raise iframe
height to cover responsive single-column collapse under 1100px
- news: treat naive ISO/strptime datetimes as UTC before converting
to local-naive, matching the int-timestamp branch from 75dbe29
- news: bump per-row iframe height to fit summary + metadata under
scrolling=False
- top_movers: drop name column in compact (sidebar) mode and tighten
grid so symbol/price/change fit a default-width Streamlit sidebar
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
|
|
|
|
|
Unix-int timestamps from Finnhub were returned as naive UTC, then
.timestamp() reinterpreted them as local time — shifting relative ages
and date filtering. Now normalize to local-naive like the other branches.
Also escape </ in the JSON embedded in <script>, so headlines containing
</script> cannot break out of the inline script.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
|
|
|
|
|
|
|
|
|
|
|
Replaces st.radio/st.tabs/st.expander/st.dataframe with a single
components.html() panel matching the Prism design system — same token
block, val-ctx bar, lede card, and CSS grid tables as the Valuation tabs.
Annual/Quarterly toggle and Income/Balance Sheet/Cash Flow tabs are
handled in-iframe via vanilla JS with no Streamlit re-renders.
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>
|
|
- add Organized/Raw toggle for income statement, balance sheet, and cash flow
- group line items into expandable sections for easier navigation
- add Prism Net Debt row to annual balance sheet using valuation bridge logic
- keep full raw statement tables and CSV download support
|
|
- 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>
|
|
- Corrected existing labels that didn't match yfinance output
(e.g. 'research development' → 'research and development',
'income tax expense' → 'tax provision',
'selling general administrative' → 'selling general and administration')
- Added balance sheet debt/liability rows: net debt, total debt, long/current
debt, capital lease obligations, all liability subtotals, payables
- Added cash flow rows: debt issuance (increase = bad), equity dilution
(issuance of capital stock = bad), taxes/interest paid (more = bad),
buybacks (repurchase of capital stock = inverse so more buybacks = green)
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>
|
|
FMP v3 insider-trading and sec_filings endpoints are legacy-gated.
Switch to yfinance (t.insider_transactions, t.sec_filings) which
provides the same data for free with no API key required.
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
|
|
Green for improvement, red for decline. Cost/expense rows use
inverse logic (decline = green). Value cells retain neutral styling.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
|
|
|
|
|
|
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>
|