from flask import Flask, request, render_template import backtrader as bt import yfinance as yf import pandas as pd app = Flask(__name__) class CustomStrategy(bt.Strategy): params = (('sma_period', 15),) def __init__(self): self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=self.params.sma_period) self.order = None def next(self): if not self.position: if self.data.close[0] > self.sma[0]: self.buy() else: if self.data.close[0] < self.sma[0]: self.sell() def run_backtest(ticker, sma_period, days): cerebro = bt.Cerebro() cerebro.addstrategy(CustomStrategy, sma_period=sma_period) data = bt.feeds.PandasData(dataname=yf.download(ticker, period=f'{days}d')) cerebro.adddata(data) start_value = cerebro.broker.getvalue() cerebro.run() end_value = cerebro.broker.getvalue() return start_value, end_value, (end_value - start_value) / start_value * 100 @app.route('/', methods=['GET', 'POST']) def index(): results = [] if request.method == 'POST': sma_period = int(request.form.get('sma_period', 15)) days = int(request.form.get('days', 365)) tickers = ['AAPL', 'MSFT', 'GOOG'] # Example companies; expand as needed or user input for ticker in tickers: start, end, roi = run_backtest(ticker, sma_period, days) results.append({ 'ticker': ticker, 'start_value': round(start, 2), 'end_value': round(end, 2), 'roi_percent': round(roi, 2) }) return render_template('index.html', results=results) if __name__ == "__main__": app.run(host='0.0.0.0', port=81)

Comments

Popular posts from this blog