加密貨幣數(shù)據(jù)探索 —— 帶著Python玩金融(6)

2017年底比特幣的市值達到了2000億美元。隨著比特幣的大熱,類似的基于區(qū)塊鏈技術(shù)的各種各樣的某某幣大量涌現(xiàn),它們統(tǒng)稱為加密貨幣。本文將使用Python編程語言帶你探索加密貨幣市場的數(shù)據(jù),從而對這一新興市場有一初步了解。

警告:本文的目的是示范如何用Python分析數(shù)據(jù),而非投資建議。投資加密貨幣需謹慎,因為風(fēng)險非常大。

按慣例,在做具體分析之前,我們都需要導(dǎo)入相關(guān)的工具包并做一些設(shè)置。

# 導(dǎo)入 pandas 數(shù)據(jù)分析包
import pandas as pd

# 導(dǎo)入 matplotlib 繪圖包,并進行設(shè)置
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'retina' 
plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['axes.unicode_minus']=False
plt.style.use('fivethirtyeight')

獲取加密貨幣數(shù)據(jù)

所謂巧婦難為無米之炊,當我們談到數(shù)據(jù)分析,首先得有數(shù)據(jù)才行。CoinMarketCap 網(wǎng)站提供了加密貨幣市場的實時數(shù)據(jù),其API接口返回 json 格式的數(shù)據(jù),可使用 pandas.read_json() 函數(shù)來獲取數(shù)據(jù),如下所示:

current = pd.read_json("https://api.coinmarketcap.com/v1/ticker/")

得到數(shù)據(jù)框(DataFrame)格式的數(shù)據(jù),我們來查看前幾行,以便對數(shù)據(jù)有個大概的認識。

current.head()

以上API獲取的數(shù)據(jù)是實時變動的,為了使本文的分析可重復(fù),讓我們從特定的CSV文件中讀取數(shù)據(jù)。

我已將數(shù)據(jù)上傳到github中以供大家下載,點我哦!下載后請將csv數(shù)據(jù)文件和代碼文件放在同一目錄下,方便讀取。

# 讀取csv文件
dec6 = pd.read_csv("coinmarketcap_06122017.csv")

建立一個新的數(shù)據(jù)框變量 market_cap_raw,用于存儲 idmarket_cap_usd 這兩列數(shù)據(jù),它們分別代表加密貨幣名稱和對應(yīng)的市值。

market_cap_raw = dec6[['id', 'market_cap_usd']]

計算 idmarket_cap_usd 這兩列中數(shù)值的個數(shù)。

market_cap_raw.count()
id                1326
market_cap_usd    1031
dtype: int64

為什么這兩列的計數(shù)不一樣呢?因為 market_cap_usd 這一列中有些值是缺失的,即有些加密貨幣的市值是未知的。在本文的分析中我們忽略掉這些未知市值的貨幣。

# 將市值大于0的數(shù)據(jù)過濾出來
cap = market_cap_raw.query('market_cap_usd > 0')

# 重新計數(shù)
cap.count()
id                1031
market_cap_usd    1031
dtype: int64

市值 TOP10 貨幣的比較

盡管比特幣受到其他加密貨幣的挑戰(zhàn),但其市值仍然處于領(lǐng)先地位。為了直觀地看到這一點,讓我們來繪制市值前十位貨幣的條形圖。

# 將貨幣名id列設(shè)為索引,并按市值market_cap_usd列進行降序排列,選取前10行數(shù)據(jù)
cap10 = cap.set_index('id') \
           .sort_values(by='market_cap_usd', ascending=False)[:10]
    
# 新增一列 market_cap_perc,是該貨幣市值占總市值的百分比
cap10 = cap10.assign(market_cap_perc = 
            lambda x: x.market_cap_usd / cap.market_cap_usd.sum() * 100)

# 繪制前10位市值的占比
ax = cap10.plot.bar(y='market_cap_perc', title='市值 TOP10')

# 設(shè)置y軸標簽
_ = ax.set_ylabel('占總市值的百分數(shù) (%)')

從圖中我們發(fā)現(xiàn),比特幣占了所有加密貨幣市值的一半以上。這幅圖還可以進一步優(yōu)化。由于比特幣市值遠大于其他貨幣,導(dǎo)致其他貨幣在柱狀圖中被壓縮的很小以致難以看清,對此我們可以采用對數(shù)坐標。并且上圖的顏色過于雜亂,我們來重新設(shè)置條形圖的顏色,把類似的貨幣設(shè)置成相同顏色。

# 設(shè)置條形圖對應(yīng)的顏色列表
COLORS = ['orange', 'green', 'orange', 'cyan', 'cyan', 'blue', 'silver', 'orange', 'red', 'green']

# 繪制市值的條形圖,并使用對數(shù)坐標
ax = cap10.plot.bar(y="market_cap_usd", logy=True, color=COLORS, title='市值 TOP10')

# 設(shè)置y軸標簽為'美元'
_ = ax.set_ylabel('美元')

# 刪去沒有信息含量的x軸標簽"id"
_ = ax.set_xlabel('')

此時各貨幣在條形圖中的顯示更清晰了,但是要特別注意y軸的坐標,否則很容易對數(shù)據(jù)造成誤解。

巨大的波動性

自首次交易以來,加密貨幣市場的波動性一直很大?,F(xiàn)在讓我們通過貨幣價格24小時的變化率 percent_change_24h 和7天的變化率 percent_change_7d 來觀察這一現(xiàn)象。

先來查看24小時價格跌幅前5的貨幣。

# 選擇id, percent_change_24h 和 percent_change_7d 這三列數(shù)據(jù),存儲到新的DataFrame中
volatility = dec6[['id', 'percent_change_24h', 'percent_change_7d']]

# 設(shè)置 'id' 為索引并刪去缺失值
volatility = volatility.set_index('id').dropna()

# 按'percent_change_24h'升序排列數(shù)據(jù)
volatility = volatility.sort_values(by='percent_change_24h', ascending=True)

# 查看前5列
volatility.head()

你投入的錢可能很快蒸發(fā)掉,也可能瞬間翻倍,這是一個瘋狂的市場。通過繪制24小時內(nèi)貨幣跌幅和漲幅前十的條形圖,我們可以更直觀地看到這一現(xiàn)象。

#定義繪圖函數(shù),有兩個參數(shù):排序好的數(shù)據(jù)和圖片標題
def top10_subplot(volatility_series, title):
    # 設(shè)置圖片大小和兩個子圖
    fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 6))
    
    # 繪制跌幅前十的條形圖
    ax = volatility_series[:10].plot.bar(color='darkred', ax=axes[0])
    
    # 設(shè)置y軸標簽
    ax.set_ylabel('變化率(%)')
    
    # 繪制漲幅前十的條形圖
    ax = volatility_series[-10:].plot.bar(color='darkblue', ax=axes[1])
    
    # 設(shè)置圖片標題
    fig.suptitle(title)
    
    # 返回值
    return fig, ax

# 設(shè)置24小時變化圖的標題
DTITLE = "24小時漲跌幅前十的貨幣"

# 調(diào)用繪圖函數(shù),繪制24小時變化率的條形圖 
fig, ax = top10_subplot(volatility.percent_change_24h, DTITLE)

加密貨幣 fedoracoin 在24小時內(nèi)漲了8倍多,這也夠瘋狂的。是不是很心動?不過千萬要保持冷靜的頭腦,讓我們繼續(xù)用類似的方法來繪制7天漲跌幅前十的貨幣。

# 按'percent_change_7d'升序排列數(shù)據(jù)
volatility7d = volatility.sort_values(by='percent_change_7d', ascending=True)

# 設(shè)置7天變化圖的標題
WTITLE = "Weekly top losers and winners"

# 調(diào)用繪圖函數(shù),繪制7天變化率的條形圖 
fig, ax = top10_subplot(volatility7d.percent_change_7d, WTITLE)

千萬要 Hold 住啊,巨大的風(fēng)險讓你既有可能一夜暴富也有可能血本無歸。

加密貨幣的市值分布

像股票這類金融產(chǎn)品,其市值越小,風(fēng)險和回報也越大。加密貨幣也類似,市值較小的貨幣相較于市值大的貨幣,更不穩(wěn)定風(fēng)險也更高。我們先來查看市值大于100億的貨幣都有哪些。

# 選擇市值大于100億的數(shù)據(jù)
largecaps = cap.query('market_cap_usd > 10000000000')

# 輸出
print(largecaps)
             id  market_cap_usd
0       bitcoin    2.130493e+11
1      ethereum    4.352945e+10
2  bitcoin-cash    2.529585e+10
3          iota    1.475225e+10

為了進一步分析加密貨幣市場中市值的分布情況,我們大致將貨幣市值分為三類:

  • 大:市值大于等于3億
  • 中:市值大于等于5000萬,小于3億
  • ?。菏兄敌∮?000萬

然后我們繪制這三個區(qū)間中貨幣數(shù)目的條形圖。

# 定義函數(shù)計算特定市值區(qū)間內(nèi)貨幣的數(shù)目
def capcount(query_string):
    return cap.query(query_string).count().id

# 圖片標簽
LABELS = ["大", "中", "小"]

# 計算大市值貨幣數(shù)
biggish = capcount('market_cap_usd >= 300000000')

# 計算中市值貨幣數(shù)
micro = capcount('market_cap_usd >= 50000000 & market_cap_usd < 300000000')

# 計算小市值貨幣數(shù)
nano =  capcount('market_cap_usd < 50000000')

# 創(chuàng)建包含三種規(guī)模市值貨幣數(shù)的列表
values = [biggish, micro, nano]

# 繪制條形圖 
_ = plt.bar(range(len(values)), values, tick_label=LABELS)

可見,絕大部分加密貨幣的市值都比較小,風(fēng)險很高。

小結(jié)

通過對加密貨幣市場數(shù)據(jù)的分析,我們得出三個結(jié)論:

  • 比特幣市值占加密貨幣市場的大頭,超過一半。
  • 加密貨幣市場中絕大部分貨幣的市值都比較小,風(fēng)險高。
  • 加密貨幣價格的波動性很大,投資需謹慎。

注:本文基于 DataCamp 項目 Exploring the Bitcoin cryptocurrency market 撰寫而成。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容