第一章:5 找出策略最佳參數


Posted by nightqwq on 2021-12-07

在上一章中,我們成功利用 finlab_crypto 的裝飾器來幫我們的策略做回測,現在,我們要試著找出策略的最佳參數。

我們的雙均線是設在 sma20 以及 sma60,也就是突破 20MA 而且同時站在 60MA 之上買入;跌破 20MA 且同時在 60MA 之下賣出。

但是我們怎麼知道參數設成 20 跟 60 能達到最高的報酬率呢?亦或更直接一點來說,我們如何得知怎樣的參數搭配可以達到最高報酬率呢?讓我們試著達成這件事。


a. 參數設定

為了要讓參數便於修改,我們直接將參數設在裝飾器裡,以便於以後隨時調整:

如上圖,修改了裝飾器和兩個 sma 變數的位置。

再來,於儲存格的最後一行加入字典,輸入雙均線的變數,寫完看起來會像這樣:

portfolio = sma_strategy.backtest(ohlcv, variables = {'sma1': 20, 'sma20': 60}, freq = '4h', plot = True)

在於上述程式碼的上一行也寫上「variables = {'sma1': 20, 'sma20': 60}」,並於最後一行把字典變數傳給字典變數,寫完會像這樣:

portfolio = sma_strategy.backtest(ohlcv, variables = variables, freq = '4h', plot = True)

這樣似乎看起來多此一舉,沒關係,等會就會知道它的功用。


b. 參數配對

我們往上開一個新的儲存格,並導入 Numpy:

import numpy as np

這樣就可以使用一個 numpy 的函式「arange」,這是做什麼的?很簡單,輸入:

np.arange(20, 310, 10)

上述程式碼會創造一個涵蓋 20 到 310,每 10 個數顯示一個數值的範圍(最後一個數字會省略,所以 300 要加 10),看起來就像這樣:

再來,我們把策略儲存格的倒數第二行改成:

variables = {'sma1': np.arange(20, 310, 10), 'sma2': np.arange(20, 310, 10)}

剩下的語法就不需更動,把倒數兩行程式碼一起複製並貼到新的儲存格,直接按下執行,就會觸發裝飾器的另外一種功能 ── 執行不同參數配對並比較其報酬率:

如上圖,總共比較了 841 種參數配對。

首先來看第一張圖:

這張圖表由上往下顯示了一到十名的績效。

第二張:

這張圖表顯示了最大虧損風險。

第三張:

由這張圖表我們可以得知,當 sma1 設定參數較低時,sma2 設定參數較高時,累積報酬率會比較高。

第四張和第五張則是不同的以不同的指標作為判斷標準,但看法與第三張相同。

第六到第八張用來驗證策略過擬合的機率。

第六張:

這張圖表表示過擬合機率只有 10 % 左右,效果很好,長條圖的數值越往右邊,過擬合機率越低,反之越高。

第七張:

這張圖表表示策略的精準度非常好,藍點越往直線靠攏,精準度越高。

第八張:

圖上的藍線比黃線還要低,意味著我們的策略比隨機使用任意種策略所得到的績效報酬率還要高。

第九張:

這張圖表顯示了把 sma1 當作橫軸和縱軸來比較最高報酬率,然而這沒有意義,因為是拿相同的均線在做比較,無法得出最佳配對。

所以讓我們來進行調整,把橫軸當作 sma2、縱軸當作 sma1:

在這張分層設色圖中,顏色越淺代表報酬率越高,反之則報酬率越低。


到此,我們已成功發現最高報酬率的雙均線參數配對。

下一章,我們來研發上漲趨勢追蹤的交易策略。

本章策略:https://colab.research.google.com/drive/14FbvnD0TO5SQeFo97EN_kKsvj9ci1dlx?usp=sharing


#加密貨幣 #Python







Related Posts

Set & Map - 變形的 Array & Object ?

Set & Map - 變形的 Array & Object ?

【Day00】七天切出屬於自己的個人網站

【Day00】七天切出屬於自己的個人網站

〈 演算法與資料結構 #1〉Recursion 遞迴函式

〈 演算法與資料結構 #1〉Recursion 遞迴函式


Comments