第二章:7 撰寫布林通道突破策略


Posted by nightqwq on 2021-12-11

上一節,我們成功用一行程式碼撰寫策略。

這一節,我們在試著用 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


#加密貨幣 #Python







Related Posts

Inference, Prediction, and Forecast

Inference, Prediction, and Forecast

ESlint 錯誤訊息紀錄

ESlint 錯誤訊息紀錄

物件參考觀念 小試身手

物件參考觀念 小試身手


Comments