Торговая стратегия Python RSI: комплексное руководство по реализации и бэктестированию

В этой статье блога мы рассмотрим различные методы реализации торговой стратегии индекса относительной силы (RSI) на основе Python. RSI — популярный технический индикатор, используемый трейдерами для определения условий перекупленности и перепроданности на рынке. Мы рассмотрим различные подходы к расчету RSI, генерации торговых сигналов и бэк-тестированию стратегии с использованием исторических ценовых данных. Давайте погрузимся!

Метод 1: расчет RSI с использованием Pandas и Numpy
Первый метод включает использование библиотек Pandas и Numpy для расчета RSI. Вот пример фрагмента кода:

import pandas as pd
import numpy as np
def calculate_rsi(prices, n=14):
    deltas = np.diff(prices)
    seed = deltas[:n+1]
    up = seed[seed >= 0].sum()/n
    down = -seed[seed < 0].sum()/n
    rs = up/down
    rsi = np.zeros_like(prices)
    rsi[:n] = 100. - 100./(1. + rs)
    for i in range(n, len(prices)):
        delta = deltas[i-1]  # Recent price change
        if delta > 0:
            upval = delta
            downval = 0.
        else:
            upval = 0.
            downval = -delta
        up = (up*(n-1) + upval)/n
        down = (down*(n-1) + downval)/n
        rs = up/down
        rsi[i] = 100. - 100./(1. + rs)
    return rsi
# Usage example
prices = [70, 69, 71, 68, 72, 68, 67, 70, 72, 71, 70, 69, 68, 70]
rsi = calculate_rsi(prices)
print(rsi)

Метод 2: генерация торговых сигналов RSI
После того, как у нас есть значения RSI, мы можем генерировать торговые сигналы на основе заранее определенных пороговых значений. Например, мы можем рассматривать значение RSI выше 70 как перекупленность, а ниже 30 как перепроданность. Вот фрагмент кода, который демонстрирует это:

def generate_signals(rsi, overbought=70, oversold=30):
    signals = []
    for i in range(1, len(rsi)):
        if rsi[i-1] > overbought and rsi[i] <= overbought:
            signals.append("SELL")
        elif rsi[i-1] < oversold and rsi[i] >= oversold:
            signals.append("BUY")
        else:
            signals.append("HOLD")
    return signals
# Usage example
rsi = [65, 72, 78, 82, 68, 62, 55, 41, 38, 47, 52]
signals = generate_signals(rsi)
print(signals)

Метод 3: тестирование стратегии RSI
Чтобы оценить эффективность стратегии RSI, мы можем протестировать ее на исторических данных, используя исторические ценовые данные. Библиотека backtraderпредоставляет удобную основу для тестирования торговых стратегий. Вот пример фрагмента кода:

import backtrader as bt
class RSIStrategy(bt.Strategy):
    def __init__(self):
        self.rsi = bt.indicators.RSI_SMA(self.data.close, period=14)
    def next(self):
        if self.rsi > 70:
            self.sell()
        elif self.rsi < 30:
            self.buy()
# Usage example
cerebro = bt.Cerebro()
data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2019, 1, 1), todate=datetime(2020, 12, 31))
cerebro.adddata(data)
cerebro.addstrategy(RSIStrategy)
cerebro.run()
cerebro.plot()

В этой статье мы рассмотрели несколько методов реализации торговой стратегии Python RSI. Мы рассмотрели расчет RSI с использованием Pandas и Numpy, генерацию торговых сигналов на основе пороговых значений RSI и тестирование стратегии с использованием библиотеки backtrader. Объединив эти методы и настроив их под свои нужды, вы сможете создать надежную торговую стратегию RSI.