Spaces:
Runtime error
Runtime error
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) | |