# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3 (ipykernel)
#     language: python
#     name: python3
# ---

# +
import sys
import pandas as pd
import datetime as dt
from queue import Queue

sys.path.append("../") # adding path to library

from library.backtester import backtest
from library.backtester.portfolio import NaivePortfolio
from library.backtester.strategy import BuyAndHoldStrategy
from library.backtester.data import FtxHistoricCSVDataHandler
from library.backtester.execution import SimulatedExecutionHandler
# -

# ### Создаем очередь событий

# Event-driven backtest основывается на принципе появления событий. Каждое событие несет в себе какое-то событие, будь то появление маркет даты, или исполнения ордеров. В нашем примере мы создаем очередь событий и предоставляем к ней доступ для всех модулей, чтобы каждый элемент имел к ней доступ

events = Queue()

# ### Показываем бэктестеру, где лежат наши данные

# Вообще, архитектура позволяет дописывать обработчики данных для разных форматов, но в примере мы рассмотрим обработчик csv данных, предполагающий наличие csv файлов в формате, в котором ftx выдает исторические данные. Предполагается, что для каждого актива имеем по csv файлу с названием *ticker*.csv, пример ниже:

# !ls ../data

# О том, как получить данные в таком формате можно почитать в предыдущем ноутбуке
#
# Объявляем обработчик данных, предоставляя ему доступ к очереди событий, указывая на директорию с цсвшками и передавая список тикеров, которые мы будем гонять в бэктестере. Кстати, мы назвали переменную bars, потому что исторические данные -- это свечи, а не просто цена закрытия.

# !head -n 3 ../data/ABNBUSD.csv

bars = FtxHistoricCSVDataHandler(events=events, csv_dir='../data', symbol_list=['BTCUSDT'])

# ### Определяем используемую стратегию

# В трейдинге широко распространенной практикой является тестирование стратегий в сравнении с каким-либо бенчмарком. Обычно бэнчмарк выбирается исходя из каких-то специфичных размышлений, я выбрал в качестве первого приближения считать бэнчмарком портфель buy and hold. Стратегия наследуется от шаблона стратегий, описанного в `library.backtester.strategy`, поэтому можно легко дописывать свои стратегии.

strategy = BuyAndHoldStrategy(bars=bars, events=events)

# ### Определяем портфель

# Портфель выполняет функции по анализу проведенных торгов, сбору метрик и аггрегации результатов. Кроме того, портфель отдает приказы брокеру, руководствуясь сигналами стратегии и наличию доступных средств. Нынешняя реализация портфеля наивна в смысле отсуствия риск-менеджмента, а также фиксированному количеству покупаемых активов.

portfolio = NaivePortfolio(bars=bars, events=events, start_date=dt.datetime(2020, 8, 1), initial_capital=6_500)

# ### Добавляем исполнителя сделок

broker = SimulatedExecutionHandler(events)

# ### Запускам бэктестер

backtest(events, bars, strategy, portfolio, broker)
results = portfolio.create_equity_curve_dataframe()

# Важно, что функция backtest меняет внутренние переменные всех модулей, что наверное не очень хорошо, и это нужно будет как-то переосмыслить, но вот какие результаты мы получаем.

results

# И действительно, вложившись в биткойн в конце 2020 года мы бы имели в 6 раз больше вложенных денег. 

results['equity_curve'].plot();

StarcoderdataJupyterScriptsDedupFiltered