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

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

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

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

  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

# Objective Function: Return of strategy
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()

# Simulated Annealing
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]  # Ensure moving periods are positive
        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 Short and Long Window Parameters:", optimized_params)

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

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

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

Вызовы:

Заключение

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