在加密貨幣市場當中,不同的幣種有不同的價格和市場波動,所以也可以針對個別幣種來做策略,於是自然而然會累積許多策略。
然而每當要拿以前做過的策略出來用時,要重打程式碼是一件很煩人的事,於是接下來,我們要試著將策略進行打包,這樣以後不管是要拿出來用,還是要上傳到 Google cloud 自動運行都會變得很方便。
a. 什麼是 Decorator
Decorator 也叫裝飾器,它能夠在不更改程式碼的狀況下為程序附加特殊功能,而這些特殊功能 finlab_crypto 也早已幫我們寫好,現在就讓我們見識加上 finlab_crypto 自家的 Decorator 對我們的程序有怎樣的影響。
b. 策略裝入函式
在上次製作策略圖表那行程式碼複製圖片上反白位置,在新儲存格中貼上,並寫上:
def sma_strategy(ohlcv):
讓其餘程式碼往前四格,使整個策略變成一個函式:
之後在函式最下方 return 出場點和進場點,寫完後可以自行 run 看看,與上一章相同,會獲得時間序列:
c. 策略打包
接下來就是重頭戲了,我們在函式上方從 finlab_crypto 的裡面導入 Strategy:
from finlab_crypto import Strategy
再下一行寫入:
@Strategy()
上一行有小老鼠的程式碼就是 finlab_crypto 自家的 Decorator。
於是,我們的雙均線策略就會多出許多功能,宛如穿上強化裝備一般,比如與上一章的 vectorbt 相似,輸入:
portfolio = sma_strategy.backtest(ohlcv, freq='4h', plot=True)
效果如下:
我們成功製作了一個可移動的可視化回測圖表,圖中的藍色箭頭往上升,代表該區間斷獲利,往下則是虧損。
第二張圖表表示確切的買入賣出時間段,第三章則是累積報酬率:
我們也可以將雙均線加入回測圖表裡,來看看策略是否真的在黃金交叉時買入,死亡交叉時賣出,只要利用 Python 的高級資料結構「字典」就可以辦到。
我們在函式里最後一行的 return 上方寫一個字典,把變數取叫「figures」,我們希望均線能夠跟著價格跑,所以在字典裡寫上「'overlaps'」這個變數再做一個字典,並把雙均線寫進裡面,鍵對應到值:
figures = {'overlaps': {'sma20': sma20,'sma60': sma60}}
把 figure 加入 return 裡面作為返回值的第三個參數,再重新運行即可看到雙均線:
可以看到,策略確實有在黃金交叉、死亡交叉的時候進行買入和賣出,也就是箭頭的開頭總是會在雙均線交叉附近(箭頭開始買入,箭頭末尾賣出)。
最後,我們將程式最下方把那行叫出視覺化圖表的程式碼存進 portfolio 這個變數裡面,以利後續跟 vectorbt 結合,激盪出更多強力的效果。
portfolio = sma_strategy.backtest(ohlcv, freq='4h', plot=True)
今天先到這邊。
下一節,我們來試著找出策略的最佳參數。