feat: Add cross-sectional strategy support

- Add cross-sectional strategy type (single vs cross-sectional)
- Support multi-symbol portfolio management with automatic ranking
- Add portfolio size, long ratio, and rebalance frequency configuration
- Implement parallel order execution for cross-sectional strategies
- Add frontend UI for strategy type selection and configuration
- Add i18n support (Chinese and English) for cross-sectional features
- Fix decimal precision issues in exchange order quantities
- Add last_rebalance_at field to database schema
- Add comprehensive documentation and examples

Database migration required: Add last_rebalance_at column to qd_strategies_trading table
This commit is contained in:
TIANHE
2026-02-10 15:19:20 +08:00
parent a89cc9bee9
commit a51184497d
19 changed files with 1517 additions and 36 deletions
+73
View File
@@ -4,6 +4,79 @@ This document records version updates, new features, bug fixes, and database mig
---
## V2.1.3 (2026-02-XX)
### 🚀 New Features
#### Cross-Sectional Strategy Support
- **Multi-Symbol Portfolio Management** - Added support for cross-sectional strategies that manage a portfolio of multiple symbols simultaneously
- Strategy type selection: Single Symbol vs Cross-Sectional
- Symbol list configuration: Select multiple symbols for portfolio management
- Portfolio size: Configure the number of symbols to hold simultaneously
- Long/Short ratio: Set the proportion of long vs short positions (0-1)
- Rebalance frequency: Daily, Weekly, or Monthly portfolio rebalancing
- Indicator execution: Indicators receive a `data` dictionary (symbol -> DataFrame) for cross-symbol analysis
- Signal generation: Automatic buy/sell/close signals based on indicator rankings
- Parallel execution: Multiple orders executed concurrently for efficiency
- **Backend Implementation**
- Cross-sectional configurations stored in `trading_config` JSON field
- New `_run_cross_sectional_strategy_loop` method in TradingExecutor
- Automatic rebalancing based on configured frequency
- Support for both long and short positions in the same portfolio
- **Frontend UI**
- Strategy type selector in strategy creation/editing form
- Conditional display of single-symbol vs cross-sectional configuration fields
- Multi-select symbol picker for cross-sectional strategies
- Full i18n support (Chinese and English)
See `docs/CROSS_SECTIONAL_STRATEGY_GUIDE_CN.md` or `docs/CROSS_SECTIONAL_STRATEGY_GUIDE_EN.md` for detailed usage instructions.
### 🐛 Bug Fixes
- Fixed decimal precision issues in exchange order quantities (Binance Spot LOT_SIZE filter errors)
- Improved `_dec_str` method across all exchange clients for accurate quantity formatting
- Enhanced quantity normalization to respect exchange precision requirements
- Fixed validation logic for cross-sectional strategies (now validates correct symbol list field)
- Fixed success message to show correct strategy count for cross-sectional strategies
### 📋 Database Migration
**Run the following SQL on your PostgreSQL database before deploying V2.1.3:**
```sql
-- ============================================================
-- QuantDinger V2.1.3 Database Migration
-- Cross-Sectional Strategy Support
-- ============================================================
-- Add last_rebalance_at column to track rebalancing time for cross-sectional strategies
-- Note: Cross-sectional strategy configurations (symbol_list, portfolio_size, long_ratio, rebalance_frequency)
-- are stored in the trading_config JSON field, not as separate database columns.
-- This migration only adds the last_rebalance_at timestamp field which is needed for rebalancing logic.
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'qd_strategies_trading'
AND column_name = 'last_rebalance_at'
) THEN
ALTER TABLE qd_strategies_trading
ADD COLUMN last_rebalance_at TIMESTAMP;
RAISE NOTICE 'Added last_rebalance_at column to qd_strategies_trading';
ELSE
RAISE NOTICE 'Column last_rebalance_at already exists';
END IF;
END $$;
```
**Migration Notes:**
- This migration is safe to run multiple times (uses IF NOT EXISTS check)
- Cross-sectional strategy configurations are stored in the `trading_config` JSON field, so no additional columns are needed
- The `last_rebalance_at` field is used to track when the last rebalancing occurred for cross-sectional strategies
- If you don't run this migration, cross-sectional strategies will still work, but rebalancing frequency checks may not function correctly
---
## V2.1.2 (2026-02-01)
### 🚀 New Features