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

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



Этот подготовленный набор данных будет использоваться для тестирования стратегии разворота в этой статье.

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



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

Понимание стратегии разворота

Стратегия разворота направлена ​​на выявление потенциальных разворотов трендов цен на акции, что позволяет трейдерам открывать или закрывать позиции в оптимальное время. В предоставленном фрагменте кода стратегия разворота реализована в методе get_signals. Давайте разберем код шаг за шагом, чтобы понять, как он работает:

import numpy as np
import pandas as pd

# ...

def get_signals(df):

    # Buy Signals
    df['signal'] = np.where((df['low'] < df['low'].shift()) & (df['close'] > df['high'].shift()) & (df['open'] < df['close'].shift()), 1, 0)
    
    # Sell Signals   
    df['signal'] = np.where((df['high'] > df['high'].shift()) & (df['close'] < df['low'].shift()) & (df['open'] > df['open'].shift()), -1, df['signal'])

    return df['signal']

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

На этом этапе код идентифицирует потенциальные длинные сигналы (покупки). Он проверяет следующие условия:

  • df['low'] < df['low'].shift(): Минимальная цена текущего периода ниже минимальной цены предыдущего периода.
  • df['close'] > df['high'].shift(): Цена закрытия текущего периода выше максимальной цены предыдущего периода.
  • df['open'] < df['close'].shift(): Цена открытия текущего периода ниже цены закрытия предыдущего периода.

Если все эти условия выполнены, сигнал устанавливается на 1, что указывает на сигнал на покупку.

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

На этом шаге код идентифицирует потенциальные короткие (продажные) сигналы. Он проверяет следующие условия:

  • df['high'] > df['high'].shift(): максимальная цена текущего периода выше максимальной цены предыдущего периода.
  • df['close'] < df['low'].shift(): Цена закрытия текущего периода ниже минимальной цены предыдущего периода.
  • df['open'] > df['open'].shift(): Цена открытия текущего периода выше цены открытия предыдущего периода.

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

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

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

def show_stategy_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 = wins + (1 if (close_price - open_price) > 0 else 0)
            losses = 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: -398.47
* Wins: 1676 - Losses: 1861
* Win Rate:  47.38%
***************** Result for timeframe 15T *****************
* Profit/Loss: -237.29
* Wins: 617 - Losses: 787
* Win Rate:  43.95%
***************** Result for timeframe 1H ******************
* Profit/Loss: -4.06
* Wins: 292 - Losses: 290
* Win Rate:  50.17%
***************** Result for timeframe 1D ******************
* Profit/Loss: 130.31
* Wins: 24 - Losses: 19
* Win Rate:  55.81%

Заключение

В этой статье мы рассмотрели стратегию разворота для торговли акциями и реализовали ее с помощью Python. Мы шаг за шагом изучили фрагмент кода, чтобы понять, как стратегия определяет потенциальные сигналы покупки и продажи. Кроме того, мы протестировали стратегию на данных по акциям OIH на разных таймфреймах и проанализировали результаты, используя смоделированную стратегию длинной позиции. Стратегия разворота предоставляет трейдерам основу для выявления потенциальных разворотов тренда и принятия обоснованных торговых решений.

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

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

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

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