24 KiB
Changelog
All notable changes to TradingAgents will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
-
Trade model for execution history with CGT tracking (Issue #6: DB-5)
- Trade model with BUY/SELL sides and execution status tracking (PENDING, FILLED, PARTIAL, CANCELLED, REJECTED) file:tradingagents/api/models/trade.py
- TradeSide, TradeStatus, TradeOrderType enums for type-safe trade operations file:tradingagents/api/models/trade.py:86-137
- Order type support (MARKET, LIMIT, STOP, STOP_LIMIT) with signal source and confidence tracking
- Capital Gains Tax (CGT) support for Australian tax compliance file:tradingagents/api/models/trade.py:201-305
- 50% CGT discount eligibility for holdings >12 months (cgt_discount_eligible field)
- Australian financial year (FY) calculation (July-June) via tax_year property file:tradingagents/api/models/trade.py:418-441
- CGT gain/loss tracking with gross_gain, gross_loss, and net_gain after discount
- Multi-currency support with FX rate to AUD conversion file:tradingagents/api/models/trade.py:306-325
- High-precision decimal arithmetic (19,4) for monetary values and (19,8) for FX rates
- Automatic acquisition_date and timestamp management via default values and validators
- Check constraints for positive values (quantity, price, total_value, fx_rate_to_aud)
- Signal confidence validation (0-100 range) and holding period non-negative constraint
- Many-to-one relationship with Portfolio model with cascade delete behavior file:tradingagents/api/models/portfolio.py:202-205
- Properties for convenient trade type checking (is_buy, is_sell, is_filled) file:tradingagents/api/models/trade.py:443-475
- Comprehensive validators for enum normalization (side, status, order_type) and symbol/currency normalization file:tradingagents/api/models/trade.py:477-585
- Event listener validation (before_flush) for cross-field business rule enforcement file:tradingagents/api/models/trade.py:596-665
- Composite indexes for efficient queries: (portfolio_id, symbol) and (portfolio_id, side) and (status, executed_at)
- Database migration 005_add_trade_model.py with comprehensive schema definition file:migrations/versions/005_add_trade_model.py
- Migration with proper upgrade and downgrade functions for reversible schema changes
- Comprehensive unit test suite covering field validation, defaults, constraints, enums, and CGT calculations file:tests/unit/api/test_trade_model.py (2054 lines, 65 tests)
- Integration test suite for relationships, cascade delete, and concurrent operations file:tests/integration/api/test_trade_integration.py (1235 lines, 22 tests)
- Comprehensive docstrings with examples for all Trade model methods and fields
- Total: 87 tests added for Trade model feature
-
FastAPI backend with JWT authentication and strategies CRUD (Issue #48)
- FastAPI application with async/await support and health check endpoints file:tradingagents/api/main.py
- JWT authentication with asymmetric RS256 signing algorithm file:tradingagents/api/services/auth_service.py
- Argon2 password hashing with automatic salt generation for secure credential storage
- POST /api/v1/auth/login endpoint with username/password authentication returning JWT tokens
- GET /api/v1/strategies endpoint with pagination, user isolation, and permission-based access control
- POST /api/v1/strategies endpoint for creating new strategies with JSON parameters support
- GET /api/v1/strategies/{id} endpoint for retrieving individual strategies with authorization checks
- PUT /api/v1/strategies/{id} endpoint for updating strategy metadata and parameters
- DELETE /api/v1/strategies/{id} endpoint for removing strategies with proper cascade behavior
- SQLAlchemy ORM with async PostgreSQL/SQLite support file:tradingagents/api/models/
- User model with hashed passwords, email uniqueness, and active status tracking file:tradingagents/api/models/user.py
- Strategy model with JSON parameters, description, user association, and active/inactive toggling file:tradingagents/api/models/strategy.py
- Alembic migration system with version control for database schema changes file:migrations/
- Initial migration creating users and strategies tables with proper constraints file:migrations/versions/
- Database configuration with environment variable support (DATABASE_URL, SQLALCHEMY_ECHO) file:tradingagents/api/config.py
- Pydantic schemas for request validation and response serialization file:tradingagents/api/schemas/
- CORS middleware configuration with environment-based allowed origins
- Error handling middleware with consistent JSON error responses and proper HTTP status codes
- Request logging middleware with sanitized credential exclusion and request ID tracking
- Comprehensive test suite with 208 tests covering authentication, strategies CRUD, models, migrations, middleware, and configuration file:tests/api/
- API-focused fixtures with async SQLAlchemy session, FastAPI test client, and test user/strategy data file:tests/api/conftest.py
- Security tests covering SQL injection prevention, XSS payload handling, JWT tampering detection, and rate limiting
- Integration tests for endpoint authorization, user isolation, pagination, and cascade operations
- Migration tests validating schema constraints, rollback behavior, and Alembic configuration
- New dependencies in pyproject.toml: fastapi, uvicorn, sqlalchemy, alembic, pydantic-settings, passlib, argon2-cffi, python-multipart, python-jose, cryptography
- API documentation generated from FastAPI OpenAPI schema (available at /docs and /redoc)
-
User model enhancement with profile and API key management (Issue #3)
- Extended User model with tax_jurisdiction and timezone fields file:tradingagents/api/models/user.py:47-54
- Tax jurisdiction field supporting country (e.g., "US", "AU") and state/province level codes (e.g., "US-CA", "AU-NSW")
- IANA timezone identifier field (e.g., "America/New_York", "Australia/Sydney") with automatic validation
- Email verification status tracking via is_verified boolean field file:tradingagents/api/models/user.py:60-64
- Secure API key management with bcrypt hashing and unique constraints file:tradingagents/api/models/user.py:55-59
- API key service module with generate_api_key(), hash_api_key(), and verify_api_key() functions file:tradingagents/api/services/api_key_service.py
- API key generation using secrets.token_urlsafe() with 256-bit entropy and 'ta_' prefix
- Bcrypt-based API key hashing using pwdlib.PasswordHash for secure storage
- Constant-time verification to prevent timing attacks on API keys
- Timezone validator using IANA zoneinfo database file:tradingagents/api/services/validators.py:134-191
- Tax jurisdiction validator supporting 50+ country codes and state/province subdivisions file:tradingagents/api/services/validators.py:193-283
- Utility functions get_available_timezones() and get_available_tax_jurisdictions() for UI dropdowns file:tradingagents/api/services/validators.py:285-333
- Database migration 002_add_user_profile_fields.py with proper defaults and constraints file:migrations/versions/002_add_user_profile_fields.py
- Migration rollback support for reversible schema changes
- Comprehensive docstrings and security considerations for all functions
-
Portfolio model for managing trading portfolios (Issue #4: DB-3)
- Portfolio model with support for LIVE, PAPER, and BACKTEST portfolio types file:tradingagents/api/models/portfolio.py
- PortfolioType enum for type-safe portfolio categorization file:tradingagents/api/models/portfolio.py:95-107
- PreciseNumeric custom SQLAlchemy type decorator for Decimal(19,4) precision file:tradingagents/api/models/portfolio.py:63-92
- High-precision monetary value handling (19 total digits, 4 decimal places) for initial_capital and current_value fields
- Automatic current_value default to initial_capital on portfolio creation
- Unique constraint on (user_id, name) to prevent duplicate portfolio names per user
- Check constraints for non-negative capital and value amounts
- Composite indexes for efficient queries: (user_id, is_active) and (user_id, portfolio_type)
- Relationship to User model with cascade delete behavior
- Currency code field with ISO 4217 validation (3-letter codes, e.g., AUD, USD)
- Portfolio status tracking via is_active boolean field with default True
- Comprehensive validators for currency normalization, portfolio type validation, and business rule enforcement file:tradingagents/api/models/portfolio.py:249-296
- Event listener validation (before_flush) for cross-field and database constraint checks file:tradingagents/api/models/portfolio.py:300-347
- User model updated with portfolios relationship for one-to-many portfolio association file:tradingagents/api/models/user.py:72-76
- Database migration 003_add_portfolio_model.py with comprehensive schema definition file:migrations/versions/003_add_portfolio_model.py
- Migration with proper upgrade and downgrade functions for reversible schema changes
- Comprehensive unit and integration test suites file:tests/unit/api/test_portfolio_model.py file:tests/integration/api/test_portfolio_integration.py
- Unit tests covering field validation, defaults, constraints, and enum handling
- Integration tests for relationships, cascade delete, and concurrent operations
-
Settings model for user preferences and risk management (Issue #5: DB-4)
- Settings model for managing user trading preferences, risk tolerance, and alert configurations file:tradingagents/api/models/settings.py
- RiskProfile enum for user risk tolerance profiles (CONSERVATIVE, MODERATE, AGGRESSIVE) file:tradingagents/api/models/settings.py:70-82
- One-to-one relationship with User model with cascade delete behavior
- Risk management fields: risk_score (0-10 scale), risk_profile, max_position_pct (0-100), max_portfolio_risk_pct (0-100)
- Investment horizon field in years for long-term portfolio planning
- Alert preferences JSON field for configurable email/SMS/push notifications
- Unique constraint on user_id enforcing one settings record per user
- Check constraints for valid numeric ranges: risk_score 0-10, position/portfolio risk 0-100, horizon >= 0
- Automatic timestamps via TimestampMixin (created_at, updated_at)
- Validators for risk_profile enum normalization and type safety file:tradingagents/api/models/settings.py:246-279
- Event listener validation (before_flush) for business rule enforcement file:tradingagents/api/models/settings.py:284-313
- User model updated with settings relationship for one-to-one association file:tradingagents/api/models/user.py
- Database migration 004_add_settings_model.py with comprehensive schema definition file:migrations/versions/004_add_settings_model.py
- Migration with proper upgrade and downgrade functions for reversible schema changes
- Comprehensive unit test suite covering field validation, defaults, constraints, and enum handling file:tests/unit/api/test_settings_model.py
- Integration test suite for relationships, cascade delete, and concurrent operations file:tests/integration/api/test_settings_integration.py
-
Test fixtures directory with centralized mock data (Issue #51)
- FixtureLoader class for loading JSON fixtures with automatic datetime parsing file:tests/fixtures/init.py
- Stock data fixtures: US market OHLCV, Chinese market OHLCV, standardized data file:tests/fixtures/stock_data/
- Metadata fixtures: Complete analysis, partial analysis, batch analysis, error scenarios file:tests/fixtures/metadata/analysis_metadata.json
- Report section fixtures: Market, sentiment, news, fundamentals, investment plans file:tests/fixtures/report_sections/complete_reports.json
- API response fixtures: OpenAI embeddings (single, batch, error responses) file:tests/fixtures/api_responses/openai_embeddings.json
- Configuration fixtures: Vendor-specific and LLM provider configurations file:tests/fixtures/configurations/default_config.json
- Comprehensive FixtureLoader class with convenience functions and edge case support
- DataFrame conversion utilities for stock data with automatic datetime indexing
- UTF-8 encoding support for Chinese market data with column standardization
- Updated docs/testing/writing-tests.md with fixtures section and usage examples file:docs/testing/writing-tests.md
- Fixture-based testing best practices documentation
-
DeepSeek API support for LLM provider integration (Issue #41)
- DeepSeek provider integration using ChatOpenAI with base_url pointing to DeepSeek API file:tradingagents/graph/trading_graph.py:105-145
- DEEPSEEK_API_KEY environment variable handling with validation and helpful error messages
- Support for DeepSeek models: deepseek-chat and deepseek-reasoner with custom attribution headers
- Embedding fallback chain for providers without native embeddings (OpenAI -> HuggingFace -> disable memory) file:tradingagents/agents/utils/memory.py:16-57
- Optional HuggingFace sentence-transformers integration (all-MiniLM-L6-v2 model) for offline embeddings
- Graceful degradation with informative warnings when embedding backends unavailable
- Comprehensive test suite for DeepSeek integration file:tests/integration/test_deepseek.py
-
Test directory restructuring into unit/integration/e2e (Issue #50)
- Organized tests into unit/, integration/, and e2e/ subdirectories by test type
- Unit tests (5 files) - Fast, isolated tests: conftest_hierarchy, documentation_structure, exceptions, logging_config, report_exporter
- Integration tests (3 files) - Component interaction tests: akshare, cli_error_handling, openrouter
- End-to-end tests - Complete workflow tests with dedicated e2e/README.md guidelines
- Hierarchical conftest.py structure for each test directory with type-specific fixtures
- Updated pytest.ini with test discovery paths (tests, tests/unit, tests/integration, tests/e2e)
- Custom markers registered: unit, integration, e2e, llm, chromadb, slow, requires_api_key
- Updated docs/testing/README.md with new directory structure diagram and fixture organization
- Improved test isolation with directory-specific fixtures and configurations
-
pytest conftest.py hierarchy for organized test fixtures (Issue #49)
- Root-level conftest.py with shared fixtures (environment variables, LangChain/ChromaDB mocking, configuration)
- Unit-level conftest.py with data vendor mocking (akshare, yfinance, sample DataFrames)
- Integration-level conftest.py with live ChromaDB and temporary directory fixtures
- Fixture scope management (function, session, module) for test isolation and performance
- Comprehensive docstrings for all fixtures with usage examples and scope documentation
- pytest.ini configuration with custom markers (unit, integration, e2e, llm, chromadb, slow, requires_api_key)
- Test suite validating fixture accessibility across test directories file:tests/test_conftest_hierarchy.py
- Updated testing documentation with conftest.py hierarchy section file:docs/testing/README.md
- Fixture usage examples in writing-tests.md file:docs/testing/writing-tests.md
-
Comprehensive documentation structure (Issue #52)
- Organized
docs/directory with structured documentation sections - Quick start guide at
docs/QUICKSTART.md - Architecture documentation in
docs/architecture/(multi-agent-system, data-flow, llm-integration) - API reference documentation in
docs/api/(trading-graph, agents, dataflows) - Developer guides in
docs/guides/(adding-new-analyst, adding-llm-provider, adding-data-vendor, configuration) - Testing documentation in
docs/testing/(README, running-tests, writing-tests) - Development setup guide in
docs/development/ - Central documentation index at
docs/README.mdwith navigation and key concepts - Updated PROJECT.md DOCUMENTATION MAP section to reference new docs/ structure
- Added Documentation section to README.md with links to key guides
- Organized
-
Export reports to file with metadata (Issue #21)
- YAML frontmatter formatting for report metadata file:tradingagents/utils/report_exporter.py:63-111
- Report creation with combined YAML frontmatter and markdown content file:tradingagents/utils/report_exporter.py:112-136
- Safe filename generation with date prefixes and sanitization file:tradingagents/utils/report_exporter.py:137-185
- JSON metadata serialization with datetime handling and directory creation file:tradingagents/utils/report_exporter.py:186-220
- Comprehensive report generation combining multiple sections with table of contents file:tradingagents/utils/report_exporter.py:221-325
- Support for organizing report sections by team (Analyst, Research, Trading, Portfolio)
- Datetime-to-ISO-string conversion for YAML/JSON serialization
- Helper functions for basic YAML formatting when PyYAML is unavailable
- Comprehensive test suite for all report export functions file:tests/test_report_exporter.py
- Public API exports in utils/init.py for easy access
-
Rate limit error handling for LLM APIs (Issue #39)
- Unified exception hierarchy for handling rate limit errors across providers (OpenAI, Anthropic, OpenRouter) file:tradingagents/utils/exceptions.py
- Dual-output logging configuration supporting both terminal and file outputs file:tradingagents/utils/logging_config.py
- Automatic rotating log files with 5MB rotation and 3 backups
- Terminal logging at INFO level and file logging at DEBUG level
- API key sanitization in log messages to prevent credential leaks
- Error recovery utilities for saving partial analysis state on errors file:tradingagents/utils/error_recovery.py
- User-friendly error message formatting for rate limit errors file:tradingagents/utils/error_messages.py
- Comprehensive test suite for exceptions and logging configuration file:tests/test_exceptions.py file:tests/test_logging_config.py
-
AKShare data vendor integration for US and Chinese stock market data (Issue #16)
- Unified AKShare vendor module with support for both US and Chinese markets file:tradingagents/dataflows/akshare.py
- Date format conversion utility for YYYYMMDD compatibility file:tradingagents/dataflows/akshare.py:34-67
- Exponential backoff retry mechanism with configurable attempts and delays file:tradingagents/dataflows/akshare.py:70-108
- US stock data retrieval via
get_akshare_stock_data_us()file:tradingagents/dataflows/akshare.py:114-211 - Chinese stock data retrieval via
get_akshare_stock_data_cn()file:tradingagents/dataflows/akshare.py:213-320 - Auto-market detection with
get_akshare_stock_data()for automatic routing file:tradingagents/dataflows/akshare.py:322-372 - Rate limit error handling via
AKShareRateLimitErrorexception with vendor fallback file:tradingagents/dataflows/akshare.py:28-30 - Integration with interface.py vendor routing system file:tradingagents/dataflows/interface.py
- Comprehensive test suite for all AKShare functions file:tests/test_akshare.py
-
OpenRouter API provider support for unified access to multiple LLM models
- Support for
provider/model-nameformat (e.g.,anthropic/claude-sonnet-4.5) - Proper API key handling with OPENROUTER_API_KEY environment variable
- Custom headers for OpenRouter attribution (HTTP-Referer, X-Title)
- Embedding fallback to OpenAI when using OpenRouter (since OpenRouter lacks embeddings)
- Comprehensive test suite for OpenRouter provider integration file:tests/test_openrouter.py
- Support for
-
Expanded .env.example with all supported LLM provider API keys
-
Detailed LLM Provider Options section in README.md with examples for:
- OpenAI (default)
- Anthropic
- OpenRouter (new)
- Google Generative AI
- Ollama (local)
-
OpenRouter configuration example in Python usage section
-
Documentation updates in PROJECT.md for OpenRouter support
Changed
- Updated trading_graph.py LLM provider initialization to handle OpenRouter separately with proper API key and header management file:tradingagents/graph/trading_graph.py:75-105
- Enhanced memory.py embedding logic to support OpenRouter's embedding fallback behavior file:tradingagents/agents/utils/memory.py:6-27
- Main.py now includes OpenRouter configuration example (commented out) for easy reference
Fixed
- ChromaDB collection persistence issue by using
get_or_create_collection()instead ofcreate_collection()to prevent "collection already exists" errors and enable persistent memory across application restarts file:tradingagents/agents/utils/memory.py:29 (Issue #30) - Improved error messages for missing OPENROUTER_API_KEY when using openrouter provider
- Better embedding client initialization for different LLM providers
[1.0.0] - 2025-01-01 (Example - Update with actual release date)
Added
- Initial multi-agent trading framework release
- Support for multiple LLM providers
- Analyst team (fundamental, sentiment, news, technical)
- Researcher debate mechanism
- Risk management workflow
- CLI interface
- Integration with financial data APIs