class SmaCrossCons(ConsStrategy):
# Class variable for parameters tuning
fast_days = 5
slow_days = 15
def init(self):
super().init()
self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
self.conservative = True
def next(self):
if crossover(self.fast_line, self.slow_line):
if len(self.trades) > 0:
self.trades[0].close()
self.buy()
elif crossover(self.slow_line, self.fast_line):
if len(self.trades) > 0:
self.trades[0].close()
if self.conservative == False:
self.sell()
super().init():繼承Strategy的初始化函式。params(self):用來記錄訓練後參數。
class ConsStrategy(Strategy):
def init(self):
super().init()
self.conservative = True
@property
def params(self):
return self._params
參數可藉由
backtesting.optimize()進行參數優化。
# Class variable for parameters tuning
fast_days = 5
slow_days = 15
def init(self):
super().init()
self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
self.conservative = True
def next(self):
if crossover(self.fast_line, self.slow_line):
if len(self.trades) > 0:
self.trades[0].close()
self.buy()
elif crossover(self.slow_line, self.fast_line):
if len(self.trades) > 0:
self.trades[0].close()
if self.conservative == False:
self.sell()
該語法會將之前的操作清空,作用等同於
exclusive_orders=True。
if len(self.trades) > 0:
self.trades[0].close()
策略為激進時
self.conservative = False,允許賣空。
if self.conservative == False:
self.sell()
test = Backtest(
data=df,
strategy=SmaCrossCons,
cash=10000000,
commission=0.004,
exclusive_orders=True,
hedging = True,
trade_on_close=True,
)
strategy:回測策略。cash:本金。commission:交易手續費。hedging:若為True時,優先對之前操作進行抵銷。
Sell(1100)、Buy(1000) -> 賣空100Sell(1000)、Buy(1100) -> 買空100Sell(1000)、Sell(1100) -> 賣空2100exclusive_orders:若為True時,每次操作前自動關閉(close)上次操作。
Buy(500)、Buy(1000) -> 最後持股1000Buy(500)、Sell(500) -> 賣空500trade_on_close:於收盤時交易,否則預設於開盤交易。對參數進行優化,尋找該策略下的最佳參數,
參數必須為Strategy的Class variable。
constraint:限定組合必須符合特定條件
result = test.optimize(
fast_days=[5,10,15],
slow_days=[10,15,20],
constraint=lambda p: p.fast_days < p.slow_days,
)
最後的測試組合為:(5,10), (5,15), (5,20), (10,15), (10,20), (15,20)。
backtesting你的文檔可以寫得再爛點沒關係。