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
Post a Comment