290 lines
No EOL
6.5 KiB
Markdown
290 lines
No EOL
6.5 KiB
Markdown
# Unified Trading System Architecture
|
|
|
|
A high-performance trading system that seamlessly handles backtesting, paper trading, and live trading using a three-tier architecture optimized for different performance requirements.
|
|
|
|
## Architecture Overview
|
|
|
|
### Three-Tier Design
|
|
|
|
1. **Rust Core (Hot Path - Microseconds)**
|
|
- Order book management
|
|
- Order matching engine
|
|
- Real-time risk checks
|
|
- Position tracking
|
|
- Live P&L calculations
|
|
|
|
2. **Bun Orchestrator (Warm Path - Milliseconds)**
|
|
- System coordination
|
|
- Data routing and normalization
|
|
- API gateway (REST + WebSocket)
|
|
- Exchange connectivity
|
|
- Strategy management
|
|
|
|
3. **Python Analytics (Cold Path - Seconds+)**
|
|
- Portfolio optimization
|
|
- Complex risk analytics
|
|
- ML model inference
|
|
- Performance attribution
|
|
- Market regime detection
|
|
|
|
## Trading Modes
|
|
|
|
### Backtest Mode
|
|
- Processes historical data at maximum speed
|
|
- Realistic fill simulation with market impact
|
|
- Comprehensive performance metrics
|
|
- Event-driven architecture for accuracy
|
|
|
|
### Paper Trading Mode
|
|
- Uses real-time market data
|
|
- Simulates fills using actual order book
|
|
- Tracks virtual portfolio with realistic constraints
|
|
- Identical logic to live trading for validation
|
|
|
|
### Live Trading Mode
|
|
- Connects to real brokers/exchanges
|
|
- Full risk management and compliance
|
|
- Real-time position and P&L tracking
|
|
- Audit trail for all activities
|
|
|
|
## Key Features
|
|
|
|
### Unified Strategy Interface
|
|
Strategies work identically across all modes:
|
|
```typescript
|
|
class MyStrategy extends BaseStrategy {
|
|
async onMarketData(data: MarketData) {
|
|
// Same code works in backtest, paper, and live
|
|
const signal = await this.generateSignal(data);
|
|
if (signal.strength > 0.7) {
|
|
await this.submitOrder(signal.toOrder());
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Mode Transitions
|
|
Seamlessly transition between modes:
|
|
- Backtest → Paper: Validate strategy performance
|
|
- Paper → Live: Deploy with confidence
|
|
- Live → Paper: Test modifications safely
|
|
|
|
### Performance Optimizations
|
|
|
|
**Backtest Mode:**
|
|
- Batch data loading
|
|
- Parallel event processing
|
|
- Memory-mapped large datasets
|
|
- Columnar data storage
|
|
|
|
**Paper/Live Mode:**
|
|
- Lock-free data structures
|
|
- Batched market data updates
|
|
- Efficient cross-language communication
|
|
- Minimal allocations in hot path
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
- Rust (latest stable)
|
|
- Bun runtime
|
|
- Python 3.10+
|
|
- Docker (for dependencies)
|
|
|
|
### Installation
|
|
|
|
1. **Build Rust Core:**
|
|
```bash
|
|
cd apps/stock/core
|
|
cargo build --release
|
|
npm run build:napi
|
|
```
|
|
|
|
2. **Install Bun Orchestrator:**
|
|
```bash
|
|
cd apps/stock/orchestrator
|
|
bun install
|
|
```
|
|
|
|
3. **Setup Python Analytics:**
|
|
```bash
|
|
cd apps/stock/analytics
|
|
python -m venv venv
|
|
source venv/bin/activate # or venv\Scripts\activate on Windows
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### Running the System
|
|
|
|
1. **Start Analytics Service:**
|
|
```bash
|
|
cd apps/stock/analytics
|
|
python main.py
|
|
```
|
|
|
|
2. **Start Orchestrator:**
|
|
```bash
|
|
cd apps/stock/orchestrator
|
|
bun run dev
|
|
```
|
|
|
|
3. **Connect to UI:**
|
|
Open WebSocket connection to `ws://localhost:3002`
|
|
|
|
## API Examples
|
|
|
|
### Submit Order (REST)
|
|
```bash
|
|
curl -X POST http://localhost:3002/api/orders \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"symbol": "AAPL",
|
|
"side": "buy",
|
|
"quantity": 100,
|
|
"orderType": "limit",
|
|
"limitPrice": 150.00
|
|
}'
|
|
```
|
|
|
|
### Subscribe to Market Data (WebSocket)
|
|
```javascript
|
|
const socket = io('ws://localhost:3002');
|
|
|
|
socket.emit('subscribe', {
|
|
symbols: ['AAPL', 'GOOGL'],
|
|
dataTypes: ['quote', 'trade']
|
|
});
|
|
|
|
socket.on('marketData', (data) => {
|
|
console.log('Market update:', data);
|
|
});
|
|
```
|
|
|
|
### Run Backtest
|
|
```bash
|
|
curl -X POST http://localhost:3002/api/backtest/run \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"mode": "backtest",
|
|
"startDate": "2023-01-01T00:00:00Z",
|
|
"endDate": "2023-12-31T23:59:59Z",
|
|
"symbols": ["AAPL", "GOOGL", "MSFT"],
|
|
"initialCapital": 100000,
|
|
"strategies": [{
|
|
"id": "mean_reversion_1",
|
|
"name": "Mean Reversion Strategy",
|
|
"enabled": true,
|
|
"allocation": 1.0,
|
|
"symbols": ["AAPL", "GOOGL", "MSFT"],
|
|
"parameters": {
|
|
"lookback": 20,
|
|
"entryZScore": 2.0,
|
|
"exitZScore": 0.5
|
|
}
|
|
}]
|
|
}'
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
**Orchestrator (.env):**
|
|
```env
|
|
PORT=3002
|
|
DATA_INGESTION_URL=http://localhost:3001
|
|
ANALYTICS_SERVICE_URL=http://localhost:3003
|
|
QUESTDB_HOST=localhost
|
|
QUESTDB_PORT=9000
|
|
POSTGRES_HOST=localhost
|
|
POSTGRES_PORT=5432
|
|
```
|
|
|
|
**Analytics Service (.env):**
|
|
```env
|
|
ANALYTICS_PORT=3003
|
|
REDIS_URL=redis://localhost:6379
|
|
DATABASE_URL=postgresql://user:pass@localhost:5432/trading
|
|
```
|
|
|
|
### Risk Limits Configuration
|
|
```json
|
|
{
|
|
"maxPositionSize": 100000,
|
|
"maxOrderSize": 10000,
|
|
"maxDailyLoss": 5000,
|
|
"maxGrossExposure": 1000000,
|
|
"maxSymbolExposure": 50000
|
|
}
|
|
```
|
|
|
|
## Monitoring
|
|
|
|
### Metrics Exposed
|
|
- Order latency (submission to fill)
|
|
- Market data latency
|
|
- Strategy performance metrics
|
|
- System resource usage
|
|
- Risk limit utilization
|
|
|
|
### Health Endpoints
|
|
- Orchestrator: `GET http://localhost:3002/health`
|
|
- Analytics: `GET http://localhost:3003/health`
|
|
|
|
## Development
|
|
|
|
### Adding a New Strategy
|
|
1. Extend `BaseStrategy` class
|
|
2. Implement required methods
|
|
3. Register with `StrategyManager`
|
|
4. Configure parameters
|
|
|
|
### Adding a New Data Source
|
|
1. Implement `MarketDataSource` trait in Rust
|
|
2. Add connector in Bun orchestrator
|
|
3. Configure data routing
|
|
|
|
### Adding Analytics
|
|
1. Create new endpoint in Python service
|
|
2. Implement analysis logic
|
|
3. Add caching if needed
|
|
4. Update API documentation
|
|
|
|
## Performance Benchmarks
|
|
|
|
### Backtest Performance
|
|
- 1M bars/second processing rate
|
|
- 100K orders/second execution
|
|
- Sub-millisecond strategy evaluation
|
|
|
|
### Live Trading Latency
|
|
- Market data to strategy: <100μs
|
|
- Order submission: <1ms
|
|
- Risk check: <50μs
|
|
|
|
### Resource Usage
|
|
- Rust Core: ~200MB RAM
|
|
- Bun Orchestrator: ~500MB RAM
|
|
- Python Analytics: ~1GB RAM
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
**"Trading engine not initialized"**
|
|
- Ensure mode is properly initialized
|
|
- Check Rust build completed successfully
|
|
|
|
**"No market data received"**
|
|
- Verify data-ingestion service is running
|
|
- Check symbol subscriptions
|
|
- Confirm network connectivity
|
|
|
|
**"Risk check failed"**
|
|
- Review risk limits configuration
|
|
- Check current positions
|
|
- Verify daily P&L hasn't exceeded limits
|
|
|
|
## License
|
|
|
|
MIT License - See LICENSE file for details |