Stock & Skachatok
Привет, Сток, глянул на новые бесплатные библиотеки для бэктрейтинга на Python – backtrader и zipline? Очень удобно для быстрой проверки стратегий, но с загрузкой данных все еще немного тормозит – интересно, нет ли более удобного API для этого.
Ну, я пробежался по Backtrader и Zipline. API в Backtrader довольно чистый, но загрузчик данных может достать, когда нужно вытащить кучу тикеров из CSV или базы данных – встроенной асинхронности нет, всё блокируется. У Zipline пайплайн ingest более надёжный, но он заточен под собственные DataFrame на базе pandas, и приходится писать кучу шаблонного кода, чтобы подтянуть внешние источники данных. Лучше было бы обернуть загрузку данных в генератор или использовать легковесную библиотеку, типа yfinance или alpaca-trade-api, чтобы стримить тик-данные и сразу подавать их в стратегию. Так ты избежишь блокировок чтения и тестировщик будет работать быстрее. Если всё-таки нужен API-подобный обёртку, который абстрагирует логику fetch/parse/queue в один класс, код будет чище, и ты сможешь менять источники данных, не трогая стратегию.
Похоже, узкое место – ввод-вывод, а не логика стратегии. Попробуй использовать асинхронный CSV-ридер, например pandas‑async или aiofiles, чтобы стримить строки и передавать их в очередь, которую потребляет бэктестер. Для данных в реальном времени или на уровне тиков API Alpaca или стриминговые функции yfinance уже асинхронные, так что эти тики можно просто подавать в цикл стратегии. Если нужен готовый к использованию вариант, посмотри vectorbt – он построен на NumPy и позволяет получать данные через простой асинхронный генератор, и вся цепочка останется неблокирующей. Просто оберни логику получения-парсинга-подачи в очередь в один класс, и ты сможешь менять Yahoo, Alpaca или локальную базу данных, не трогая код стратегии. Это самый чистый и эффективный вариант.
Звучит здорово – асинхронные стримы должны убрать задержку ввода-вывода, только следи за ограничением очереди, чтобы не перегрузило память. Проверь скорость загрузки, убедись, что ты действительно быстрее, чем основной цикл. Отличный выбор с vectorbt – чистая и готовая интеграция для свопов.
Отлично, только не забудь установить максимальный размер для твоего asyncio.Queue, а то память переполнится. И поставь небольшую задержку в producer, если consumer отстаёт – так будет стабильнее. Да и профилируй с помощью встроенных таймеров async‑io или async‑profile, чтобы проверить, быстрее ли fetch, чем стратегия. Удачи в кодинге!
Понял, максимум на очереди, небольшой сон на продусере, и быстрая профайлеровская сессия. Буду следить за памятью и удостоверюсь, что фе́тч не отстанет от стратегии. Спасибо за наводку, и тебе удачного кодинга!