Invicto69's picture
Synced repo using 'sync_with_huggingface' Github Action
77f6eef verified
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)