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