""" Signals page — today's recommendation cards with rich visual indicators. Each signal is displayed as a data-dense card with strategy badges, confidence bars, and expandable thesis sections. """ from datetime import datetime import pandas as pd import plotly.express as px import streamlit as st from tradingagents.ui.theme import COLORS, get_plotly_template, page_header, signal_card from tradingagents.ui.utils import load_recommendations @st.cache_data(ttl=3600) def _load_price_history(ticker: str, period: str) -> pd.DataFrame: try: from tradingagents.dataflows.y_finance import download_history except Exception: return pd.DataFrame() data = download_history( ticker, period=period, interval="1d", auto_adjust=True, progress=False, ) if data is None or data.empty: return pd.DataFrame() if isinstance(data.columns, pd.MultiIndex): tickers = data.columns.get_level_values(1).unique() target = ticker if ticker in tickers else tickers[0] data = data.xs(target, level=1, axis=1).copy() data = data.reset_index() date_col = "Date" if "Date" in data.columns else data.columns[0] close_col = "Close" if "Close" in data.columns else "Adj Close" if close_col not in data.columns: return pd.DataFrame() return data[[date_col, close_col]].rename(columns={date_col: "date", close_col: "close"}) def render(): today = datetime.now().strftime("%Y-%m-%d") recommendations, meta = load_recommendations(today, return_meta=True) display_date = meta.get("date", today) if meta else today st.markdown( page_header("Signals", f"Recommendations for {display_date}"), unsafe_allow_html=True, ) if not recommendations: st.warning(f"No recommendations for {today}.") return if meta.get("is_fallback") and meta.get("date"): st.info(f"Showing latest signals from **{meta['date']}** (none for today).") # ---- Controls row ---- ctrl_cols = st.columns([1, 1, 1, 1]) with ctrl_cols[0]: pipelines = sorted( set( (r.get("pipeline") or r.get("strategy_match") or "unknown") for r in recommendations ) ) pipeline_filter = st.multiselect("Strategy", pipelines, default=pipelines) with ctrl_cols[1]: min_confidence = st.slider("Min Confidence", 1, 10, 1) with ctrl_cols[2]: min_score = st.slider("Min Score", 0, 100, 0) with ctrl_cols[3]: show_charts = st.checkbox("Price Charts", value=False) if show_charts: chart_window = st.selectbox("Window", ["1mo", "3mo", "6mo", "1y"], index=1) else: chart_window = "3mo" # Apply filters filtered = [ r for r in recommendations if (r.get("pipeline") or r.get("strategy_match") or "unknown") in pipeline_filter and r.get("confidence", 0) >= min_confidence and r.get("final_score", 0) >= min_score ] # ---- Summary bar ---- st.markdown( f"""