资讯动态

10 分钟拉取一年 OKX 历史 K 线数据:python-okx 实战指南

发布时间:2026/8/24 2:30:37 来源:尧图企业网站定制
10 分钟拉取一年 OKX 历史 K 线数据python-okx 实战指南【免费下载链接】python-okx项目地址: https://gitcode.com/GitHub_Trending/py/python-okxpython-okx 拉历史 K 线直接调 OKX 端点每次只返回 100 条limit 填 1000 直接报 51001。python-okx 是 OKX v5 API 的 Python SDK本文用它的 MarketData 模块从零讲清楚历史 K 线数据的分页拉取、清洗与落盘。读完你能复制一套完整的 K 线数据管道把回测用的 CSV 存下来。安装 python-okx 并跑通第一次 K 线调用1. 安装依赖pip install python-okx运行时只依赖 httpx 和 logurupip 会一并装好。拉 K 线走公开行情不需要申请 API key。2. 调用历史 K 线接口from okx.MarketData import MarketAPI # 公开行情数据免鉴权默认 key -1 即可 market_api MarketAPI(flag0) # 0实盘环境1模拟盘 result market_api.get_history_candlesticks( instIdBTC-USDT, bar1H, # K线周期支持 1m/5m/1H/4H/1D 等 limit100, # history 端点单次上限就是 100 ) # code 为 0 且 data 非空说明调用成功 print(result[code], result[msg]) print(result[data][0])返回的每行长这样[1704022400000, 25204.5, 25318.2, 25120.1, 25266.8, 120.4, 120.4, 3040986.5, 1] 9 个字段依次是开盘时间、开、高、低、收、基础币成交量、计价币成交量、报价成交量、是否已确认。时间戳是毫秒级confirm0 表示这根 K 线还没走完价格仍在跳动。数据按时间倒序返回第 0 行是最新的。看懂两个 K 线端点和 before/after 参数体系1. 对比两个 K 线端点MarketData 模块封装了两个 K 线方法okx/MarketData.py端点地址定义在 okx/consts.py方法端点数据范围单次上限限频适用场景get_candlesticks/api/v5/market/candles近 3 个月300 条40 次/2s近期行情、回测前拉小批量数据get_history_candlesticks/api/v5/market/history-candles主流币近 3 年100 条20 次/2s长周期数据、跨年度回测 为什么要拆成两个端点OKX 把近期数据放在热缓存里candles 查询快、单次条数放得大历史数据走冷存储单次上限压到 100限频也更严。拉跨年度数据必须用 history 端点。2. 确认 before/after 分页语义参数含义示例使用说明instId交易对标识BTC-USDT / ETH-USDT-SWAP现货、永续、期权后缀不同barK 线周期1H / 4H / 1D分钟级用小写如 15mlimit单次返回条数100history-candles 上限 100after / before分页游标1704067200000after 取更早数据before 取更新数据⚠️ before 和 after 的命名反直觉after 传某时间戳返回的是比它更早的 K 线before 返回比它更新的。倒推历史要用 after 翻页而且 after 与 before 不能同时传。分页游标的走法如下最新 100 条 ── 取最旧一条的 ts减 1ms ── 作为下一次的 after ▲ │ └──────────── 循环直到 ts ≤ 开始时间 ──────┘每轮拿上一批最旧一行回退 1ms 后作为 after。回退是为了边界 K 线不出现在连续两批里避免重复数据。实现一年历史 K 线数据的分页拉取目标拉全 ETH-USDT-SWAP 的 2023 全年 4H K 线清洗后存成 CSV。没装 pandas 先执行pip install pandas。1. 定义参数与客户端import time import pandas as pd from okx.MarketData import MarketAPI INST_ID ETH-USDT-SWAP BAR 4H START_TS 1672531200000 # 2023-01-01 00:00 UTC13 位毫秒 END_TS 1704067200000 # 2024-01-01 00:00 UTC SAVE_PATH eth_usdt_swap_4h_2023.csv market_api MarketAPI(flag0)2. 循环分页拉取历史数据def fetch_history(inst_id, bar, start_ts, end_ts): rows [] cursor end_ts # 只取 ts cursor 的 K 线 while cursor start_ts: result market_api.get_history_candlesticks( instIdinst_id, barbar, aftercursor, limit100) if result[code] ! 0: raise RuntimeError(fAPI 错误 {result[code]}: {result[msg]}) batch result[data] if not batch: # 没有更早的数据结束 break rows.extend(batch) cursor int(batch[-1][0]) - 1 # 回退 1ms防止边界重复 time.sleep(0.3) # 压到 20 次/2s 限频之下 return rows raw_rows fetch_history(INST_ID, BAR, START_TS, END_TS) print(f共拉取 {len(raw_rows)} 条)3. 转 DataFrame 并清洗def to_dataframe(raw_rows): df pd.DataFrame(raw_rows, columns[ ts, open, high, low, close, vol, volCcy, volCcyQuote, confirm]) df[datetime] pd.to_datetime(df[ts], unitms) # 行情字段全是字符串统一转 float 才能进回测 for col in [open, high, low, close, vol, volCcy, volCcyQuote]: df[col] df[col].astype(float) # 接口倒序返回按时间升序重排并去重 return (df.drop_duplicates(subsetts) .sort_values(ts) .reset_index(dropTrue)) kline_df to_dataframe(raw_rows) kline_df.to_csv(SAVE_PATH, indexFalse)4. 校验输出结果bar_ms 4 * 3600 * 1000 # 4H 换算成毫秒 gap kline_df[ts].diff().dropna() print(行数:, len(kline_df)) # 预期 2190 print(时间范围:, kline_df[datetime].min(), →, kline_df[datetime].max()) print(间隔异常(非4H):, int((gap ! bar_ms).sum())) print(重复行数:, int(kline_df[ts].duplicated().sum())) 正常输出行数约 2190时间范围从 2023-01-01 00:00 到 2023-12-31 20:00间隔异常 0重复行数 0。行数明显偏少通常是时间窗截断回去核对 START_TS 和 END_TS间隔异常多说明中间批次漏拉检查循环是否被限频打断。修复 51001/50011 报错与常见踩坑1. 修复 51001 参数无效报错现象get_history_candlesticks 传limit1000返回 code 51001。根因history-candles 单次上限是 100candles 端点也才 3001000 哪都不行。一行修复limit100靠循环多翻几页。2. 修复 50011 频率超限报错现象循环中途返回 code 50011Request rate exceeds the limit。根因history-candles 每个 IP 限 20 次/2s紧凑循环不 sleep 必然撞上。一行修复请求后加time.sleep(0.3)见上文 fetch_history 里的写法。3. 修复同批数据反复返回的死循环现象每次请求都返回同样 100 条循环不退出。根因误用 before 倒推历史。before 取的是比时间戳更新的数据传最旧时间戳只会拿回同一批。一行修复after int(batch[-1][0]) - 1。4. 修复时间戳单位错误导致数据为空现象传 10 位秒级时间戳返回空数据或窗口整体错位。根因端点只认 13 位毫秒时间戳。一行修复START_TS int(pd.Timestamp(2023-01-01, tzUTC).timestamp() * 1000)。5. 修复最后一根 K 线价格漂移现象拉含当前周期的数据最后一行收盘价每次读都不一样。根因confirm0 的 K 线还没走完价格随行情实时变动。一行修复kline_df kline_df[kline_df[confirm] 1]。延伸到实时行情与成交统计实时 K 线推送okx/websocket/WsPublicAsync.py 封装了公开 WebSocketK 线主动推送免掉轮询适合做盯盘面板。市场聚合统计okx/PublicData.py 的 get_market_data_history 拉每日成交量等聚合数据okx/TradingData.py 提供 Taker 成交量、多空人数比。策略回测把存下的 CSV 喂给 backtrader 或 vectorbtts 列可直接当时间索引用。把上面的 INST_ID、BAR 和时间窗口换成你的参数再跑一遍。看到「行数: 2190间隔异常: 0」这套 python-okx 历史 K 线数据管道就通了。【免费下载链接】python-okx项目地址: https://gitcode.com/GitHub_Trending/py/python-okx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价