Team Ai
Apppublic

diegobeyl/backtesting

sourceHugging Faceupdated 9mo agoView on Hugging Face
2likes
quick_compare.py110 linesDownload Raw Back to analysis
1#!/usr/bin/env python32"""3Análisis: Por qué diferente cantidad de velas4Yahoo Finance vs Binance - 10 años5"""6 7import pandas as pd8import yfinance as yf9from datetime import datetime, timedelta10import ccxt11import time12 13end_date = datetime.now()14start_date = end_date - timedelta(days=365*10)  # 10 años15 16print(f"\n{'='*70}\n📊 ANÁLISIS: ¿POR QUÉ DIFERENTE CANTIDAD DE VELAS?\n{'='*70}\n")17 18# YAHOO FINANCE19print("📥 Yahoo Finance...")20yf_data = yf.download('BTC-USD', start=start_date, end=end_date, interval='1mo', progress=False)21yf_data = yf_data.rename(columns={'Open': 'open', 'High': 'high', 'Low': 'low', 'Close': 'close', 'Volume': 'volume'})22if hasattr(yf_data.index, 'tz') and yf_data.index.tz is not None:23    yf_data.index = yf_data.index.tz_localize(None)24print(f"✅ {len(yf_data)} velas")25print(f"   Primera: {yf_data.index[0].strftime('%Y-%m-%d')}")26print(f"   Última:  {yf_data.index[-1].strftime('%Y-%m-%d')}\n")27 28# BINANCE29print("📥 Binance (descargando)...")30binance = ccxt.binance({'enableRateLimit': True})31since = int(start_date.timestamp() * 1000)32ohlcv = []33cnt = 034 35while True:36    batch = binance.fetch_ohlcv('BTC/USDT', '1d', since=since, limit=1000)37    if not batch or len(batch) == 0:38        break39    ohlcv.extend(batch)40    since = batch[-1][0] + 141    cnt += 142    print(f"   Batch {cnt}: {len(ohlcv)} velas")43    if len(batch) < 1000:44        break45 46binance_daily = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])47binance_daily['timestamp'] = pd.to_datetime(binance_daily['timestamp'], unit='ms')48binance_daily.set_index('timestamp', inplace=True)49 50print(f"✅ {len(binance_daily)} velas DIARIAS")51print(f"   Primera: {binance_daily.index[0].strftime('%Y-%m-%d')}")52print(f"   Última:  {binance_daily.index[-1].strftime('%Y-%m-%d')}\n")53 54# Resamplear a mensual55print("📊 Resampleando a mensuales...")56binance_monthly = binance_daily.resample('ME').agg({'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum'})57print(f"✅ {len(binance_monthly)} velas MENSUALES")58print(f"   Primera: {binance_monthly.index[0].strftime('%Y-%m-%d')}")59print(f"   Última:  {binance_monthly.index[-1].strftime('%Y-%m-%d')}\n")60 61# ANÁLISIS62print(f"{'='*70}\n🔍 ¿POR QUÉ DIFERENCIA DE {len(yf_data) - len(binance_monthly)} VELAS?\n{'='*70}\n")63 64print("RAZÓN: Binance empezó a operar BTC-USD después que Yahoo Finance\n")65print(f"Yahoo Finance velas:  {len(yf_data)}")66print(f"Binance velas:        {len(binance_monthly)}")67print(f"Diferencia:           {len(yf_data) - len(binance_monthly)} velas\n")68print(f"Yahoo empieza:  {yf_data.index[0].strftime('%Y-%m-%d')}")69print(f"Binance empieza: {binance_monthly.index[0].strftime('%Y-%m-%d')}")70print(f"Diferencia:     {(binance_monthly.index[0] - yf_data.index[0]).days // 30} meses\n")71 72# COMPARACIÓN73print(f"{'='*70}\n🔍 ANÁLISIS DE DIFERENCIAS\n{'='*70}\n")74 75common_dates = yf_data.index.intersection(binance_monthly.index)76if len(common_dates) > 0:77    yf_a = yf_data.loc[common_dates]78    bn_a = binance_monthly.loc[common_dates]79    80    print(f"Fechas comunes: {len(common_dates)} velas\n")81    print("📋 PRIMERAS 3 VELAS:")82    print(f"{'Fecha':<12} {'Fuente':<10} {'Open':<12} {'Close':<12} {'High':<12} {'Low':<12}")83    print("-" * 70)84    85    for date in common_dates[:3]:86        print(f"{date.strftime('%Y-%m-%d'):<12} {'Yahoo':<10} {yf_a.loc[date, 'open']:>11.2f} {yf_a.loc[date, 'close']:>11.2f} {yf_a.loc[date, 'high']:>11.2f} {yf_a.loc[date, 'low']:>11.2f}")87        print(f"{'':<12} {'Binance':<10} {bn_a.loc[date, 'open']:>11.2f} {bn_a.loc[date, 'close']:>11.2f} {bn_a.loc[date, 'high']:>11.2f} {bn_a.loc[date, 'low']:>11.2f}")88        diff = ((yf_a.loc[date, 'close'] - bn_a.loc[date, 'close']) / bn_a.loc[date, 'close'] * 100)89        print(f"{'Diferencia':<12} {'%':<10} {'':<11} {diff:>11.4f}%\n")90    91    # Estadísticas92    print("\n📊 ESTADÍSTICAS DE DIFERENCIAS EN CLOSE:")93    print("-" * 50)94    95    diff_close = ((yf_a['close'] - bn_a['close']) / bn_a['close'] * 100)96    97    print(f"Media:        {diff_close.mean():>10.6f}%")98    print(f"Desv. estándar: {diff_close.std():>10.6f}%")99    print(f"Min:          {diff_close.min():>10.6f}%")100    print(f"Max:          {diff_close.max():>10.6f}%")101    102    max_idx = diff_close.abs().idxmax()103    print(f"\n⚠️  MAYOR DIFERENCIA:")104    print(f"   Fecha: {max_idx.strftime('%Y-%m-%d')}")105    print(f"   Yahoo:   ${yf_a.loc[max_idx, 'close']:.2f}")106    print(f"   Binance: ${bn_a.loc[max_idx, 'close']:.2f}")107    print(f"   Diferencia: {diff_close.loc[max_idx]:.6f}%")108 109print(f"\n{'='*70}\n")110