{"record":{"id":"b6be893a5c424343","repo":"TauricResearch/TradingAgents","slug":"no-income-statement-data","errorCode":null,"errorMessage":"no income statement data","messagePattern":"no income statement data","errorType":"exception","errorClass":"NoMarketDataError","httpStatus":null,"severity":"error","filePath":"tradingagents/dataflows/y_finance.py","lineNumber":429,"sourceCode":"def get_income_statement(\n    ticker: Annotated[str, \"ticker symbol of the company\"],\n    freq: Annotated[str, \"frequency of data: 'annual' or 'quarterly'\"] = \"quarterly\",\n    curr_date: Annotated[str, \"current date in YYYY-MM-DD format\"] = None\n):\n    \"\"\"Get income statement data from yfinance.\"\"\"\n    canonical = normalize_symbol(ticker)\n    try:\n        ticker_obj = yf.Ticker(canonical)\n\n        if freq.lower() == \"quarterly\":\n            data = yf_retry(lambda: ticker_obj.quarterly_income_stmt)\n        else:\n            data = yf_retry(lambda: ticker_obj.income_stmt)\n\n        data = filter_financials_by_date(data, curr_date)\n\n        if data.empty:\n            raise NoMarketDataError(ticker, canonical, \"no income statement data\")\n\n        # Convert to CSV string for consistency with other functions\n        csv_string = data.to_csv()\n\n        # Add header information\n        header = f\"# Income Statement data for {canonical} ({freq})\\n\"\n        header += f\"# Data retrieved on: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\\n\\n\"\n\n        return header + csv_string\n\n    except NoMarketDataError:\n        raise\n    except Exception as e:\n        return f\"Error retrieving income statement for {ticker}: {str(e)}\"\n\n\ndef get_insider_transactions(\n    ticker: Annotated[str, \"ticker symbol of the company\"]","sourceCodeStart":411,"sourceCodeEnd":447,"githubUrl":"https://github.com/TauricResearch/TradingAgents/blob/a33fd4c0f134485a43553a2c23a63cb14adbd88f/tradingagents/dataflows/y_finance.py#L411-L447","documentation":"NoMarketDataError raised by get_income_statement (y_finance.py) when the date-filtered income-statement frame is empty. Identical guard to the balance-sheet/cash-flow getters: unknown symbol, or curr_date earlier than the first statement period, so filter_financials_by_date produces an empty frame.","triggerScenarios":"Calling get_income_statement(ticker, freq, curr_date) with a symbol lacking income statements on Yahoo, or a curr_date before the earliest filing; requesting 'quarterly' when only annual data exists.","commonSituations":"Backtests reaching before the company's first annual report, young companies, foreign listings with sparse Yahoo coverage, delisted symbols.","solutions":["Move curr_date forward to a period where statements exist (or use today).","Fall back to freq='yearly' when quarterly statements are missing.","Catch NoMarketDataError and mark income-statement analysis unavailable."],"exampleFix":"# before\ninc = get_income_statement('FOOBAR', 'quarterly', '2012-06-01')\n\n# after\nfrom tradingagents.dataflows.errors import NoMarketDataError\ntry:\n    inc = get_income_statement('FOOBAR', 'quarterly', '2012-06-01')\nexcept NoMarketDataError:\n    inc = get_income_statement('FOOBAR', 'yearly', '2012-12-31')  # or None","handlingStrategy":"try-catch","validationCode":"import yfinance as yf\n\ndef has_income_stmt(symbol: str, freq: str = 'yearly') -> bool:\n    obj = yf.Ticker(symbol)\n    frame = obj.quarterly_income_stmt if freq == 'quarterly' else obj.income_stmt\n    return frame is not None and not frame.empty","typeGuard":null,"tryCatchPattern":"from tradingagents.dataflows.errors import NoMarketDataError\n\ntry:\n    inc = get_income_statement(symbol, freq, curr_date)\nexcept NoMarketDataError:\n    inc = None  # or try yearly freq / later curr_date","preventionTips":["Check symbol statement history before backtesting old dates.","Use yearly frequency for young companies.","Centralize NoMarketDataError handling in the fundamentals analyst step."],"tags":["market-data","yfinance","income-statement","financials"],"backgroundTag":null,"analyzedSha":"a33fd4c0f134485a43553a2c23a63cb14adbd88f","analyzedAt":"2026-08-14T19:45:16.920Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}