第一章:2 製作買賣訊號


Posted by nightqwq on 2021-12-07

今天來開始撰寫交易策略的第二步,我們來試著製作雙均線策略的買賣訊號。

a. 什麼是雙均線策略

在講什麼是雙均線策略之前,先來介紹什麼是均線。

對於每一個交易日,都可以計算出前 N 天的收盤價的移動平均值,把這些移動平均值連起來,形成一條線,就叫做 N 日移動平均線(均線)。

雙均線就是兩條均線,比如5日均線和10日均線。

雙均線策略,指的是運用兩條不同週期的移動平均線,即短週期移動平均線和長週期移動平均線的相對大小,研判買進與賣出時機的策略。

由短週期均線自下向上穿越長週期均線,所形成的交點,稱為黃金交叉。 當短週期均線自上而下穿越長週期均線,所形成的交點,稱為死亡交叉。

這樣我們可以構建一個雙均線策略:黃金交叉的時候,表明該幣很強勢,市場屬於多頭市場,進行買入 ; 反之,當出現死亡交叉點時,市場屬於空頭市場,進行賣出。


b. 製作雙均線策略買賣訊號

現在參考第一部分所介紹的雙均線策略來撰寫程式碼。

在開始之前,先把獲取歷史數據的那一行程式碼中的「1h」改成「4h」,以獲得較高的交易頻率。

由於均線表示收盤價的平均值,我們利用下列程式碼來獲取收盤價的數據,並將最近二十天的收盤價平均值做成一條均線,並傳到 sma20 這個變數:

close = ohlcv.close

sma20 = close.rolling(20).mean()

這樣就可以將「收盤價」與「收盤價的平均值」做比對,只要在變數後面接上「.plot()」即可。

假如不想看到這麼多筆資料,可以將獲取收盤價資料的那行程式碼後面接上「.tail(1000)」,於是我們只會看到最近的 1000 筆資料。

接著來繪製第二條均線,複製製作第一條均線的程式碼貼上,將 20 改成 60 並傳到 sma60 這個變數裡面即可。

依據上面繪圖的方法把 sma60 繪製出來,並按下執行:

OK,既然已經有了兩條均線,該是撰寫進出場點的時候了。

短週期均線自下向上穿越長週期均線,為黃金交叉,於是我們可撰寫一個買入點,效果是「當今天的快速均線向上衝破(大於)慢速均線,而昨天的情況並不是這樣的話,就買入進場」:

entries = (sma20 > sma60) & (sma20.shift() < sma60.shift())

出場點跟進場點是相反的:

exits = (sma20 < sma60) & (sma20.shift() > sma60.shift())

有趣的是,當我們將 entries 或是 exits 印出來時,會看到下圖的情形:

這裡每條時間序列的資料型態都是布林值,False 表示當前的時間點不符合條件所以不執行,True 表示符合所以做買入的動作。

由於布林值無法用視覺化圖型展現,我們需要利用「.astype(int)」將 entries 和 exits 的資料型態從布林值轉為整數,方可視覺化。

來到最後一步,我們將收盤價、均線、進出場點全部進行繪圖。

需要注意的是,我們只要顯示「有進行買入賣出」的部分,所以 entries 與 exits 的 plot 括號內需加上 secondary_y = True(True 表示有執行):

如上圖,黃色跟綠色的線就是兩條均線,紫色跟紅色則是交易訊號(紫色為出場點,紅色為進場點)。

這樣看其實有點複雜,所以我們可在 exits 的開頭加一個負號,讓他顯示時變成 -1,以便跟是 1 的 entries 區分開來。(True 預設是 1)

記得要加上括號把「-exits.astype(int)」包裹起來,才是合法的寫法。


當然現在只是在做測試,如果要真的下單獲利,需要串連卷商的 API,把策略部署好才可以。在這系列文的後半段也會實際演示這一部份。

今天先到這邊。


#加密貨幣 #Python







Related Posts

Emit 觀念與使用

Emit 觀念與使用

ES6

ES6

用 JavaScript 學習資料結構和演算法:佇列(Queue)篇

用 JavaScript 學習資料結構和演算法:佇列(Queue)篇


Comments