Работа с библиотекой Backtesting.py.

Общие вопросы

Пример простейшей реализации. Нужно, чтобы были установлены библиотеки
Простейший шаблон использования библиотеки будет выглядеть так:
backtestingpy_template.py
# file backtestingpy_template.py
import datetime
import pandas_ta as ta
import pandas as pd
import yfinance as yf
import backtesting as bt

class myStrategy(bt.Strategy):

    def init(self):
        pass

    def next(self):
        pass
          
assets = yf.Ticker("MSFT")
today = str(datetime.datetime.today()).split()[0]

assets_historical = assets.history(start="2022-01-02", end=today, interval="1d")

btest = bt.Backtest(assets_historical, myStrategy, cash=10_000, commission=.002)
stats = btest.run()
print(stats)
backtestingpy_example_1.py
import datetime
import pandas_ta as ta
import pandas as pd
import yfinance as yf

from backtesting import Backtest
from backtesting import Strategy
from backtesting.lib import crossover

class RsiOscillator(Strategy):

    upper_bound = 70
    lower_bound = 30
    rsi_window = 14

    # Do as much initial computation as possible
    def init(self):
        self.rsi = self.I(ta.rsi, pd.Series(self.data.Close), self.rsi_window)

    # Step through bars one by one
    # Note that multiple buys are a thing here
    def next(self):
        if crossover(self.rsi, self.upper_bound):
            self.position.close()
        elif crossover(self.lower_bound, self.rsi):
            self.buy()
            
msft = yf.Ticker("MSFT")
msft_historical = msft.history(start="2022-01-02", end="2024-02-07", interval="1d")

bt = Backtest(msft_historical, RsiOscillator, cash=10_000, commission=.002)
stats = bt.run()
bt.plot()
Стратегия будет использовать индикатор RSI. Про индикатор RSI
Для реализации стратегии нам нужно создать класс, который будет наследовать от backtesting.Strategy и реализовать две обязательные функции init() и next().
Функция init() вызывается сразу после создания объекта и запускается только один раз. Мы должны указать здесь все, что можно заранее рассчитать перед тестированием на исторических данных, например любые технические индикаторы. У функции создания индикатора предопределенное имя self.I
Функция next() вызывается на каждой свече по ходу бэктеста.
Функция crossover вспомагательная, которая возвращает True, если series1 только что стало больше series2. Т.е. series1[-2] < series2[-2] and series1[-1] > series2[-1]
  •  image crossover()  - документация 
  • Функция buy() по умолчанию покупает на все свободные средства целое число акций.
  •  image buy()  - документация 
  • Такой файл откроется в броузере после выполнения скрипта RsiOscillator.html
    Дополнительная информация по теме:
    1.  image backtestingpy guide  - Статья и видео.