Проект предназначен для удобного тестирования стратегий торговых ботов
Они же генераторы сигналов к сделкам.
В папке bots
каждый бот подчиняется базовому интерфейсу.
bots.wide_ranging_day_bot.bot.WideRangeDayBot
бот основан на принципе широкодиапазонного дня ("Технический анализ. Полный курс" - Швагер Джек Д., стр. 651)bots.run_day_breakout_bot.bot.RunDayBreakoutBot
бот основан на идее пробоя "дней с ускорением" ("Технический анализ. Полный курс" - Швагер Джек Д., стр. 661)
from bots.wide_ranging_day_bot.bot import WideRangeDayBot
# history_candles: List[Candle] - список сделок на модели tinvest
# new_candle: Candle - следующий за последним элементом history_candles
generate_signal = WideRangeDayBot(history_candles) # список может быть пустым
decision = generate_signal(new_canlde) # buy
decision = generate_signal(newer_canlde) # pass
decision = generate_signal(newest_canlde) # sell
...
decision
определяет видение тренда сигнального бота
sim.traders.Buffett
позволяет сгенерировать сделки пассивного инвестирования (используется как референс)sim.traders.OnePaperHistoryWideRangeTrader
генерит сделки по сигналамWideRangeDayBot
sim.traders.OnePaperHistoryRunDayBreakoutTrader
генерит сделки по сигналамRunDayBreakoutBot
sim.models.Deal
модель сделки, поддерживаетsum()
для суммирования стоимости списка сделокsim.models.DealsView
позволяет рассчитать доходность сделокsim.utils.printers.TradingPrinter
вычисляет разницу двух разных трейдеров, получает данные с помощью клиента, выводит результат в консольsim.utils.result_savers.SummaryTradeResultsCsvSaver
создает csv файл со сводными результатами ботов, использует классы трейдеров для генерации сделок
from sim import OnePaperHistoryWideRangeTrader
trader = OnePaperHistoryWideRangeTrader(is_short_on=True)
active_deals = trader.create_deals(history_candles)
print("active deals:", *active_deals, sep="\n")
# >> active deals:
# >> deal: sell 1 paper(s) by 26.47, total_cost: 26.48$
# >> deal: buy 1 paper(s) by 19.61, total_cost: -19.62$
вызов объекта возвращает список сделок List[Deal]
from sim import Baffet
passive_deals = Baffet().create_deals(history_candles)
print("passive deals:", *passive_deals, sep="\n")
# >> passive deals:
# >> deal: buy 1 paper(s) by 16.47, total_cost: -16.48$
# >> deal: sell 1 paper(s) by 19.61, total_cost: 19.62$
from sim.models import DealsView
# fist_candle - candle, по которому производится первая сделка
# при пассивном инвестировании, от нее и считаем доходность
# active_deals: List[Deal]
active_deals_view = DealsView(active_deals, fist_candle)
print(f"profit active {active_deals_view}")
# >> profit active Total result: 6.86$, 41.65%, deals count: 2
from datetime import datetime
from app.clients.tinkoff import TIClient
from app.settings import TINKOFF_SANDBOX_TOKEN
from bots.run_day_breakout_bot.models import RunDayBreakoutParams
from sim.traders import OnePaperHistoryRunDayBreakoutTrader
from sim.utils.printers import TradingPrinter
client = TIClient(TINKOFF_SANDBOX_TOKEN, use_sandbox=True)
trader = OnePaperHistoryRunDayBreakoutTrader(
RunDayBreakoutParams(3, 3), is_short_on=True
)
printer = TradingPrinter(client, trader)
printer.print_history_trading(
ticker="AMD",
_from=datetime(year=2020, month=5, day=10),
_to=datetime(year=2021, month=5, day=10),
)
# >> TICKER AMD
# >> date range: from 2020-05-11 to 2021-05-07
# >> active deals:
# >> 2020-05-28: sell 1 paper(s) by 51.74, total_cost: 51.77$
# >> ...
# >> 2021-05-07: buy 1 paper(s) by 78.81, total_cost: -78.85$
# >> profit active Total result: -13.52$, -24.26%, deals count: 10
# >> profit passive Total result: 23.08$, 41.41%, deals count: 2
# >> profit effect -65.67%
# >> ________________________
Все модули проекта завязаны на сущность app.common.models.candle.Candle
для отвязки от типа данных конкретного источника.
Сущность Candle
содержит в себе класс-методы для создания объекта на основе данных из другого клиента.
Все клиенты должны поддерживать базовый интерфейс и выдавать данные в базовых моделях.
app.clients.tinkoff.TIClient
класс клиента апи тинькова
Устанавливаем python 3.8
Устанавливаем зависимости:
pip intstall -r requirements.txt
Кладем TINKOFF_SANDBOX_TOKEN в .env
Токен можно взять тут https://tinkoffcreditsystems.github.io/invest-openapi/auth/
python main.py
- Оптимизация и подбор параметров для стратегии
WideRangeDayBot
https://github.com/antonguzun/traders/blob/master/research/optimize_wide_range.ipynb
Установка зависимостей:
pip intstall -r requirements_additional.txt
запуск юпитера:
jupiter lab