链上数据知多少系列之一:如何获得链上数据
链上数据之于区块链,就像基本面数据之于股票市场,是做加密资产量化时绕不开的信息,它可以成为因子策略中的重要因子。 链上数据泛指所有发生在区块链上的交易信息。区块链本质上是一个公开的分布式数据库,所有的链上交易都会被保存,具有公开透明、不可篡改等特点。因此,链上数据不可造假,公开透明。 本文将简要介绍主要有哪些链上数据提供商,并以Glassnode为例展示如何使用Python下载数据,并以「活跃地址交易调整后价格」指标为例展示链上数据的作用。一、链上数据提供商一览Galaxy Research区块链的数据提供商可以分成以下三类: 一是区块浏览器,包括Etherscan、Zapper等,主要是用来帮助用户更方便地浏览交易和账户信息(下图)。Etherscan二是链上数据服务商,包括 Glassnode,Coin Metrics,IntoTheBlock、Nansen,Token Terminal 等,主要对链上数据进行分析整合和分析。本文将简要介绍如何使用 Python 从 Glassnode 免费下载链上数据。 三是链上基建,包括Chainalysis,Infura等,包括以反洗钱...
部署以太坊全节点教程系列之二:运行测试网验证节点
本文将演示如何通过质押以太坊,成为验证节点。步骤一:加快节点同步速度在上一篇文章(链接如下),介绍了如何运行以太坊的执行和共识节点。第一次运行时,通常节点同步要等待2-3天时间(共识链和执行层需要分别进行同步,但最慢的是共识层),这是由于共识层客户端需要从第一个区块开始重新验证和同步。 为了加快共识层的同步速度,可以选择使用checkpoint sync,即选择受信任的别的信标链最新确认区块开始同步,并假设此前的所有区块已经被验证: https://mirror.xyz/0x89912c3449006F0Db8a1E051f3b9fc87ea435330 添加checkpoint sync的方法也很简单,只要重新运行./prysm.sh,并添加两个额外参数,如果是goerli(prater)的话:--checkpoint-sync-url=https://goerli.checkpoint-sync.ethpandaops.io --genesis-beacon-api-url=https://goerli.checkpoint-sync.ethpandaops.io 上面的ch...
Crypto quant trader
链上数据知多少系列之一:如何获得链上数据
链上数据之于区块链,就像基本面数据之于股票市场,是做加密资产量化时绕不开的信息,它可以成为因子策略中的重要因子。 链上数据泛指所有发生在区块链上的交易信息。区块链本质上是一个公开的分布式数据库,所有的链上交易都会被保存,具有公开透明、不可篡改等特点。因此,链上数据不可造假,公开透明。 本文将简要介绍主要有哪些链上数据提供商,并以Glassnode为例展示如何使用Python下载数据,并以「活跃地址交易调整后价格」指标为例展示链上数据的作用。一、链上数据提供商一览Galaxy Research区块链的数据提供商可以分成以下三类: 一是区块浏览器,包括Etherscan、Zapper等,主要是用来帮助用户更方便地浏览交易和账户信息(下图)。Etherscan二是链上数据服务商,包括 Glassnode,Coin Metrics,IntoTheBlock、Nansen,Token Terminal 等,主要对链上数据进行分析整合和分析。本文将简要介绍如何使用 Python 从 Glassnode 免费下载链上数据。 三是链上基建,包括Chainalysis,Infura等,包括以反洗钱...
部署以太坊全节点教程系列之二:运行测试网验证节点
本文将演示如何通过质押以太坊,成为验证节点。步骤一:加快节点同步速度在上一篇文章(链接如下),介绍了如何运行以太坊的执行和共识节点。第一次运行时,通常节点同步要等待2-3天时间(共识链和执行层需要分别进行同步,但最慢的是共识层),这是由于共识层客户端需要从第一个区块开始重新验证和同步。 为了加快共识层的同步速度,可以选择使用checkpoint sync,即选择受信任的别的信标链最新确认区块开始同步,并假设此前的所有区块已经被验证: https://mirror.xyz/0x89912c3449006F0Db8a1E051f3b9fc87ea435330 添加checkpoint sync的方法也很简单,只要重新运行./prysm.sh,并添加两个额外参数,如果是goerli(prater)的话:--checkpoint-sync-url=https://goerli.checkpoint-sync.ethpandaops.io --genesis-beacon-api-url=https://goerli.checkpoint-sync.ethpandaops.io 上面的ch...
Share Dialog
Share Dialog
Crypto quant trader
本文以Python为例,展示如何从全球最大的加密货币交易所「币安(Binance)」交易所下载加密货币的历史数据,并交易加密货币期货的方法,为此后加密货币的量化交易提供数据基础。
Anaconda是包管理器和环境管理器,它附带了 conda、Python 和 150 多个科学包及其依赖项,因此对Python开发者非常友好。建议大家前往下面的官方网站进行下载:
除了常用的一些Python包(pandas,numpy等),ccxt(https://github.com/ccxt/ccxt)是一个非常常用的加密货币量化包,它是一个开源的数字货币交易框架,连接了全球几乎所有的交易所,为用户提供了市场数据访问、算法交易等功能。初次使用前需要啊下载该工具包,方法如下:
ccxt下载成功后,可以使用如下方法连接交易所:
import ccxt
exchange = ccxt.binance() #连接币安
使用fetch_ohlcv方程即可下载历史数据,其中ohlcv分别代表了o(open,开盘价),h(high,最高价),l(low,最低价),c(close,收盘价),v(volume,交易量)。以比特币为例:
symbol = 'BTCUSDT' #设置要查询的加密货币对
time_interval = '1d' #设置数据频率
start = exchange.parse8601('2020-01-01T00:00:00') #设置起始时间
data = exchange.fetch_ohlcv(symbol=symbol, timeframe=time_interval,
since=start)
此时返回的数据是list of list的格式(下图所示):

该格式不方便浏览,因此需要将其设置成dataframe格式:
df = pd.DataFrame(data, dtype=float) # 将数据转换为dataframe
df.columns = ['Time','Open','High','Low','Close','Volume'] #重新命名
df['Time'] = pd.to_datetime(df['Time'], unit='ms') # 处理时间
数据处理结果如下图:

ccxt存在下载限制,并不能下载完整的K线数据。etch_ohlcv默认只能换一性下载500个数据点。循环下载历史数据的方法如下:
# 下载最新数据
data = exchange.fetch_ohlcv(symbol=symbol, timeframe=time_interval)
formated = formatData(data) #将原数据生成dataframe
while formated.shape[0] > 1:
list_data.append(formated.copy())
# 计算返回数据中最早的日期数据
early_time = formated['Time'].iloc[0]
# 计算回看多少小时
hoursToRevert = toHours(time_interval)
start_time = early_time - timedelta(hours=hoursToRevert)
start_time = str(start_time).replace(" ","T")
print(start_time)
# 转换时间
new_start_time = exchange.parse8601(start_time)
data = exchange.fetch_ohlcv(symbol=symbol, timeframe=time_interval,
since=new_start_time)
formated = formatData(data)
# 将所有数据合并
combined_df = pd.concat(list_data,axis=0)
# 调成北京时间
combined_df['Time_GMT8'] = combined_df['Time'] + timedelta(hours=8)
del combined_df['Time']
# 删除重复值
combined_df = combined_df.set_index('Time_GMT8')
combined_df = combined_df.sort_index()
combined_df = combined_df[~combined_df.index.duplicated(keep='last')]
# 保存数据到本地
combined_df.to_csv('{}_{}.csv'.format(symbol,time_interval))
其中,该循环方程运用到了时间转换方程toHours():
"""将time interval转换成以小时为单位"""
def toHours(interval):
if interval[-1] == 'm':
return int(interval[:-1])/60
if interval[-1] == 'h':
return int(interval[:-1])
if interval[-1] == 'd':
return int(interval[:-1])*24
至此,我们获得了来自交易所的最完整烛线数据。
币安提供了官方API:
https://binance-docs.github.io/apidocs
几乎以上所有的官方API可以通过ccxt的API实现,参考ccxt开发手册(http://cw.hubwiz.com/card/c/ccxt-dev-manual/1/4/2/)。为了找出输入可以获得所有API的对应公式名称,可以输入如下命令:
dir(ccxt.binance())
部分API接口可能需要签名(如下图),标志是括号含有HMAC SHA256。

根据币安API的官网介绍,对于此类API用户需要提供API-KEY和API-Secret。为了得到API Key和Secret,用户需要注册币安账户并创建API。方法是:
1. 在币安(binance.com)完成账户的注册**(可以使用我10%的返佣码:485323223)**后,点击右上角的人物头像,在下拉菜单中选择“API管理”。

2. 给API密钥设置一个标签后点击创建API,输入验证码之后,就会有API Key和Secret Key。

这样,我们便能对账户进行自动化操作。以交易币本位期货为例,由于保证金制度,币安需要用于将现货账户里的部分加密货币转移到币本位账户作为保证金。通过币安API查询,需要使用asset/transfer接口,ccxt提供了对应的接口sapi_post_asset_transfer,红色方框是必须需要提供的参数。

对应代码如下,将0.1个以太币从现货钱包转移至币本位合约钱包。
import time
import ccxt
BINANCE_CONFIG = {
'apiKey': '<填写APIkey>', #填写APIkey
'secret': '<填写secret>', #填写secret
'timeout': 3000,
'rateLimit': 10,
'enableRateLimit': False}
exchange = ccxt.binance(BINANCE_CONFIG)
res = exchange.sapi_post_asset_transfer({'type':'MAIN_CMFUTURE',
'asset':'ETH',
'amount':0.1,
'timestamp':int(time.time() * 1000)})
其中type选择MAIN_CMFUTURE是因为该类型符合转账需求。

而查看币安账户,可以发现0.1个以太币已经转移到了币本位钱包。

钱包中有了少许以太币便可以买卖以太币期货,通过查询币安官方API介绍,可以了解所需要的参数。

确保币安开启双向持仓,即允许同时持有同一币种多空两个仓位。

以市价开一单ETHUSD_210924的期货代码如下:
res = exchange.dapiPrivate_post_order({'symbol':'ETHUSD_210924',
'side': 'BUY',
'positionSide':'LONG',
'type':'MARKET',
'timestamp':int(time.time() * 1000),
'quantity':1})
从下图可以看到,已经成功买到了以太币期货。

本文以Python为例,展示如何从全球最大的加密货币交易所「币安(Binance)」交易所下载加密货币的历史数据,并交易加密货币期货的方法,为此后加密货币的量化交易提供数据基础。
Anaconda是包管理器和环境管理器,它附带了 conda、Python 和 150 多个科学包及其依赖项,因此对Python开发者非常友好。建议大家前往下面的官方网站进行下载:
除了常用的一些Python包(pandas,numpy等),ccxt(https://github.com/ccxt/ccxt)是一个非常常用的加密货币量化包,它是一个开源的数字货币交易框架,连接了全球几乎所有的交易所,为用户提供了市场数据访问、算法交易等功能。初次使用前需要啊下载该工具包,方法如下:
ccxt下载成功后,可以使用如下方法连接交易所:
import ccxt
exchange = ccxt.binance() #连接币安
使用fetch_ohlcv方程即可下载历史数据,其中ohlcv分别代表了o(open,开盘价),h(high,最高价),l(low,最低价),c(close,收盘价),v(volume,交易量)。以比特币为例:
symbol = 'BTCUSDT' #设置要查询的加密货币对
time_interval = '1d' #设置数据频率
start = exchange.parse8601('2020-01-01T00:00:00') #设置起始时间
data = exchange.fetch_ohlcv(symbol=symbol, timeframe=time_interval,
since=start)
此时返回的数据是list of list的格式(下图所示):

该格式不方便浏览,因此需要将其设置成dataframe格式:
df = pd.DataFrame(data, dtype=float) # 将数据转换为dataframe
df.columns = ['Time','Open','High','Low','Close','Volume'] #重新命名
df['Time'] = pd.to_datetime(df['Time'], unit='ms') # 处理时间
数据处理结果如下图:

ccxt存在下载限制,并不能下载完整的K线数据。etch_ohlcv默认只能换一性下载500个数据点。循环下载历史数据的方法如下:
# 下载最新数据
data = exchange.fetch_ohlcv(symbol=symbol, timeframe=time_interval)
formated = formatData(data) #将原数据生成dataframe
while formated.shape[0] > 1:
list_data.append(formated.copy())
# 计算返回数据中最早的日期数据
early_time = formated['Time'].iloc[0]
# 计算回看多少小时
hoursToRevert = toHours(time_interval)
start_time = early_time - timedelta(hours=hoursToRevert)
start_time = str(start_time).replace(" ","T")
print(start_time)
# 转换时间
new_start_time = exchange.parse8601(start_time)
data = exchange.fetch_ohlcv(symbol=symbol, timeframe=time_interval,
since=new_start_time)
formated = formatData(data)
# 将所有数据合并
combined_df = pd.concat(list_data,axis=0)
# 调成北京时间
combined_df['Time_GMT8'] = combined_df['Time'] + timedelta(hours=8)
del combined_df['Time']
# 删除重复值
combined_df = combined_df.set_index('Time_GMT8')
combined_df = combined_df.sort_index()
combined_df = combined_df[~combined_df.index.duplicated(keep='last')]
# 保存数据到本地
combined_df.to_csv('{}_{}.csv'.format(symbol,time_interval))
其中,该循环方程运用到了时间转换方程toHours():
"""将time interval转换成以小时为单位"""
def toHours(interval):
if interval[-1] == 'm':
return int(interval[:-1])/60
if interval[-1] == 'h':
return int(interval[:-1])
if interval[-1] == 'd':
return int(interval[:-1])*24
至此,我们获得了来自交易所的最完整烛线数据。
币安提供了官方API:
https://binance-docs.github.io/apidocs
几乎以上所有的官方API可以通过ccxt的API实现,参考ccxt开发手册(http://cw.hubwiz.com/card/c/ccxt-dev-manual/1/4/2/)。为了找出输入可以获得所有API的对应公式名称,可以输入如下命令:
dir(ccxt.binance())
部分API接口可能需要签名(如下图),标志是括号含有HMAC SHA256。

根据币安API的官网介绍,对于此类API用户需要提供API-KEY和API-Secret。为了得到API Key和Secret,用户需要注册币安账户并创建API。方法是:
1. 在币安(binance.com)完成账户的注册**(可以使用我10%的返佣码:485323223)**后,点击右上角的人物头像,在下拉菜单中选择“API管理”。

2. 给API密钥设置一个标签后点击创建API,输入验证码之后,就会有API Key和Secret Key。

这样,我们便能对账户进行自动化操作。以交易币本位期货为例,由于保证金制度,币安需要用于将现货账户里的部分加密货币转移到币本位账户作为保证金。通过币安API查询,需要使用asset/transfer接口,ccxt提供了对应的接口sapi_post_asset_transfer,红色方框是必须需要提供的参数。

对应代码如下,将0.1个以太币从现货钱包转移至币本位合约钱包。
import time
import ccxt
BINANCE_CONFIG = {
'apiKey': '<填写APIkey>', #填写APIkey
'secret': '<填写secret>', #填写secret
'timeout': 3000,
'rateLimit': 10,
'enableRateLimit': False}
exchange = ccxt.binance(BINANCE_CONFIG)
res = exchange.sapi_post_asset_transfer({'type':'MAIN_CMFUTURE',
'asset':'ETH',
'amount':0.1,
'timestamp':int(time.time() * 1000)})
其中type选择MAIN_CMFUTURE是因为该类型符合转账需求。

而查看币安账户,可以发现0.1个以太币已经转移到了币本位钱包。

钱包中有了少许以太币便可以买卖以太币期货,通过查询币安官方API介绍,可以了解所需要的参数。

确保币安开启双向持仓,即允许同时持有同一币种多空两个仓位。

以市价开一单ETHUSD_210924的期货代码如下:
res = exchange.dapiPrivate_post_order({'symbol':'ETHUSD_210924',
'side': 'BUY',
'positionSide':'LONG',
'type':'MARKET',
'timestamp':int(time.time() * 1000),
'quantity':1})
从下图可以看到,已经成功买到了以太币期货。

Subscribe to Trader Li
Subscribe to Trader Li
<100 subscribers
<100 subscribers
No activity yet