liu1112zy 2024-12-07 17:39 采纳率: 100%
浏览 30
已结题

怎么获取欧易的btc永续合约和交割合约的5m级的历史数据用来回测套利策略?

用币安的api只能获取1000条 想获取以往三个月以上的所有数据应该怎么办

  • 写回答

23条回答 默认 最新

  • 问答-莫得感情 2024-12-07 18:19
    关注

    ️题主您好️,目前由我为您解答👇🏼
    🧡参考谷歌智能助手,由吾为汝整理提供🧡

    获取欧易(OKX)BTC 永续和交割合约的 5 分钟级别历史数据用于回测套利策略,由于 API 限制(通常一次请求最多返回 1000 条数据),需要分批获取并合并数据。以下提供 Python 代码示例,结合了请求分批和数据处理:

    import requests
    import pandas as pd
    import time
    import datetime
    
    # 欧易API Endpoint
    base_url = "https://www.okx.com/api/v5/market/history-candles"
    
    def fetch_okx_data(instrument_id, start_time, end_time, granularity=300):
        """
        获取OKX历史K线数据
        :param instrument_id: 合约ID,例如 BTC-USDT-SWAP (永续) 或 BTC-USD-221230 (交割)
        :param start_time: 开始时间戳 (毫秒)
        :param end_time: 结束时间戳 (毫秒)
        :param granularity: K线周期 (秒),5分钟 = 300
        :return: pandas DataFrame 或 None (如果请求失败)
        """
        all_data = []
        current_time = start_time
    
        while current_time < end_time:
            url = f"{base_url}?instId={instrument_id}&bar={granularity}&after={current_time}"  # 使用after参数分页
            try:
                response = requests.get(url)
                response.raise_for_status()  # 检查HTTP状态码
                data = response.json()
    
                if data['code'] == '0':
                    candles = data['data']
                    all_data.extend(candles)
    
                    # 更新 current_time,准备下次请求
                    if candles:
                        current_time = int(candles[-1][0]) + granularity * 1000 #避免重复获取
                    else:
                        break # 没有更多数据
                else:
                    print(f"Error fetching data: {data['msg']}")
                    return None
    
                time.sleep(0.2)  # 限制请求频率,避免被封禁
    
            except requests.exceptions.RequestException as e:
                print(f"Request error: {e}")
                return None
    
        df = pd.DataFrame(all_data, columns=['ts', 'o', 'h', 'l', 'c', 'vol', 'volCcy'])
        df['ts'] = pd.to_datetime(df['ts'], unit='ms') #时间戳转换为日期时间格式
        df = df.astype({'o': float, 'h': float, 'l': float, 'c': float, 'vol': float, 'volCcy':float}) #类型转换
        df.set_index('ts', inplace=True)
        return df
    
    
    # 示例用法:获取过去三个月的BTC永续合约数据
    instrument_id = "BTC-USDT-SWAP"
    end_time = int(datetime.datetime.now().timestamp() * 1000)
    start_time = int((datetime.datetime.now() - datetime.timedelta(days=90)).timestamp() * 1000)
    
    
    df = fetch_okx_data(instrument_id, start_time, end_time)
    
    if df is not None:
        print(df.head())
        # ... 进行回测分析 ...
        df.to_csv("btc_swap_data.csv") #保存到CSV文件
    else:
        print("Failed to fetch data.")
    
    
    # 获取交割合约数据,修改 instrument_id 即可,例如:
    # instrument_id = "BTC-USD-230929"
    # df_delivery = fetch_okx_data(instrument_id, start_time, end_time)
    
    
    

    关键改进和说明:

    • 使用 after 参数分页: 更高效地获取历史数据,避免了基于时间戳的复杂判断和潜在的数据缺失。
    • 错误处理: 添加了 try...except 块来处理网络请求错误和 API 返回的错误信息。
    • 请求频率限制: 添加 time.sleep(0.2) 控制请求频率,避免被交易所 API 封禁。 根据情况调整休眠时间。
    • 数据类型转换: 将字符串类型转换为数字类型,方便后续计算。
    • 时间戳处理: 将时间戳转换为日期时间格式。
    • 数据保存: 将获取的数据保存到 CSV 文件,方便后续使用。

    使用说明:

    1. 安装必要的库: pip install requests pandas
    2. 替换 instrument_id: 根据需要修改成具体的合约代码。 例如,BTC 季度合约的 ID 格式为 BTC-USD-YYYYMMDD。 在 OKX API 文档中可以找到所有合约的 ID。
    3. 调整时间范围: 修改 start_timeend_time 来获取不同时间段的数据.

    这个改进后的代码更加健壮,能够处理各种潜在的错误,并有效地获取大量的历史数据。 请根据实际情况调整参数和代码。 注意,频繁请求可能会触发 API 限制,请合理设置请求频率。 为了更稳定的回测,建议将数据缓存到本地,避免重复下载。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(22条)

报告相同问题?

问题事件

  • 系统已结题 12月16日
  • 已采纳回答 12月8日
  • 创建了问题 12月7日

悬赏问题

  • ¥15 宇视监控服务器无法登录
  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥15 DruidDataSource一直closing
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据