Эта история является частью серии Бэктрейдер. Другие истории вы можете найти здесь: Улучшите свою торговлю с помощью 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

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь: