"""
批量下载 Binance 官方 15分钟 数据 (含 Taker Buy Volume)
"""
import pandas as pd
import numpy as np
import zipfile
import io
import urllib.request
from datetime import datetime, timedelta

print("🚀 开始批量下载 Binance 官方数据...")

# 日期范围：2023-01-01 到 2026-06-30
start_date = datetime(2023, 1, 1)
end_date = datetime(2026, 6, 30)

all_dfs = []
total_days = (end_date - start_date).days + 1
downloaded = 0

current = start_date
while current <= end_date:
    date_str = current.strftime('%Y-%m-%d')
    url = f"https://data.binance.vision/data/futures/um/daily/klines/BTCUSDT/15m/BTCUSDT-15m-{date_str}.zip"
    
    try:
        # 下载 ZIP
        with urllib.request.urlopen(url, timeout=10) as response:
            zip_data = response.read()
        
        # 解压 CSV
        with zipfile.ZipFile(io.BytesIO(zip_data)) as z:
            csv_name = z.namelist()[0]
            with z.open(csv_name) as f:
                df = pd.read_csv(f)
                all_dfs.append(df)
        
        downloaded += 1
        if downloaded % 30 == 0:
            print(f"  已下载 {downloaded}/{total_days} 天 ({downloaded/total_days*100:.1f}%)")
    
    except Exception as e:
        # 跳过没有交易的日子 (如未来日期)
        pass
    
    current += timedelta(days=1)

if all_dfs:
    print(f"\n✅ 成功下载 {downloaded} 天数据")
    
    # 合并
    full_df = pd.concat(all_dfs, ignore_index=True)
    print(f"总行数: {len(full_df):,}")
    
    # 重命名字段
    full_df.rename(columns={
        'open_time': 'ts',
        'open': 'o',
        'high': 'h',
        'low': 'l',
        'close': 'c',
        'volume': 'v',
        'taker_buy_volume': 'taker_buy_v',
        'taker_buy_quote_volume': 'taker_buy_quote'
    }, inplace=True)
    
    # 转换时间戳
    full_df['ts'] = pd.to_datetime(full_df['ts'], unit='ms')
    full_df.set_index('ts', inplace=True)
    
    # 计算 Taker 卖出量
    full_df['taker_sell_v'] = full_df['v'] - full_df['taker_buy_v']
    full_df['taker_sell_quote'] = full_df['quote_volume'] - full_df['taker_buy_quote']
    
    # 计算 Taker 买入占比
    full_df['taker_buy_ratio'] = full_df['taker_buy_v'] / (full_df['v'] + 1e-9)
    
    # 保存
    full_df.to_parquet('/root/quant_pipeline/data/btc_15m_binance_full.parquet')
    print(f"✅ 已保存到: /root/quant_pipeline/data/btc_15m_binance_full.parquet")
    
    # 显示样本
    print(f"\n📊 数据预览:")
    print(full_df[['c', 'v', 'taker_buy_v', 'taker_sell_v', 'taker_buy_ratio']].tail())
    
else:
    print("❌ 没有下载到任何数据")
