Commit Graph

257 Commits

Author SHA1 Message Date
Ahmet Guzererler 9ddf489c28 feat: add per-ticker progress logging to pipeline
Before this change, the pipeline showed a generic 'Analyzing...' spinner
for the entire multi-ticker run with no way to know which ticker was
processing or whether anything was actually working.

Changes:
- macro_bridge.py:
  - run_ticker_analysis: logs '▶ Starting', '✓ complete in Xs', '✗ FAILED'
    with elapsed time per ticker using logger.info/logger.error
  - run_all_tickers: replaced asyncio.gather (swallows all progress) with
    asyncio.as_completed + optional on_ticker_done(result, done, total)
    callback; uses asyncio.Semaphore for max_concurrent control
  - Added time and Callable imports

- cli/main.py run_pipeline:
  - Replaced Live(Spinner) with Rich Progress bar (spinner + bar + counter
    + elapsed time)
  - Prints '▷ Queued: TICKER' before analysis starts for each ticker
  - on_ticker_done callback prints '✓ TICKER (N/M, Xs elapsed) → decision'
    or '✗ TICKER failed ...' immediately as each ticker finishes
  - Prints total elapsed time when all tickers complete
2026-03-22 00:20:35 +01:00
Ahmet Guzererler eafdce3121 fix: harden dataflows layer against silent failures and data corruption
## Problem (Incident Post-mortem)

The pipeline was emitting hundreds of errors:
  'Invalid number of return arguments after parsing column name: Date'

Root cause: after _clean_dataframe() lowercases all columns, stockstats.wrap()
promotes 'date' to the DataFrame index. Subsequent df['Date'] access caused
stockstats to try parsing 'Date' as a technical indicator name.

## Fixes

### 1. Fix df['Date'] stockstats bug (already shipped in prior commit)
- stockstats_utils.py + y_finance.py: use df.index.strftime() instead of
  df['Date'] after wrap()

### 2. Extract _load_or_fetch_ohlcv() — single OHLCV authority
- Eliminates duplicated 30-line download+cache boilerplate in two places
- Cache filename is always derived from today's date — hardcoded stale date
  '2015-01-01-2025-03-25' in local mode is gone
- Corruption/truncation detection: files <50 rows or unparseable are deleted
  and re-fetched rather than silently returning bad data
- Drops on_bad_lines='skip' — malformed CSVs now raise instead of silently
  dropping rows that would distort indicator calculations

### 3. YFinanceError typed exception
- Defined in stockstats_utils.py; raised instead of print()+return ''
- get_stockstats_indicator now raises YFinanceError on failure so errors
  surface to callers rather than delivering empty strings to LLM agents
- interface.py route_to_vendor now catches YFinanceError alongside
  AlphaVantageError and FinnhubError — failures appear in observability
  telemetry and can trigger vendor fallback

### 4. Explicit date column discovery in alpha_vantage_common
- _filter_csv_by_date_range: replaced df.columns[0] positional assumption
  with explicit search for 'time'/'timestamp'/'date' column
- ValueError re-raised (not swallowed) so bad API response shape is visible

### 5. Structured logging
- Replaced all print() calls in changed files with logging.getLogger()
- Added logging import + logger to alpha_vantage_common

## Tests
- tests/unit/test_incident_fixes.py: 12 new unit tests covering all fixes
  (dynamic cache filename, corruption re-fetch, YFinanceError propagation,
  explicit column lookup, empty download raises)
- tests/integration/test_stockstats_live.py: 11 live tests against real
  yfinance API (all major indicators, weekend N/A, regression guard)
- All 70 tests pass (59 unit + 11 live integration)
2026-03-22 00:07:32 +01:00
ahmet guzererler d4a8ea38c1
Merge pull request #84 from aguzererler/copilot/standardize-env-variables
Standardize env/config loading: single entry point in `default_config.py`
2026-03-21 23:46:35 +01:00
copilot-swe-agent[bot] 4a3aa5ca3c refactor: centralize env loading in default_config.py; fix .env.example
Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
Agent-Logs-Url: https://github.com/aguzererler/TradingAgents/sessions/b62cf290-b389-45bf-b644-08b2360a1f76
2026-03-21 22:33:06 +00:00
Ahmet Guzererler 5ec87923e9 fix: allow .env variables to override DEFAULT_CONFIG values
Merged origin/main and resolved all 8 conflicting files:
- CLAUDE.md: merged MISTAKES.md ref + Project Tracking section + env override docs
- cli/main.py: kept top-level json import, kept try/except in run_pipeline
- tool_runner.py: kept descriptive comments for MAX_TOOL_ROUNDS
- alpha_vantage_common.py: kept thread-safe rate limiter, robust error handling
- interface.py: kept broader exception catch (AlphaVantageError + ConnectionError + TimeoutError)
- default_config.py: kept _env()/_env_int() env var overrides with load_dotenv() at module level
- scanner_graph.py: kept debug mode fix (stream for debug, invoke for result)
- macro_bridge.py: kept get_running_loop() over deprecated get_event_loop()

Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
2026-03-21 23:26:37 +01:00
ahmet guzererler 7cc47b6627
Merge pull request #83 from aguzererler/fix-unused-import-time-6733591745228634997
🧹 [remove unused import time in news_analyst.py]
2026-03-21 23:25:01 +01:00
copilot-swe-agent[bot] ac2230de11 Initial plan 2026-03-21 22:24:38 +00:00
google-labs-jules[bot] 049f03e7cd 🧹 remove unused import time in news_analyst.py
- Removed unused `import time` from `tradingagents/agents/analysts/news_analyst.py`
- Verified file syntax with `py_compile`
- Confirmed that the import was successfully removed

Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
2026-03-21 22:20:30 +00:00
ahmet guzererler 822b786fbe
Merge pull request #71 from aguzererler/perf-optimize-completed-reports-count-11317210005896921131
 [Performance] Optimize redundant iteration in get_completed_reports_count
2026-03-21 23:03:55 +01:00
ahmet guzererler e0b882ed75
Merge pull request #75 from aguzererler/optimize-sell-batching-17320376887335337420
 Batch database writes for portfolio SELL operations
2026-03-21 23:02:52 +01:00
ahmet guzererler 6aa7351d12
Merge pull request #74 from aguzererler/optimize-percentile-risk-metrics-3721557834418496366
 Optimize percentile calculation in risk metrics
2026-03-21 23:02:25 +01:00
ahmet guzererler 415ab75415
Merge pull request #73 from aguzererler/perf/optimize-team-filtering-5153644847450952095
 [optimize team filtering loop performance]
2026-03-21 23:01:11 +01:00
ahmet guzererler 28f35a54ed
Merge pull request #72 from aguzererler/fix-macro-bridge-concurrency-3956784745339794663
 Optimize synchronous API execution concurrency in macro_bridge.py
2026-03-21 22:58:14 +01:00
ahmet guzererler becac49192
Merge pull request #76 from aguzererler/perf-opt-df-cols-1934091478908671805
 Optimize DataFrame column lowercasing in stockstats_utils.py
2026-03-21 22:50:18 +01:00
google-labs-jules[bot] 1886391997 Optimize DataFrame column lowercasing in stockstats_utils.py
Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
2026-03-21 21:47:43 +00:00
ahmet guzererler 442b38dff4
Merge pull request #69 from aguzererler/copilot/review-financial-tools-implementation
Financial tools analysis doc and fix YoY revenue growth off-by-one
2026-03-21 22:41:55 +01:00
google-labs-jules[bot] 1ed46937d7 perf(portfolio): batch database writes during bulk SELL executions
Replaces the O(N) database operations in the `TradeExecutor`'s
`execute_decisions` SELL loop with a single `batch_remove_holdings`
call to the repository. The new repository method calculates updates
in memory, resolves duplicate operations on the same ticker, and issues
the updates via newly implemented `psycopg2.extras.execute_batch`
routines on the `SupabaseClient`.

Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
2026-03-21 20:06:45 +00:00
google-labs-jules[bot] e14d07ea81 perf(risk_metrics): optimize _percentile using heapq
Optimize the _percentile calculation to use heapq.nsmallest or heapq.nlargest when requesting small extreme percentiles (like 5% VaR) from large lists, falling back to sorted() only when necessary. This avoids fully sorting the entire array.

Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
2026-03-21 20:05:29 +00:00
google-labs-jules[bot] 6d7e7c2944 Optimize team filtering loop performance
Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
2026-03-21 19:59:02 +00:00
google-labs-jules[bot] c39e34c389 Optimize synchronous API execution inside async loop in macro_bridge.py
Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
2026-03-21 19:56:23 +00:00
google-labs-jules[bot] f30a42ccab perf: optimize redundant iteration in get_completed_reports_count
Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
2026-03-21 19:51:52 +00:00
ahmet guzererler 01b892041b
Merge pull request #43 from aguzererler/copilot/update-portfolio-management-flow
docs: align portfolio flow with implementation, add token estimates and CLI reference
2026-03-21 20:50:57 +01:00
copilot-swe-agent[bot] c4a7108a76 Address code review: add debug logging for unknown method resolution
Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
Agent-Logs-Url: https://github.com/aguzererler/TradingAgents/sessions/bb80e772-3e03-420e-bb0e-76cfdde14a04
2026-03-21 17:27:38 +00:00
copilot-swe-agent[bot] 92ebc13ce4 Add API consumption estimation module and CLI command
- New tradingagents/api_usage.py: Pre-run estimation of API calls per vendor
  for analyze, scan, and pipeline commands. Includes Alpha Vantage tier
  assessment (free: 25/day vs premium: 75/min).
- New CLI command: `estimate-api [analyze|scan|pipeline|all]`
- Enhanced observability: RunLogger.summary() now includes vendor_methods
  breakdown (vendor → method → call count)
- Enhanced CLI output: All 3 command summaries (analyze, scan, pipeline)
  now show per-vendor breakdown and Alpha Vantage assessment after runs
- 32 new tests in tests/unit/test_api_usage.py

Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
Agent-Logs-Url: https://github.com/aguzererler/TradingAgents/sessions/bb80e772-3e03-420e-bb0e-76cfdde14a04
2026-03-21 17:25:26 +00:00
copilot-swe-agent[bot] a8ccff31a0 Add YoY edge case tests for 5 and 4 quarter scenarios
Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
Agent-Logs-Url: https://github.com/aguzererler/TradingAgents/sessions/b594017b-ed84-4786-9b81-200a78eb5d76
2026-03-21 16:59:03 +00:00
copilot-swe-agent[bot] 3d76acf17d Add financial tools analysis doc and fix YoY revenue growth bug in TTM analysis
- Create docs/FINANCIAL_TOOLS_ANALYSIS.md with comprehensive 4-point analysis:
  1. Implementation accuracy review for all indicators and metrics
  2. Library assessment (stockstats vs TA-Lib vs pandas-ta)
  3. Alpha Vantage debate (local calc vs API-fetched)
  4. Data flow & API mapping for every financial tool
- Fix off-by-one in ttm_analysis.py: YoY revenue used quarterly[-4]
  (3 quarters back) instead of quarterly[-5] (4 quarters = 1 year back)
- Add test_revenue_yoy_is_four_quarters_back test to validate the fix

Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
Agent-Logs-Url: https://github.com/aguzererler/TradingAgents/sessions/b594017b-ed84-4786-9b81-200a78eb5d76
2026-03-21 16:57:21 +00:00
ahmet guzererler a7b8c996f2
Merge pull request #70 from aguzererler/fix/resolve-prs-56-58-60-4650038896702716891
🧪 Resolve PRs #56, #58, and #60
2026-03-21 17:54:10 +01:00
google-labs-jules[bot] c8465af163 🧪 Resolve PRs #56, #58, and #60
- Added edge case test for `_find_col` in `tests/unit/test_ttm_analysis.py` (from PR #56).
- Enhanced `_clean_dataframe` in `tradingagents/dataflows/stockstats_utils.py` to parse dates, drop invalid rows, fill price gaps, and lowercase columns (combining PRs #58 and #60).
- Expanded the test suite in `tests/unit/test_stockstats_utils.py` to cover the new `_clean_dataframe` functionality.

Co-authored-by: aguzererler <6199053+aguzererler@users.noreply.github.com>
2026-03-21 16:51:49 +00:00
copilot-swe-agent[bot] 5f3fbd5abd Initial plan 2026-03-21 16:47:43 +00:00
ahmet guzererler 68df103ee9
Merge pull request #52 from aguzererler/fix/remove-unused-import-interface-7009076599669968401
🧹 Remove unused Annotated import from interface.py
2026-03-21 17:37:18 +01:00
ahmet guzererler 9ef73577f3
Merge pull request #53 from aguzererler/jules-12150822204137850232-2d21567f
🧹 Remove unused import 'Path' from trading_graph.py
2026-03-21 17:36:57 +01:00
ahmet guzererler 2ec8a17216
Merge pull request #54 from aguzererler/test-macro-regime-fmt-pct-18208719821293052000
🧪 Add tests for `_fmt_pct` in macro regime
2026-03-21 17:36:20 +01:00
ahmet guzererler 7b9510a99b
Merge pull request #61 from aguzererler/fix/agent-utils-unused-imports-948671579039994874
🧹 fix: remove unused imports from agent_utils.py
2026-03-21 17:35:19 +01:00
ahmet guzererler 86a0f5d9b7
Merge pull request #59 from aguzererler/testing/industry-deep-dive-parsing-12762969703991793840
🧪 test: add tests and parsing logic for text formats in _extract_top_sectors
2026-03-21 17:34:47 +01:00
ahmet guzererler a42676d8b6
Merge pull request #57 from aguzererler/remove-unused-imports-alpha-vantage-5385473624944698804
🧹 [Code Health] Remove unused imports in alpha_vantage.py
2026-03-21 17:33:57 +01:00
ahmet guzererler ae83ce74fa
Merge pull request #55 from aguzererler/fix/refactor-alpha-vantage-indicator-4324081028548110342
🧹 Refactor long `get_indicator` function to improve maintainability
2026-03-21 17:32:31 +01:00
ahmet guzererler cce5755b30
Merge pull request #62 from aguzererler/test-stockstats-utils-15966200471023157106
🧪 [testing improvement] Add unit tests for _clean_dataframe in stockstats_utils
2026-03-21 17:29:41 +01:00
ahmet guzererler 4747d98cb3
Merge pull request #63 from aguzererler/fix/macro-regime-refactor-299016324797440021
🧹 Refactor classify_macro_regime to improve readability
2026-03-21 17:29:23 +01:00
ahmet guzererler e5be3f4676
Merge pull request #64 from aguzererler/perf/lazy-load-portfolio-snapshot-8090947574151242031
 [performance] Lazy Load JSON Parsing for PortfolioSnapshot Holdings
2026-03-21 17:28:43 +01:00
ahmet guzererler b0424a36d7
Merge pull request #66 from aguzererler/jules-17548469684748509551-99819dec
🧪 [Fix Finnhub API error handling and add coverage]
2026-03-21 17:27:49 +01:00
ahmet guzererler 0dc6236e20
Merge pull request #67 from aguzererler/testing/cli-extract-content-string-6775172434327225745
🧪 [Testing Improvement] Add tests for `extract_content_string` in `cli/main.py`
2026-03-21 17:27:21 +01:00
ahmet guzererler f2ec1bd6aa
Merge pull request #51 from aguzererler/test-vix-trend-short-history-13411679154947690802
🧪 [testing improvement] Add missing edge case test for short history in _signal_vix_trend
2026-03-21 17:26:42 +01:00
ahmet guzererler 5c91aa8bb3
Merge pull request #50 from aguzererler/test-ttm-analysis-find-col-8347777247783205733
🧪 Add unit tests for _find_col in ttm_analysis
2026-03-21 17:26:22 +01:00
ahmet guzererler e5dcfb0e25
Merge pull request #49 from aguzererler/test-extract-article-data-17131555993247333235
🧪 Improve test coverage for `_extract_article_data`
2026-03-21 17:25:19 +01:00
ahmet guzererler e292c833ce
Merge pull request #48 from aguzererler/fix/unused-typing-imports-8765363568869734056
🧹 Remove unused imports in trading_graph.py
2026-03-21 17:24:14 +01:00
ahmet guzererler 319feac087
Merge pull request #65 from aguzererler/testing-macro-regime-edge-cases-7674628334263228754
🧪 Fix VIX trend logic and add extensive tests for macro regime short history edge cases
2026-03-21 17:23:38 +01:00
ahmet guzererler 0313cc629e
Merge pull request #47 from aguzererler/fix/test-config-sum-constraints-edge-case-6454385375638160819
🧪 test: add edge case for portfolio config sum constraints
2026-03-21 17:20:25 +01:00
ahmet guzererler e877f298bb
Merge pull request #46 from aguzererler/fix-unused-import-finnhub-scanner-619852487739765853
🧹 remove unused import _make_api_request from finnhub_scanner.py
2026-03-21 17:20:03 +01:00
ahmet guzererler 5d600480ce
Merge pull request #45 from aguzererler/code-health/risk-manager-unused-import-1634631888147245992
🧹 Remove unused imports and variables in risk manager
2026-03-21 17:18:31 +01:00
ahmet guzererler 1e10b4ca96
Merge pull request #44 from aguzererler/fix/unused-import-finnhub-stock-10302219538878494092
🧹 Remove unused pandas import from finnhub_stock.py
2026-03-21 17:18:10 +01:00