用币安的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 文件,方便后续使用。
使用说明:
- 安装必要的库:
pip install requests pandas
- 替换
instrument_id
: 根据需要修改成具体的合约代码。 例如,BTC 季度合约的 ID 格式为BTC-USD-YYYYMMDD
。 在 OKX API 文档中可以找到所有合约的 ID。 - 调整时间范围: 修改
start_time
和end_time
来获取不同时间段的数据.
这个改进后的代码更加健壮,能够处理各种潜在的错误,并有效地获取大量的历史数据。 请根据实际情况调整参数和代码。 注意,频繁请求可能会触发 API 限制,请合理设置请求频率。 为了更稳定的回测,建议将数据缓存到本地,避免重复下载。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用 - 使用
悬赏问题
- ¥15 宇视监控服务器无法登录
- ¥15 PADS Logic 原理图
- ¥15 PADS Logic 图标
- ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
- ¥15 DruidDataSource一直closing
- ¥20 气象站点数据求取中~
- ¥15 如何获取APP内弹出的网址链接
- ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
- ¥50 STM32单片机传感器读取错误
- ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据