用Python投資加密貨幣:三年20倍的策略參數最佳化 (Part 7)

這篇文章中,我們將承接著之前的單元,來教大家怎麼做最佳化!

必備的單元提要:

  1. 環境設定:使用 colab 並且安裝相關 packages
  2. 簡單回測:利用均線相交產生買賣訊號回測

要執行完上述兩個單元的程式碼,才能繼續接下來的單元喔!

我們將上次的回測程式改成以下的樣子,請大家來比較一下有什麼不同:

from backtesting import Backtest
from backtesting.lib import SignalStrategy
import pandas as pd

class Strategy(SignalStrategy):
    
    n1 = 20
    n2 = 60
    
    def init(self):
        super().init()
        
        # Precompute the two moving averages
        close = pd.Series(self.data.Close)
        sma1 = close.rolling(self.n1).mean()
        sma2 = close.rolling(self.n2).mean()
        
        # Precompute signal
        signal_long = (sma1 > sma2) & (sma1.shift() < sma2.shift())
        signal_short = (sma1 < sma2) & (sma1.shift() > sma2.shift())
        
        # combine signal
        signal = signal_long
        signal[signal_short] = -1
        
        # add signal
        self.set_signal(signal)

bt = Backtest(df, Strategy)
result1 = bt.run()
bt.plot()

沒錯,我們新增了7、8行的物件參數,分別代表兩條均線的參數,並且在15、16行,製作均線時,使用該參數來製作均線。

另外我們也在倒數第二行,將回測結果存到 result1,等等可以做比較。

你應該會看到跟上次一樣的結果:

接下來就可以自動最佳化了!

暴力枚舉

你可能以為要寫for迴圈,但其實 backtesting 已經幫你寫好了,我們只要將參數範圍傳入 bt.optimize,就可以了,非常方便:

result2 = bt.optimize(n1=range(5, 100, 5),
                      n2=range(5, 100, 5))

優化後的結果

由於策略優化完後,參數會自動更新,所以我們可以用:

bt.plot()

來看優化後的績效就可以了!

三年半 20 倍,是不是很夢幻呀!而且還多空都賺,拿量化交易的方式交易比特幣,就像是拿大砲對付刀劍一樣,我們可以將優化前後的績效比對一下,真的差很多呢!

result1._trade_data.Equity.plot()
result2._trade_data.Equity.plot()

但隨著期貨市場的開放,這樣的績效,或許沒辦法重現,或許市場已經慢慢走向效率化,可以看到2019年以後,賺得比較少,但是加密貨幣又不是只有 BTC,一定有很多未開發的地帶,等著量化交易去開拓的,所以也不用太擔心!

這些單元的用意,就是在你在開江闢土時,提供你豐富的資源,讓你在開發策略事半功倍!

更新:很多人都躍躍欲試呢!我幫大家寫好完整的代碼,可以在線上直接運行喔!
請點此

下個階段,我們就可以來真的入金交易囉

你可以到FinLab粉專,點選追蹤,或點讚,就可以收到我們的新單元囉!

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎第十一大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!