#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 测试分批次数据获取功能 验证A股和加密货币数据的大时间范围获取 """ import sys import os sys.path.append('web') from datetime import datetime, timedelta from cn_stock_data import ChinaStockData import ccxt def test_a_stock_batch_data(): """测试A股分批次数据获取""" print("=== 测试A股分批次数据获取 ===") china_stock = ChinaStockData() # 测试获取更长时间范围的数据 end_date = datetime.now() start_date = end_date - timedelta(days=180) # 6个月数据 print(f"测试时间范围: {start_date.strftime('%Y-%m-%d')} 到 {end_date.strftime('%Y-%m-%d')}") # 测试不同时间周期 test_cases = [ ('600519', '1d', '日线数据'), ('600519', '1h', '1小时数据'), ('600519', '15m', '15分钟数据'), ] for symbol, timeframe, description in test_cases: print(f"\n测试 {description}: {symbol} {timeframe}") try: df = china_stock.get_kl_data( symbol=symbol, timeframe=timeframe, start_date=start_date.strftime('%Y-%m-%d'), end_date=end_date.strftime('%Y-%m-%d'), limit=5000 ) if df is not None: print(f"✅ 成功获取 {len(df)} 条记录") print(f" 时间范围: {df['date'].min()} 到 {df['date'].max()}") print(f" 数据列: {list(df.columns)}") else: print(f"❌ 获取失败") except Exception as e: print(f"❌ 错误: {e}") def test_crypto_batch_data(): """测试加密货币分批次数据获取""" print("\n=== 测试加密货币分批次数据获取 ===") # 初始化交易所 exchange = ccxt.binance({ 'enableRateLimit': True, }) # 测试获取更长时间范围的数据 end_time = datetime.now() start_time = end_time - timedelta(days=30) # 30天数据 print(f"测试时间范围: {start_time} 到 {end_time}") # 转换为时间戳 start_timestamp = int(start_time.timestamp() * 1000) end_timestamp = int(end_time.timestamp() * 1000) # 测试不同时间周期 test_cases = [ ('BTC/USDT:USDT', '1d', '日线数据'), ('BTC/USDT:USDT', '1h', '1小时数据'), ('BTC/USDT:USDT', '5m', '5分钟数据'), ] for symbol, timeframe, description in test_cases: print(f"\n测试 {description}: {symbol} {timeframe}") try: # 模拟分批次获取逻辑 all_ohlcv = [] current_since = start_timestamp request_count = 0 max_requests = 10 batch_size = 500 if timeframe in ['1m', '5m'] else 1000 while request_count < max_requests and current_since < end_timestamp: request_count += 1 print(f" 批次 {request_count}: 获取数据...") ohlcv = exchange.fetch_ohlcv(symbol, timeframe, since=current_since, limit=batch_size) if not ohlcv or len(ohlcv) == 0: break all_ohlcv.extend(ohlcv) last_timestamp = ohlcv[-1][0] if last_timestamp >= end_timestamp: break if len(ohlcv) < batch_size: break current_since = last_timestamp + 1 # 防止请求过频 import time time.sleep(0.3) if all_ohlcv: print(f"✅ 成功获取 {len(all_ohlcv)} 条记录 (共 {request_count} 个批次)") # 时间范围检查 first_time = datetime.fromtimestamp(all_ohlcv[0][0] / 1000) last_time = datetime.fromtimestamp(all_ohlcv[-1][0] / 1000) print(f" 时间范围: {first_time} 到 {last_time}") else: print(f"❌ 获取失败") except Exception as e: print(f"❌ 错误: {e}") def test_data_quality(): """测试数据质量""" print("\n=== 测试数据质量 ===") china_stock = ChinaStockData() # 获取一小段数据进行质量检查 df = china_stock.get_kl_data( symbol='600519', timeframe='1d', limit=100 ) if df is not None: print(f"数据行数: {len(df)}") print(f"数据列: {list(df.columns)}") # 检查缺失值 missing_values = df.isnull().sum() print(f"缺失值统计:") for col, count in missing_values.items(): if count > 0: print(f" {col}: {count}") # 检查数据类型 print(f"数据类型:") for col, dtype in df.dtypes.items(): print(f" {col}: {dtype}") # 检查时间连续性 if len(df) > 1: time_diffs = df['date'].diff().dropna() print(f"时间间隔统计:") print(f" 最小间隔: {time_diffs.min()}") print(f" 最大间隔: {time_diffs.max()}") print(f" 平均间隔: {time_diffs.mean()}") # 检查价格合理性 price_cols = ['open', 'high', 'low', 'close'] for col in price_cols: if col in df.columns: print(f"{col} 价格范围: {df[col].min():.2f} - {df[col].max():.2f}") print("✅ 数据质量检查完成") else: print("❌ 无法获取数据进行质量检查") if __name__ == '__main__': print("开始测试分批次数据获取功能...\n") # 测试A股数据 test_a_stock_batch_data() # 测试加密货币数据 test_crypto_batch_data() # 测试数据质量 test_data_quality() print("\n测试完成!")