【问题标题】:How do I get all the prices history with binance API for a crypto using Python?如何使用 Python 获取币安 API 的所有价格历史记录?
【发布时间】:2021-05-23 11:37:42
【问题描述】:

我一直在使用这个脚本通过 Binance API 和这个脚本从一些加密货币中获取价格: https://steemit.com/python/@marketstack/how-to-download-historical-price-data-from-binance-with-python

问题在于,使用此脚本我无法控制日期范围:例如,我想选择 2015 年 12 月至 2020 年 12 月之间的期间范围,或者我想要任何加密货币交易的第一天的每日价格...等等。

所以我与你分享我正在使用的代码(从 steemit 代码复制并稍作修改) 我该怎么做?

# https://steemit.com/python/@marketstack/how-to-download-historical-price-data-from-binance-with-python###

import requests 
import json 
import pandas as pd 
import numpy as np  
import datetime as dt  

frequency = input("Please enter the frequency (1m/5m/30m/.../1h/6h/1d/ :  ")

def get_bars(symbol, interval=frequency):
    root_url = 'https://api.binance.com/api/v1/klines'
    url = root_url + '?symbol=' + symbol + '&interval=' + interval
    data = json.loads(requests.get(url).text)
    df = pd.DataFrame(data)
    df.columns = ['open_time',
                  'o', 'h', 'l', 'c', 'v',
                  'close_time', 'qav', 'num_trades',
                  'taker_base_vol', 'taker_quote_vol', 'ignore']
    df.index = [dt.datetime.fromtimestamp(x / 1000.0) for x in df.close_time]
    return df

btcusdt = get_bars('BTCUSDT')
ethusdt = get_bars('ETHUSDT')


df0=pd.DataFrame(btcusdt)
df0.to_csv('_btcusdt.csv')

df1=pd.DataFrame(ethusdt)
df1.to_csv('_ethusdt.csv')

谁能帮我优化一下?

【问题讨论】:

    标签: python api cryptocurrency binance


    【解决方案1】:

    我在 Binance 文档中使用它:https://python-binance.readthedocs.io/en/latest/binance.html?highlight=get_historical_klines#binance.client.Client.get_historical_klines

    import os
    from binance.client import Client
    import pandas as pd
    import datetime, time
    
    def GetHistoricalData(self, howLong):
        self.howLong = howLong
        # Calculate the timestamps for the binance api function
        self.untilThisDate = datetime.datetime.now()
        self.sinceThisDate = self.untilThisDate - datetime.timedelta(days = self.howLong)
        # Execute the query from binance - timestamps must be converted to strings !
        self.candle = self.client.get_historical_klines("BNBBTC", Client.KLINE_INTERVAL_1MINUTE, str(self.sinceThisDate), str(self.untilThisDate))
    
        # Create a dataframe to label all the columns returned by binance so we work with them later.
        self.df = pd.DataFrame(self.candle, columns=['dateTime', 'open', 'high', 'low', 'close', 'volume', 'closeTime', 'quoteAssetVolume', 'numberOfTrades', 'takerBuyBaseVol', 'takerBuyQuoteVol', 'ignore'])
        # as timestamp is returned in ms, let us convert this back to proper timestamps.
        self.df.dateTime = pd.to_datetime(self.df.dateTime, unit='ms').dt.strftime(Constants.DateTimeFormat)
        self.df.set_index('dateTime', inplace=True)
    
        # Get rid of columns we do not need
        self.df = self.df.drop(['closeTime', 'quoteAssetVolume', 'numberOfTrades', 'takerBuyBaseVol','takerBuyQuoteVol', 'ignore'], axis=1)
    
        print(self.df)
    

    我希望这对某人有所帮助。

    (请注意这个方法是从我的一个类中删除的,所以你可能会摆脱所有的自我),并且你需要在之前设置你的客户端

    client = Client(api_key, api_secret)

    当然欢迎任何改进!

    【讨论】:

      【解决方案2】:

      这是我使用的一个功能。 开始和结束是 Unix 时间戳格式的日期。区间为图区间。

      请记住,币安在 2015 年 12 月不存在 :-)

      def get_klines_iter(symbol, interval, start, end, limit=5000):
          df = pd.DataFrame()
          startDate = end
          while startDate>start:
              url = 'https://api.binance.com/api/v3/klines?symbol=' + \
                  symbol + '&interval=' + interval + '&limit='  + str(iteration)
              if startDate is not None:
                  url += '&endTime=' + str(startDate)
              
              df2 = pd.read_json(url)
              df2.columns = ['Opentime', 'Open', 'High', 'Low', 'Close', 'Volume', 'Closetime', 'Quote asset volume', 'Number of trades','Taker by base', 'Taker buy quote', 'Ignore']
              df = pd.concat([df2, df], axis=0, ignore_index=True, keys=None)
              startDate = df.Opentime[0]   
          df.reset_index(drop=True, inplace=True)    
          return df 
      

      【讨论】:

      • 用 get_klines_iter(symbol....) 不起作用 T_T 问题
      • 改成:def get_klines_iter(symbol, interval, start, end, limit=5000):
      【解决方案3】:
      from binance.client import Client
      from datetime import datetime
      import pandas as pd
      
      def GetHistoricalData(symbol, interval, fromDate, toDate):
          klines = client.get_historical_klines(symbol, interval, fromDate, toDate)
          df = pd.DataFrame(klines, columns=['dateTime', 'open', 'high', 'low', 'close', 'volume', 'closeTime', 'quoteAssetVolume', 'numberOfTrades', 'takerBuyBaseVol', 'takerBuyQuoteVol', 'ignore'])
          df.dateTime = pd.to_datetime(df.dateTime, unit='ms')
          df['date'] = df.dateTime.dt.strftime("%d/%m/%Y")
          df['time'] = df.dateTime.dt.strftime("%H:%M:%S")
          df = df.drop(['dateTime', 'closeTime', 'quoteAssetVolume', 'numberOfTrades', 'takerBuyBaseVol','takerBuyQuoteVol', 'ignore'], axis=1)
          column_names = ["date", "time", "open", "high", "low", "close", "volume"]
          df = df.reindex(columns=column_names)
          return df
          
      api_key = ""
      api_secret = ""
      client = Client(api_key, api_secret)
      
      fromDate = str(datetime.strptime('19/11/2021', '%d/%m/%Y'))
      toDate = str(datetime.strptime('20/11/2021', '%d/%m/%Y'))
      symbol = "BTCUSDT"
      interval = Client.KLINE_INTERVAL_1MINUTE
      df = GetHistoricalData(symbol, interval, fromDate, toDate)
      df
      

      【讨论】:

      • 感谢您的回答,它有效,赞成
      猜你喜欢
      • 1970-01-01
      • 2022-08-07
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2021-01-26
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多