Общие вопросы
-
Официальный сайт - библиотеки Backtesting.py
Пример простейшей реализации. Нужно, чтобы были установлены библиотеки
- backtesting.py;
- yfinance;
- pandas_ta;
Простейший шаблон использования библиотеки будет выглядеть так:
# 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)
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]
crossover() - документация
Функция buy() по умолчанию покупает на все свободные средства целое число акций.
buy() - документация
Такой файл откроется в броузере после выполнения скрипта RsiOscillator.html
Дополнительная информация по теме:
-
backtestingpy guide - Статья и видео.