pythonでbinanceのAPIからビットコインの価格を取得する

ろうそく足の取得

ccxtライブラリを使います。下ではbinanceでのBTC/USDTペアの日足を3年分取得しています。

import datetime
from time import sleep
import ccxt 
import pandas as pd
from pandas import Series, DataFrame

# binanceからろうそく足を取得する
def get_past_data_from_binance(candles_num, end_day, symbol, barsymbol, bar):
   binance = ccxt.binance()
   data_n = 500 #binanceで一度にとれるろうそく足の本数
   data_m = (candles_num + data_n - 1)// data_n
   data_l = candles_num % data_n
   pastdata = pd.DataFrame([])
   for i in range(0, data_m):
       sleep(0.01)
       period = data_l + data_n * (data_m - i - 1)
       data = get_past_data(binance, symbol, barsymbol, bar, period, end_day)
       data.index = list(range(len(pastdata), len(pastdata) + len(data)))
       pastdata = pd.concat([pastdata, data])
   return pastdata
def get_past_data(exchange, symbol, barsymbol, bar, period, end_day=None):
   while(True):
       try:
           if not end_day:
               timest = exchange.fetch_ticker(symbol)['timestamp']
           else:
               timest = day_to_unixtime(end_day)
           timest = timest - period*bar*60*1000
           candles = exchange.fetch_ohlcv(symbol, timeframe=barsymbol, since=timest, limit=min(500,period))
           pd_candles = pd.DataFrame(candles)
           break
       except Exception as e:
           print(e)
           print("データの取得に失敗しました")
           sleep(5)
           continue
   return pd_candles
def day_to_unixtime(date_str):
   # date_str = '2018-02-01 12:30:00' or date_str = '2018-02-01'
   l = len(date_str.split())
   if l == 1:
       date_str = date_str + " 00:00:00"
   time = pd.to_datetime(date_str)
   return int(time.timestamp() * 1000)
# 取得するろうそく足の数
candles_num = 365*3
# 取得期間の終日
end_day = "2021-06-30"
# 通貨ペア
symbol = "BTC/USDT"
# ろうそく足の期間
barsymbol = "1d"
#ろうそく足(分)
bar = 60*24
#ろうそく足の取得
candles = get_past_data_from_binance(candles_num, end_day, symbol, barsymbol, bar)

グラフの描写

import matplotlib.pyplot as plt
import numpy as np

timestamp = candles[0].values.tolist()
date = [datetime.datetime.fromtimestamp(timestamp[i]/1000) for i in range(len(timestamp))]
price = candles[4].astype(float)

fig = plt.figure()
x = np.arange(len(date))
ax = fig.add_subplot(1,1,1)
ax.plot(x,price,label='price')
ax.set_ylabel("dollar")
ax.set_xlabel("datetime")
ax.legend()
ax.grid(True)
plt.xticks(x[::90], date[::90], rotation=90)
plt.tight_layout()
plt.show()

画像1

csvに出力

candles.index = pd.to_datetime(date) # DatatimeIndexに変換してindexに指定
candles = candles[[1,2,3,4,5]] # 必要なカラムだけにする
candles.columns = ['Open', 'High', 'Low', 'Close', 'Volume']
candles.to_csv("candles.csv")

参考


この記事が気に入ったらサポートをしてみませんか?