SYMBOL INDEX (156 symbols across 17 files) FILE: src/config_loader.py function _parse_bool (line 25) | def _parse_bool(value, default=False) -> bool: function load_config (line 38) | def load_config() -> dict: function validate_config (line 89) | def validate_config(cfg: dict) -> bool: FILE: src/data_validator.py class DataValidationResult (line 22) | class DataValidationResult: function _to_float (line 30) | def _to_float(value: Any, default=None): function validate_ohlcv_history (line 39) | def validate_ohlcv_history(closes: list, volumes: list | None = None, function detect_unexplained_price_spike (line 89) | def detect_unexplained_price_spike(price: float, closes: list, news_sign... function realized_volatility (line 117) | def realized_volatility(closes: list, lookback: int = 20) -> float | None: function data_flags_to_text (line 129) | def data_flags_to_text(*results: DataValidationResult | None) -> str: FILE: src/event_study.py function fetch_rows (line 25) | def fetch_rows(selected_only: bool = False): function _bucket_ev (line 49) | def _bucket_ev(ev_pct): function _bucket_ivrv (line 65) | def _bucket_ivrv(iv_to_rv): function _bucket_iv_rank (line 82) | def _bucket_iv_rank(iv_rank, iv_history_count): function _group_key (line 101) | def _group_key(row, group: str): function summarize (line 122) | def summarize(rows, group: str = "base"): function write_csv (line 145) | def write_csv(rows, path: Path): function main (line 157) | def main(): FILE: src/finbert_sentiment.py function is_finbert_enabled (line 36) | def is_finbert_enabled() -> bool: function get_finbert_status (line 42) | def get_finbert_status() -> dict[str, Any]: function _parse_device (line 54) | def _parse_device() -> int: function _load_model (line 63) | def _load_model(): function _flatten_pipeline_result (line 126) | def _flatten_pipeline_result(result: Any) -> list[dict[str, Any]]: function _score_from_label_rows (line 151) | def _score_from_label_rows(rows: Iterable[dict[str, Any]]) -> float: function get_finbert_sentiment (line 186) | def get_finbert_sentiment(text: str) -> float: function get_finbert_sentiment_batch (line 204) | def get_finbert_sentiment_batch(texts: list[str]) -> list[float]: FILE: src/llm_schema.py class TickerSignal (line 24) | class TickerSignal(BaseModel): method normalize_ticker (line 35) | def normalize_ticker(cls, value: Any) -> str: method to_wire (line 38) | def to_wire(self) -> str: class SignalEnvelope (line 42) | class SignalEnvelope(BaseModel): method to_wire (line 46) | def to_wire(self) -> str: function validate_ticker_signal_line (line 52) | def validate_ticker_signal_line(raw_line: str, max_tickers: int = 5) -> ... class ReportReasonDetail (line 116) | class ReportReasonDetail(BaseModel): class TickerTableRow (line 125) | class TickerTableRow(BaseModel): method normalize_ticker (line 147) | def normalize_ticker(cls, value: Any) -> str: class ReportPayload (line 151) | class ReportPayload(BaseModel): method normalize_optional_ticker (line 198) | def normalize_optional_ticker(cls, value: Any) -> str | None: method normalize_direction (line 205) | def normalize_direction(cls, value: Any) -> str | None: method validate_trade_payload (line 211) | def validate_trade_payload(self) -> "ReportPayload": function validate_report_payload (line 240) | def validate_report_payload(data: dict[str, Any]) -> tuple[dict[str, Any... function build_cancelled_report (line 250) | def build_cancelled_report(reason: str, raw: str | None = None) -> dict[... FILE: src/main.py function setup_logging (line 25) | def setup_logging(verbose: bool) -> None: function _no_trade_html (line 38) | def _no_trade_html(today: str, vix=None, market_status: str = "", function _error_html (line 66) | def _error_html(error: str, today: str) -> str: function _send_or_save (line 70) | def _send_or_save(html: str, subject: str, cfg: dict, dry_run: bool) -> ... function _enrich_market_data_with_cluster_context (line 79) | def _enrich_market_data_with_cluster_context(market_data: list, clusters... function main (line 91) | def main() -> int: FILE: src/market_calendar.py function now_et (line 17) | def now_et() -> datetime: function _status_from_et (line 21) | def _status_from_et(dt: datetime) -> str: function market_status (line 34) | def market_status(dt: datetime | None = None) -> str: function market_context (line 57) | def market_context(dt: datetime | None = None) -> tuple[str, str]: function market_elapsed_fraction (line 63) | def market_elapsed_fraction(dt: datetime | None = None) -> float | None: FILE: src/market_data.py function robust_get (line 51) | def robust_get(url, params=None, headers=None, timeouts=(6, 8, 10)): function get_quote_tradier (line 69) | def get_quote_tradier(symbol, tradier_token, sandbox=False): function get_quote_alphavantage (line 99) | def get_quote_alphavantage(symbol, api_key): function get_history_alphavantage (line 126) | def get_history_alphavantage(symbol, api_key): function get_quote_yahoo_v8 (line 146) | def get_quote_yahoo_v8(symbol): function get_quote_finnhub (line 172) | def get_quote_finnhub(symbol, api_key): function get_quote (line 192) | def get_quote(symbol, cfg): function get_history (line 207) | def get_history(symbol, cfg): function get_sentiment (line 234) | def get_sentiment(symbol, change_pct, finnhub_key): function classify_sentiment_price_reaction (line 255) | def classify_sentiment_price_reaction(direction: str, bullish: float, be... function get_vix (line 291) | def get_vix(): function get_earnings (line 310) | def get_earnings(start, end, finnhub_key): function calc_realized_volatility (line 326) | def calc_realized_volatility(closes: list, lookback: int = 20) -> float ... function estimate_expected_move_pct (line 340) | def estimate_expected_move_pct(price: float, change_pct: float, rel_vol, function _safe_float (line 359) | def _safe_float(value, default=0.0) -> float: function evaluate_option_ev (line 368) | def evaluate_option_ev(option: dict, direction: str, underlying_price: f... function enrich_with_journal_iv_rank (line 507) | def enrich_with_journal_iv_rank(symbol: str, option_ev: dict) -> dict: function get_tradier_options (line 559) | def get_tradier_options(symbol, direction, tradier_token, function calc_ma (line 653) | def calc_ma(values, period): function calc_rel_volume (line 659) | def calc_rel_volume(volumes): function validate_gap_and_go (line 671) | def validate_gap_and_go(price: float, change_pct: float, volumes: list, ... function calculate_score (line 726) | def calculate_score(price, change_pct, above_ma50, ma20, function process_ticker (line 764) | def process_ticker(ticker, direction, earnings_list, cfg, target_dte: in... function build_summary (line 990) | def build_summary(ranked, vix_value, ticker_directions, FILE: src/news_analyzer.py function _score_catalyst (line 116) | def _score_catalyst(event_type: str, base_conf: float = 5.0) -> float: function _resolve_sec_filing (line 126) | def _resolve_sec_filing(article: dict, cik_map: dict) -> Optional[Tuple[... function cluster_articles (line 165) | def cluster_articles(articles: List[Dict], earnings_map: Dict) -> List[D... function run_claude (line 175) | def run_claude(cluster_text: str, market_time: str, market_status: str, ... function get_market_context (line 218) | def get_market_context() -> tuple: FILE: src/news_utils.py function canonicalize_url (line 17) | def canonicalize_url(url: str) -> str: function normalize_title (line 43) | def normalize_title(title: str) -> str: function article_fingerprint (line 50) | def article_fingerprint(title: str, link: str = "", summary: str = "") -... function near_duplicate_key (line 59) | def near_duplicate_key(title: str) -> str: FILE: src/report_generator.py function repair_json_quotes (line 114) | def repair_json_quotes(text: str) -> str: function close_fragment (line 141) | def close_fragment(frag: str) -> str: function extract_json_fragment (line 168) | def extract_json_fragment(text: str) -> str: function _compress_summary (line 183) | def _compress_summary(summary: str) -> str: function call_claude (line 202) | def call_claude(summary: str, api_key: str, vix_direct=None) -> dict: function build_html (line 280) | def build_html(d: dict, today: str) -> str: function send_email (line 535) | def send_email(subject: str, html_content: str, cfg: dict) -> bool: FILE: src/rules.py class TradingRules (line 17) | class TradingRules: method evaluate_trade (line 98) | def evaluate_trade(self, ticker_info: dict, market_metrics: dict, news... method calculate_position_size (line 121) | def calculate_position_size(self, confidence_score: float, account_val... function _to_float (line 139) | def _to_float(value: Any, default=None): function merge_reasons (line 148) | def merge_reasons(*parts: Any) -> str: function conservative_entry_price (line 171) | def conservative_entry_price(options_data: dict) -> float | None: function exit_slippage_points (line 188) | def exit_slippage_points(options_data: dict) -> float: function estimate_fill_probability (line 208) | def estimate_fill_probability(options_data: dict) -> float: function check_data_quality (line 224) | def check_data_quality(market_data: dict, options_data: dict) -> tuple[b... function check_liquidity (line 244) | def check_liquidity(options_data: dict) -> tuple[bool, str]: function check_earnings_iv_gate (line 288) | def check_earnings_iv_gate(options_data: dict, earnings_soon: bool) -> t... function build_time_stop_plan (line 306) | def build_time_stop_plan(direction: str, dte_actual: int | None) -> dict: function apply_vix_rules (line 335) | def apply_vix_rules(vix_direct, claude_output: dict) -> dict: function validate_claude_output (line 397) | def validate_claude_output(data: dict) -> tuple: function parse_ticker_signals (line 430) | def parse_ticker_signals(raw: str) -> list: FILE: src/sec_check.py function _headers (line 258) | def _headers() -> dict: function _archive_headers (line 268) | def _archive_headers() -> dict: function _get_json (line 276) | def _get_json(url: str) -> Any: function _get_text (line 282) | def _get_text(url: str) -> str: function _load_sec_raw_tickers (line 288) | def _load_sec_raw_tickers() -> dict: function _load_ticker_map (line 304) | def _load_ticker_map() -> dict[str, int]: function _filing_url (line 313) | def _filing_url(cik: int, accession: str, primary_doc: str) -> str: function _recent_filings (line 319) | def _recent_filings(cik: int) -> list[dict]: function _within_days (line 331) | def _within_days(date_str: str, days_back: int) -> bool: function _xml_text (line 339) | def _xml_text(root: ET.Element, tag: str) -> str: function _iter_form4_transactions (line 347) | def _iter_form4_transactions(xml_text: str) -> list[dict]: function _classify_form4 (line 378) | def _classify_form4(text: str) -> list[dict]: function _classify_8k (line 420) | def _classify_8k(text: str, filing: dict) -> list[dict]: function get_sec_signal (line 434) | def get_sec_signal(ticker: str, days_back: int = 14) -> dict: function _normalize_company_name (line 502) | def _normalize_company_name(name: str) -> str: function get_company_name_to_ticker (line 520) | def get_company_name_to_ticker() -> dict[str, str]: function get_cik_to_ticker_map (line 561) | def get_cik_to_ticker_map() -> dict[int, str]: FILE: src/sector_map.py class SectorFilterResult (line 96) | class SectorFilterResult: function _quote_change (line 111) | def _quote_change(symbol: str, cfg: dict, quote_fn: Callable[[str, dict]... function sector_for_ticker (line 122) | def sector_for_ticker(ticker: str) -> tuple[str, str]: function evaluate_sector_filter (line 131) | def evaluate_sector_filter(ticker: str, direction: str, stock_change_pct... FILE: src/simple_journal.py class TradingJournal (line 13) | class TradingJournal: method __init__ (line 16) | def __init__(self): method start_run (line 19) | def start_run(self): method log_signals (line 24) | def log_signals(self, parsed_signals, market_data, clusters=None): method log_decision (line 30) | def log_decision(self, result: dict): method update_outcomes (line 36) | def update_outcomes(self, cfg): method get_iv_stats (line 40) | def get_iv_stats(self, ticker: str, current_iv: float | None = None): method get_run_id (line 44) | def get_run_id(self): FILE: src/trading_journal.py function utc_now (line 37) | def utc_now() -> datetime: function iso (line 41) | def iso(dt: datetime | None = None) -> str: function _json (line 45) | def _json(obj: Any) -> str: function connect (line 49) | def connect(db_path: Path = DB_PATH) -> sqlite3.Connection: function init_db (line 59) | def init_db(con: sqlite3.Connection) -> None: function _ensure_columns (line 223) | def _ensure_columns(con: sqlite3.Connection, table: str, columns: dict[s... function create_run (line 230) | def create_run(market_status: str = "", vix: Any = None, raw_ticker_sign... function update_run_context (line 249) | def update_run_context(run_id: int, market_status: str = "", vix: Any = ... function _cluster_for_ticker (line 270) | def _cluster_for_ticker(clusters: list[dict], ticker: str) -> dict: function _parsed_signal_for_ticker (line 277) | def _parsed_signal_for_ticker(parsed_signals: list[dict], ticker: str) -... function log_market_signals (line 284) | def log_market_signals(run_id: int, parsed_signals: list[dict], market_d... function log_final_decision (line 380) | def log_final_decision(run_id: int, result: dict) -> None: function _as_float (line 406) | def _as_float(value: Any) -> float | None: function _record_iv_snapshot (line 415) | def _record_iv_snapshot(con: sqlite3.Connection, run_id: int, signal_id:... function get_iv_stats (line 437) | def get_iv_stats(ticker: str, current_iv: float | None, min_samples: int... function update_due_outcomes (line 488) | def update_due_outcomes(cfg: dict, max_updates: int = 50) -> int: FILE: src/universe.py function _is_cache_fresh (line 36) | def _is_cache_fresh(path: Path) -> bool: function _download_text (line 43) | def _download_text(url: str) -> str: function _parse_pipe_table (line 49) | def _parse_pipe_table(text: str, symbol_field: str) -> set[str]: function refresh_universe (line 71) | def refresh_universe() -> set[str]: function get_known_tickers (line 89) | def get_known_tickers(fallback: set[str] | None = None) -> set[str]: