比特币价格的表现如何?数字货币价格的飙升和下跌原因是什么?不同山寨币的市场价格是不可分割地联系在一起还是在很大程度上是独立的? 我们如何预测接下来会发生什么?
关于数字货币的文章,比如比特币和以太坊,现在充斥着各种猜测,数百名自称为专家的人都在倡导他们期望出现的趋势。许多这些分析缺少的是基础数据和统计模型的坚实基础。
本文的目标是使用Python提供对数字货币分析的简单介绍。我们将通过一个简单的Python脚本来检索,分析和可视化不同数字货币的数据。在此过程中,我们将发现这些波动的市场行为以及它们如何发展的有趣趋势。
这不是一个解释数字货币的文章,也不是一个关于哪些特定货币会上涨而哪些会下跌的观点。相反,我们在本教程中所关注的只是获取原始数据并发现隐藏在数字中的故事。
本教程旨在为各个段位技能水平的爱好者,工程师和数据科学家使用,无论你是行业大牛还是编程小白,你需要的唯一技能是对Python编程语言的基本了解以及命令行操作的足够知识(能设置一个数据科学项目即可)。
发明者量化平台FMZ.COM除了提供优质的各大主流交易所的数据源,还提供一套丰富的API接口以帮助我们在完成数据的分析后进行自动化交易。这套接口包括查询账户信息,查询各个主流交易所的高,开,低,收价格,成交量,各种常用技术分析指标等实用工具,特别是对于实际交易过程中连接各大主流交易所的公共API接口,提供了强大的技术支持。
所有上边提到的这些功能,都被封装到一个类似Docker的系统当中,我们要做的,就是购买或者租赁好自己的云计算服务后,把这个Docker系统部署完成即可。
在发明者量化平台的官方称呼中,这个Docker系统被称为托管者系统。
关于如何部署托管者和机器人,请参考我之前的文章:https://www.fmz.com/bbs-topic/4140
想购买自己云计算服务器部署托管者的读者,可以参考这篇文章:https://www.fmz.com/bbs-topic/2848
在成功部署好云计算服务与托管者系统后,接下来,我们要安装Python目前最大的神器:Anaconda
为了实现本文所需的所有相关程序环境(依赖库,版本管理等),最简单的办法就是用Anaconda。它是一个打包的Python数据科学生态系统和依赖库管理器。
由于我们是在云服务上安装Anaconda,因此我们推荐云服务器安装Linux系统加命令行版本的Anaconda。
关于Anaconda的安装方法,请查看Anaconda官方指南:https://www.anaconda.com/distribution/
如果你是一个经验丰富的Python程序员,觉得不需要使用Anaconda,那也完全没有问题。我会假设你在安装必须的依赖环境时不需要帮助,你可以直接跳到第二部分。
Anaconda安装完成后,我们需要创建一个新的环境来管理我们的依赖包。在linux命令行界面,我们输入:
conda create --name cryptocurrency-analysis python=3
来为我们的项目创建一个新的Anaconda环境。
接下来,输入
source activate cryptocurrency-analysis (linux/MacOS操作)
或者
activate cryptocurrency-analysis (windows操作系统)
来激活这个环境
接下来,输入:
conda install numpy pandas nb_conda jupyter plotly
以安装这个项目需要的各种依赖包。
注意:为什么要使用Anaconda环境?如果你打算在你的电脑上运行很多Python项目,那么分开不同项目的依赖包(软件库和包)来避免冲突是很有帮助的。Ananconda会为每一个项目的依赖包创建一个特殊的环境目录,使得所有包都能妥善地被管理和区分。
当环境和依赖包都安装好之后,运行
jupyter notebook
来启动iPython内核,然后用你的浏览器访问http://localhost:8888/ ,创建一个新的Python notebook,确保它使用的是:
Python [conda env:cryptocurrency-analysis]
内核
新建一个空的Jupyter notebook,然后我们要做的第一件事就是导入所需的依赖包。
import os
import numpy as np
import pandas as pd
import pickle
from datetime import datetime
我们还需要导入Plotly并且开启离线模式
import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)
准备工作完成,现在我们可以开始获取要分析的数据了。首先,我们要用发明者量化平台的API接口来获取比特币的价格数据。
这将会用到GetTicker函数,关于这两个函数的用法,详情请参见:https://www.fmz.com/api
为了方便数据获取,我们要编写一个函数来下载和同步来自Quandl(quandl.com)的数据。这是一个免费的金融数据接口,在国外有很高的知名度。发明者量化平台也提供类似的数据接口,主要用于实盘交易的时候用,由于本文主要为数据分析,这里我们还是用Quandl的数据。
在实盘交易的时候,可以直接在Python中调用GetTicker和GetRecords函数来获取价格数据,关于他们的用法,请参见:https://www.fmz.com/api
def get_quandl_data(quandl_id):
# 下载和缓冲来自Quandl的数据列
cache_path = '{}.pkl'.format(quandl_id).replace('/','-')
try:
f = open(cache_path, 'rb')
df = pickle.load(f)
print('Loaded {} from cache'.format(quandl_id))
except (OSError, IOError) as e:
print('Downloading {} from Quandl'.format(quandl_id))
df = quandl.get(quandl_id, returns="pandas")
df.to_pickle(cache_path)
print('Cached {} at {}'.format(quandl_id, cache_path))
return df
这里用pickle库来序列化数据并且把下载的数据存成文件,这样程序就不会在每次运行的时候重新下载同样的数据。这个函数将返回Pandas数据帧(Dataframe)格式的数据。如果你对数据帧的概念不太熟悉,可以把它想象成是一种强大的Excel表格。
我们就用Kraken比特币交易所作为例子,先从获取它的比特币价格开始。
# 获取Kraken比特币交易所的价格
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
用head()方法来查看数据框的前五行。
btc_usd_price_kraken.head()
其结果为:
BTC | Open | High | Low | Close | Volume (BTC) | Volume (Currency) | Weighted Price |
---|---|---|---|---|---|---|---|
2014-01-07 | 874.67040 | 892.06753 | 810.00000 | 810.00000 | 15.622378 | 13151.472844 | 841.835522 |
2014-01-08 | 810.00000 | 899.84281 | 788.00000 | 824.98287 | 19.182756 | 16097.329584 | 839.156269 |
2014-01-09 | 825.56345 | 870.00000 | 807.42084 | 841.86934 | 8.158335 | 6784.249982 | 831.572913 |
2014-01-10 | 839.99000 | 857.34056 | 817.00000 | 857.33056 | 8.024510 | 6780.220188 | 844.938794 |
2014-01-11 | 858.20000 | 918.05471 | 857.16554 | 899.84105 | 18.748285 | 16698.566929 | 890.671709 |
下一步,我们要做一个简单的表格,以通过可视化的方法来验证数据的正确性。
# 做出BTC价格的表格
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price'])
py.iplot([btc_trace])
这里,我们用Plotly来完成可视化部分。相对于使用一些更成熟的Python数据可视化库,比如Matplotlib,用Plotly是一个不那么普遍的选择,但Plotly确实是一个不错的选择,因为它可以调用D3.js的充分交互式图表。这些图表有非常漂亮的默认设置,易于探索,而且非常方便嵌入到网页中。
小提示:可以将生成的图表与主流交易所的比特币价格图表(如OKEX,Binance或Huobi上的图表)进行比较,作为一个快速的完整性检查,以用来确认下载的数据是否大体一致。
细心的读者可能已经发觉到了,以上的数据中有数据缺失情况,特别是在2014年末和2016年初。特别是在Kraken交易所中,这种数据缺失状况特别明显。我们当然不希望这些缺失的数据会影响到对价格的分析。
数字货币交易所的特点是,供需关系决定币种的价格。因而,没有哪个交易的价格所能够成为市场的“主流价格”。为了解决这个问题,以及刚刚提到的数据缺失问题(可能是由于技术性断电和数据的差错),我们将从世界上三家主流比特币交易所下载数据,进而计算出平均的比特币价格。
让我们开始,先把各个交易所的数据下载到到由字典类型组成的数据帧中。
# 下载COINBASE,BITSTAMP和ITBIT的价格数据
exchanges = ['COINBASE','BITSTAMP','ITBIT']
exchange_data = {}
exchange_data['KRAKEN'] = btc_usd_price_kraken
for exchange in exchanges:
exchange_code = 'BCHARTS/{}USD'.format(exchange)
btc_exchange_df = get_quandl_data(exchange_code)
exchange_data[exchange] = btc_exchange_df
下一步,我们将要定义一个特别的函数,把各个数据帧中共有的列合并为一个新的数据帧。让我们叫他merge_dfs_on_column函数吧
def merge_dfs_on_column(dataframes, labels, col):
'''Merge a single column of each dataframe into a new combined dataframe'''
series_dict = {}
for index in range(len(dataframes)):
series_dict[labels[index]] = dataframes[index][col]
return pd.DataFrame(series_dict)
现在,基于各个数据集的“加权价格”列,把所有的数据帧整合到一起。
# 整合所有数据帧
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')
最后,我们使用“tail()”方法,查看合并后数据的最后五行,以确保数据正确和完整。
btc_usd_datasets.tail()
结果显示为:
BTC | BITSTAMP | COINBASE | ITBIT | KRAKEN |
---|---|---|---|---|
2017-08-14 | 4210.154943 | 4213.332106 | 4207.366696 | 4213.257519 |
2017-08-15 | 4101.447155 | 4131.606897 | 4127.036871 | 4149.146996 |
2017-08-16 | 4193.426713 | 4193.469553 | 4190.104520 | 4187.399662 |
2017-08-17 | 4338.694675 | 4334.115210 | 4334.449440 | 4346.508031 |
2017-08-18 | 4182.166174 | 4169.555948 | 4175.440768 | 4198.277722 |
从上边这个表格可以看到,这些数据符合我们的预期,数据范围大致相同,只是基于各个交易所的延迟或者各自的特点而略有不同。
从分析逻辑上讲,下一步就是通过可视化,将这些数据进行比对。为此,我们需要先定义一个辅助函数,通过提供单行命令使用数据制作图表,我们就叫它df_scatter函数吧。
def df_scatter(df, title, seperate_y_axis=False, y_axis_label='', scale='linear', initial_hide=False):
'''Generate a scatter plot of the entire dataframe'''
label_arr = list(df)
series_arr = list(map(lambda col: df[col], label_arr))
layout = go.Layout(
title=title,
legend=dict(orientation="h"),
xaxis=dict(type='date'),
yaxis=dict(
title=y_axis_label,
showticklabels= not seperate_y_axis,
type=scale
)
)
y_axis_config = dict(
overlaying='y',
showticklabels=False,
type=scale )
visibility = 'visible'
if initial_hide:
visibility = 'legendonly'
# 每个系列的表格跟踪
trace_arr = []
for index, series in enumerate(series_arr):
trace = go.Scatter(
x=series.index,
y=series,
name=label_arr[index],
visible=visibility
)
# 为系列添加单独的轴
if seperate_y_axis:
trace['yaxis'] = 'y{}'.format(index + 1)
layout['yaxis{}'.format(index + 1)] = y_axis_config
trace_arr.append(trace)
fig = go.Figure(data=trace_arr, layout=layout)
py.iplot(fig)
为了各位容易理解,本文不会过多探讨这个辅助函数的逻辑原理。如果想了解更多,请查看Pandas和Plotly的官方说明文档。
现在,我们就可以轻松制作比特币价格数据的图形了!
# 绘制所有BTC交易价格
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')
从以上的图形中可以看到,尽管这四个系列数据遵循大致相同的路径,但其中还是有一些不规则的变化,我们将设法清除这些不规则变化。
在2012-2017年的时间段中,我们知道比特币的价格从来没有等于零的时候,所以我们先去除数据框中所有的零值。
# 清除"0"值
btc_usd_datasets.replace(0, np.nan, inplace=True)
在重新构建数据帧之后,我们可以看到更加清晰的图形,没有缺失数据的情况了。
# 绘制修订后的数据框
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')
我们现在可以计算一个新的列:所有交易所的比特币日平均价格。
# 将平均BTC价格计算为新列
btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)
新的一列就是比特币的价格指数!我们再把它画出来,以核对该数据看起来是否有问题。
# 绘制平均BTC价格
btc_trace = go.Scatter(x=btc_usd_datasets.index, y=btc_usd_datasets['avg_btc_price_usd'])
py.iplot([btc_trace])
看起来确实没有问题,稍后,我们将继续使用这个加总的价格序列数据,以便能够确定其他数字货币与美元之间的兑换汇率。
到目前为止,我们已经有了比特币价格的时间序列数据了。接下来我们来看看非比特币的数字货币的一些数据,就是那些山寨币(Altcoins)的情况,当然,山寨币这个词可能有点过重了,但就目前数字货币的发展状况,除了市值排名前十的(如比特币,以太坊,EOS,USDT等),大部分可以被称作山寨币是没有问题的,我们应当在交易时尽量远离这些币种,因为他们的迷惑性和欺骗性太高。
首先,我们使用Poloniex交易所的API来获取数字货币交易的数据信息。我们定义了两个辅助函数来获取山寨币的相关数据,这两个函数主要是通过API下载和缓存JSON数据。
首先,我们定义函数get_json_data,它将从给定的URL中下载和缓存JSON数据。
def get_json_data(json_url, cache_path):
'''Download and cache JSON data, return as a dataframe.'''
try:
f = open(cache_path, 'rb')
df = pickle.load(f)
print('Loaded {} from cache'.format(json_url))
except (OSError, IOError) as e:
print('Downloading {}'.format(json_url))
df = pd.read_json(json_url)
df.to_pickle(cache_path)
print('Cached {} at {}'.format(json_url, cache_path))
return df
接下来,我们定义一个新的函数,该函数将产生Poloniex API的HTTP请求,并调用刚刚定义的get_json_data函数,以保存调用的数据结果。
base_polo_url = 'https://poloniex.com/public?command=returnChartData¤cyPair={}&start={}&end={}&period={}'
start_date = datetime.strptime('2015-01-01', '%Y-%m-%d') # 从2015年开始获取数据
end_date = datetime.now() # 直到今天
pediod = 86400 # pull daily data (86,400 seconds per day)
def get_crypto_data(poloniex_pair):
'''Retrieve cryptocurrency data from poloniex'''
json_url = base_polo_url.format(poloniex_pair, start_date.timestamp(), end_date.timestamp(), pediod)
data_df = get_json_data(json_url, poloniex_pair)
data_df = data_df.set_index('date')
return data_df
上述函数将抽取数字货币配对字符代码(比如“BTC_ETH”),并返回包含两种货币历史价格的数据帧。
绝大多数山寨币都无法使用美元直接购买,个人要想获取这些数字货币,通常都得先买比特币,再根据他们之间的价格比例,兑换成山寨币。因而,我们就得下载每一种数字货币兑换比特币的兑换汇率,然后再使用现有比特币价格数据转换成美元。我们会下载9种排名靠前的数字货币交易数据:Ethereum,Litecoin,Ripple,EthereumClassic,Stellar,Dash,Siacoin,Monero,和NEM。
altcoins = ['ETH','LTC','XRP','ETC','STR','DASH','SC','XMR','XEM']
altcoin_data = {}
for altcoin in altcoins:
coinpair = 'BTC_{}'.format(altcoin)
crypto_price_df = get_crypto_data(coinpair)
altcoin_data[altcoin] = crypto_price_df
现在,我们有了包含9个数据帧的字典,每种都包含山寨币与比特币之间的历史日平均价格数据。
我们可以通过Ethereum价格表格的最后几行,来判定数据是否正确。
altcoin_data['ETH'].tail()
ETH | Open | High | Low | Close | Volume (BTC) | Volume (Currency) | Weighted Price |
---|---|---|---|---|---|---|---|
2017-08-18 | 0.070510 | 0.071000 | 0.070170 | 0.070887 | 17364.271529 | 1224.762684 | 0.070533 |
2017-08-18 | 0.071595 | 0.072096 | 0.070004 | 0.070510 | 26644.018123 | 1893.136154 | 0.071053 |
2017-08-18 | 0.071321 | 0.072906 | 0.070482 | 0.071600 | 39655.127825 | 2841.549065 | 0.071657 |
2017-08-19 | 0.071447 | 0.071855 | 0.070868 | 0.071321 | 16116.922869 | 1150.361419 | 0.071376 |
2017-08-19 | 0.072323 | 0.072550 | 0.071292 | 0.071447 | 14425.571894 | 1039.596030 | 0.072066 |
现在,我们可以将BTC与山寨币汇率数据与我们的比特币价格指数结合,来直接计算每一个山寨币的历史价格(单位:美元)。
# 将USD Price计算为每个altcoin数据帧中的新列
for altcoin in altcoin_data.keys():
altcoin_data[altcoin]['price_usd'] = altcoin_data[altcoin]['weightedAverage'] * btc_usd_datasets['avg_btc_price_usd']
这里,我们为每一个山寨币的数据帧新增一列用于存储其相应的美元价格。
接着,我们可以重新使用之前定义的函数merge_dfs_on_column,来建立一个合并的数据帧,整合每种数字货币的美元价格。
# 将每个山寨币的美元价格合并为单个数据帧
combined_df = merge_dfs_on_column(list(altcoin_data.values()), list(altcoin_data.keys()), 'price_usd')
搞定!
现在让我们同时把比特币价格作为最后一栏添加到合并后的数据帧中。
# 将BTC价格添加到数据帧
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']
现在我们有了唯一的数据帧,它包含了我们正在验证的十种数字货币的每日美元价格。
我们重新调用之前的函数df_scatter,以图表形式展现全部山寨币的相应价格。
图表看来没问题,这张图为我们展现了每一种数字货币兑换价格在过去几年的变化情况的一个全貌。
注意:在这里我们使用了对数规格的y轴,在同一图上比较所有数字货币。你也可以尝试其他不同的参数值(例如scale=‘linear’),可以从不同视角理解数据。
细心的读者可能注意到了数字货币的价格看上去似乎是相关的,尽管他们的货币价值相差很大,而且波动性很高。尤其是从2017年4月的迅猛上涨开始,甚至很多的小波动似乎都与整个市场的波动同步出现。
当然,有数据支撑的结论比依据图像而产生的直觉更有说服力。
我们可以利用Pandas corr()函数来验证上述的相关性假设。该检验手段为数据帧的每一栏计算了其对应另一栏的皮尔森相关系数。
2017.8.22修订说明:这部分的修改是为了在计算相关系数时使用每日回报率而不是价格的绝对值。
基于一个非固态时间序列(例如原始的价格数据)直接计算可能会导致相关性系数的偏差。针对此问题,我们的解决方案是使用pct_change()方法,将数据帧中的每一个的价格绝对值转化为相应的日回报率。
例如,我们来计算2016年的相关系数。
# 计算2016年数字货币的皮尔森相关系数
combined_df_2016 = combined_df[combined_df.index.year == 2016]
combined_df_2016.pct_change().corr(method='pearson')
Name | DASH | ETC | ETH | LTC | SC | STR | XEM | XMR | XRP | BTC |
---|---|---|---|---|---|---|---|---|---|---|
DASH | 1.000000 | 0.003992 | 0.122695 | -0.012194 | 0.026602 | 0.058083 | 0.014571 | 0.121537 | 0.088657 | -0.014040 |
ETC | 0.003992 | 1.000000 | -0.181991 | -0.131079 | -0.008066 | -0.102654 | -0.080938 | -0.105898 | -0.054095 | -0.170538 |
ETH | 0.122695 | -0.181991 | 1.000000 | -0.064652 | 0.169642 | 0.035093 | 0.043205 | 0.087216 | 0.085630 | -0.006502 |
LTC | -0.012194 | -0.131079 | -0.064652 | 1.000000 | 0.012253 | 0.113523 | 0.160667 | 0.129475 | 0.053712 | 0.750174 |
SC | 0.026602 | -0.008066 | 0.169642 | 0.012253 | 1.000000 | 0.143252 | 0.106153 | 0.047910 | 0.021098 | 0.035116 |
STR | 0.058083 | -0.102654 | 0.035093 | 0.113523 | 0.143252 | 1.000000 | 0.225132 | 0.027998 | 0.320116 | 0.079075 |
XEM | 0.014571 | -0.080938 | 0.043205 | 0.160667 | 0.106153 | 0.225132 | 1.000000 | 0.016438 | 0.101326 | 0.227674 |
XMR | 0.121537 | -0.105898 | 0.087216 | 0.129475 | 0.047910 | 0.027998 | 0.016438 | 1.000000 | 0.027649 | 0.127520 |
XRP | 0.088657 | -0.054095 | 0.085630 | 0.053712 | 0.021098 | 0.320116 | 0.101326 | 0.027649 | 1.000000 | 0.044161 |
BTC | -0.014040 | -0.170538 | -0.006502 | 0.750174 | 0.035116 | 0.079075 | 0.227674 | 0.127520 | 0.044161 | 1.000000 |
上面这张图显示的都是相关系数。系数接近1或-1,分别意味着这一序列是正相关的,或逆相关的,相关系数趋近于0则说明相应对象并不相关,他们的波动是相互独立的。
为了更好的可视化的展示结果,我们创建一个新的可视化的帮助函数。
def correlation_heatmap(df, title, absolute_bounds=True):
'''Plot a correlation heatmap for the entire dataframe'''
heatmap = go.Heatmap(
z=df.corr(method='pearson').as_matrix(),
x=df.columns,
y=df.columns,
colorbar=dict(title='Pearson Coefficient'),
)
layout = go.Layout(title=title)
if absolute_bounds:
heatmap['zmax'] = 1.0
heatmap['zmin'] = -1.0
fig = go.Figure(data=[heatmap], layout=layout)
py.iplot(fig)
correlation_heatmap(combined_df_2016.pct_change(), "Cryptocurrency Correlations in 2016")
此处,深红色的数值代表强相关性(每一个币种显然是与其自身高度相关的),深蓝色的数值表示逆相关性。所有介于中间的颜色-浅蓝/橙/灰/茶色-其数值代表不同程度的弱相关或不相关。
这张图告诉我们了什么呢?从基础上讲,它说明了不同的数字货币价格在2016年间的波动情况,几乎没有统计上的显著相关性。
现在,为了验证我们的假设“数字货币在近几个月的相关性增强”,接下来,我们将使用从2017年开始的数据来重复同样的测试。
combined_df_2017 = combined_df[combined_df.index.year == 2017]
combined_df_2017.pct_change().corr(method='pearson')
Name | DASH | ETC | ETH | LTC | SC | STR | XEM | XMR | XRP | BTC |
---|---|---|---|---|---|---|---|---|---|---|
DASH | 1.000000 | 0.384109 | 0.480453 | 0.259616 | 0.191801 | 0.159330 | 0.299948 | 0.503832 | 0.066408 | 0.357970 |
ETC | 0.384109 | 1.000000 | 0.602151 | 0.420945 | 0.255343 | 0.146065 | 0.303492 | 0.465322 | 0.053955 | 0.469618 |
ETH | 0.480453 | 0.602151 | 1.000000 | 0.286121 | 0.323716 | 0.228648 | 0.343530 | 0.604572 | 0.120227 | 0.421786 |
LTC | 0.259616 | 0.420945 | 0.286121 | 1.000000 | 0.296244 | 0.333143 | 0.250566 | 0.439261 | 0.321340 | 0.352713 |
SC | 0.191801 | 0.255343 | 0.323716 | 0.296244 | 1.000000 | 0.417106 | 0.287986 | 0.374707 | 0.248389 | 0.377045 |
STR | 0.159330 | 0.146065 | 0.228648 | 0.333143 | 0.417106 | 1.000000 | 0.396520 | 0.341805 | 0.621547 | 0.178706 |
XEM | 0.299948 | 0.303492 | 0.343530 | 0.250566 | 0.287986 | 0.396520 | 1.000000 | 0.397130 | 0.270390 | 0.366707 |
XMR | 0.503832 | 0.465322 | 0.604572 | 0.439261 | 0.374707 | 0.341805 | 0.397130 | 1.000000 | 0.213608 | 0.510163 |
XRP | 0.066408 | 0.053955 | 0.120227 | 0.321340 | 0.248389 | 0.621547 | 0.270390 | 0.213608 | 1.000000 | 0.170070 |
BTC | 0.357970 | 0.469618 | 0.421786 | 0.352713 | 0.377045 | 0.178706 | 0.366707 | 0.510163 | 0.170070 | 1.000000 |
以上这些数据是否更相关一些呢?是否足以作为投资的判断标准?答案是否定的。
然而值得注意的是,几乎所有的数字货币都已经变得越来越相互关联。
correlation_heatmap(combined_df_2017.pct_change(), "Cryptocurrency Correlations in 2017")
从上图可以看到,事情变得越来越有趣了。
问得好!但实际情况是,我也不是很确定…
我的第一反应是,对冲基金最近开始公开在数字货币市场交易。这些基金持有远超于普通交易员的大量资本,当一支基金如果在多种数字货币间对冲自己的投入资本,然后根据独立变量(比如说,股票市场)对每一种货币使用相似的交易策略。如果从这个角度来看,出现这种越来越强的相关性趋势是合理的。
更深度的理解XRP和STR
例如,从上图中可以很明显看出XRP(Ripple的代币)是与其他数字货币相关性最低的。但这里有一个值得注意的例外是STR(Stellar的代币,官方名字是"Lumens"),与XRP有强相关关系(相关系数:0.62)。
有趣的是,Stellar和Ripple是非常相似的金融科技平台,他们都旨在减少银行间跨国转账时的繁琐步骤。可想而知,考虑到区块链服务使用代币的相似性,一些大玩家以及对冲基金可能会对他们在Stellar和Ripple上的投资使用相似的交易战略。这可能就是为什么XRP相比其他数字货币,与STR有更强相关性的原因。
以上的这些解释在很大程度上是推测性的,可能你会做的更好。基于我们已经奠定的基础,你有成百上千条不同的方法可以继续探索数据中蕴藏的故事。
以下是我的一些建议,读者可以参考往这些方向突进研究:
关于比特币,以及对于数字货币总体而言,最好的部分是它们的去中心化本质,这使得它比任何其他资产都自由、民主。可以将你的分析开源共享,参与到社区中,或者写一篇博客!希望你现在已经掌握了自行分析所需的技能,以及在未来读到任何投机性的数字货币的文章时,进行辩证思考的能力,尤其是那些没有数据支撑的预测。感谢你的阅读,关于这一教程,如果你有任何看法、建议或批评指正,请在 https://www.fmz.com/bbs 上留言。
ruixiao1989 很有价值的文章,学习了,感谢。
善 感谢你的喜欢!共勉之!