Files
gogo2/test_cob_data_quality.py
Dobromir Popov e2c495d83c cleanup
2025-07-27 18:31:30 +03:00

118 lines
5.2 KiB
Python

#!/usr/bin/env python3
"""
Test script for COB data quality and imbalance indicators
"""
import time
import logging
from core.data_provider import DataProvider
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def test_cob_data_quality():
"""Test COB data quality and imbalance indicators"""
logger.info("Testing COB data quality and imbalance indicators...")
# Initialize data provider
dp = DataProvider()
# Wait for initial data load and COB connection
logger.info("Waiting for initial data load and COB connection...")
time.sleep(20)
# Test 1: Check cached data summary
logger.info("\n=== Test 1: Cached Data Summary ===")
cache_summary = dp.get_cached_data_summary()
for symbol in cache_summary['cached_data']:
logger.info(f"\n{symbol}:")
for timeframe, info in cache_summary['cached_data'][symbol].items():
if 'candle_count' in info and info['candle_count'] > 0:
logger.info(f" {timeframe}: {info['candle_count']} candles, latest: ${info['latest_price']}")
else:
logger.info(f" {timeframe}: {info.get('status', 'no data')}")
# Test 2: Check COB data quality
logger.info("\n=== Test 2: COB Data Quality ===")
cob_quality = dp.get_cob_data_quality()
for symbol in cob_quality['symbols']:
logger.info(f"\n{symbol} COB Data:")
# Raw ticks
raw_info = cob_quality['raw_ticks'].get(symbol, {})
logger.info(f" Raw ticks: {raw_info.get('count', 0)} ticks")
if raw_info.get('age_seconds') is not None:
logger.info(f" Raw data age: {raw_info['age_seconds']:.1f} seconds")
# Aggregated 1s data
agg_info = cob_quality['aggregated_1s'].get(symbol, {})
logger.info(f" Aggregated 1s: {agg_info.get('count', 0)} records")
if agg_info.get('age_seconds') is not None:
logger.info(f" Aggregated data age: {agg_info['age_seconds']:.1f} seconds")
# Imbalance indicators
imbalance_info = cob_quality['imbalance_indicators'].get(symbol, {})
if imbalance_info:
logger.info(f" Imbalance 1s: {imbalance_info.get('imbalance_1s', 0):.4f}")
logger.info(f" Imbalance 5s: {imbalance_info.get('imbalance_5s', 0):.4f}")
logger.info(f" Imbalance 15s: {imbalance_info.get('imbalance_15s', 0):.4f}")
logger.info(f" Imbalance 60s: {imbalance_info.get('imbalance_60s', 0):.4f}")
logger.info(f" Total volume: {imbalance_info.get('total_volume', 0):.2f}")
logger.info(f" Price buckets: {imbalance_info.get('bucket_count', 0)}")
# Data freshness
freshness = cob_quality['data_freshness'].get(symbol, 'unknown')
logger.info(f" Data freshness: {freshness}")
# Test 3: Get recent COB aggregated data
logger.info("\n=== Test 3: Recent COB Aggregated Data ===")
for symbol in ['ETH/USDT', 'BTC/USDT']:
recent_cob = dp.get_cob_1s_aggregated(symbol, count=5)
logger.info(f"\n{symbol} - Last 5 aggregated records:")
for i, record in enumerate(recent_cob[-5:]):
timestamp = record.get('timestamp', 0)
imbalance_1s = record.get('imbalance_1s', 0)
imbalance_5s = record.get('imbalance_5s', 0)
total_volume = record.get('total_volume', 0)
bucket_count = len(record.get('bid_buckets', {})) + len(record.get('ask_buckets', {}))
logger.info(f" [{i+1}] Time: {timestamp}, Imb1s: {imbalance_1s:.4f}, "
f"Imb5s: {imbalance_5s:.4f}, Vol: {total_volume:.2f}, Buckets: {bucket_count}")
# Test 4: Monitor real-time updates
logger.info("\n=== Test 4: Real-time Updates (30 seconds) ===")
logger.info("Monitoring COB data updates...")
initial_quality = dp.get_cob_data_quality()
time.sleep(30)
updated_quality = dp.get_cob_data_quality()
for symbol in ['ETH/USDT', 'BTC/USDT']:
initial_count = initial_quality['raw_ticks'].get(symbol, {}).get('count', 0)
updated_count = updated_quality['raw_ticks'].get(symbol, {}).get('count', 0)
new_ticks = updated_count - initial_count
initial_agg = initial_quality['aggregated_1s'].get(symbol, {}).get('count', 0)
updated_agg = updated_quality['aggregated_1s'].get(symbol, {}).get('count', 0)
new_agg = updated_agg - initial_agg
logger.info(f"{symbol}: +{new_ticks} raw ticks, +{new_agg} aggregated records")
# Show latest imbalances
latest_imbalances = updated_quality['imbalance_indicators'].get(symbol, {})
if latest_imbalances:
logger.info(f" Latest imbalances: 1s={latest_imbalances.get('imbalance_1s', 0):.4f}, "
f"5s={latest_imbalances.get('imbalance_5s', 0):.4f}, "
f"15s={latest_imbalances.get('imbalance_15s', 0):.4f}, "
f"60s={latest_imbalances.get('imbalance_60s', 0):.4f}")
# Clean shutdown
logger.info("\n=== Shutting Down ===")
dp.stop_automatic_data_maintenance()
logger.info("COB data quality test completed")
if __name__ == "__main__":
test_cob_data_quality()