stock-ai-agent/scripts/test_bitget_vs_binance.py
2026-02-22 22:16:08 +08:00

283 lines
9.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Bitget vs Binance 数据对比测试脚本
测试内容:
1. K线数据对比
2. 当前价格对比
3. 资金费率对比
4. 多周期数据对比
5. 技术指标计算对比
"""
import sys
import os
from pathlib import Path
# 添加项目路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root / "backend"))
import pandas as pd
from app.services.binance_service import binance_service
from app.services.bitget_service import bitget_service
def print_section(title: str):
"""打印分节标题"""
print("\n" + "=" * 80)
print(f" {title}")
print("=" * 80)
def print_comparison(label: str, binance_value, bitget_value, tolerance: float = 0.01):
"""打印对比结果"""
# 计算差异百分比
if binance_value and bitget_value:
if isinstance(binance_value, (int, float)) and isinstance(bitget_value, (int, float)):
diff_percent = abs(binance_value - bitget_value) / binance_value * 100 if binance_value != 0 else 0
match = "" if diff_percent <= tolerance else ""
print(f"{match} {label}")
print(f" Binance: {binance_value}")
print(f" Bitget: {bitget_value}")
print(f" 差异: {diff_percent:.2f}%")
else:
print(f"{label}")
print(f" Binance: {binance_value}")
print(f" Bitget: {bitget_value}")
else:
print(f"{label}")
print(f" Binance: {binance_value}")
print(f" Bitget: {bitget_value}")
def test_kline_data(symbol: str = "BTCUSDT"):
"""测试 K线数据"""
print_section("1. K线数据对比")
interval = '5m'
limit = 100
print(f"\n获取 {symbol} {interval} K线数据{limit}根)...")
# 获取数据
binance_df = binance_service.get_klines(symbol, interval, limit)
bitget_df = bitget_service.get_klines(symbol, interval, limit)
if binance_df.empty:
print("❌ Binance 数据为空")
return
if bitget_df.empty:
print("❌ Bitget 数据为空")
return
print(f"\n✅ Binance 获取 {len(binance_df)} 根 K线")
print(f"✅ Bitget 获取 {len(bitget_df)} 根 K线")
# 对比最新一根K线
print("\n最新K线对比:")
b_latest = binance_df.iloc[-1]
g_latest = bitget_df.iloc[-1]
print_comparison("开盘价", float(b_latest['open']), float(g_latest['open']), tolerance=0.1)
print_comparison("最高价", float(b_latest['high']), float(g_latest['high']), tolerance=0.1)
print_comparison("最低价", float(b_latest['low']), float(g_latest['low']), tolerance=0.1)
print_comparison("收盘价", float(b_latest['close']), float(g_latest['close']), tolerance=0.1)
print_comparison("成交量", float(b_latest['volume']), float(g_latest['volume']), tolerance=1.0)
# 对比时间戳
print(f"\n时间对比:")
print(f" Binance: {b_latest['open_time']}")
print(f" Bitget: {g_latest['open_time']}")
# 检查数据结构
print("\n数据结构对比:")
print(f" Binance 列: {list(binance_df.columns)}")
print(f" Bitget 列: {list(bitget_df.columns)}")
def test_current_price(symbol: str = "BTCUSDT"):
"""测试当前价格"""
print_section("2. 当前价格对比")
print(f"\n获取 {symbol} 当前价格...")
binance_price = binance_service.get_current_price(symbol)
bitget_price = bitget_service.get_current_price(symbol)
print_comparison("当前价格", binance_price, bitget_price, tolerance=0.05)
def test_funding_rate(symbol: str = "BTCUSDT"):
"""测试资金费率"""
print_section("3. 资金费率对比")
print(f"\n获取 {symbol} 资金费率...")
binance_fr = binance_service.get_funding_rate(symbol)
bitget_fr = bitget_service.get_funding_rate(symbol)
if not binance_fr:
print("❌ Binance 资金费率数据为空")
return
if not bitget_fr:
print("❌ Bitget 资金费率数据为空")
return
print("\n资金费率对比:")
# 对比资金费率
fr_diff = abs(binance_fr['funding_rate'] - bitget_fr['funding_rate'])
fr_match = "" if fr_diff < 0.0001 else ""
print(f"{fr_match} 资金费率")
print(f" Binance: {binance_fr['funding_rate']:.6f} ({binance_fr['funding_rate_percent']:.4f}%)")
print(f" Bitget: {bitget_fr['funding_rate']:.6f} ({bitget_fr['funding_rate_percent']:.4f}%)")
print(f" 差异: {fr_diff:.6f}")
# 对比标记价格
print_comparison("标记价格", binance_fr.get('mark_price'), bitget_fr.get('mark_price'), tolerance=0.1)
# 对比指数价格
print_comparison("指数价格", binance_fr.get('index_price'), bitget_fr.get('index_price'), tolerance=0.1)
# 对比市场情绪
print(f"\n市场情绪:")
print(f" Binance: {binance_fr.get('sentiment', 'N/A')}")
print(f" Bitget: {bitget_fr.get('sentiment', 'N/A')}")
def test_multi_timeframe(symbol: str = "BTCUSDT"):
"""测试多周期数据"""
print_section("4. 多周期数据对比")
print(f"\n获取 {symbol} 多周期数据...")
binance_data = binance_service.get_multi_timeframe_data(symbol)
bitget_data = bitget_service.get_multi_timeframe_data(symbol)
intervals = ['5m', '15m', '1h', '4h']
print("\n各周期数据量:")
for interval in intervals:
b_count = len(binance_data.get(interval, []))
g_count = len(bitget_data.get(interval, []))
print(f" {interval}: Binance {b_count}根, Bitget {g_count}")
# 对比最新价格
print("\n各周期最新价格:")
for interval in intervals:
b_df = binance_data.get(interval, pd.DataFrame())
g_df = bitget_data.get(interval, pd.DataFrame())
if not b_df.empty and not g_df.empty:
b_price = float(b_df.iloc[-1]['close'])
g_price = float(g_df.iloc[-1]['close'])
print(f" {interval}: Binance ${b_price:,.2f}, Bitget ${g_price:,.2f}")
def test_technical_indicators(symbol: str = "BTCUSDT"):
"""测试技术指标计算"""
print_section("5. 技术指标计算对比")
print(f"\n获取 {symbol} 1h K线并计算指标...")
binance_df = binance_service.get_klines(symbol, '1h', 100)
bitget_df = bitget_service.get_klines(symbol, '1h', 100)
if binance_df.empty or bitget_df.empty:
print("❌ K线数据为空")
return
# 计算指标
binance_df = binance_service.calculate_indicators(binance_df, '1h')
bitget_df = bitget_service.calculate_indicators(bitget_df, '1h')
# 对比最新的指标值
print("\n最新技术指标对比:")
b_latest = binance_df.iloc[-1]
g_latest = bitget_df.iloc[-1]
# RSI
print_comparison("RSI(14)", b_latest['rsi'], g_latest['rsi'], tolerance=5.0)
# MACD
print_comparison("MACD", b_latest['macd'], g_latest['macd'], tolerance=10.0)
# 布林带
print_comparison("布林带上轨", b_latest['bb_upper'], g_latest['bb_upper'], tolerance=0.5)
print_comparison("布林带中轨", b_latest['bb_middle'], g_latest['bb_middle'], tolerance=0.5)
print_comparison("布林带下轨", b_latest['bb_lower'], g_latest['bb_lower'], tolerance=0.5)
# 移动平均线
print_comparison("MA5", b_latest['ma5'], g_latest['ma5'], tolerance=0.2)
print_comparison("MA10", b_latest['ma10'], g_latest['ma10'], tolerance=0.2)
print_comparison("MA20", b_latest['ma20'], g_latest['ma20'], tolerance=0.2)
def test_ticker(symbol: str = "BTCUSDT"):
"""测试 ticker 数据"""
print_section("6. Ticker 数据对比")
print(f"\n获取 {symbol} ticker 数据...")
binance_stats = binance_service.get_24h_stats(symbol)
bitget_ticker = bitget_service.get_ticker(symbol)
if not binance_stats:
print("❌ Binance ticker 数据为空")
return
if not bitget_ticker:
print("❌ Bitget ticker 数据为空")
return
print("\n24h 统计对比:")
print_comparison("最新价", binance_stats['price'], float(bitget_ticker['lastPrice']), tolerance=0.1)
print_comparison("24h最高", binance_stats['high'], float(bitget_ticker['highPrice24h']), tolerance=0.5)
print_comparison("24h最低", binance_stats['low'], float(bitget_ticker['lowPrice24h']), tolerance=0.5)
print_comparison("24h成交量", binance_stats['volume'], float(bitget_ticker['volume24h']), tolerance=5.0)
def main():
"""主函数"""
print("\n" + "🚀" * 40)
print("\nBitget vs Binance 数据对比测试")
print(f"测试时间: {pd.Timestamp.now()}")
# 测试交易对
test_symbol = "BTCUSDT"
try:
# 1. K线数据
test_kline_data(test_symbol)
# 2. 当前价格
test_current_price(test_symbol)
# 3. 资金费率
test_funding_rate(test_symbol)
# 4. 多周期数据
test_multi_timeframe(test_symbol)
# 5. 技术指标
test_technical_indicators(test_symbol)
# 6. Ticker 数据
test_ticker(test_symbol)
print("\n" + "=" * 80)
print(" ✅ 所有测试完成!")
print("=" * 80 + "\n")
except Exception as e:
print(f"\n❌ 测试出错: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()