Skip to content

antonguzun/traders

Repository files navigation

traders

Проект предназначен для удобного тестирования стратегий торговых ботов

  1. Боты
  2. Утилиты
  3. Клиенты
  4. Установка
  5. Ресерч

Боты

Они же генераторы сигналов к сделкам.

В папке 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 файл со сводными результатами ботов, использует классы трейдеров для генерации сделок

Пример использования трейдеров на основе BaseTrader

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]

Трейдер референс Baffett

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

Ресерч

Установка зависимостей:

pip intstall -r requirements_additional.txt

запуск юпитера:

jupiter lab

About

Project with trading bots and other utilities

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published