上一節,我們成功用一行程式碼撰寫策略。
這一節,我們在試著用 Talib 撰寫布林通道突破的策略。
a. 什麼是布林通道突破?
布林通道是一種判斷「進出場時機」的指標,用平均線與機率的觀念找出市場多空訊號。
如圖,當價格突破 Upperband 時,進行買入,時,跌破 lowerband 時,進行賣出。
b. 策略撰寫
只要依照上圖的程式碼文件和布林通道的說明,相信現在以大家的實力也能夠輕易寫出來,這邊一樣先給程式碼:
bbands_strategy = TalibStrategy(
'BBANDS',
lambda ohlcv, bb: crossover(ohlcv.close, bb.upperband),
lambda ohlcv, bb: crossunder(ohlcv.close, bb.lowerband),
)
bbands_strategy.backtest(ohlcv, variables = {'timeperiod': 50}, freq = '1h', plot = True)
由圖可以看出布林通道,並且在價格突破紅色線段(Upperband)時確實有進行買入,也確實在跌破 lowerband 時進行賣出。
這樣簡潔的寫法,其實也可以用來撰寫其他 Filters,我們現在就來試試看。
先移動到「Talib Filter Wrapper」觀看下方的技術文件:
如圖,參數和輸出各只有一個。
往下開一個新儲存格,按照上面的方式撰寫,寫入收盤價和參數:
talib.LINEARREG_ANGLE(ohlcv.close, timeperiod = 14)
如圖,我們希望指標大於 0 時進場。(因為時間很長,所以看起來很密集)
往下開一個新儲存格,導入 TalibFilter:
from finlab_crypto.talib_filter import TalibFilter
撰寫 lambda:
line_angle_filter = TalibFilter(
'LINEARREG_ANGLE',
lambda ohlcv, angle: angle > 0
)
lambda 撰寫完畢,接著往下開一個新儲存格,創建這個 Filter:
f14 = line_angle_filter.create({'timeperiod': 14})
可以導入歷史價格來看看這個 Filter:
(True 代表有進場,False 代表沒有)
好了,既然有 Strategy,也有了 Filter,接下來就是要將這兩者做結合,去產生出新的策略。
先移動到「Combine talib strategy and filter」這邊,將製作好的 Filter 貼到「macd_strategy」這個變數下方。
再來就是做回測,於該儲存格最下方撰寫
macd_vars = {}
macd_strategy.show_parameters()
然後執行,將跑出來的結果複製貼上到空字串裡面,並去除進出場點的參數,以及去除最後一行,這樣空字典的部分就會是:
macd_vars = { 'fastperiod': 12,
'slowperiod': 26,
'signalperiod': 9}
再來於空字典上方導入 numpy,再把前兩個參數改成 arange,已進行最佳化,再把最後一個參數從 9 改成 10:
macd_vars = { 'fastperiod': np.arange(20, 120, 10),
'slowperiod': np.arange(20, 120, 10),
'signalperiod': 10}
最後於該儲存格最下方輸入下列程式碼,即可進行回測:
macd_strategy.backtest(ohlcv, variables = macd_vars, freq = '1h', plot = True)
整個程式碼會是這樣:
from finlab_crypto.talib_strategy import TalibStrategy
from finlab_crypto.talib_filter import TalibFilter
macd_strategy = TalibStrategy(
'MACD',
lambda ohlcv, macd: crossover(macd.macdhist, 0),
lambda ohlcv, macd: crossunder(macd.macdhist, 0),
)
line_angle_filter = TalibFilter(
'LINEARREG_ANGLE',
lambda ohlcv, angle: angle > 0
)
import numpy as np
macd_vars = { 'fastperiod': np.arange(20, 120, 10),
'slowperiod': np.arange(20, 120, 10),
'signalperiod': 10}
macd_strategy.backtest(ohlcv, variables = macd_vars, freq = '1h', plot = True)
可以看到跑出來的績效不是太好,最多只到 300,可以更改參數範圍區間試試看:
macd_vars = {
'fastperiod': np.arange(200, 400, 10),
'slowperiod': np.arange(200, 400, 10),
'signalperiod': 10}
績效成功提升到 2000 左右。
(如果你在這時候 RAM 耗盡的話,不用慌,cloud 會自動幫你重置,這時你只需要由上往下重跑一遍即可,不然就是只跑你需要的儲存格。)
其實我們在裡面寫上的 Filter 還沒有被正式啟用,所以現在就讓我們把它加入回測參數裡面。
其實與以前所學到的類似,加入完後會像這樣:
# macd_strategy
# line_angle_filter
from finlab_crypto.talib_strategy import TalibStrategy
from finlab_crypto.talib_filter import TalibFilter
def crossover(s1, s2):
if isinstance(s2, numbers.Number):
return (s1 > s2) & (s1.shift() < s2)
return (s1 > s2) & (s1.shift() < s2.shift())
def crossunder(s1, s2):
if isinstance(s2, numbers.Number):
return (s1 < s2) & (s1.shift() > s2)
return (s1 < s2) & (s1.shift() > s2.shift())
macd_strategy = TalibStrategy(
'MACD',
lambda ohlcv, macd: crossover(macd.macdhist, 0),
lambda ohlcv, macd: crossunder(macd.macdhist, 0),
)
line_angle_filter = TalibFilter(
'LINEARREG_ANGLE',
lambda ohlcv, angle: angle > 0
)
import numpy as np
macd_vars = {
'fastperiod': np.arange(200, 400, 10),
'slowperiod': np.arange(200, 400, 10),
'signalperiod': 10}
angle_vars = {'timeperiod': np.arange(20, 100, 10)}
macd_strategy.backtest(ohlcv, variables=macd_vars,
filters={'line_angle': line_angle_filter.create(angle_vars)},
freq='1h', plot=True)
再來,我們複製倒數三行程式碼並貼上新儲存格,取其中的最佳策略(由上往下越佳)來創建回測可視化圖表:
macd_vars = {
'fastperiod': 300,
'slowperiod': 390,
'signalperiod': 10}
angle_vars = {'timeperiod': 20}
macd_strategy.backtest(ohlcv, variables=macd_vars,
filters={'line_angle': line_angle_filter.create(angle_vars)},
freq='1h', plot = True)
這一節,我們成功撰寫布林通道突破策略,並且嘗試用不同的 filters 寫 lambda。
下一章,我們來針對基本面與籌碼面撰寫策略。
完整版程式碼連結:https://colab.research.google.com/drive/108kx9nAsefqdDfFc_n2ISEablT9SRNbD?usp=sharing