aboutsummaryrefslogtreecommitdiff
path: root/components/financials.py
diff options
context:
space:
mode:
authorTyler <tyler@tylerhoang.xyz>2026-03-30 18:19:50 -0700
committerTyler <tyler@tylerhoang.xyz>2026-03-30 18:19:50 -0700
commitf6b21398b8d9d13fa707955852f4e73158d7db19 (patch)
tree7dd49e0f483b2bda9ff4b5db0f10df3a5eef06ca /components/financials.py
parentfde921603425de36c6cbf583f1ec0e2f2ce034cb (diff)
Add score card, 52W range bar, short interest, options tab, CSV exports
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>
Diffstat (limited to 'components/financials.py')
-rw-r--r--components/financials.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/components/financials.py b/components/financials.py
index 828f256..9078770 100644
--- a/components/financials.py
+++ b/components/financials.py
@@ -116,6 +116,13 @@ def render_financials(ticker: str):
else:
display, colors = _build_statement(df)
st.dataframe(_style(display, colors), use_container_width=True)
+ st.download_button(
+ "Download CSV",
+ df.to_csv().encode(),
+ file_name=f"{ticker.upper()}_income_{'quarterly' if quarterly else 'annual'}.csv",
+ mime="text/csv",
+ key=f"dl_income_{ticker}_{quarterly}",
+ )
with tab_balance:
df = get_balance_sheet(ticker, quarterly=quarterly)
@@ -124,6 +131,13 @@ def render_financials(ticker: str):
else:
display, colors = _build_statement(df)
st.dataframe(_style(display, colors), use_container_width=True)
+ st.download_button(
+ "Download CSV",
+ df.to_csv().encode(),
+ file_name=f"{ticker.upper()}_balance_{'quarterly' if quarterly else 'annual'}.csv",
+ mime="text/csv",
+ key=f"dl_balance_{ticker}_{quarterly}",
+ )
with tab_cashflow:
df = get_cash_flow(ticker, quarterly=quarterly)
@@ -132,3 +146,10 @@ def render_financials(ticker: str):
else:
display, colors = _build_statement(df)
st.dataframe(_style(display, colors), use_container_width=True)
+ st.download_button(
+ "Download CSV",
+ df.to_csv().encode(),
+ file_name=f"{ticker.upper()}_cashflow_{'quarterly' if quarterly else 'annual'}.csv",
+ mime="text/csv",
+ key=f"dl_cashflow_{ticker}_{quarterly}",
+ )