import yfinance as yf from backtesting import Backtest import pandas as pd import random from strategies import SMC_test, SMC_ema, SMCStructure def fetch(symbol, period, interval): df = yf.download(symbol, period=period, interval=interval) df.columns =df.columns.get_level_values(0) return df def smc_plot_backtest(data, filename, swing_hl, **kwargs): bt = Backtest(data, SMC_test, **kwargs) bt.run(swing_hl=swing_hl) return bt.plot(filename=filename, open_browser=False) def smc_ema_plot_backtest(data, filename, ema1, ema2, closecross, **kwargs): bt = Backtest(data, SMC_ema, **kwargs) bt.run(ema1=ema1, ema2=ema2, close_on_crossover=closecross) return bt.plot(filename=filename, open_browser=False) def smc_structure_plot_backtest(data, filename, swing_hl, **kwargs): bt = Backtest(data, SMCStructure, **kwargs) bt.run(swing_window=swing_hl) return bt.plot(filename=filename, open_browser=False) def smc_backtest(data, swing_hl, **kwargs): return Backtest(data, SMC_test, **kwargs).run(swing_hl=swing_hl) def smc_ema_backtest(data, ema1, ema2, closecross, **kwargs): return Backtest(data, SMC_ema, **kwargs).run(ema1=ema1, ema2=ema2, close_on_crossover=closecross) def smc_structure_backtest(data, swing_hl, **kwargs): return Backtest(data, SMCStructure, **kwargs).run(swing_hl=swing_hl) def random_test(strategy: str, period: str, interval: str, no_of_stocks: int = 5, **kwargs): nifty50 = pd.read_csv("data/ind_nifty50list.csv") ticker_list = pd.read_csv("data/Ticker_List_NSE_India.csv") # Merging nifty50 and ticker_list dataframes to get 'YahooEquiv' column. nifty50 = nifty50.merge(ticker_list, "inner", left_on=['Symbol'], right_on=['SYMBOL']) # Generating random indices between 0 and len(nifty50). random_indices = random.sample(range(0, len(nifty50)), no_of_stocks) df = pd.DataFrame() for i in random_indices: # Fetching ohlc of random ticker_symbol. ticker_symbol = nifty50['YahooEquiv'].values[i] data = fetch(ticker_symbol, period, interval) if strategy == "Order Block": backtest_results = smc_backtest(data, kwargs['swing_hl']) elif strategy == "Order Block with EMA": backtest_results = smc_ema_backtest(data, kwargs['ema1'], kwargs['ema2'], kwargs['cross_close']) elif strategy == "Structure trading": backtest_results = smc_structure_backtest(data, kwargs['swing_hl']) else: raise Exception('Strategy not found') # Converting pd.Series to pd.Dataframe backtest_results = backtest_results.to_frame().transpose() backtest_results['stock'] = ticker_symbol # Reordering columns. # cols = df.columns.tolist() # cols = cols[-1:] + cols[:-1] cols = ['stock', 'Start', 'End', 'Return [%]', 'Equity Final [$]', 'Buy & Hold Return [%]', '# Trades', 'Win Rate [%]', 'Best Trade [%]', 'Worst Trade [%]', 'Avg. Trade [%]'] backtest_results = backtest_results[cols] df = pd.concat([df, backtest_results]) df = df.sort_values(by=['Return [%]'], ascending=False) return df def complete_test(strategy: str, period: str, interval: str, **kwargs): nifty50 = pd.read_csv("data/ind_nifty50list.csv") ticker_list = pd.read_csv("data/Ticker_List_NSE_India.csv") # Merging nifty50 and ticker_list dataframes to get 'YahooEquiv' column. nifty50 = nifty50.merge(ticker_list, "inner", left_on=['Symbol'], right_on=['SYMBOL']) df = pd.DataFrame() for i in range(len(nifty50)): # Fetching ohlc of random ticker_symbol. ticker_symbol = nifty50['YahooEquiv'].values[i] data = fetch(ticker_symbol, period, interval) if strategy == "Order Block": backtest_results = smc_backtest(data, kwargs['swing_hl']) elif strategy == "Order Block with EMA": backtest_results = smc_ema_backtest(data, kwargs['ema1'], kwargs['ema2'], kwargs['cross_close']) elif strategy == "Structure trading": backtest_results = smc_structure_backtest(data, kwargs['swing_hl']) else: raise Exception('Strategy not found') # Converting pd.Series to pd.Dataframe backtest_results = backtest_results.to_frame().transpose() backtest_results['stock'] = ticker_symbol # Reordering columns. # cols = df.columns.tolist() # cols = cols[-1:] + cols[:-1] cols = ['stock', 'Start', 'End', 'Return [%]', 'Equity Final [$]', 'Buy & Hold Return [%]', '# Trades', 'Win Rate [%]', 'Best Trade [%]', 'Worst Trade [%]', 'Avg. Trade [%]'] backtest_results = backtest_results[cols] df = pd.concat([df, backtest_results]) df = df.sort_values(by=['Return [%]'], ascending=False) return df if __name__ == "__main__": # random_testing("") # data = fetch('RELIANCE.NS', period='1y', interval='15m') # df = yf.download('RELIANCE.NS', period='1yr', interval='15m') rt = all_testing("Order Block", '1mo', '15m', swing_hl=20) rt.to_excel('test/all_testing_1.xlsx', index=False) print(rt)