This article provides a comprehensive guide to building a Streamlit application for backtesting trading strategies using Backtrader, yFinance, and Matplotlib.
The following Python libraries are used: - streamlit
for
the web interface. - pandas
for data manipulation. -
backtrader
for strategy backtesting. -
yfinance
for financial data retrieval. -
matplotlib
for plotting.
import streamlit as st
import pandas as pd
import backtrader as bt
import yfinance as yf
import matplotlib
# Use a backend that doesn't display the plot to the user
'Agg')
matplotlib.use(import matplotlib.pyplot as plt
This function initializes Backtrader, sets up the trading environment, and executes the backtest.
def run_backtest(strategy_class, symbol, start_date, end_date, **params):
= bt.Cerebro()
cerebro =0.00)
cerebro.broker.setcommission(commission
= bt.feeds.PandasData(dataname=yf.download(symbol, start=start_date, end=end_date, interval='1d'))
data
cerebro.adddata(data)
**params)
cerebro.addstrategy(strategy_class,
='returns')
cerebro.addanalyzer(bt.analyzers.TimeReturn, _name
100.)
cerebro.broker.setcash(= cerebro.run()
results = results[0]
strat
= strat.analyzers.returns.get_analysis()
returns = pd.DataFrame(list(returns.items()), columns=['Date', 'Return'])
returns_df 'Date'] = pd.to_datetime(returns_df['Date'])
returns_df['Date', inplace=True)
returns_df.set_index(
"figure.figsize"] = (10, 6)
plt.rcParams[= cerebro.plot()
fig return fig[0][0]
The Streamlit app allows users to interactively select trading strategies, set parameters, and visualize backtest results.
def main():
'Backtest Trading Strategies')
st.title(
import strategies
= [name for name in dir(strategies) if name.endswith('Strategy')]
strategy_names = st.selectbox('Select Strategy', strategy_names)
selected_strategy
= getattr(strategies, selected_strategy)
selected_strategy_class
def to_number(s):
= float(s)
n return int(n) if n.is_integer() else n
= {}
strategy_params for param_name in dir(selected_strategy_class.params):
if not param_name.startswith("_") and param_name not in ['isdefault', 'notdefault']:
= getattr(selected_strategy_class.params, param_name)
param_value = st.text_input(f'{param_name}', value=param_value)
strategy_params[param_name]
= {param_name: to_number(strategy_params[param_name]) for param_name in strategy_params}
strategy_params
= st.text_input('Enter symbol (e.g., BTC-USD, AMZN, ...):', 'BTC-USD')
symbol = st.date_input('Select start date:', pd.to_datetime('2023-01-01'))
start_date = st.date_input('Select end date:', pd.to_datetime('2023-12-31'))
end_date
if st.button('Run Backtest'):
f"Running backtest for {symbol} from {start_date} to {end_date} with {selected_strategy} strategy")
st.write(= run_backtest(selected_strategy_class, symbol, start_date, end_date, **strategy_params)
fig
st.pyplot(fig)
if __name__ == '__main__':
main()
This application provides a user-friendly interface to backtest various trading strategies using Backtrader. Users can select strategies, input parameters, and visualize the results interactively. Integrating Streamlit with Backtrader and yFinance facilitates easy experimentation with different trading strategies and data.