В мире торговли акциями внедрение и тестирование стратегий может стать для трейдеров ценным инструментом для оценки эффективности их торговых идей. Одной из таких стратегий является стратегия «Волатильность с полосами Боллинджера». В этой статье мы подробно рассмотрим эту стратегию и покажем, как ее протестировать с помощью Python.

Прежде чем мы углубимся в саму стратегию, давайте кратко повторим процесс подготовки данных. В предыдущей статье под названием «Бэктестирование стратегий торговли акциями с использованием Python (подготовка данных)» мы рассмотрели шаги по получению данных об акциях OIH из Интернета и созданию файлов с данными на различных таймфреймах, включая 1-минутный, 5-минутный, 15-минутный. минут, 1 час и 1 день интервалы.



Эти файлы послужат входными данными для тестирования нашей стратегии «Волатильность с полосами Боллинджера».

Мы также подготовили среду для тестирования любой стратегии, генерирующей сигналы покупки и продажи, которые мы собираемся использовать для создания этого бэктеста.



TL;DR Хотите увидеть результаты, не проверяя детали кода Python? Проверьте их в конце страницы.

Понимание волатильности с помощью стратегии полос Боллинджера

В основе нашего подхода лежит метод get_signals. Этот метод использует DataFrame в качестве входных данных и вычисляет сигналы покупки и продажи на основе выбранной стратегии. Давайте рассмотрим код шаг за шагом:

import numpy as np
import pandas as pd
import pandas_ta as ta

# ...

def get_signals(df):
    pd.options.mode.chained_assignment = None
    
    df.ta.bbands(close=df['close'], length=20, append=True)    
    df = df.dropna()
    
    df['high_limit'] = df['BBU_20_2.0'] + (df['BBU_20_2.0'] - df['BBL_20_2.0']) / 2
    df['low_limit'] = df['BBL_20_2.0'] - (df['BBU_20_2.0'] - df['BBL_20_2.0']) / 2
    df['close_percentage'] = np.clip((df['close'] - df['low_limit']) / (df['high_limit'] - df['low_limit']), 0, 1)
    df['volatility'] = df['BBU_20_2.0'] / df['BBL_20_2.0'] - 1
    min_volatility = df['volatility'].mean() - df['volatility'].std()
    
    df['signal'] = np.where((df['volatility'] > min_volatility) & (df['close_percentage'] < 0.25), 1, 0)
    df['signal'] = np.where((df['close_percentage'] > 0.75), -1, df['signal'])
    
    return df['signal']

Давайте разберем код и разберем каждый шаг:

Сначала мы импортируем необходимые библиотеки: numpy как np, pandas как pd и pandas_ta как ta.

Затем мы определяем метод get_signals, который принимает DataFrame df в качестве входных данных.

Мы используем функцию ta.bbands из библиотеки pandas_ta для расчета полос Боллинджера. Мы передаем цену закрытия (df['close']) и устанавливаем параметр длины равным 20 (это наиболее часто используемое значение). Параметр append=True обеспечивает добавление столбцов Bollinger Bands в DataFrame.

Далее мы вычисляем верхнюю и нижнюю границы рабочего диапазона (верхняя полоса Боллинджера представлена ​​0,75 или 75% диапазона, а нижняя полоса Боллинджера представлена ​​0,25 или 25% диапазона, давая место цене когда он проходит над или под полосами). Верхний предел получается путем добавления половины ширины полос Боллинджера к значению верхней полосы (представленному 1 или 100% диапазона), а нижний предел получается путем вычитания половины ширины полос Боллинджера из нижней полосы. значение (представленное 0 или 0% диапазона).

Мы рассчитываем процент закрытия, который представляет собой положение цены закрытия относительно рабочего диапазона. Он рассчитывается как усеченное значение разницы между ценой закрытия и нижним пределом, деленное на диапазон между верхним и нижним пределами.

Волатильность рассчитывается как отношение между верхней и нижней полосами Боллинджера минус 1.

Мы определяем минимальную волатильность, необходимую для открытия позиции, вычитая стандартное отклонение волатильности из ее среднего значения.

Купить сигналы

Основываясь на нашей стратегии, мы назначаем сигнал на покупку (1), когда волатильность превышает требуемую минимальную волатильность, а процент закрытия меньше 0,25.

Сигналы продажи

Точно так же мы назначаем сигнал на продажу (-1), когда процент закрытия превышает 0,75.

Тестирование на истории и анализ результатов

Чтобы оценить производительность волатильности с помощью стратегии «Полосы Боллинджера», следующий фрагмент кода предоставляет метод show_strategy_result. Этот метод имитирует стратегию длинной позиции и рассчитывает прибыль/убыток, количество выигрышей, проигрышей и процент выигрышей.

def show_strategy_result(timeframe, df):
    waiting_for_close = False
    open_price = 0

    profit = 0.0
    wins = 0
    losses = 0
    
    for i in range(len(df)):
        signal = df.iloc[i]['signal']
        
        if signal == 1 and not waiting_for_close:
            waiting_for_close = True
            open_price = df.iloc[i]['close']
        elif signal == -1 and waiting_for_close:
            waiting_for_close = False
            close_price = df.iloc[i]['close']

            profit += close_price - open_price
            wins += 1 if (close_price - open_price) > 0 else 0
            losses += 1 if (close_price - open_price) < 0 else 0

    print(f' Result for timeframe {timeframe} '.center(60, '*'))
    print(f'* Profit/Loss: {profit:.2f}')
    print(f"* Wins: {wins} - Losses: {losses}")
    print(f"* Win Rate: {100 * (wins/(wins + losses)):6.2f}%")

Если вы запустите этот код с данными, предоставленными в первой статье, вы должны увидеть что-то похожее на это.

***************** Result for timeframe 5T ******************
* Profit/Loss: 2403.68
* Wins: 3379 - Losses: 1851
* Win Rate:  64.61%
***************** Result for timeframe 15T *****************
* Profit/Loss: 2220.58
* Wins: 1369 - Losses: 726
* Win Rate:  65.35%
***************** Result for timeframe 1H ******************
* Profit/Loss: 251.15
* Wins: 417 - Losses: 203
* Win Rate:  67.26%
***************** Result for timeframe 1D ******************
* Profit/Loss: -122.69
* Wins: 43 - Losses: 19
* Win Rate:  69.35%

Заключение

В этой статье мы рассмотрели стратегию «Волатильность с полосами Боллинджера» для торговли акциями и продемонстрировали, как ее протестировать с помощью Python. Поняв код и следуя пошаговым объяснениям, вы теперь можете применять эту стратегию для анализа и оценки возможностей торговли акциями на разных таймфреймах. Не забывайте настраивать и оптимизировать параметры стратегии, исходя из ваших конкретных требований и рыночных условий, чтобы повысить ее эффективность.

Если вам нравится история, не стесняйтесь потратить пару секунд, чтобы дать ей 10 хлопков. Это очень мотивирует меня продолжать писать. :)

Загрузите полный исходный код и блокнот colab этой статьи отсюда.

Twitter: https://twitter.com/diegodegese
LinkedIn: https://www.linkedin.com/in/ddegese
Github: https://github.com/crapher

Отказ от ответственности. Инвестирование на фондовом рынке сопряжено с риском и может не подходить для всех инвесторов. Информация, представленная в этой статье, предназначена только для образовательных целей и не должна рассматриваться как инвестиционный совет или рекомендация купить или продать какую-либо конкретную ценную бумагу. Всегда проводите собственное исследование и консультируйтесь с лицензированным финансовым консультантом, прежде чем принимать какие-либо инвестиционные решения. Прошлые результаты не являются показателем будущих результатов