Python使用CryptoCompare API快速入门指南
今天我们将快速了解如何利用CryptoCompare API对加密货币价格进行自己的数据分析。
我们将介绍一些您可能想要使用的Python包,并进行一些初步的可视化。
无论您是想监控当前的投资组合,获得新投资的市场见解,还是只想在大量数据集中找到有趣的东西,本指南都将使用CryptoCompare广泛的市场数据来开发您的第一个程序。
Python是一种可访问的编程语言,在数据科学应用程序方面也越来越成为行业标准。我们使用它是因为它有各种各样的数据科学和机器学习包。
REST API?JSON?
CryptoCompare以REST API的形式提供市场数据,这基本上只是将数据从我们传输到您的特定方法。您使用特定的URL请求某个数据,我们通过向您的计算机发送该数据来做出响应。
数据以JSON格式返回,JSON格式是一种数据格式,既易于阅读,也可由机器理解。
入门 - 获取一些数据
从API获取数据只需几行代码。我们将使用三个Python库:
requests - 此包非常适合处理REST API和JSON对象
pandas - 在Python中很难使用JSON对象,因此我们将数据存储在易于操作的pandas DataFrame对象中
matplotlib - 首选的Python图形包
API文档,可从https://min-api.cryptocompare.com/获取。在这里,我们可以选择我们想要的数据类型,并查看我们可以在URL中提供的参数来更改返回数据的详细信息。
要更改查询,我们可以按顺序向URL添加参数,使用“&”分隔参数。在上面的示例中,我们查看历史每日价格数据,如果我们只想查看Bitfinex交易所,我们会在URL中添加“&e = Bitfinex”。
让我们继续获取这些数据,Python代码如下:
url = "https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=10&e=Bitfinex"
f = requests.get(url)
ipdata = f.json()
df = pd.DataFrame(ipdata['Data'])
df现在包含了我们想要的数据的整洁的pandas DataFrame。
一个简单的应用
看到获取数据是多么容易,我们现在将通过几个可以实例进行探索。如何随着时间的推移看coin币的价格。CryptoCompare列出超过5000种不同的硬币,因此您可以选择。
首先,我们可以将API数据检索脚本转换为函数,Python代码如下。
def get_data(date):
""" Query the API for 2000 days historical price data starting from "date". """
url = "https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=2000&toTs={}".format(date)
r = requests.get(url)
ipdata = r.json()
return ipdata
我们希望从特定日期开始获取价格数据。因为每个查询限制2000个数据,所以我们编写一个函数来重复调用API,我们可以检索最早的日期,直到达到所需的日期。如果您愿意,使用此功能可以获得自coin交易开始以来的每小时价格数据。
def get_df(from_date, to_date):
""" Get historical price data between two dates. """
date = to_date
holder = []
# While the earliest date returned is later than the earliest date requested, keep on querying the API
# and adding the results to a list.
while date > from_date:
data = get_data(date)
holder.append(pd.DataFrame(data['Data']))
date = data['TimeFrom']
# Join together all of the API queries in the list.
df = pd.concat(holder, axis = 0)
# Remove data points from before from_date
df = df[df['time']>from_date]
# Convert to timestamp to readable date format
df['time'] = pd.to_datetime(df['time'], unit='s')
# Make the DataFrame index the time
df.set_index('time', inplace=True)
# And sort it so its in time order
df.sort_index(ascending=False, inplace=True)
return df
剩下要做的就是使用这些函数来查询API并生成数据图。在这里,我们可以看到2018年1月的峰值,比特币价格达到20,000美元。
fig, ax = plt.subplots(figsize=(15, 10))
ax.plot(df[['low', 'close', 'high']])
ax.set_ylabel('BTC Price (USD)')
ax.set_xlabel('Date')
ax.legend(['Low', 'Close', 'High']);
进一步的应用
假设你想分散你的持有,并且担心coin之间的价格相关性。我们能确定哪些coin的价格变动最独立吗?
我们需要一些硬币的价格数据——我选择了比特币、Ethereum、Dogecoin、Dash和Tether。为了进行这个探索,让我们使用每日定价数据(在查询多个月的数据时避免API利率限制),我们将从2018年1月1日开始研究价格的相关性。
我们对以前的函数做了一些变化。主要的变化是我们以前定义的函数现在让我们指定我们想要的是每小时还是每天的数据,并且只返回收盘价。
def get_df_spec(time_period, coin, from_date, to_date):
""" Get historical price data between two dates. If further apart than query limit then query multiple times. """
date = to_date
holder = []
while date > from_date:
# Now we use the new function to query specific coins
data = get_data_spec(coin, date, time_period)
holder.append(pd.DataFrame(data['Data']))
date = data['TimeFrom']
df = pd.concat(holder, axis = 0)
df = df[df['time']>from_date]
df['time'] = pd.to_datetime(df['time'], unit='s')
df.set_index('time', inplace=True)
df.sort_index(ascending=False, inplace=True)
# And just keep the close price, with the column heading as the name of the coin.
df.rename(columns={'close':coin}, inplace=True)
return df[coin]
因此,我们继续获取定价数据,并寻找回报率的相关性,Python代码如下:
coins = ['BTC', 'ETH', 'DOGE', 'USDT', 'DASH']
holder = []
from_date = 1514764800 # 2018 New Year
to_date = 1536081800 # Today
time_period = 'histoday'
for coin in coins:
holder.append(get_df_spec(time_period, coin, from_date, to_date))
df = pd.concat(holder, axis = 1)
df = df.divide(df.shift())-1 # Get rate of return
correlations = df.corr() # Get correlation matrix
看起来大多数硬币的价格都非常强烈相关!正如你可能预料的那样,Tether将自己推向稳定的货币市场。
这些相关性是过去几个月。它们今天仍适用吗?通过一些调整,我们可以看看这些硬币在上周的每小时价格的相关性:
holder = []
from_date = 1535480760 # Last week
to_date = 1536081800 # Today
time_period = 'histohour'
for coin in coins:
holder.append(get_df_spec(time_period, coin, from_date, to_date))
df = pd.concat(holder, axis = 1)
df = df.divide(df.shift())-1
import seaborn as sns
sns.heatmap(df.corr(), annot=True, cmap="YlGnBu", square = True);
这些试探性的探索可能会提出比他们回答更多的问题。这些相关性是否仅对其每日/每小时时段有效?(我检查过,每日相关性与每小时相关性相同)。但对于分钟数据,它会是真的吗?我们能否了解价格变化在加密市场中的传播速度有多快?是否只是比特币价格导致价格波动或其他网络上的公告会影响比特币价格?
嗯,有每日,每小时和每分钟的价格数据,甚至是新闻API,所以你可以找到。