zipline-reloaded стандартные «акционные» комиссии (поштучные) не подходят. Необходимо использовать процентную модель комиссий через класс PercentageShare и процентную модель проскальзывания через FixedPercentSlippage в функции initialize.Исходный код
По умолчанию Zipline настроен на американский фондовый рынок, где комиссии рассчитываются в центах за акцию (например, $0.005 за штуку). В криптоиндустрии биржи (Binance, Coinbase, Bybit) взимают комиссию в процентах от объема сделки (обычно от 0.02% до 0.1% для Maker/Taker). Кроме того, из-за высокой волатильности и особенностей стакана крайне важно закладывать процентное проскальзывание.
Ниже представлен готовый шаблон торгового алгоритма для zipline-reloaded с корректными настройками транзакционных издержек для крипторынка. Перед тем как запускать сложные оптимизационные процессы, например, такие как Оптимизация торговых стратегий с помощью генетических алгоритмов DEAP на Python, обязательно настройте эти параметры, чтобы избежать эффекта «грааля» на бумаге.
from zipline.api import order_target_percent, record, symbol, set_commission, set_slippage
from zipline.finance.commission import PercentageShare
from zipline.finance.slippage import FixedPercentSlippage
def initialize(context):
# Указываем торговый инструмент (тикер должен быть предварительно импортирован в bundle)
context.asset = symbol('BTCUSD')
# Настройка комиссий: задаем 0.1% (0.001) от объема сделки (стандартный Taker-тариф Binance)
set_commission(PercentageShare(percentage=0.001))
# Настройка проскальзывания: задаем фиксированный процент проскальзывания 0.05% (0.0005)
# Это симулирует ухудшение цены исполнения из-за недостатка ликвидности в стакане
set_slippage(FixedPercentSlippage(percent=0.0005))
def handle_data(context, data):
# Простая демонстрационная логика: покупаем и держим
if not context.portfolio.positions[context.asset].amount:
order_target_percent(context.asset, 1.0)
# Записываем текущую стоимость портфеля для анализа
record(portfolio_value=context.portfolio.portfolio_value) Разбор параметров
Для точной настройки транзакционных издержек мы использовали два ключевых класса из пакета zipline.finance:
PercentageShare(percentage): Этот класс рассчитывает комиссию как фиксированную долю от общей стоимости сделки. Параметрpercentage=0.001означает комиссию в 0.1%. Если вы торгуете на VIP-тарифах или используете Maker-ордера, это значение можно снизить до0.0002(0.02%).FixedPercentSlippage(percent): Модель проскальзывания, которая сдвигает цену исполнения ордера на фиксированный процент в неблагоприятную для трейдера сторону. Параметрpercent=0.0005(0.05%) является консервативной и реалистичной оценкой для ликвидных пар вроде BTC/USDT или ETH/USDT на крупных биржах.
Как запустить
Чтобы запустить этот бэктест, вам потребуется выполнить несколько шагов:
1. Подготовить и импортировать исторические данные по криптовалюте в ваш локальный Zipline-bundle. Обычно для этого пишут кастомный инжектор, который скачивает минутные или дневные свечи с API Binance или Bybit.
2. Запустить бэктест через интерфейс командной строки (CLI) или напрямую из Jupyter Notebook с помощью функции run_algorithm.
3. Проанализировать полученные метрики (Sharpe Ratio, Max Drawdown). Обратите внимание, как сильно изменятся результаты бэктеста при переходе от нулевых комиссий к реалистичным 0.1% — для высокочастотных стратегий это часто означает разницу между прибылью и полным сливом депозита.
Если вы планируете строить сложные торговые системы, использующие альтернативные источники данных, рекомендуем ознакомиться с материалом про Парсинг и Sentiment Analysis Reddit (r/CryptoCurrency) на Python для генерации торговых сигналов. А для тех, кто работает с деривативами, незаменимым инструментом станет Расчет и Визуализация Поверхности Подразумеваемой Волатильности (IV Surface) Опционов в Python Matplotlib.




