Количественная торговая стратегия на основе нейронной сети для оптимизации разницы ценовых колебаний

ATR ANN TANH OHLC4 volatility TIMEFRAME NEURAL NETWORK MACHINE LEARNING
Дата создания: 2025-06-23 11:39:44 Последнее изменение: 2025-06-23 11:39:44
Копировать: 5 Количество просмотров: 306
2
Подписаться
319
Подписчики

Количественная торговая стратегия на основе нейронной сети для оптимизации разницы ценовых колебаний Количественная торговая стратегия на основе нейронной сети для оптимизации разницы ценовых колебаний

Обзор

Стратегия квантовой торговли, основанная на искусственной нейронной сети (ANN), является высокочастотной торговой системой, предназначенной для оптимизации временных рамок на уровне 1 секунды. Стратегия использует нейронную сеть для анализа кратковременных ценовых колебаний, прогнозирования направления цены с помощью алгоритмов перемещения вперед и оптимизации торговых решений в сочетании с фильтрацией колебаний и контролем времени сеанса.

Стратегический принцип

Стратегия использует трехслойную архитектуру нейронной сети для обработки данных о ценовых разницах с помощью алгоритмов передового распространения:

  1. Входный уровень (L0): Процентная разница между принятием текущего OHLC4 (средняя цена запуска) и исторического OHLC4 (дифолтная 15-секундная временная рамка) в качестве одного входного нейрона.

  2. Первый скрытый слой (L1): Содержит 5 нейронов, использующих двойную прямоугольную ((tanh) как функцию активации для нелинейного преобразования входных данных. Каждый нейрон имеет предварительно обученные веса, используемые для захвата различий в ценах.

  3. Второй скрытый слой (L2): содержит 33 нейронов, также используя функцию активации tanh, для дальнейшей обработки вывода первого скрытого слоя с помощью более сложной матрицы весов.

  4. Выходный уровень (L3): Одиночный нейрон выводит окончательный прогнозный сигнал, значение которого переворачивается для коррекции направления сигнала.

Логика транзакции развивается вокруг выходной величины нейронной сети ((L3_0)):

  • Когда L3_0 больше входного порога ((по умолчанию 0.003), запускается многосигнал
  • Когда L3_0 меньше отрицательного входного порога ((-0,003), запускается пустота
  • Прямые позиции, когда L3_0 меньше, чем выходной порог (по умолчанию 0.001)
  • Когда L3_0 больше отрицательного отступного порога ((-0.001), открывается свободный рынок

Также в стратегии реализуется тройной механизм фильтрации:

  • Фильтр охлаждения: После совершения сделки система вынуждена ждать установленный период охлаждения (по умолчанию 60 секунд)
  • Фильтр колебаний: через показатель ATR (Average True Range), торгуйте только в том случае, если рыночная волатильность превышает минимальную отметку (0,02 по умолчанию)
  • Фильтрация по времени сделки: выборочно ограничить торговлю только в определенные рыночные часы (по умолчанию с 9:00 до 16:00)

Стратегические преимущества

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

  2. Отличный коэффициент риска и прибыли: Стратегия достигла коэффициента прибыли 3.754, что означает, что сумма прибыльных сделок в 3.754 раза превышает сумму убыточных сделок, что является очень хорошим показателем в количественной стратегии.

  3. Гибкое пространство для оптимизации параметров: Стратегия предоставляет множество регулируемых параметров, включая вход/выходные пороги, длину охлаждающего периода, временные рамки ссылки и минимальные требования к волатильности, что позволяет трейдерам оптимизировать в зависимости от различных рыночных условий и типов торгов.

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

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

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

Стратегический риск

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

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

  3. Риски высокочастотных сделокНа 1-секундных временных рамках, затраты на торговлю (например, расхождение и скольжение) могут существенно влиять на прибыльность стратегии. Эти затраты должны быть полностью учтены перед торговлей в реальном времени и имитировать реальные условия затрат на торговлю в обратной связи.

  4. Технологические вызовы: высокочастотная стратегия требует, чтобы торговая система имела очень низкую задержку и высокую надежность. Любая задержка сети, задержка данных или задержка исполнения может привести к сбою стратегии.

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

Направление оптимизации стратегии

  1. Оптимизация архитектуры нейронных сетей:

    • Рассмотреть возможность внедрения дополнительных входных характеристик, таких как объемы торгов, показатели волатильности и показатели динамики цен, чтобы повысить прогнозируемость моделей
    • Попробуйте различные скрытые слои структуры и количество нейронов, чтобы найти оптимальный баланс между сложностью и способностью к генерализации
    • Исследование эффективности других функций активации (например, ReLU или Leaky ReLU), которые превосходят tanh в некоторых приложениях нейронных сетей
  2. Механизм коррекции динамических параметров:

    • Вход/выходные барьеры, адаптированные к состоянию рынка, например, повышение барьера в условиях высокой волатильности и снижение барьера в условиях низкой волатильности
    • Разработка алгоритмов регулировки периода охлаждения с восприятием волатильности, позволяющих стратегии поддерживать оптимальную частоту торгов на разных этапах рынка
  3. Интегрированная прогнозная структура:

    • Модели нейронных сетей, объединенные в несколько временных рамок, образуют комплексные прогнозные сигналы
    • Внедрение метамоделей машинного обучения, динамическое изменение веса различных прогнозных моделей
    • Такой подход позволяет уменьшить ограничения одной модели и повысить стабильность прогноза.
  4. Усиление управления рисками:

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

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

Подвести итог

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

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

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

Исходный код стратегии
/*backtest
start: 2024-06-23 00:00:00
end: 2025-06-21 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("ANN Strategy v2 (Optimized for 1s)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === INPUTS ===
entryThreshold = input.float(0.003, title="Entry Threshold")
exitThreshold  = input.float(0.001, title="Exit Threshold")
cooldownBars   = input.int(60, title="Cooldown (bars)")  // 60 seconds cooldown
timeframe      = input.timeframe("1", title="Reference Timeframe")  // 1-minute diff reference
minVolatility  = input.float(0.02, title="Min ATR (Volatility Filter)")
useSession     = input.bool(true, title="Use Session Filter")

// === UTILITY FUNCTIONS ===
getDiff() =>
    prev = request.security(syminfo.tickerid, timeframe, ohlc4[1])
    now = ohlc4
    (now - prev) / prev

linear(v) => v
tanh(v) => (math.exp(v) - math.exp(-v)) / (math.exp(v) + math.exp(-v))

// === ANN FORWARD PROPAGATION ===
l0_0 = linear(getDiff())

l1 = array.new_float()
array.push(l1, tanh(l0_0 * 0.8446488687))
array.push(l1, tanh(l0_0 * -0.5674069006))
array.push(l1, tanh(l0_0 * 0.8676766445))
array.push(l1, tanh(l0_0 * 0.5200611473))
array.push(l1, tanh(l0_0 * -0.2215499554))

// === Layer 2 weights ===
w2 = array.from(    0.3341657935, -2.0060003664, 0.8606354375, 0.9184846912, -0.8531172267,    -0.0394076437, -0.4720374911, 0.2900968524, 1.0653326022, 0.3000188806,    -0.559307785, -0.9353655177, 1.2133832962, 0.1952686024, 0.8552068166,    -0.4293220754, 0.8484259409, -0.7154087313, 0.1102971055, 0.2279392724,    0.9111779155, 0.2801691115, 0.0039982713, -0.5648257117, 0.3281705155,    -0.2963954503, 0.4046532178, 0.2460580977, 0.6608675819, -0.8732022547,    0.8810811932, 0.6903706878, -0.5953059103, -0.3084040686, -0.4038498853,    -0.5687101164, 0.2736758588, -0.2217360382, 0.8742950972, 0.2997583987,    0.0708459913, 0.8221730616, -0.7213265567, -0.3810462836, 0.0503867753,    0.4880140595, 0.9466627196, 1.0163097961, -0.9500386514, -0.6341709382,    1.3402207103, 0.0013395288, 3.4813009133, -0.8636814677, 41.3171047132,    1.2388217292, -0.6520886912, 0.3508321737, 0.6640560714, 1.5936220597,    -0.1800525171, -0.2620989752, 0.056675277, -0.5045395315, 0.2732553554,    -0.7776331454, 0.1895231137, 0.5384918862, 0.093711904, -0.3725627758,    -0.3181583022, 0.2467979854, 0.4341718676, -0.7277619935, 0.1799381758,    -0.5558227731, 0.3666152536, 0.1538243225, -0.8915928174, -0.7659355684,    0.6111516061, -0.5459495224, -0.5724238425, -0.8553500765, -0.8696190472,    0.6843667454, 0.408652181, -0.8830470112, -0.8602324935, 0.1135462621,    -0.1569048216, -1.4643247888, 0.5557152813, 1.0482791924, 1.4523116833,    0.5207514017, -0.2734444192, -0.3328660936, -0.7941515963, -0.3536051491,    -0.4097807954, 0.3198619826, 0.461681627, -0.1135575498, 0.7103339851,    -0.8725014237, -1.0312091401, 0.2267643037, -0.6814258121, 0.7524828703,    -0.3986855003, 0.4962556631, -0.7330224516, 0.7355772164, 0.3180141739,    -1.083080442, 1.8752543187, 0.3623326265, -0.348145191, 0.1977935038,    -0.0291290625, 0.0612906199, 0.1219696687, -1.0273685429, 0.0872219768,    0.931791094, -0.313753684, -0.3028724837, 0.7387076712, 0.3806140391,    0.2630619402, -1.9827996702, -0.7741413496, 0.1262957444, 0.2248777886,    -0.2666322362, -1.124654664, 0.7288282621, -0.1384289204, 0.2395966188,    0.6611845175, 0.0466048937, -0.1980999993, 0.8152350927, 0.0032723211,    -0.3150344751, 0.1391754608, 0.5462816249, -0.7952302364, -0.7520712378,    -0.0576916066, 0.3678415302, 0.6802537378, 1.1437036331, -0.8637405666,    0.7016273068, 0.3978601709, 0.3157049654, -0.2528455662, -0.8614146703,    1.1741126834, -1.4046408959, 1.2914477803, 0.9904052964, -0.6980155826)


l2 = array.new_float()
for i = 0 to 32
    sum = 0.0
    for j = 0 to 4
        weight = array.get(w2, i * 5 + j)
        sum += weight * array.get(l1, j)
    array.push(l2, tanh(sum))

// === Output layer weights ===
weights_out = array.from(    -0.1366382003, 0.8161960822, -0.9458773183, 0.4692969576, 0.0126710629,    -0.0403001012, -0.0116244898, -0.4874816289, -0.6392241448, -0.410338398,    -0.1181027081, 0.1075562037, -0.5948728252, 0.5593677345, -0.3642935247,    -0.2867603217, 0.142250271, -0.0535698019, -0.034007685, -0.3594532426,    0.2551095195, 0.4214344983, 0.8941621336, 0.6283377368, -0.7138020667,    -0.1426738249, 0.172671223, 0.0714824385, -0.3268182144, -0.0078989755,    -0.2032828145, -0.0260631534, 0.4918037012)


sum_out = 0.0
for i = 0 to array.size(l2) - 1
    sum_out += array.get(weights_out, i) * array.get(l2, i)

// === Final ANN output (inverted for signal correction) ===
l3_0 = -tanh(sum_out)

// === TRADE FILTERS ===
volatility = ta.atr(14)
isVolOkay = volatility > minVolatility

isSession = (hour >= 9 and hour < 16)  // Adjust to your market hours
sessionOkay = useSession ? isSession : true

// === SIGNAL LOGIC ===
var string activeTrade = "none"
var int lastTradeBar = na
canTrade = (na(lastTradeBar) or (bar_index - lastTradeBar > cooldownBars)) and isVolOkay and sessionOkay

enterLong  = l3_0 > entryThreshold  and activeTrade != "long"  and canTrade
exitLong   = l3_0 < exitThreshold   and activeTrade == "long"
enterShort = l3_0 < -entryThreshold and activeTrade != "short" and canTrade
exitShort  = l3_0 > -exitThreshold  and activeTrade == "short"

// === STRATEGY EXECUTION ===
if barstate.isrealtime
    if enterLong
        strategy.entry("Long", strategy.short)
        activeTrade := "long"
        lastTradeBar := bar_index

    if exitLong
        strategy.close("Long")
        activeTrade := "none"

    if enterShort
        strategy.entry("Short", strategy.long)
        activeTrade := "short"
        lastTradeBar := bar_index

    if exitShort
        strategy.close("Short")
        activeTrade := "none"

// === PLOTTING ===
bgcolor(activeTrade == "long" ? color.new(color.green, 85) : activeTrade == "short" ? color.new(color.red, 85) : na)
plot(l3_0, title="ANN Output (Inverted)", color=color.aqua, linewidth=2)