当前位置: 首页 > 科技观察

使用Python轻松访问Binance历史交易

时间:2023-03-13 07:53:25 科技观察

该过程并不总是那么简单,因为某些策略需要一定水平的技术数据,而其他策略可能只需要一个小时,而基础设施、可用性和连接性等元素,可能因数据类型而异。但是为什么这篇文章只是关于获取“交易”数据,我们为什么要使用BinanceAPI?您可能对我的文章内容有一些疑问。数据频率和平衡我会说交易数据端点在99.99%的交易所中大多可用。它是细粒度的,提供了足够的细节(在某些非常具体的情况下)来回测高频交易(HFT)策略,并且可以用作OHLC蜡烛(如果需要,1秒到24小时或更长)的基础。交易数据是通用的,允许对不同频率的策略进行大量实验。为什么选择币安?那只是因为它是我由于数量庞大而倾向于回溯的交易所之一。我们要编写的代码我们将创建一个Python脚本,它接收配对符号、开始日期和结束日期作为命令行参数。它将包含所有交易的CSV文件输出到磁盘。该过程可以通过以下步骤详细描述:1.解析symbol、starting_date和ending_date参数。2、获取开始日期发生的第一笔交易,获取第一笔交易trade_id。3.循环获取每个请求1000个交易(BinanceAPI限制),直到到达ending_date。4.最后将数据保存到磁盘。例如,我们将其保存为CSV,但您还有其他选择,不一定要保存为CSV。5.我们将使用pandas、requests、time、sys和datetime。在代码片段中,不会显示错误验证,因为它不会为描述添加任何值。编码时间该脚本将使用以下参数:1.symbol:交易对的符号,由Binance定义。可以在此处查询,也可以从币安Web应用程序的URL中复制(不包括_字符)。-starting_date和ending_date:不言自明。预期格式为mm/dd/yyyy,或Pythonlang中的%m/%d/%Y。为了获取参数,我们将使用内置函数sys(这里没什么特别的),为了解析日期,我们将使用datetime库。我们将添加一天并减去一微秒,以便ending_date时间部分始终为23:59:59.999,这使得获取当前日期间隔更加实用。获取交易使用Binance的API和aggTrades端点,我们可以在一个请求中获取多达1000笔交易,如果我们使用开始和结束参数,它们之间的间隔最多为一小时。在使用时间间隔获取失败后(在某些时候,流动性会变得疯狂,我会失去一些宝贵的交易),我决定尝试from_id策略。aggTrades将选择的端点,因为它返回压缩交易。这样,我们就不会丢失任何有价值的信息。获取压缩的总交易。从同一订单以相同价格同时执行的交易将汇总数量。from_id策略是这样的:我们要通过发送到结束点的日期区间来获取第一笔交易的starting_date。之后,我们将从第一个获取的交易ID开始获取1000个交易。然后,我们将检查最后一笔交易是否发生在我们的ending_date之后。如果是这样,我们已经迭代了所有时间段并且可以将结果保存到文件中。否则,我们更新from_id变量以获取最后一个交易id,并再次开始循环。获取第一个交易号首先,我们创建一个new_end_date。那是因为我们通过传递startTime和endTime参数来使用aggTrades。现在,我们只需要知道该周期的第一笔交易号,所以我们将增加60秒。在非流动性货币对中,可以更改此参数,因为无法保证交易会在请求的第一天发生。然后使用我们的辅助函数解析日期,使用calendar.timegm函数将日期转换为Unix毫秒表示。timegm函数是首选函数,因为它将日期保留为UTC。对请求的响应是按以下格式按日期排序的交易对象列表:因此,由于我们需要第一个交易ID,因此我们将返回该response[0]["a"]值。主循环现在我们有了第一个交易ID,我们可以一次提取1000个交易,直到到达ending_date。下面的代码将在我们的主循环中被调用。它将使用from_id参数执行我们的请求,删除startDate和endDate参数。现在,这是我们的主循环,它将执行请求并创建我们的DataFrame。我们检查current_time是否包含日期大于to_date的最新获取的交易,如果是这样,那么我们:使用from_id参数获取交易使用从最新交易获取的信息更新from_id和current_time参数transactions与我们之前的交易DataFrame使用睡眠,这样Binance就不会给我们一个429HTTP响应。清洗并保存组装好的DataFrame后,我们需要进行简单的数据清洗。我们将删除重复trim的交易和在to_date之后发生的交易(我们遇到这个问题是因为我们正在获取1000笔交易中的大部分,因此我们预计会在目标结束日期之后执行一些交易)。我们可以封装我们的trim函数:并执行我们的数据清理:我们现在可以使用to_csv方法将其保存到文件中:我们还可以使用其他数据存储机制,例如Arctic。最后:验证您的数据在使用交易策略时,我们相信我们的数据是很重要的。我们可以通过应用以下验证轻松地使用获取的交易数据执行此操作:在代码片段中,我们将DataFrame转换为NumPy数组并逐行迭代,检查交易ID是否每行递增1。币安交易ID是为每个符号递增编号和创建的,因此很容易验证数据是否正确。PS:创建成功交易策略的第一步是拥有正确的数据。