Backtesting到底要怎麼用呢?這邊我們會一步一步向大家介紹,
最簡單的方式就是直接實做一個策略來和大家講解裡面的細節。
那我們就先從實做一條均線(季線60MA)做進出場依據的策略開始吧,把策略取名為OneMA。
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
from backtesting.test import SMA
import talib
class OneMA(Strategy):
n1 = 60 #預設的均線參數
def init(self): #初始化會用到的參數和指標,告知要如何計算
self.sma1 = self.I(SMA, self.data.Close, self.n1)
def next(self): #回測的時候每一根K棒出現什麼狀況要觸發進出場
#如果收盤價>sma1(也就是60ma),而且目前沒有多單部位
if (self.data.Close > self.sma1) and (not self.position.is_long) :
self.buy()#做多
#如果收盤價<sma1(也就是60ma)
elif (self.data.Close < self.sma1):
self.position.close()#部位出場
#如果要做空就用self.sell()
策略搞定之後就要來用Backtest回測囉!
#輸入回測的條件,df是上一篇台積電日K資料,OneMA是寫好的策略,初始資金10000,交易成本0.2%
bt = Backtest(df, OneMA, cash=10000, commission=0.002)
#將跑完回測得到的數據放到stats
stats = bt.run()
stats
從下面的回測結果可以發現:
資料:台積電2020-2021/9/22
策略:「高於季線做多,跌破出場」
績效有超過50%,但卻比買進並持有的績效還差!
這段期間的Sharpe Ratio更是低到只有0.23!
勝率也只有不到3成的27.7%!
Out:
---------------------------------------------
Start 2020-01-02 00:00:00
End 2021-09-22 00:00:00
Duration 629 days 00:00:00
Exposure [%] 58.028617
Equity Final [$] 15061.227055
Equity Peak [$] 21692.629027
Return [%] 50.612271
Buy & Hold Return [%] 72.861357
Max. Drawdown [%] -30.56984
Avg. Drawdown [%] -4.895715
Max. Drawdown Duration 244 days 00:00:00
Avg. Drawdown Duration 30 days 00:00:00
# Trades 18
Win Rate [%] 27.777778
Best Trade [%] 47.195966
Worst Trade [%] -3.02392
Avg. Trade [%] 3.034155
Max. Trade Duration 162 days 00:00:00
Avg. Trade Duration 21 days 00:00:00
Expectancy [%] 5.630253
SQN 0.84756
Sharpe Ratio 0.231967
Sortino Ratio 3.252764
Calmar Ratio 0.099253
_strategy OneMA
接著我們用下面這行code就能把圖畫出來囉!
bt.plot(superimpose = False)
這張圖配色舒服,互動體驗也很好,也可以客製化調整只秀出你想看到的數據,趕快來玩玩看吧!
從回測資料看來這個策略還有很大的改善空間,那要怎麼做策略的最佳化呢?
請期待我們下一篇的文章喔!