Индикатор

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

Скользящие средние

Простая скользящая средняя (SMA)

Простая скользящая средняя - один из наиболее часто используемых индикаторов. Она рассчитывает среднюю цену за указанное количество периодов. SMA часто используется для определения направления тренда. Например, 50-дневная SMA - это среднее значение цен закрытия за последние 50 дней.

def calculate_sma(prices, period):
    return sum(prices[-period:]) / period

Экспоненциальная скользящая средняя (EMA)

Экспоненциальная скользящая средняя придает больший вес недавним ценам, что делает ее более чувствительной к новой информации. Формула EMA применяет мультипликативный коэффициент к самым последним точкам данных.

def calculate_ema(prices, period):
    ema = [sum(prices[:period]) / period]
    multiplier = 2 / (period + 1)
    for price in prices[period:]:
        ema.append(((price - ema[-1]) * multiplier) + ema[-1])
    return ema

Осцилляторы

Индекс относительной силы (RSI)

Индекс относительной силы - это осциллятор моментума, который измеряет скорость и изменение ценовых движений. RSI колеблется между 0 и 100 и обычно используется для выявления состояний перекупленности или перепроданности.

def calculate_rsi(prices, period=14):
    deltas = [prices[i+1] - prices[i] for i in range(len(prices)-1)]
    gain = sum([delta for delta in deltas if delta > 0])
    loss = abs(sum([delta for delta in deltas if delta < 0]))
    avg_gain = gain / period
    avg_loss = loss / period
    rs = avg_gain / avg_loss
    return 100 - (100 / (1 + rs))

Стохастический осциллятор

Стохастический осциллятор сравнивает конкретную цену закрытия ценной бумаги с диапазоном ее цен за определенный период. Он генерирует две линии, %K и %D, для выявления состояний перекупленности или перепроданности.

def calculate_stochastic_oscillator(prices, period=14):
    high_low_diff = [max(prices[i-period:i]) - min(prices[i-period:i]) for i in range(period, len(prices))]
    %K = [(prices[i] - min(prices[i-period:i])) / high_low_diff[i-period] * 100 for i in range(period, len(prices))]
    %D = [sum(%K[i-2:i+1]) / 3 for i in range(2, len(%K))]
    return %K, %D

Индикаторы объема

Балансовый объем (OBV)

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

def calculate_obv(prices, volumes):
    obv = [volumes[0]]
    for i in range(1, len(prices)):
        if prices[i] > prices[i-1]:
            obv.append(obv[-1] + volumes[i])
        elif prices[i] < prices[i-1]:
            obv.append(obv[-1] - volumes[i])
        else:
            obv.append(obv[-1])
    return obv

Средневзвешенная по объему цена (VWAP)

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

def calculate_vwap(prices, volumes):
    cumulative_price_volume = sum([price * volume for price, volume in zip(prices, volumes)])
    cumulative_volume = sum(volumes)
    return cumulative_price_volume / cumulative_volume

Индикаторы волатильности

Полосы Боллинджера

Полосы Боллинджера состоят из средней полосы, являющейся скользящей средней, и двух внешних полос, рассчитанных как стандартные отклонения от скользящей средней. Они помогают выявлять волатильность и состояния перекупленности/перепроданности.

import numpy as np

def calculate_bollinger_bands(prices, period=20):
    sma = np.mean(prices[-period:])
    std_dev = np.std(prices[-period:])
    upper_band = sma + (2 * std_dev)
    lower_band = sma - (2 * std_dev)
    return upper_band, sma, lower_band

Средний истинный диапазон (ATR)

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

def calculate_atr(high, low, close, period=14):
    tr = [max(high[i] - low[i], abs(high[i] - close[i-1]), abs(low[i] - close[i-1])) for i in range(1, len(high))]
    atr = [sum(tr[:period]) / period]
    for i in range(period, len(tr)):
        atr.append((atr[-1] * (period - 1) + tr[i]) / period)
    return atr

Трендовые индикаторы

Схождение/расхождение скользящих средних (MACD)

MACD вычисляет разницу между двумя экспоненциальными скользящими средними (EMA), обычно 12-периодной EMA и 26-периодной EMA. 9-периодная EMA от MACD называется “сигнальной линией”.

def calculate_macd(prices, fast_period=12, slow_period=26, signal_period=9):
    fast_ema = calculate_ema(prices, fast_period)
    slow_ema = calculate_ema(prices, slow_period)
    macd = [fast - slow for fast, slow in zip(fast_ema, slow_ema)]
    signal_line = calculate_ema(macd, signal_period)
    return macd, signal_line

Параболический SAR

Параболический SAR (Stop and Reverse) используется для определения направления моментума актива и момента времени, когда этот моментум имеет повышенную вероятность смены направления.

def calculate_parabolic_sar(high, low, af=0.02, max_af=0.2):
    sar = low[0]  # Начинаем с первого минимума
    ep = high[0]  # Наивысшая цена (Extreme Point)
    trend = 1  # 1 для восходящего тренда, 0 для нисходящего
    sar_list = []

    for i in range(1, len(high)):
        sar_list.append(sar)
        if trend == 1:
            sar = sar + af * (ep - sar)
            if high[i] > ep:
                ep = high[i]
                af = min(af + 0.02, max_af)
            if low[i] < sar:
                trend = 0
                sar = ep
                ep = low[i]
                af = 0.02
        else:
            sar = sar - af * (sar - ep)
            if low[i] < ep:
                ep = low[i]
                af = min(af + 0.02, max_af)
            if high[i] > sar:
                trend = 1
                sar = ep
                ep = high[i]
                af = 0.02

    sar_list.append(sar)
    return sar_list

Заключение

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