好啦!經過這麼多堂課,相信大家對Backtesting有一定的認識了,
今天要來和大家分享的是常見的雙均線策略。
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
from backtesting.test import SMA
class TwoMA(Strategy):
# 定義長短天期均線參數
n1 = 20
n2 = 60
# 先算好均線(技術指標)價格
def init(self):
self.sma1 = self.I(SMA, self.data.Close, self.n1)
self.sma2 = self.I(SMA, self.data.Close, self.n2)
#一次推進一根 K 棒
def next(self):
#短天期均線較長天期均線高,隔日開盤價買進
if self.sma1 > self.sma2 and (not self.position.is_long):
self.buy()
#短天期均線較長天期均線低,隔日開盤價賣出
elif self.sma2 > self.sma1 :
self.position.close()
#輸入回測的條件,df是上一篇台積電日K資料,TwoMA是寫好的策略,初始資金10000,交易成本0.2%
bt = Backtest(df, TwoMA, cash=10000, commission=0.002)
#將跑完回測得到的數據放到stats
stats = bt.run()
stats
從下面的回測結果可以發現:
Out:
---------------------------------------------
Start 2020-01-02 00:00:00
End 2021-09-22 00:00:00
Duration 629 days 00:00:00
Exposure [%] 59.300477
Equity Final [$] 19049.461623
Equity Peak [$] 22923.436404
Return [%] 90.494616
Buy & Hold Return [%] 72.861357
Max. Drawdown [%] -16.899625
Avg. Drawdown [%] -3.820395
Max. Drawdown Duration 244 days 00:00:00
Avg. Drawdown Duration 27 days 00:00:00
# Trades 2
Win Rate [%] 50.0
Best Trade [%] 101.822896
Worst Trade [%] -0.202401
Avg. Trade [%] 50.810247
Max. Trade Duration 322 days 00:00:00
Avg. Trade Duration 187 days 00:00:00
Expectancy [%] 51.012648
SQN 0.992163
Sharpe Ratio 0.704301
Sortino Ratio NaN
Calmar Ratio 3.00659
_strategy TwoMA
bt.plot(superimpose = False)
stats = bt.optimize(n1=range(10, 41, 1),
n2=range(41, 121, 1),
maximize='Equity Final [$]',
)
stats
Out:
---------------------------------------------
Start 2020-01-02 00:00:00
End 2021-09-22 00:00:00
Duration 629 days 00:00:00
Exposure [%] 55.166932
Equity Final [$] 21305.634403
Equity Peak [$] 22923.436404
Return [%] 113.056344
Buy & Hold Return [%] 72.861357
Max. Drawdown [%] -14.561664
Avg. Drawdown [%] -3.776633
Max. Drawdown Duration 244 days 00:00:00
Avg. Drawdown Duration 28 days 00:00:00
# Trades 3
Win Rate [%] 100.0
Best Trade [%] 102.861905
Worst Trade [%] 1.855479
Avg. Trade [%] 35.984833
Max. Trade Duration 315 days 00:00:00
Avg. Trade Duration 116 days 00:00:00
Expectancy [%] NaN
SQN 1.160389
Sharpe Ratio 0.62127
Sortino Ratio NaN
Calmar Ratio 2.471203
_strategy TwoMA(n1=40,n2=48)
雖然這績效看起來真的驚人,但這看起來也未免太人工了,
因此這邊只是幫大家熟悉一下基本策略如何實作及最佳化,
大家可別直接拿去用啊!