<feed xmlns='http://www.w3.org/2005/Atom'>
<title>prism.git/components/valuation.py, branch feature/valuation-redesign</title>
<subtitle>Webapp for stock analysis</subtitle>
<id>https://git.tylerhoang.xyz/prism.git/atom?h=feature%2Fvaluation-redesign</id>
<link rel='self' href='https://git.tylerhoang.xyz/prism.git/atom?h=feature%2Fvaluation-redesign'/>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/'/>
<updated>2026-05-17T09:08:26Z</updated>
<entry>
<title>Fix valuation review: dead code, wrong peer bands, height scaling</title>
<updated>2026-05-17T09:08:26Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-17T09:08:26Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=85160a558b2d37965ee2b8799fdd177ec986eadd'/>
<id>urn:sha1:85160a558b2d37965ee2b8799fdd177ec986eadd</id>
<content type='text'>
- 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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix Historical Ratios blank render and Earnings History height cutoff</title>
<updated>2026-05-17T08:55:53Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-17T08:55:53Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=636086c5332b8aab5c1cc322bef1f3bb446a5add'/>
<id>urn:sha1:636086c5332b8aab5c1cc322bef1f3bb446a5add</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Redesign Valuation tab: Key Ratios, Models, Historical, Comps, Multiples</title>
<updated>2026-05-17T08:33:17Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-17T08:33:17Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=bb55d8be4a080e16227290333f667a5b39fa6575'/>
<id>urn:sha1:bb55d8be4a080e16227290333f667a5b39fa6575</id>
<content type='text'>
- 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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix valuation and data robustness bugs</title>
<updated>2026-05-16T07:02:32Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-16T07:02:32Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=0d888203cbc4dc596d0c05cedfeabe8785b263fc'/>
<id>urn:sha1:0d888203cbc4dc596d0c05cedfeabe8785b263fc</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Fix inner scrollbars on Forward Estimates, Analyst Targets, Earnings History tabs</title>
<updated>2026-05-16T01:45:17Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-16T01:45:17Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=fd1482b11c2d38a3c8aae52ae47d7709a2787399'/>
<id>urn:sha1:fd1482b11c2d38a3c8aae52ae47d7709a2787399</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Fix peer comparison track slider visual issues</title>
<updated>2026-05-15T08:54:17Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-15T08:54:17Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=b9df46b4776ba1195238fa47c82b92db18478294'/>
<id>urn:sha1:b9df46b4776ba1195238fa47c82b92db18478294</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Redesigned valuation tabs</title>
<updated>2026-05-15T08:42:37Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-15T08:42:37Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=a1015045ea0693664faf3ce1fe010e52be8af103'/>
<id>urn:sha1:a1015045ea0693664faf3ce1fe010e52be8af103</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Completely refreshed Key Ratios, Historical Ratios, and DCF/Multiples</title>
<updated>2026-05-14T08:01:02Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-14T08:01:02Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=764cd69bfc2e5a0cf504c8d6e4f032d35edd9a4c'/>
<id>urn:sha1:764cd69bfc2e5a0cf504c8d6e4f032d35edd9a4c</id>
<content type='text'>
tab.
</content>
</entry>
<entry>
<title>Move DCF sliders into left rail of canvas iframe</title>
<updated>2026-05-14T07:08:12Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-14T07:08:12Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=679baae2773dc7eaf419648ac7a59c4734fca735'/>
<id>urn:sha1:679baae2773dc7eaf419648ac7a59c4734fca735</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Make DCF sliders live — no page reruns on drag</title>
<updated>2026-05-14T07:00:45Z</updated>
<author>
<name>Tyler</name>
<email>tyler@tylerhoang.xyz</email>
</author>
<published>2026-05-14T07:00:45Z</published>
<link rel='alternate' type='text/html' href='https://git.tylerhoang.xyz/prism.git/commit/?id=1072357a6997ab273deb0cb383aa081aab448fe0'/>
<id>urn:sha1:1072357a6997ab273deb0cb383aa081aab448fe0</id>
<content type='text'>
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 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
