import gradio as gr import yfinance as yf import numpy as np import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime # Ensure visualization styles are set for the plots sns.set(style="whitegrid") plt.rcParams['figure.figsize'] = [10, 5] def backtest_ema_strategy(asset_symbol, short_ema, long_ema, timeframe='1d'): # Fetching financial data with dynamic timeframe and date range start_date = '2020-01-01' end_date = '2024-01-01' asset_data = yf.download(asset_symbol, start=start_date, end=end_date, interval=timeframe) # Check if data is empty (can happen with incorrect symbols or network issues) if asset_data.empty: return None, "Failed to fetch data. Please check the asset symbol and date range.", 0, 0 # Calculate the short-term and long-term EMAs asset_data[f'EMA{short_ema}'] = asset_data['Close'].ewm(span=short_ema, adjust=False).mean() asset_data[f'EMA{long_ema}'] = asset_data['Close'].ewm(span=long_ema, adjust=False).mean() # Generate signals asset_data['Signal'] = np.where(asset_data[f'EMA{short_ema}'] > asset_data[f'EMA{long_ema}'], 1, 0) asset_data['Position'] = asset_data['Signal'].diff() # Plotting plt.figure(figsize=(14, 7)) plt.plot(asset_data['Close'], label=f'{asset_symbol} Close', alpha=0.5) plt.plot(asset_data[f'EMA{short_ema}'], label=f'{short_ema}-day EMA', alpha=0.75) plt.plot(asset_data[f'EMA{long_ema}'], label=f'{long_ema}-day EMA', alpha=0.75) plt.plot(asset_data[asset_data['Position'] == 1].index, asset_data[f'EMA{short_ema}'][asset_data['Position'] == 1], '^', markersize=10, color='g', lw=0, label='Buy Signal') plt.plot(asset_data[asset_data['Position'] == -1].index, asset_data[f'EMA{short_ema}'][asset_data['Position'] == -1], 'v', markersize=10, color='r', lw=0, label='Sell Signal') plt.title(f'{asset_symbol} EMA Crossover Trading Strategy') plt.legend() plt_path = f"{asset_symbol}_EMA_Strategy.png" plt.savefig(plt_path) plt.close() # Calculating total and annual returns initial_price = asset_data['Close'].iloc[0] final_price = asset_data['Close'].iloc[-1] total_returns = ((final_price - initial_price) / initial_price) * 100 years_diff = (datetime.strptime(end_date, "%Y-%m-%d") - datetime.strptime(start_date, "%Y-%m-%d")).days / 365.25 annual_returns = ((final_price / initial_price) ** (1 / years_diff) - 1) * 100 # Returning path of the saved plot, total and annual returns return plt_path, "Backtest completed message", total_returns, annual_returns def create_gradio_interface(asset_symbol, short_ema, long_ema, timeframe): # Convert string inputs for EMAs to integers and pass all new parameters to the backtest strategy short_ema = int(short_ema) long_ema = int(long_ema) plot_path, message,total_returns, annual_returns = backtest_ema_strategy(asset_symbol, short_ema, long_ema, timeframe) # Prepare and return the results result_text = [ [message], # f"Backtest completed for {asset_symbol} from {start_date} to {end_date} using {timeframe} data.", [f"Total Returns: {total_returns:.2f}%"], [f"Annual Returns: {annual_returns:.2f}%"] ] return plot_path, result_text # Expanded list of major assets to include Indian indices and major stocks major_assets = [ # Global and Cryptocurrencies "AAPL", # Apple "GOOGL", # Alphabet "MSFT", # Microsoft "AMZN", # Amazon "FB", # Facebook "TSLA", # Tesla "BTC-USD", # Bitcoin "ETH-USD", # Ethereum # # Indian Indices and Major Stocks # "NIFTY50.NS", # Nifty 50 Index # "RELIANCE.NS", # Reliance Industries Limited # "TCS.NS", # Tata Consultancy Services # "HDFCBANK.NS", # HDFC Bank # "INFY.NS", # Infosys # "HINDUNILVR.NS", # Hindustan Unilever # "ITC.NS", # ITC Limited # "SBIN.NS", # State Bank of India # "ICICIBANK.NS", # ICICI Bank # "BHARTIARTL.NS", # Bharti Airtel ] # Define the Gradio app with updated inputs iface = gr.Interface( fn=create_gradio_interface, inputs=[ gr.Dropdown(choices=major_assets, label="Asset Symbol (Select or type, e.g., NIFTY50.NS)"), gr.Textbox(label="Short EMA Period"), gr.Textbox(label="Long EMA Period"), gr.Dropdown(choices=['1d', '1wk', '1mo'], label="Timeframe (1d = daily, 1wk = weekly, 1mo = monthly)"), ], outputs=[ gr.Image(label="Trading Strategy Chart"), gr.List(label="Results") ], title="EMA Crossover Trading Strategy Backtest", description="Enter the asset symbol, EMA periods, timeframe, and date range to backtest the EMA Crossover Trading Strategy." ) # Launch the app if __name__ == "__main__": iface.launch(share=True)