Имитация отжига

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

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

Ключевые компоненты имитации отжига

  1. График температуры (график охлаждения): Температура контролирует вероятность принятия худших решений по мере прогрессирования алгоритма. График определяет, как температура снижается с течением времени. Распространенный график - геометрическое охлаждение, которое снижает температуру на постоянный коэффициент на каждой итерации.

  2. Функция соседства: Определяет локальную область в пространстве решений для исследования. Например, в торговой стратегии функция соседства может включать небольшие корректировки параметров, таких как точки входа и выхода или уровни стоп-лосса.

  3. Вероятность принятия: Определяет вероятность принятия худшего решения в зависимости от разницы в стоимости между текущим и новым решениями и текущей температурой. Это часто управляется критерием Метрополиса, который принимает худшие решения с вероятностью ( \exp(-\Delta E / T) ).

  4. Целевая функция: Функция, которая должна быть минимизирована или максимизирована. В торговле это может быть коэффициент Шарпа, общая доходность или другой показатель производительности.

Шаги, связанные с имитацией отжига в алгоритмической торговле

  1. Инициализация: Начните с начального решения и установите начальную температуру.

  2. Итерация:
    • Генерируйте соседское решение.
    • Рассчитайте изменение целевой функции.
    • Определите, принимать ли новое решение на основе вероятности принятия.
    • Отрегулируйте температуру в соответствии с графиком охлаждения.
  3. Завершение: Процесс продолжается до тех пор, пока не будет выполнен критерий завершения. Это может быть фиксированное количество итераций, решение, отвечающее предопределенному порогу качества, или температура ниже определенного уровня.

Применение в алгоритмической торговле

В алгоритмической торговле имитация отжига может оптимизировать многочисленные компоненты торговой стратегии. Вот некоторые конкретные приложения:

1. Оптимизация параметров

Торговые стратегии часто включают несколько параметров, таких как периоды скользящей средней, пороги индекса относительной силы (RSI) и уровни стоп-лосса. Имитация отжига может найти оптимальную комбинацию этих параметров для максимизации прибыли или минимизации риска.

2. Оптимизация портфеля

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

3. Разработка стратегии

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

4. Калибровка алгоритма

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

Пример: Применение имитации отжига к стратегии пересечения скользящих средних

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

import numpy as np
import pandas as pd
from random import randint, uniform
import yfinance as yf

# Целевая функция: возврат стратегии
def calculate_return(params, data):
    short_window, long_window = params
    data['short_mavg'] = data['Close'].rolling(window=short_window).mean()
    data['long_mavg'] = data['Close'].rolling(window=long_window).mean()
    data['signal'] = 0.0
    data['signal'][short_window:] = np.where(data['short_mavg'][short_window:] > data['long_mavg'][short_window:], 1.0, 0.0)
    data['positions'] = data['signal'].diff()
    initial_capital = float(100000.0)
    positions = pd.DataFrame(index=data.index).fillna(0.0)
    positions['AAPL'] = data['signal']
    portfolio = positions.multiply(data['Close'], axis=0)
    pos_diff = positions.diff()
    portfolio['holdings'] = positions.multiply(data['Close'], axis=0).sum(axis=1)
    portfolio['cash'] = initial_capital - (pos_diff.multiply(data['Close'], axis=0)).sum(axis=1).cumsum()
    portfolio['total'] = portfolio['cash'] + portfolio['holdings']
    portfolio['returns'] = portfolio['total'].pct_change()
    return portfolio['returns'].sum()

# Имитация отжига
def simulated_annealing(data, initial_temp, cooling_rate, stopping_temp, steps):
    current_params = [randint(5, 15), randint(20, 50)]
    current_cost = -calculate_return(current_params, data)
    current_temp = initial_temp

    while current_temp > stopping_temp:
        new_params = [current_params[0] + randint(-2, 2), current_params[1] + randint(-5, 5)]
        new_params = [max(1, x) for x in new_params]  # Обеспечьте положительные периоды скользящей средней
        new_cost = -calculate_return(new_params, data)

        if new_cost < current_cost or uniform(0, 1) < np.exp((current_cost - new_cost) / current_temp):
            current_params = new_params
            current_cost = new_cost

        current_temp *= cooling_rate

    return current_params

ticker = 'AAPL'
data = yf.download(ticker, start="2020-01-01", end="2023-01-01")
optimized_params = simulated_annealing(data, initial_temp=10000, cooling_rate=0.99, stopping_temp=1, steps=1000)
print("Оптимизированные параметры коротких и длинных окон:", optimized_params)

В этом примере:

Преимущества и вызовы

Преимущества:

Вызовы:

Заключение

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