Эта история является частью серии Бэктрейдер. Другие истории вы можете найти здесь: Улучшите свою торговлю с помощью Python. Кроме того, есть репозиторий GitHub, связанный с этой серией, вы можете найти его здесь, если хотите более четко следовать коду: Backtrader Series.
После того, как вы нашли стратегию, вы должны проверить некоторые показатели ее эффективности. Чтобы получить эти метрики, вы можете использовать анализаторы. Мы уже говорили о них (Бэктестирование торговых систем с помощью Python — анализ результатов), а сегодня мы научимся разрабатывать собственные анализаторы.
Действительно, точно так же, как мы можем разрабатывать собственные индикаторы, мы можем разрабатывать собственные анализаторы.
Как работает анализатор в Backtrader
Что хорошо в Backtrader, так это то, что все классы работают одинаково. То есть анализатор работает как стратегия или как индикатор. В любом случае, я сделаю краткий обзор.
Анализатор может быть инициализирован с параметрами и включает метод next
, чтобы решить, что делать для каждой итерации.
В отличие от стратегий и индикаторов, анализаторы не работают с lines
. Вместо этого они работают с методом get_analysis
, возвращающим результаты анализа.
Мы можем использовать те же методы, что и в стратегиях в анализаторах, например notify_order
, notify_trade
и т.д.
Анализатор можно добавить в церебро с помощью cerebro.addanalyzer(analyzer, _name=analyzer_name)
.
Затем из результата стратегии можно получить анализатор:
analyzer = result[0].analyzers.customanalyzer analysis = analyzer.get_analysis() print(analysis)
Разработка анализатора
Давайте разработаем простой анализатор, который мы будем использовать, чтобы узнать, сколько прибыли мы получаем в среднем за сделку.
class CustomAnalyzer(bt.Analyzer): def __init__(self): pass
Нам нужны два атрибута. Один для отслеживания количества сделок, а другой для отслеживания общей прибыли.
def __init__(self): self._total = 0 self._count = 0
Теперь, как мы можем отслеживать прибыль по каждой сделке? Мы будем использовать метод notify_trade
, это самый простой способ сделать это. Этот метод вызывается каждый раз при обновлении сделки.
def notify_trade(self, trade): print(trade)
А вот пример вывода:
ref:164 data:<backtrader.feeds.pandafeed.PandasData object at 0x000001A3FBF16580> tradeid:0 size:0 price:21184.30078125 value:0.0 commission:42.60089843750001 pnl:-232.296875 pnlcomm:-274.8977734375 justopened:False isopen:False isclosed:True baropen:365 dtopen:738464.0 barclose:366 dtclose:738465.0 barlen:1 historyon:False history:[] status:2
Как видите, информации по каждой сделке очень много. Зная, как моделируется сделка, теперь мы можем реализовать наш метод notify_trade
:
def notify_trade(self, trade): if trade.isclosed: self._total += trade.pnlcomm self._count += 1
Наконец, нам просто нужно реализовать метод get_analysis
для возврата результатов:
def get_analysis(self): return dict( average=self._total / self._count, total=self._total, count=self._count )
Использование анализатора
Теперь воспользуемся нашим анализатором. Я немного изменил код в репозитории Git для реализации анализаторов:
def backtest_strategy_optimized(strategy, analyzers=None, **parameters):
И я добавил эти строки:
if not analyzers: analyzers = [] for analyzer in analyzers: cerebro.addanalyzer(analyzer, _name=analyzer.__name__.lower())
Таким образом, теперь мы можем проверить нашу стратегию на истории и получить анализ:
from backtester import Backtester from strategies import BracketStrategy from analyzers import CustomAnalyzer if __name__ == '__main__': result = Backtester.backtest_strategy_non_optimized( BracketStrategy, analyzers=[CustomAnalyzer], stop_loss=1, take_profit=2 ) print(result[0].analyzers.customanalyzer.get_analysis())
И вот результат, если мы запустим этот код:
{'average': -275.7979792184804, 'total': -45230.86859183079, 'count': 164}
Оно работает! Он говорит, что наша стратегия не является хорошей стратегией, к сожалению. Вот почему анализаторы важны, вы можете иметь такие метрики о своей стратегии, чтобы знать, является ли она хорошей стратегией или нет.
Заключительное примечание
Теперь вы можете создавать свои собственные индикаторы с помощью Backtrader. Но перед этим вы должны проверить эту ссылку: Справочник по анализаторам — Backtrader, чтобы узнать, был ли нужный вам анализатор уже реализован в Backtrader или нет.
Теперь у вас нет оправданий, чтобы не протестировать свои стратегии правильно! Анализаторы очень полезны для анализа ваших стратегий и предотвращения потери денег.
Чтобы найти другие истории из этой серии и больше о совмещении трейдинга и Python, прочтите эту статью: Улучшите свою торговлю с помощью Python
Чтобы узнать больше о моих рассказах о Python, нажмите здесь!
Если вам понравилась история, не забудьте похлопать и, возможно, подпишитесь на меня, если хотите узнать больше о моем содержании :)
Вы также можете подписаться на меня по электронной почте, чтобы получать уведомления каждый раз, когда я публикую новую историю, просто нажмите здесь!
Если вы еще не подписаны на Medium и хотите поддержать меня или получить доступ ко всем моим историям, вы можете использовать мою ссылку:
Сообщение от InsiderFinance
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Хлопайте за историю и подписывайтесь на автора 👉
- 📰 Смотрите больше контента в InsiderFinance Wire
- 📚 Пройдите наш БЕСПЛАТНЫЙ мастер-класс
- 📈 Откройте для себя Мощные торговые инструменты