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()
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")
参考
この記事が気に入ったらサポートをしてみませんか?