上一節,我們成功製作了策略濾網。
然而,若是以後每製作一個策略,就要手動添加濾網和修改參數的話很是麻煩,於是這一節,我們來試著將 Filter 打包重複再利用。
a. Filter 打包
首先先把「MMI Filter」下方儲存格的程式碼複製貼上到「Encapsulation」下方的儲存格,再來寫一個函式將這段程式碼包起來,參數放歷史價格、返回值放 mmi > 0.5:
def mmi_filter(ohlcv):
median = ohlcv.close.rolling(20).median()
p1 = ohlcv.close > median
p2 = ohlcv.close.shift() > median
mmi = (p1 & p2).astype(int).rolling(20).mean()
return mmi > 0.5
可以印出來看看:
mmi_filter(ohlcv)
如果要以視覺化呈現的話,可以在 return 方加入一個巢狀字典 figures,再加入返回值:
def mmi_filter(ohlcv):
median = ohlcv.close.rolling(20).median()
p1 = ohlcv.close > median
p2 = ohlcv.close.shift() > median
mmi = (p1 & p2).astype(int).rolling(20).mean()
figures = {
'figures': {
'mmi_index': mmi
}
}
return mmi > 0.5, figures
mmi_filter(ohlcv)
於是以後要使用這個策略時,它就具備了視覺化的功能。
再來要將這個策略進行封裝。
於 def 上方導入 finlab_crypto.strategy 的 Filter,在寫上裝飾器,裡面的參數寫 timeperiod,設成 20,再把函式裡面的參數改成「mmi_filter.timeperiod」:
from finlab_crypto.strategy import Filter
@Filter(timeperiod = 20)
def mmi_filter(ohlcv):
median = ohlcv.close.rolling(mmi_filter.timeperiod).median()
p1 = ohlcv.close > median
p2 = ohlcv.close.shift() > median
mmi = (p1 & p2).astype(int).rolling(mmi_filter.timeperiod).mean()
figures = {
'figures': {
'mmi_index': mmi
}
}
return mmi > 0.5, figures
封裝完之後就必須以另外一種方式呼叫它:
f40 = mmi_filter.create({'timeperiod': 40})
f40(ohlcv)
封裝完畢,接下來讓我們看看這樣的好處。
b. 將打包完的 Filter 拿來使用
首先把「Simple Moving Average」下方儲存格的倒數兩行程式碼複製貼上到「Optimization」下方的程式碼。
再來,於 portfolio 上方把打包好的 filter 拿出來用,並傳給 f_mmi 這個變數:
variables = {'sma1': np.arange(20, 100, 5), 'sma2': np.arange(20, 100, 5)}
f_mmi = mmi_filter.create({'timeperiod': 20})
portfolio = mmi_sma_strategy.backtest(ohlcv, variables=variables, freq='1h', plot=True)
然後於 portfolio 裡面放置 filters 這個字典,於字典裡面放置 f_mmi:
variables = {'sma1': np.arange(20, 100, 5), 'sma2': np.arange(20, 100, 5)}
f_mmi = mmi_filter.create({'timeperiod': 20})
portfolio = mmi_sma_strategy.backtest(ohlcv, variables=variables, filters = {'mmi': f_mmi}, freq='1h', plot=True)
於是,我們成功將 strategy 跟 filters 作結合。
如果想要優化參數配對,只要把參數改成 np.arange 即可:
variables = {'sma1': np.arange(20, 100, 5), 'sma2': np.arange(20, 100, 5)}
f_mmi = mmi_filter.create({'timeperiod': np.arange(10, 50, 5)})
portfolio = mmi_sma_strategy.backtest(ohlcv, variables=variables, filters = {'mmi': f_mmi}, freq='1h', plot=True)
最後,我們依照上圖圈起來的最高報酬率的參數配對來設置回測可視化圖表:
variables = {'sma1': 35, 'sma2': 80}
f_mmi = mmi_filter.create({'timeperiod': 30})
portfolio = mmi_sma_strategy.backtest(ohlcv, variables=variables, filters = {'mmi': f_mmi}, freq='1h', plot=True)
這一節,我們成功將 Filter 打包,並重複再利用。
下一節,我們來挑戰只用一行來撰寫策略。
完整版程式碼連結:https://colab.research.google.com/drive/1NOU6mgokMSu6hHU9RhBNJ2zAwzQQhTYB?usp=sharing