You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Binance 5分钟K线收盘后拉取数据,规避高频请求与数据偏差

币安5分钟K线收盘拉取实现方案

核心实现逻辑

5分钟K线的收盘时间固定为每小时的0、5、10……55分的整分时间点,我们只需要每次计算下一个收盘时间点,精准等待到该时间再触发拉取,同时增加K线收盘校验,即可保证无论程序何时启动,都只会拿到完全收盘的K线数据。

实现要点

  • 动态计算下一个5分钟整分收盘点的等待时长,避免固定休眠5分钟导致的时间漂移问题
  • 拉取K线后校验最新K线的收盘时间,自动过滤未完结的K线数据
  • 出错时增加重试等待,避免触发接口限流

修正后完整代码

依赖导入

import time
import datetime
import requests
import pandas as pd

K线拉取函数(增加收盘校验)

def getKlines(symbol, length):
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
               "Connection": "keep-alive",
               "Accept-Encoding": "*"
               }
    payload = {'symbol': symbol, 'interval': '5m', 'limit': str(length)}
    result = requests.get(
        "https://api.binance.com/api/v3/klines", headers=headers, params=payload)
    # 替换原eval解析为官方json方法,安全性更高
    candles = pd.DataFrame(result.json())
    candles.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Close_Time',
                       'Quote_Volume', 'Trades_Count', 'BUY_VOL', 'BUY_VOL_VAL', 'x']    
    candles.insert(loc=1, column="Symbol", value=symbol)  
    candles["Date"] = pd.to_datetime(candles["Date"], unit="ms")
    candles["Close"] = candles["Close"].astype(float)
    candles["Volume"] = candles["Volume"].astype(float)
    # 校验最新K线是否已完全收盘
    latest_close_ts = candles["Close_Time"].iloc[-1]
    current_ts = int(time.time() * 1000)
    if latest_close_ts > current_ts:
        # 未收盘则丢弃最后一条未完结K线
        candles = candles.iloc[:-1]
    return candles

主循环(动态对齐收盘时间)

# 替换为你需要拉取的交易对列表
symbols = ["BTCUSDT", "ETHUSDT"]
while True:
    try:
        # 计算下一个5分钟整分收盘时间
        now = datetime.datetime.now()
        add_min = 5 - (now.minute % 5)
        next_run_time = now + datetime.timedelta(minutes=add_min)
        # 对齐到整分,忽略秒和微秒
        next_run_time = next_run_time.replace(second=0, microsecond=0)
        # 计算需要等待的秒数
        wait_sec = (next_run_time - now).total_seconds()
        time.sleep(wait_sec)
        
        # 到点后批量拉取K线
        for ticker in symbols:
            candles = getKlines(symbol=ticker, length=48)
            print(candles)
    except Exception as e:
        print(f"运行异常: {str(e)}")
        # 异常后休眠10秒重试,避免频繁请求触发限流
        time.sleep(10)

方案说明

该方案无需依赖外部定时工具,每次循环都会自动对齐5分钟K线的收盘时间点,不会出现提前拉取、时间漂移导致的数据不匹配问题,即使程序中途重启,也会自动等待到下一个收盘点再执行拉取,完全符合需求。

内容的提问来源于stack exchange,提问作者Mohamed Nagy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:24:02