(
data: pd.DataFrame,
code: str,
strategy: bt.Strategy,
strategy_kwargs: Dict = {},
commission_kwargs: Dict = {},
)
| 49 | |
| 50 | |
| 51 | def backtest_strategy( |
| 52 | data: pd.DataFrame, |
| 53 | code: str, |
| 54 | strategy: bt.Strategy, |
| 55 | strategy_kwargs: Dict = {}, |
| 56 | commission_kwargs: Dict = {}, |
| 57 | ): |
| 58 | commission_kwargs: Dict = update_params(COMMISSION, commission_kwargs) |
| 59 | strategy_kwargs: Dict = update_params(STRATEGY_PARAMS, strategy_kwargs) |
| 60 | assert commission_kwargs["leverage"] == strategy_kwargs["leverage"], "leverage must be same in both strategy and commission settings" |
| 61 | |
| 62 | if isinstance(code, str): |
| 63 | |
| 64 | df: pd.DataFrame = data.query("code == @code").copy() |
| 65 | |
| 66 | elif isinstance(code, list): |
| 67 | |
| 68 | df: pd.DataFrame = data.query("code in @code").copy() |
| 69 | strategy_kwargs["hold_num"] = len(code) |
| 70 | |
| 71 | df: pd.DataFrame = df.dropna(subset=["close","factor1","factor2","signal","vwap"]) |
| 72 | bt_engine = BackTesting(**commission_kwargs) |
| 73 | bt_engine.load_data( |
| 74 | df, |
| 75 | datafeed_cls=CryptoDataFeed, |
| 76 | ) |
| 77 | print(strategy_kwargs) |
| 78 | bt_engine.add_strategy(strategy, **strategy_kwargs) |
| 79 | bt_engine.cerebro.addanalyzer( |
| 80 | bt.analyzers.TimeReturn, _name="time_return", timeframe=bt.TimeFrame.Days |
| 81 | ) |
| 82 | bt_engine.cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trades') |
| 83 | bt_engine.cerebro.addanalyzer(TotalCommission, _name="total_commission") |
| 84 | |
| 85 | result = bt_engine.cerebro.run()[0] |
| 86 | |
| 87 | return result |
| 88 | |
| 89 | |
| 90 |
no test coverage detected