您现在的位置是: 首页 >  平台 平台

Upbit API历史行情数据获取教程详解

时间:2025-02-27 32人已围观

使用 Upbit API 获取历史行情数据教程

简介

Upbit 交易所是韩国领先的加密货币交易所,以其高交易量和用户友好的界面而闻名。它提供包括比特币、以太坊等多种主流加密货币以及众多山寨币的交易对,满足不同投资者的需求。对于量化交易者、学术研究人员以及软件开发者来说,Upbit API 提供了极其便捷且高效的接口,用于获取历史行情数据,进行各种复杂的数据分析和应用开发。通过历史行情数据,量化交易者可以进行回测交易策略的有效性,模拟真实市场环境,评估潜在风险和收益。研究人员能够分析市场趋势,挖掘隐藏的市场规律,为学术研究提供数据支撑。开发者则可以利用 API 构建数据驱动型应用程序,例如自动化交易机器人、投资组合管理工具等。本文将深入详细地介绍如何使用 Upbit API 获取历史行情数据,包括 API 的认证、请求参数的设置以及数据解析等关键步骤,并提供多种编程语言的代码示例(例如Python),帮助读者更快速地上手,并能独立开发和部署相关应用。

准备工作

在使用 Upbit API 之前,需要完成以下准备工作,这些准备步骤至关重要,直接关系到后续API调用的成功和账户安全:

  1. 注册 Upbit 账号: 如果您还没有 Upbit 账号,这是访问Upbit API的前提。请前往 Upbit 官方网站(通常为 upbit.com,请仔细核实网址以防钓鱼网站)注册一个账号。注册过程中,请务必使用真实有效的身份信息,并牢记您的登录密码。建议开启双重验证(2FA)以提高账户安全性。
  2. 创建 API Key: 登录 Upbit 账号后,您需要创建一个API Key才能访问API接口。请前往 Upbit 账号的 API 管理页面(通常在“我的账户”或“安全中心”等类似位置)。在创建 API Key 时,系统会要求您选择允许的权限。 请务必仔细阅读权限说明 ,理解每种权限的具体含义,并 只授予必要的权限 ,以遵循最小权限原则,确保账户安全。例如,如果您只需要查询市场行情数据,则建议只授予 "行情查询" 权限。如果需要进行交易,则需要授予交易权限,但请务必谨慎操作。API Key 包含 Access Key 和 Secret Key, Access Key 相当于用户名,用于标识您的身份;Secret Key 相当于密码,用于进行签名验证。请将 Access Key 和 Secret Key 妥善保管,切勿泄露给他人。 强烈建议将其存储在安全的地方,例如密码管理器。如果 Secret Key 泄露,请立即禁用该 API Key 并重新创建。
安装必要的库: 为了方便与 Upbit API 交互,我们需要安装一些常用的 Python 库,例如 requests 用于发送 HTTP 请求,以及 pandas 用于处理数据。可以使用以下命令安装:

bash pip install requests pandas

Upbit API 概览

Upbit API 是一套全面的接口,旨在为开发者和交易者提供访问其平台数据的能力,尤其是历史行情数据。 其中,最常用的接口之一是 Candles API,它允许用户检索指定交易对的 K 线数据,从而进行技术分析和市场趋势研究。 Candles API 根据时间粒度提供了多种类型的 K 线数据,以满足不同分析需求。

  • minute (分): 提供高分辨率的 K 线数据,包括 1 分钟、5 分钟、15 分钟、30 分钟、60 分钟以及 240 分钟的 K 线数据。 这些数据适用于短线交易者和高频交易策略,能够捕捉到市场中的细微波动。 每根 K 线代表相应时间间隔内的开盘价、最高价、最低价和收盘价。
  • day (日): 提供每日 K 线数据,显示每个交易日的开盘、最高、最低和收盘价格。 这种类型的数据对于中长期投资者来说非常有价值,可以帮助他们识别趋势和评估每日的市场表现。 日线数据还能用于分析成交量和价格之间的关系,以判断趋势的强度。
  • week (周): 提供每周 K 线数据,聚合了一周内的价格波动。 周线图能够过滤掉短期噪音,更清晰地显示中长期趋势,适用于长线投资者或趋势交易者。 周线数据可以帮助投资者识别重要的支撑位和阻力位。
  • month (月): 提供每月 K 线数据,代表了一个月内的价格波动范围。 月线数据是长期投资者分析市场趋势的重要工具,能够帮助他们评估长期的市场表现和潜在的投资机会。 月线数据通常用于识别主要趋势的反转或延续。

每个 K 线数据点包含以下关键字段,这些字段提供了关于特定时间段内市场活动的详细信息:

  • market : 明确的市场代码,用于标识特定的交易对。 例如,"KRW-BTC" 表示韩元 (KRW) 计价的比特币 (BTC) 交易对。 通过 market 代码,可以轻松定位特定的交易品种。
  • candle_date_time_utc : K 线开始的时间,以协调世界时 (UTC) 表示。 使用 UTC 时间标准可以确保数据在不同时区之间的一致性。
  • candle_date_time_kst : K 线开始的时间,以韩国标准时间 (KST) 表示。 提供 KST 时间方便韩国本地用户使用。
  • opening_price : 该时间段内的开盘价格,表示交易开始时的价格水平。 开盘价是分析价格波动的重要参考点。
  • high_price : 该时间段内的最高价格,代表交易期间达到的最高价格水平。 最高价反映了市场的潜在上涨动力。
  • low_price : 该时间段内的最低价格,表示交易期间达到的最低价格水平。 最低价反映了市场的潜在下跌压力。
  • trade_price : 该时间段内的收盘价格,代表交易结束时的价格水平。 收盘价是评估市场表现的关键指标。
  • timestamp : 自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的时间戳,以毫秒为单位。 时间戳是一种标准的计算机时间表示方法,方便数据处理和排序。
  • candle_acc_trade_price : 该时间段内的累计交易金额,代表了市场活跃程度的重要指标。 较高的累计交易金额通常伴随着更强的价格波动。
  • candle_acc_trade_volume : 该时间段内的累计交易量,代表了交易的股票或合约数量。 交易量是验证价格趋势的重要依据。
  • unit : 仅适用于分钟 K 线数据,表示 K 线的单位时间长度(例如,1、5、15、30、60 或 240 分钟)。 该字段明确了分钟 K 线的周期长度。

使用 Candles API 获取历史行情数据

在加密货币交易和分析中,历史行情数据至关重要。通过 Candles API (也称为 K 线 API),开发者和交易者可以获取指定交易对在特定时间范围内的开盘价、最高价、最低价、收盘价以及交易量等关键信息。这些数据可以用于技术分析、算法交易策略回测、以及构建自定义的图表和指标。

以下代码示例演示如何使用 HTTP 请求调用交易所或数据提供商提供的 Candles API,获取 BTC/KRW (比特币/韩元) 交易对的 1 分钟 K 线数据。 此示例使用了 Python 的 `requests` 库发送 HTTP 请求,并使用 `pandas` 库处理和展示返回的数据。 您需要根据实际的 API 端点和参数进行调整。不同的交易所和数据提供商可能有不同的 API 调用方式和数据格式。

需要注意的是,在使用 Candles API 时,需要考虑以下因素:

  • API 密钥和权限: 许多交易所或数据提供商要求用户提供 API 密钥才能访问数据。您需要注册并获取相应的 API 密钥,并确保您拥有访问历史数据的权限。
  • API 调用频率限制: 为了防止滥用,大多数 API 都设置了调用频率限制。您需要根据 API 文档了解这些限制,并合理控制您的 API 调用频率,以避免被限制访问。
  • 数据格式: 不同的 API 返回的数据格式可能不同,常见的格式包括 JSON 和 CSV。您需要了解 API 返回的数据格式,并使用相应的库进行解析。
  • 时间戳: 历史行情数据通常包含时间戳信息,表示 K 线对应的时间段。您需要了解 API 使用的时间戳格式(例如 Unix 时间戳),并根据需要进行转换。
  • 数据质量: 历史行情数据的质量至关重要。您需要选择可靠的数据提供商,并验证数据的准确性和完整性。

import requests

import pandas as pd

Upbit API 接口

Upbit API 的基础 URL 地址如下,所有 API 请求都将基于此地址构建。

base_url = "https://api.upbit.com/v1"

请注意,所有请求都必须以 https 协议开始,以确保数据传输的安全性。 在构建 API 请求时,请务必将此基础 URL 作为前缀添加到特定的 API 路径上。 例如,要获取市场代码列表,完整的 API 端点将是 https://api.upbit.com/v1/market/all

使用 API 前,强烈建议查阅 Upbit 官方 API 文档,其中包含了关于可用端点、请求参数、响应格式以及速率限制等详细信息。 遵循官方文档的指南有助于确保您的应用程序能够正确地与 Upbit API 交互,并避免潜在的错误或限制。

API Key (请替换成您自己的 API Key)

在使用Upbit API之前,您需要在Upbit交易所创建一个API Key,并妥善保管。请务必不要将您的API Key泄露给他人,以防止您的账户被盗用。Access Key和Secret Key是您访问Upbit API的凭证。

access_key = "YOUR_ACCESS_KEY" secret_key = "YOUR_SECRET_KEY"

以下代码演示了如何使用Python获取Upbit历史K线数据。

def get_candles(market, interval, count=200, to=None): """ 获取 Upbit 历史 K 线数据

此函数通过Upbit API获取指定交易对和时间间隔的历史K线数据,并将其转换为pandas DataFrame格式。此函数可以用于分析历史价格走势,制定交易策略。

Args: market: 市场代码 (例如: KRW-BTC)。指定要查询的交易对,如比特币/韩元。 interval: K 线类型 (minute1, minute5, minute15, minute30, minute60, minute240, day, week, month)。支持分钟级别(1, 5, 15, 30, 60, 240分钟),天级别,周级别和月级别。 count: 返回 K 线数量 (最大 200)。单次API调用最多返回200条K线数据。 to: 查询结束时间 (UTC 时间,格式: YYYY-MM-DDTHH:MM:SSZ)。指定查询的结束时间,用于分页获取历史数据。如果未指定,则返回最新的K线数据。

Returns: pandas.DataFrame: 包含 K 线数据的 DataFrame。DataFrame包含开盘价,最高价,最低价,收盘价,成交量等信息。 """ url = f"{base_url}/candles/{interval}" params = { "market": market, "count": count } if to: params["to"] = to

在发送API请求时,需要设置请求头,指定Accept为application/,表明期望返回JSON格式的数据。

headers = {"Accept": "application/"}

使用requests库发送GET请求到Upbit API,并传递必要的参数和请求头。如果API返回错误状态码,则抛出HTTPError异常。

response = requests.get(url, params=params, headers=headers) response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)

将API返回的JSON数据转换为pandas DataFrame。确保response.text返回的是有效的JSON格式数据。

data = response.() df = pd.DataFrame(data) return df

以下是主程序,演示了如何使用 get_candles 函数获取BTC/KRW交易对的1分钟K线数据,并将数据保存到CSV文件中。

if __name__ == '__main__': # 获取 BTC/KRW 交易对的 1 分钟 K 线数据 market = "KRW-BTC" interval = "minutes/1" count = 200

获取第一次数据,即最新的200条K线数据。

# 获取第一次数据 df = get_candles(market, interval, count) print(f"获取到 {len(df)} 条数据")

为了获取更多的数据,可以使用循环,每次获取200条数据,直到获取到1000条数据。每次循环都需要获取上次获取的数据中最旧的时间戳,并将其作为参数传递给 get_candles 函数,以便获取更早的数据。

# 获取更多数据,直到获取到 1000 条数据 all_data = df while len(all_data) < 1000: # 获取最旧的一条数据的时间戳 oldest_timestamp = all_data['candle_date_time_utc'].min() print(f"继续获取数据,截止到: {oldest_timestamp}")

# 获取之前的数据
new_data = get_candles(market, interval, count, to=oldest_timestamp)

# 去重 (防止重复数据)
new_data = new_data[~new_data['candle_date_time_utc'].isin(all_data['candle_date_time_utc'])]

# 将新数据添加到总数据中
all_data = pd.concat([new_data, all_data], ignore_index=True)
print(f"总共获取到 {len(all_data)} 条数据")

# 如果没有更多数据,则退出循环
if len(new_data) == 0:
   print("没有更多数据了")
  break

打印DataFrame的前几行数据,以便查看数据的格式和内容。

# 打印 DataFrame print(all_data.head())

将获取到的数据保存到CSV文件中,方便后续分析和使用。 index=False 表示不保存DataFrame的索引列。

# 将数据保存到 CSV 文件 all_data.to_csv("upbit_btc_krw_1min.csv", index=False) print("数据已保存到 upbit_btc_krw_1min.csv")

代码解释:

  1. 导入库: 程序伊始,我们需导入必要的Python库。 requests 库是发送HTTP请求的核心,用于与Upbit API进行交互,获取所需的市场数据。 pandas 库则提供强大的数据处理能力,将API返回的JSON数据转换为结构化的DataFrame格式,便于后续的分析和存储。
  2. 定义 API endpoint: 为了简化代码维护和提高可读性,我们定义了Upbit API的基本URL。这个URL是所有API请求的基地址,通过拼接不同的路径和参数,可以访问不同的API端点,如获取K线数据、交易信息等。
  3. 定义 API Key: Upbit API需要身份验证才能访问。您需要将 YOUR_ACCESS_KEY YOUR_SECRET_KEY 替换为您在Upbit账户中申请到的API Key。ACCESS_KEY用于标识您的身份,SECRET_KEY用于签名请求,确保请求的安全性。请妥善保管您的API Key,避免泄露。
  4. 定义 get_candles 函数: get_candles 函数是获取Upbit历史K线数据的关键。它接收四个参数: market (市场代码,例如"KRW-BTC"), candle_type (K线类型,例如"minutes/1"表示1分钟K线), count (返回K线数量,默认为200), to (查询结束时间,默认为当前时间)。函数返回包含历史K线数据的pandas DataFrame。
  5. 构造 URL 和参数: 根据传入的参数,函数会动态构造API请求的URL和参数。URL由基本URL、API端点和参数组成。参数包括市场代码、K线类型、返回数量和查询结束时间。URL的构造确保了API请求的正确性和灵活性。
  6. 发送 HTTP 请求: 利用 requests.get 函数,程序向Upbit API发送HTTP GET请求。GET请求用于获取服务器上的资源,这里我们用来获取历史K线数据。 requests.get 函数会返回一个响应对象,其中包含服务器返回的数据和状态码。
  7. 处理响应: 程序会检查API的响应状态码,如果状态码为200,表示请求成功。然后,将API返回的JSON数据解析为Python字典或列表,并将其转换为pandas DataFrame。DataFrame是一种二维表格数据结构,非常适合用于分析和处理K线数据。
  8. 主程序:
    • 定义市场代码和 K 线类型。例如, market = "KRW-BTC" 表示韩国交易所的比特币交易对, candle_type = "minutes/1" 表示1分钟K线。这些参数决定了程序获取哪些市场和时间粒度的数据。
    • 调用 get_candles 函数获取数据。首次调用时, to 参数为空,表示获取最近的K线数据。后续调用时, to 参数会被设置为之前获取的最旧K线数据的UTC时间,以便获取更早的数据。
    • 循环获取更多数据,直到达到所需的数量或者没有更多数据为止。由于Upbit API每次只能返回有限数量的K线数据,因此需要循环调用API,每次获取一定数量的数据,直到获取到足够的数据或者API不再返回数据为止。每次循环都将之前获取的最旧K线数据的 UTC 时间作为 to 参数,以便获取更早的数据。
    • 去重,避免重复数据。由于循环调用API可能会导致重复获取数据,因此需要对获取到的数据进行去重处理。可以使用pandas DataFrame的 drop_duplicates 方法去除重复的K线数据。
    • 将数据保存到 CSV 文件。程序将获取到的K线数据保存到CSV文件中。CSV文件是一种常用的数据存储格式,可以使用Excel或其他数据分析工具打开和分析。数据保存到CSV文件后,可以方便地进行后续的量化分析和策略回测。

注意事项:

  • Upbit API 设有严格的访问频率限制,旨在保护服务器稳定性和防止滥用。务必仔细阅读 Upbit 官方 API 文档,了解不同接口的请求频率限制。务必在程序中实现请求频率控制机制,例如使用令牌桶算法或漏桶算法,以避免因超出频率限制而被临时或永久封禁 API 访问权限。请务必监控您的 API 使用情况,以便及时发现并解决潜在的频率超限问题。
  • API Key 是访问 Upbit API 的身份凭证,拥有极高的权限。请将其视为银行密码一样重要,采取一切必要措施进行安全保管。切勿将 API Key 明文存储在代码中,避免将其提交到公共代码仓库,例如 GitHub。强烈建议使用环境变量或专门的密钥管理工具(例如 HashiCorp Vault)来存储和管理 API Key。定期轮换 API Key 也是一种提升安全性的有效手段。一旦发现 API Key 泄露,请立即前往 Upbit 平台重置 API Key。
  • count 参数用于指定每次 API 请求返回的数据条数,Upbit 限制其最大值为 200。若您需要获取超过 200 条的数据,必须采用分页查询的方式。使用 to 参数可以指定查询的时间范围的结束时间。首次查询时,您可以设置 to 参数为一个较晚的时间点。后续查询中,将上一次查询结果中最旧的一条数据的交易时间作为下一次查询的 to 参数,以此循环迭代,直到获取到所需的所有数据。请注意处理时区问题,确保时间参数的准确性。还可以使用 timestamp cursor 参数进行分页,具体用法请参考 Upbit API 文档。
  • 提供的代码示例旨在帮助您快速入门 Upbit API 的使用。您可以根据实际业务需求,对代码进行高度定制化修改和扩展。建议您添加完善的错误处理机制,例如使用 try-except 语句捕获可能出现的异常,并进行相应的处理,例如重试请求、记录错误日志等。对于需要高并发访问的场景,可以考虑使用多线程、多进程或异步编程等技术,并发请求 API,从而显著提高数据获取的效率。但是,请务必注意控制并发数量,避免对 Upbit 服务器造成过大的压力。
  • 从 Upbit API 获取的原始数据可能包含缺失值、异常值、重复数据等问题,直接使用未经处理的数据进行分析或交易可能会导致错误的结论或决策。在实际应用中,务必对数据进行清洗和预处理。对于缺失值,可以采用填充、删除或插值等方法进行处理。对于异常值,可以使用统计方法(例如标准差、四分位距)或机器学习方法(例如聚类、孤立森林)进行检测和处理。对于重复数据,可以使用去重算法进行处理。还可能需要进行数据类型转换、数据格式化、数据标准化等操作,以满足后续分析或交易的需求。
  • response.raise_for_status() 是一个非常有用的方法,可以自动检查 HTTP 响应状态码。当响应状态码表示错误时(例如 400、401、403、404、500 等),该方法会抛出一个 HTTPError 异常。通过使用 response.raise_for_status() ,您可以更方便地处理 API 请求过程中出现的各种异常情况,而无需手动检查状态码。建议在每次 API 请求之后都调用该方法,以确保请求成功。您可以使用 try-except 语句捕获 HTTPError 异常,并进行相应的处理,例如重试请求、记录错误日志、发送告警通知等。

本文详细介绍了如何使用 Upbit API 获取历史行情数据,并提供了一个完整的代码示例。希望本文能够帮助读者快速上手 Upbit API,并应用于实际的项目中。