在這個教程中,我們將學習如何利用交叉指標預測加密貨幣市場的買入/賣出信號,並在教程結尾提供了完整的Python代碼,在市場歷史數據上利用此算法可以實現三倍的比特幣收益回報率。
用自己熟悉的語言學習 以太坊DApp開發 : Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart
1、基礎知識:黃金交叉 vs. 死亡交叉
如果你有金融背景,就知道黃金交叉(golden Cross)和死亡交叉(Death Cross)這兩個指標是衍生自滑動平均算法,也被稱爲交叉指標(cross indicator)。這兩個交叉指標都是使用以下公式對特定時間段內的市場收盤價計算平均值:
該概念組合兩個滑動平均值(短期和長期)以獲得加密貨幣趨勢。當短期移動均線超過或回顧長期移動均線時,將出現買入或賣出信號。
從數學上講,如果你選擇5個週期的短期移動均線和20個週期的長期移動均線,我們將通過以下條件 獲得買入信號:
MA(5)計算如下:
MA(20)計算如下:
CPrice對應於收盤價值。例如,目前比特幣的價格爲49,670美元,t表示時間段定義(在本文結尾的視頻中對此有更多解釋)。這些交叉指標是方程的一部分,可幫助檢測所研究的加密貨幣的全球趨勢。這些CI(交叉指標)在全球範圍內被多個交易者和基金廣泛使用,以定義支撐力量、阻力水平、 止損和目標並瞭解潛在趨勢。
現在我們已經涵蓋了一些背景知識,讓我們開始測試,看看它們如何幫助預測加密貨幣市場。
2、使用的軟件棧
在繼續下面的教程之前,請確保你已經安裝了Python3以及以下軟件包:
- Pandas:
- NumPy:
- Yfinance:
- Plotly:不是必須的,但在繪圖時有用
可以使用pip安裝上述軟件包,例如:
pip install yfinance
pip install plotly
3、數據管道和建模
現在我們可以定義數據處理流程了,主要包含3個不同的步驟:
- 使用Yahoo Finance API查詢實時加密貨幣的數據
- 定義一個時間段,爲我們要計算的數據創建新列,然後每秒更新這些值。
- 實時繪圖,並檢查我們的信號是否準確。
在本文中,我不會過多地介紹有關代碼和API的細節,你可以在下面的文章中 瞭解 如何用Python獲取實時的加密貨幣市場數據。現在我們可以開始編碼了!
4、導入軟件包
第一步將包括導入必要的軟件包。使用以下代碼行導入以前安裝的軟件包:
# Raw Package
import numpy as np
import pandas as pd
#Data Source
import yfinance as yf
#Data viz
import plotly.graph_objs as go
現在已經導入了庫,接下來可以導入我們的加密貨幣數據了。
5、獲取實時市場數據
現在,所需的不同軟件包已上傳。我們將以BTC-USD交易對爲例,通過Yahoo Finance API設置導入。
可以擴展需要的法幣以及加密貨幣選項。例如,如果你來自印度或加拿大,則可以使用INR或CAD,你也可以設置是否需要Ripple或Ethereum數據。
讓我們回到API結構。
調用Yahoo Finance API時需要按順序傳入三個參數:
- 交易對代碼(1)
- 開始日期+結束日期或期間(2)
- 間隔(3)
在我們的示例中,交易對代碼(參數1)將爲BTC-USD對。此外,在此示例中,我們將選擇最後7天作爲時間段(參數2)。並設置一個間隔(參數3)的90分鐘。
要調用數據,必須使用以下結構:
在繼續之前,我將介紹有關第三個參數(interval)的一些細節。
6、可用的時間間隔
這裏我想快速介紹一下可以使用yahoo finance API設置的不同間隔。
下面詳細列出了各種可能的間隔:
現在我們已經定義了三個參數,讓我們執行查詢並檢查輸出:
data = yf.download(tickers='BTC-USD',period = '8d', interval = '90m')
下面是輸出結果:
現在,我們已經下載並存儲了數據,可以繼續並定義華東平均線以及買賣信號。
7、算法實現
現在,我們的實時數據已經下載並存儲在名爲data
的變量中。下一步包括計算我們的移動平均線 並設置買入和賣出信號。
我們將需要創建以下計算字段:
- MA(5)
- MA(20)
爲此,我們將使用Python中包含的滾動函數來獲取n個最新週期的平均值。關於MA(5),我們將在最近的5個90分鐘週期內應用我們的策略。這意味着我們將計算最近7小時30分鐘(5次乘以90分鐘)的平均收盤價。
類似的對於MA(20),要計算的是20個而不是5個90分鐘週期的平均值。Python代碼如下:
#Moving average using Python Rolling function
data['MA5'] = data['Close'].rolling(5).mean()
data['MA20'] = data['Close'].rolling(20).mean()
上面的代碼執行後,將爲數據框創建2個新列,如下所示:
好了,下面我們就可以測試策略了。
8、實時繪圖
我們計劃的最後一步是繪製數據並檢查是否可以預測市場走勢。在下圖中,我將綠色標記爲良好的預測,將黑色預測爲錯誤的預測:
9、量化交易Python代碼
完整的Python代碼如下:
# Raw Package
import numpy as np
import pandas as pd
#Data Source
import yfinance as yf
#Data viz
import plotly.graph_objs as go
#Importing market data
data = yf.download(tickers='BTC-USD',period = '8d', interval = '90m')
#Adding Moving average calculated field
data['MA5'] = data['Close'].rolling(5).mean()
data['MA20'] = data['Close'].rolling(20).mean()
#declare figure
fig = go.Figure()
#Candlestick
fig.add_trace(go.Candlestick(x=data.index,
open=data['Open'],
high=data['High'],
low=data['Low'],
close=data['Close'], name = 'market data'))
#Add Moving average on the graph
fig.add_trace(go.Scatter(x=data.index, y= data['MA20'],line=dict(color='blue', width=1.5), name = 'Long Term MA'))
fig.add_trace(go.Scatter(x=data.index, y= data['MA5'],line=dict(color='orange', width=1.5), name = 'Short Term MA'))
#Updating X axis and graph
# X-Axes
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=3, label="3d", step="days", stepmode="backward"),
dict(count=5, label="5d", step="days", stepmode="backward"),
dict(count=7, label="WTD", step="days", stepmode="todate"),
dict(step="all")
])
)
)
#Show
fig.show()
10、教程小結
所有交易都不完美,有時我們往往會滯後於進入或離開市場,但在比特幣穩定的時期,黃金交叉策略已成爲提高我們利潤的有用策略。利用已有的歷史數據進行簡單計算後,我們的算法可以在一週內獲得7.1%的回報,而同期的比特幣交易回報率則穩定在1.7%左右。