Data aggregation and distribution service: - Market data collection - OHLCV aggregation - Real-time data feeds - Data API endpoints Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
9.5 KiB
9.5 KiB
Data Service - Massive.com Integration
Resumen
Integración completa de Massive.com (rebrand de Polygon.io) para el Data Service de Trading Platform.
Características Implementadas
1. Cliente Polygon/Massive Mejorado
- Archivo:
src/providers/polygon_client.py - Soporte para ambas URLs (api.polygon.io y api.massive.com)
- Rate limiting inteligente (5 req/min para tier gratuito)
- Soporte completo de timeframes: 1m, 5m, 15m, 1h, 4h, 1d
- Manejo robusto de errores y reintentos
- Async/await nativo para mejor performance
2. Servicio de Sincronización
- Archivo:
src/services/sync_service.py - Sincronización automática de datos históricos
- Backfill inteligente desde última sincronización
- Inserción por lotes para mejor performance
- Tracking de estado de sincronización
- Soporte multi-timeframe
3. Endpoints de Sincronización
- Archivo:
src/api/sync_routes.py
Endpoints Disponibles:
GET /api/sync/symbols - Lista de símbolos soportados
GET /api/sync/symbols/{symbol} - Info de símbolo específico
POST /api/sync/sync/{symbol} - Sincronizar símbolo
POST /api/sync/sync-all - Sincronizar todos los símbolos
GET /api/sync/status - Estado de sincronización
GET /api/sync/status/{symbol} - Estado de símbolo específico
GET /api/sync/health - Health check del servicio
4. Scheduler Automático
- Archivo:
src/services/scheduler.py - Sincronización periódica automática:
- 1min data: Cada minuto
- 5min data: Cada 5 minutos
- 15min data: Cada 15 minutos
- 1h data: Cada hora
- 4h data: Cada 4 horas
- Daily data: Diariamente a medianoche UTC
- Limpieza automática de datos antiguos (semanal)
5. Tests Básicos
- Archivos:
tests/test_*.py - Tests unitarios para sync_service
- Tests unitarios para polygon_client
- Coverage de funcionalidad crítica
Instalación
Dependencias Adicionales
Agregar al requirements.txt:
apscheduler>=3.10.4
pytest>=7.4.0
pytest-asyncio>=0.21.0
Variables de Entorno
# API Keys (usar una de las dos)
POLYGON_API_KEY=your_polygon_api_key
MASSIVE_API_KEY=your_massive_api_key # Funciona igual que Polygon
# Base URL (opcional - por defecto usa api.polygon.io)
POLYGON_BASE_URL=https://api.polygon.io
# O para usar Massive directamente:
# POLYGON_BASE_URL=https://api.massive.com
# Rate Limiting
POLYGON_RATE_LIMIT=5 # requests por minuto (tier gratuito)
POLYGON_TIER=basic # basic, starter, advanced
# Sync Configuration
ENABLE_SYNC_SCHEDULER=true
SYNC_INTERVAL_MINUTES=5
BACKFILL_DAYS=30
# Database
DB_HOST=localhost
DB_PORT=5432
DB_NAME=trading_data
DB_USER=trading_user
DB_PASSWORD=trading_dev_2025
Uso
1. Iniciar el Servicio
cd /home/isem/workspace/projects/trading-platform/apps/data-service
# Instalar dependencias
pip install -r requirements.txt
# Copiar app actualizado
cp src/app_updated.py src/app.py
# Iniciar servicio
python src/app.py
2. Ver Símbolos Disponibles
curl http://localhost:8001/api/sync/symbols
Respuesta:
{
"symbols": [
{
"symbol": "EURUSD",
"polygon_symbol": "C:EURUSD",
"mt4_symbol": "EURUSD",
"asset_type": "forex",
"pip_value": 0.0001,
"supported": true
}
],
"total": 45,
"asset_types": ["forex", "crypto", "index"]
}
3. Sincronizar un Símbolo
curl -X POST "http://localhost:8001/api/sync/sync/EURUSD" \
-H "Content-Type: application/json" \
-d '{
"asset_type": "forex",
"timeframe": "5min",
"backfill_days": 30
}'
Respuesta:
{
"status": "success",
"symbol": "EURUSD",
"timeframe": "5min",
"rows_inserted": 8640,
"start_date": "2024-11-08T00:00:00",
"end_date": "2024-12-08T00:00:00"
}
4. Ver Estado de Sincronización
curl http://localhost:8001/api/sync/status
Respuesta:
[
{
"symbol": "EURUSD",
"asset_type": "forex",
"timeframe": "5min",
"last_sync": "2024-12-08T20:00:00",
"rows_synced": 8640,
"status": "success",
"error": null,
"updated_at": "2024-12-08T20:05:00"
}
]
5. Ver Estado del Scheduler
curl http://localhost:8001/scheduler/status
Respuesta:
{
"enabled": true,
"running": true,
"jobs": [
{
"id": "sync_5min",
"name": "Sync 5-minute data",
"next_run": "2024-12-08T20:10:00",
"trigger": "interval[0:05:00]"
}
],
"total_jobs": 7
}
Arquitectura
┌─────────────────────────────────────────────────────────┐
│ FastAPI Application │
│ (app.py) │
└────────────┬────────────────────────────────────────────┘
│
┌───────┴───────┐
│ │
┌────▼─────┐ ┌────▼──────┐
│ Market │ │ Sync │
│ Data │ │ Routes │
│ Routes │ │ │
└────┬─────┘ └────┬──────┘
│ │
│ ┌────▼──────────┐
│ │ Sync Service │
│ │ │
│ └────┬──────────┘
│ │
│ ┌────▼──────────┐
│ │ Scheduler │
│ │ Manager │
│ └────┬──────────┘
│ │
┌────▼──────────────▼─────┐
│ Polygon/Massive │
│ Client │
│ (polygon_client.py) │
└────┬────────────────────┘
│
┌────▼──────────────┐
│ Massive.com API │
│ (api.polygon.io) │
└───────────────────┘
Timeframes Soportados
| Timeframe | Valor Enum | Tabla DB | Sync Interval |
|---|---|---|---|
| 1 minuto | MINUTE_1 |
ohlcv_1min |
Cada 1 min |
| 5 minutos | MINUTE_5 |
ohlcv_5min |
Cada 5 min |
| 15 minutos | MINUTE_15 |
ohlcv_15min |
Cada 15 min |
| 1 hora | HOUR_1 |
ohlcv_1hour |
Cada 1 hora |
| 4 horas | HOUR_4 |
ohlcv_4hour |
Cada 4 horas |
| Diario | DAY_1 |
ohlcv_daily |
Diario |
Asset Types Soportados
| Asset Type | Prefix | Ejemplo | Cantidad |
|---|---|---|---|
| Forex | C: |
C:EURUSD | 25+ pares |
| Crypto | X: |
X:BTCUSD | 1+ |
| Índices | I: |
I:SPX | 4+ |
| Stocks | (none) | AAPL | Configurable |
Rate Limits
Tier Gratuito (Basic)
- 5 requests/minuto
- Implementado con rate limiting automático
- Retry automático en caso de 429
Tier Starter
- 100 requests/minuto
- Configurar:
POLYGON_RATE_LIMIT=100
Tier Advanced
- Sin límites
- Configurar:
POLYGON_RATE_LIMIT=999
Manejo de Errores
El servicio incluye manejo robusto de errores:
- Rate Limiting: Espera automática cuando se alcanza el límite
- Reintentos: Retry en caso de errores temporales
- Logging: Todas las operaciones se registran
- Estado de Sync: Tracking de errores en base de datos
- Partial Success: Guarda datos parciales si hay errores
Estructura de Base de Datos
Tabla sync_status
CREATE TABLE IF NOT EXISTS market_data.sync_status (
id SERIAL PRIMARY KEY,
ticker_id INTEGER REFERENCES market_data.tickers(id),
timeframe VARCHAR(20) NOT NULL,
last_sync_timestamp TIMESTAMP,
last_sync_rows INTEGER,
sync_status VARCHAR(20),
error_message TEXT,
updated_at TIMESTAMP DEFAULT NOW(),
UNIQUE(ticker_id, timeframe)
);
Testing
Ejecutar Tests
cd /home/isem/workspace/projects/trading-platform/apps/data-service
# Instalar pytest
pip install pytest pytest-asyncio
# Ejecutar todos los tests
pytest tests/ -v
# Ejecutar tests específicos
pytest tests/test_sync_service.py -v
pytest tests/test_polygon_client.py -v
# Con coverage
pytest tests/ --cov=src --cov-report=html
Próximos Pasos
- Configurar API Key: Obtener API key de Massive.com o Polygon.io
- Crear Tablas: Ejecutar migrations de base de datos
- Iniciar Servicio: Levantar el Data Service
- Sync Inicial: Ejecutar backfill de datos históricos
- Monitoreo: Verificar logs y estado de sincronización
Troubleshooting
Problema: API Key inválida
Solución: Verificar POLYGON_API_KEY en .env
Problema: Rate limit excedido
Solución: Reducir POLYGON_RATE_LIMIT o esperar 1 minuto
Problema: Scheduler no inicia
Solución: Verificar ENABLE_SYNC_SCHEDULER=true
Problema: No hay datos
Solución: Ejecutar POST /api/sync/sync/{symbol} manualmente
Soporte
Para más información sobre Massive.com/Polygon.io:
- Documentación: https://polygon.io/docs
- Massive.com: https://massive.com
- Dashboard: https://polygon.io/dashboard
Changelog
v2.0.0 (2024-12-08)
- Integración completa de Massive.com/Polygon.io
- Servicio de sincronización automática
- Scheduler con múltiples timeframes
- Endpoints de administración de sync
- Tests unitarios básicos
- Documentación completa