May-23-2025, 03:19 PM
from backtesting import Strategy, Backtest import yfinance as yf import pandas as pd import numpy as np import pandas_ta as ta # === Download Data === print("Downloading data...") df = yf.download('TSLA', period='8d', interval='1m') df.columns = [c[0] for c in df.columns] # === Calculate Indicators === df["VWAP"] = ta.vwap(df.High, df.Low, df.Close, df.Volume) df['RSI'] = ta.rsi(df.Close, length=16) my_bbands = ta.bbands(df.Close, length=14, std=2.0) df = df.join(my_bbands) VWAPsignal = [0] * len(df) backcandles = 15 for row in range(backcandles, len(df)): upt = 1 dnt = 1 for i in range(row - backcandles, row + 1): if max(df.Open.iloc[i], df.Close.iloc[i]) >= df.VWAP.iloc[i]: dnt = 0 if min(df.Open.iloc[i], df.Close.iloc[i]) <= df.VWAP.iloc[i]: upt = 0 if upt == 1 and dnt == 1: VWAPsignal[row] = 3 elif upt == 1: VWAPsignal[row] = 2 elif dnt == 1: VWAPsignal[row] = 1 df['VWAPSignal'] = VWAPsignal def TotalSignal(l): if (df.VWAPSignal.iloc[l] == 2 and df.Close.iloc[l] <= df['BBL_14_2.0'].iloc[l] and df.RSI.iloc[l] < 45): return 2 if (df.VWAPSignal.iloc[l] == 1 and df.Close.iloc[l] >= df['BBU_14_2.0'].iloc[l] and df.RSI.iloc[l] > 55): return 1 return 0 TotSignal = [0] * len(df) for row in range(backcandles, len(df)): TotSignal[row] = TotalSignal(row) df['TotalSignal'] = TotSignal def pointposbreak(x): if x['TotalSignal'] == 1: return x['High'] + 1e-4 elif x['TotalSignal'] == 2: return x['Low'] - 1e-4 else: return np.nan df['pointposbreak'] = df.apply(lambda row: pointposbreak(row), axis=1) dfpl = df[:75000].copy() dfpl['ATR'] = ta.atr(dfpl.High, dfpl.Low, dfpl.Close, length=7) def SIGNAL(): return dfpl.TotalSignal class MyStrat(Strategy): initsize = 0.99 mysize = initsize # Add these lines: rsi_exit_long = 90 # Default value; will be overridden during optimization rsi_exit_short = 10 # Default value; will be overridden during optimization def init(self): super().init() self.signal1 = self.I(SIGNAL) def next(self): super().next() slatr = 1.2 * self.data.ATR[-1] TPSLRatio = 1.5 if len(self.trades) > 0: if self.trades[-1].is_long and self.data.RSI[-1] >= self.rsi_exit_long: self.trades[-1].close() elif self.trades[-1].is_short and self.data.RSI[-1] <= self.rsi_exit_short: self.trades[-1].close() if self.signal1[-1] == 2 and len(self.trades) == 0: sl1 = self.data.Close[-1] - slatr tp1 = self.data.Close[-1] + slatr * TPSLRatio self.buy(sl=sl1, tp=tp1, size=self.mysize) elif self.signal1[-1] == 1 and len(self.trades) == 0: sl1 = self.data.Close[-1] + slatr tp1 = self.data.Close[-1] - slatr * TPSLRatio self.sell(sl=sl1, tp=tp1, size=self.mysize) bt = Backtest( dfpl, MyStrat, cash=30000, margin=1/10, commission=0.00 ) output=bt.run() print(output) stats=bt.optimize(rsi_exit_long=range(70, 100, 5), rsi_exit_short=range(5, 35, 5),maximize='Equity Final [$]') print(stats) bt.plot()i am newbiee in python backtest.
i don't understand why code can't load the optimize result.
Any idea?