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