天天看點

用Python代碼建個資料實驗室,順利入坑比特币

用Python代碼建個資料實驗室,順利入坑比特币

作者:Patrick Triest

編譯:Katherine Hou、林海、Shan LIU、高甯、Yawei

比特币市場到底是如何運作的?數字加密貨币(cryptocurrency)跌宕起伏的原因是什麼?不同的山寨币(altcoins)市場之間是緊密聯系還是各自為營?我們該如何預測接下來将發生什麼?

關于數字加密貨币(如:比特币和以太坊)的文章鋪天蓋地,數百個自诩專家的作者各自發表着他們對比特币未來的猜想。而用來支援他們觀點的這些分析中強有力的資料和統計學基礎卻乏善可陳。

這篇文章的目的是簡單介紹“如何用Python來分析數字加密貨币”。我們将用簡單的Python代碼來檢索、分析和可視化不同的數字貨币資料。在這個過程中,我們将揭示一個有趣的趨勢:這些不穩定的市場是如何運作的,它們又是如何發展的。

用Python代碼建個資料實驗室,順利入坑比特币

這不是一篇解釋數字加密貨币是什麼的科普貼(如果你需要,我推薦這篇很棒的概述),這也不是一篇講哪個貨币會升值、哪個會貶值的觀點性文章。相反,在這篇教程中,我們所關心的隻是擷取原始資料,并揭示隐藏在數字中的故事。

步驟1 - 配置你的資料實驗室

這篇教材适合在不同技能水準上的愛好者、工程師和資料科學家們。要求的技能隻是對Python有基礎的了解,以及知道如何用指令建立一個項目。

包含運作結果的notebook完整版本可以在這裡下載下傳。

步驟1.1 - 安裝 Anaconda

安裝這個項目所需的所有相關環境,最簡單的辦法就是用Anaconda。它是一個打包的Python資料科學生态系統和依賴管理器。

推薦使用下面的官方安裝指南來安裝Anacondahttps://www.continuum.io/downloads

如果你是一個高階使用者,而你不需要使用Anaconda,那也完全沒有問題。我會假設你在安裝必須的依賴環境時不需要幫助,你可以直接跳到第二部分。

步驟1.2 - 建立一個Anaconda項目環境

當Anaconda安裝完成後,我們需要建立一個新的環境來管理我們的依賴包。運作 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 quandl 來為這個環境安裝所需的依賴包。完成這些需要幾分鐘的時間。

為什麼要用環境?如果你打算在你的電腦上運作很多Python項目,那麼分開不同項目的依賴包(軟體庫和包)來避免沖突是很有幫助的。

Ananconda會為每一個項目的依賴包建立一個特殊的環境目錄,使得所有包都能妥善地被管理和區分。

步驟1.3 - 啟動一個互動的Jupyter Notebook

當環境和依賴包都安裝好之後,運作 jupyter notebook 來啟動 iPython 核心,然後用你的浏覽器通路http://localhost:8888/。建立一個新的Python notebook,確定它使用的核心是Python [conda env:cryptocurrency-analysis]。

步驟1.4 – 導入依賴包

當你打開了一個空的Jupyter notebook,我們要做的第一件事就是導入所需的依賴包。

我們還要導入Plotly來啟用離線模式。

步驟2 - 獲得比特币的價格資料

一切就緒,我們可以開始擷取要分析的資料了。首先,我們要用Quandl的免費比特币接口來獲得比特币的價格資料。

步驟2.1 - 編寫Quandl幫助函數

為了友善資料擷取,我們要編寫一個函數來下載下傳和同步來自Quandl(https://www.quandl.com/ 号稱金融資料界的維基百科)的資料。

我們用pickle來序列化,把下載下傳的資料存成檔案,這樣代碼就不會在每次運作的時候重新下載下傳同樣的資料。這個函數将傳回Pandas資料框(Dataframe)格式的資料。如果你對資料框不太熟悉,你可以把它想成是強大的電子表格。

步驟2.2 – 抓取Kraken交易所定價資料

我們首先來擷取Kraken比特币交易所的曆史比特币匯率。

我們可以用head()方法來檢視資料框的前五行。

用Python代碼建個資料實驗室,順利入坑比特币

接下來,我們要做一個簡單的圖表,以此來快速地通過可視化的方法驗證資料基本正确。

用Python代碼建個資料實驗室,順利入坑比特币

這裡,我們用Plotly 來完成可視化部分。相對于使用一些更成熟的Python資料可視化庫,例如Matplotlib ,用Plotly是一個不那麼傳統的選擇,但我認為Plotly是一個不錯的選擇,因為它可以調用D3.js的充分互動式圖表。這些圖表有非常漂亮的預設設定,易于探索,而且非常友善嵌入到網頁中。

我們可以将生成的圖表與公開可用的比特币價格圖表(如Coinbase上的圖表)進行比較,作為一個快速的完整性檢查,驗證下載下傳的資料是否合理。

步驟2.3 從更多的比特币交易所抓取價格資料

你可能已經注意到,上面的資料集中存在資料缺失現象--特别是在2014年末和2016年初。在Kraken交易所的資料集中,這種資料缺失情況尤為明顯。我們當然不希望這些資料會影響到我們對價格的全面分析。

比特币交易所的特點是,供需關系決定比特币的價格。因而,沒有哪個交易的價格所能夠成為市場的“主流價格”。為了解決這個問題,以及剛剛提到的資料缺失問題(可能是由于技術性斷電和資料的差錯),我們将從三家主要的比特币交易所抓取資料,進而計算出平均的比特币價格指數。

首先,我們把各個交易所的資料下載下傳到到由字典類型的資料框中。

步驟2.4 将所有價格資料整合到單一資料框之中

接下來,我們将要定義一個簡單的函數,把各個資料框中共有的列合并為一個新的組合資料框。

現在,基于各個資料集的“權重價格”列,把所有的資料框整合到一起。

最後,可以使用“tail()”方法,檢視合并後資料的最後五行,以確定資料整合成功。

用Python代碼建個資料實驗室,順利入坑比特币

看起來,這些資料符合我們的預期:資料範圍大緻相同,隻是基于各個交易所的供求關系而略有不同。

步驟2.5 價格資料的可視化

從邏輯上來說,下一步就是通過可視化,将這些資料進行比對。為此,我們需要先定義一個輔助函數,通過提供單行指令使用資料制作圖表。

為簡便起見,我不會過多探讨這個輔助函數的工作原理。如果想了解更多,請檢視Pandas 和 Plotly的說明檔案。

現在,我們就可以輕松制作比特币價格資料的圖形了!

用Python代碼建個資料實驗室,順利入坑比特币

步驟2.6 清理并加總價格資料

從以上圖形中可以看到,盡管這四個系列資料遵循大緻相同的路徑,但其中還是有一些不規則的變化,我們将設法清除這些異常變化。

在2012-2017年的時間段中,我們知道比特币的價格從來沒有等于零的時候,是以我們先去除資料框中所有的零值。

在重新建構資料框之後,我們可以看到更加清晰的圖形,沒有缺失資料的情況了。

用Python代碼建個資料實驗室,順利入坑比特币

我們現在可以計算一個新的列:所有交易所的比特币日平均價格。

新的一列就是比特币的價格指數!我們再把它畫出來,以核對該資料看起來是否有問題。

用Python代碼建個資料實驗室,順利入坑比特币

太好了,看起來确實沒有問題。稍後,我們将繼續使用這個加總的價格序列資料,以便能夠确定其他數字貨币與美元之間的兌換匯率。

步驟3 擷取山寨币(Altcoins)價格

現在,我們已經有了比特币價格的時間序列資料了。接下來我們來看看非比特币的數字加密貨币的一些資料,一般是指山寨币(Altcoins)。

步驟3.1 定義Poloniex交易所的API輔助函數

我們将使用Poloniex API來擷取數字加密貨币交易的資料資訊。我們定義了兩個輔助函數來擷取山寨币的相關資料,這兩個函數主要是通過這個API下載下傳和緩存JSON資料。

首先,我們定義函數get_json_data,它将從給定的URL中下載下傳和緩存JSON資料。

然後,我們定義一個新的函數,該函數将産生Poloniex API的HTTP請求,并調用剛剛定義的get_json_data函數,以儲存調用的資料結果。

上述函數将抽取加密貨币配對字元代碼(比如“BTC_ETH”),并傳回包含兩種貨币曆史兌換匯率的資料框。

步驟3.2 從Poloniex下載下傳交易資料

絕大多數山寨币都無法使用美元直接購買,個人要想擷取這些電子貨币,通常都得先買比特币,再根據加密貨币兌換匯率,兌換成山寨币。因而,我們就得下載下傳每一種加密貨币兌換比特币的兌換匯率,然後再使用現有比特币價格資料轉換成美元。

我們會下載下傳9種排名靠前的加密貨币交易資料:Ethereum,Litecoin,Ripple,Ethereum Classic,Stellar,Dash,Siacoin,Monero,和NEM。

現在,我們有了包含9個資料框的字典,每種都包含山寨币與比特币之間的曆史日平均價格資料。

我們可以通過Ethereum價格表格的最後幾行,來判定資料是否可用。

altcoin_data['ETH'].tail()

用Python代碼建個資料實驗室,順利入坑比特币

步驟3.3 – 統一貨币機關:美元

現在,我們可以将BTC-山寨币匯率資料與我們的比特币價格指數結合,來直接計算每一個山寨币的曆史價格(機關:美元)。

此處,我們為每一個山寨币的資料框新增一列存儲其相應的美元價格。

接着,我們可以重新使用之前定義的函數merge_dfs_on_column,來建立一個合并的資料框,整合每種電子貨币的美元價格。

就是如此簡單!

現在讓我們同時把比特币價格作為最後一欄添加到合并後的資料框中。

現在我們有一個唯一的資料框,它包含了我們正在驗證的十種電子貨币的每日美元價格。

我們重新調用之前的函數df_scatter,以圖表形式展現全部山寨币的相應價格。

用Python代碼建個資料實驗室,順利入坑比特币

看起來不錯!這張圖為我們展現了每一種貨币兌換匯率在過去幾年的變化情況的一個全貌。

在這裡我們使用了對數規格的y軸,在同一繪圖上比較所有貨币。你也可以嘗試其他不同的參數值(例如scale='linear'),可以從不同視角了解資料。

步驟3.4- 執行相關性分析

你可能注意到電子貨币的匯率看上去似乎是相關的,盡管他們的貨币價值相差很大,而且波動性很高。尤其是從2017年4月的迅猛上漲開始,甚至很多的小波動似乎都與整個市場的波動同步出現。

當然,有資料支撐的結論比依據圖像而産生的直覺更有說服力。

我們可以利用Pandas corr()函數來驗證上述的相關性假設。該檢驗手段為資料框的每一欄計算了其對應另一欄的皮爾森相關系數。

8/22/2017修訂說明-這部分的修改是為了在計算相關系數時使用每日回報率而不是價格的絕對值。

基于一個非穩态時間序列(例如原始的價格資料)直接計算可能會導緻相關性系數的偏差。針對此問題,我們的解決方案是使用pct_change()方法,将資料框中的每一個的價格絕對值轉化為相應的日回報率。

首先,我們來計算2016年的相關系數。

用Python代碼建個資料實驗室,順利入坑比特币

上面這張圖顯示的都是相關系數。系數接近1或-1,分别意味着這一序列是強正相關的,或逆相關的,相關系數趨近于0則說明相應對象并不相關,他們的波動是互相獨立的。

為了更可視化的展示結果,我們建立了一個新的可視化的幫助函數。

用Python代碼建個資料實驗室,順利入坑比特币

圖示為2016年的電子貨币相關系數

此處,深紅色的數值代表強相關性(每一種貨币顯然是與其自身高度相關的),深藍色的數值表示強逆相關性。所有介于中間的顔色-淺藍/橙/灰/茶色-其數值代表不同程度的弱相關或不相關。

這張圖表說明了什麼呢?關鍵在于,它說明了不同的數字加密貨币價格在2016年間的波動情況,幾乎沒有統計上的顯著相關性。

現在,為了驗證我們的假設-電子貨币在近幾個月的相關性增強,接下來,我們将使用從2017年開始的資料來重複同樣的測試。

用Python代碼建個資料實驗室,順利入坑比特币

上圖似乎顯示了更強的相關性。但這些資料可以單獨作為投資決策的依據嗎?答案是否定的。

然而值得注意得是,在這張圖上幾乎所有的電子貨币互相之間都變得相關性更強了。

用Python代碼建個資料實驗室,順利入坑比特币

圖:2017年的電子貨币相關性

這是不是相當有趣呢!?

為什麼?

好問題!其實,我也不是很确定。。。

我的第一反應是,對沖基金最近開始公開在電子貨币市場交易[1][2]。這些基金持有遠超于普通交易人的大量資本,當一支基金如果在多種加密貨币間對沖自己的投入資本,然後根據獨立變量(比如說,股票市場)對每一種貨币使用相似的交易政策。如果從這個角度來看,出現這種越來越強的相關性趨勢是合理的。

更深度的了解XRP和STR

例如,從上圖中可以很明顯看出XRP(Ripple的代币)是與其他電子貨币相關性最低的。但這裡有一個值得注意的例外是STR(Stellar的代币,官方名字是"Lumens"),與XRP有強相關關系(相關系數:0.62)。

有趣的是,Stellar和Ripple是非常相似的金融科技平台,他們都旨在減少銀行間跨國轉賬時的繁瑣步驟。

可想而知,考慮到區塊鍊服務使用代币的相似性,一些大玩家以及對沖基金可能會對他們在Stellar和Ripple上的投資使用相似的交易戰略。這可能就是為什麼XRP相比其他電子貨币,與STR有更強相關性的原因。

快訊-我是Chipper的合作人之一。Chipper是一家使用Stella的非常早期的初創企業,旨在颠覆非洲的小額彙款行業。

現在,到你了!

然而,這一解釋在很大程度上是推測性的,可能你會做的更好。基于我們已經奠定的基礎,你有成百上千條不同的方法可以繼續探索資料中蘊藏的故事。

可以考慮從以下思路入手:

為整個分析添加更多加密貨币的資料

調整相關性分析的時間範圍和顆粒度,以得到優化的或粗粒度的趨勢視圖。

從交易量或區塊鍊資料挖掘集中尋找趨勢。相較于原始的價格資料,如果你想預測未來價格波動,你可以更需要買/賣量的比率資料。

在股票、商品、法定貨币上加入價格資料來決定他們當中哪一項與電子貨币具有相關性(但是,别忘了那句老話“相關不蘊含因果”)

使用Event Registry, GDELT,以及Google Trends來量化圍繞着特定電子貨币的“熱詞”數量。

利用資料訓練一個預測性機器學習模型,來預測明日價格。如果你有更大的雄心壯志,你甚至可以考慮嘗試用循環神經網絡(RNN)進行上述訓練。

利用你的分析來建立一個自動化的交易機器人,通過對應的應用程式設計接口(API),應用在例如“Poloniex”或“Coinbase”的交易網站上。請小心:一個性能欠佳的機器人可以輕易地讓你的資産瞬間灰飛煙滅。

關于比特币,以及對于加密貨币總體而言,最好的部分是它們的去中心化本質,這使得它比任何其他資産都自由、民主。可以将你的分析開源共享,參與到社群中,或者寫一篇部落格!

希望你現在已經掌握了自行分析所需的技能,以及在未來讀到任何投機性的加密貨币的文章時,進行辯證思考的能力,尤其是那些沒有資料支撐的預測。

感謝你的閱讀,關于這一教程,如果你有任何看法、建議或批評指正,請在下方留言。如果你發現代碼如果有問題,也可以點在Github倉庫中建立一個問題(issue)。

http://fortune.com/2017/07/26/bitcoin-cryptocurrency-hedge-fund-sequoia-andreessen-horowitz-metastable/

https://www.forbes.com/sites/laurashin/2017/07/12/crypto-boom-15-new-hedge-funds-want-in-on-84000-returns/#7946ab0d416a