Размышления о Vibe Trading: когда стоит использовать ИИ, а когда нет.
Недавно появилась концепция Vibe Trading — описание своих торговых намерений на естественном языке, чтобы ИИ выполнил их за вас. Скажите «консервативная стратегия, приоритет низковолатильным активам» — и ИИ автоматически настроит портфель. Звучит заманчиво.
Но прежде чем говорить о Vibe Trading, я хочу рассказать об одном недавнем случае, который лучше всяких теорий иллюстрирует, «где ИИ нужен, а где нет».
31 марта Claude Code от Anthropic случайно раскрыл исходный код в одном из npm-обновлений — около 512 000 строк TypeScript (примечание: это общий объем кода после сборки, включая зависимости и сгенерированный код). Сообщество быстро начало реверс-инжиниринг, разработчики по всему миру перерыли код в поисках новых функций.
Но самое неожиданное открытие не было связано с ИИ. Само по себе это открытие не относится и к трейдингу, но инженерная философия, стоящая за ним, должна отозваться в душе каждого, кто занимается алгоритмической торговлей.
В модуле, который аналитики пометили как userPromptKeywords, было найдено регулярное выражение для сопоставления таких ругательств, как shit, wtf, fucking broken — чтобы быстро определить, ругается ли пользователь.
Самая передовая компания в мире по разработке больших языковых моделей использует регулярные выражения для определения эмоций.
Не вызывает Claude для анализа тональности. Не обучает классификатор. Просто сопоставление строк за микросекунды.
Почему?
I. Почему Anthropic не использует свой собственный ИИ?
Это не лень. Это продуманное инженерное решение.
Claude Code обрабатывает сотни тысяч пользовательских взаимодействий в день. Каждое взаимодействие требует оценки: «выражает ли пользователь разочарование?» — чтобы скорректировать стратегию ответа. Если бы каждый раз вызывать LLM для этой оценки:
- Задержка: один LLM-инференс занимает как минимум сотни миллисекунд, регулярное выражение — несколько микросекунд.
- Стоимость: вызов LLM тарифицируется по токенам, регулярное выражение практически бесплатно.
- Детерминированность: регулярное выражение либо совпадает, либо нет, результат на 100% определён; вывод LLM недетерминирован — один и тот же вход может привести к разным выводам.
Поэтому Anthropic выбрал: использовать регулярное выражение для быстрой фильтрации (низкий порог, высокая скорость, детерминированность), а вычислительные ресурсы LLM оставить для решений, требующих настоящего семантического понимания.
Это не техническая деталь. Это архитектурная философия: не все проблемы заслуживают решения с помощью ИИ.
Люди, занимающиеся алгоритмической торговлей, должны особенно остро это почувствовать.
II. Тот же самый выбор в алгоритмической торговле
В вашей стратегии есть два типа решений:
Детерминированные решения — здесь нужны «правила»
Всем, кто писал стратегии на FMZ, известно, что самая основная торговая логика зачастую — это несколько строк детерминированного кода:
javascript
// Сигнал пересечения скользящих средних — пример на JavaScript для FMZ
var records = exchange.GetRecords(PERIOD_D1)
var ma5 = TA.MA(records, 5)
var ma20 = TA.MA(records, 20)
var idx = records.length - 1
// Золотое пересечение — открытие long
if (ma5[idx] > ma20[idx] && ma5[idx-1] <= ma20[idx-1]) {
exchange.SetDirection("buy")
exchange.Buy(records[idx].Close, 1)
Log("Золотое пересечение скользящих средних, открытие long")
}
Условия чёткие, результат определённый, не требуется «понимания» семантики. Написано через if-else — 100% надёжность, выполнение за миллисекунды.
Это тот же подход, что и у Anthropic с регулярным выражением для определения эмоций — детерминированные проблемы решаются детерминированными инструментами. Конечно, регулярное выражение — это сопоставление строк, а скользящая средняя — математический расчёт, инструменты разные, но в своих системах они играют аналогичную роль: это детерминированные суждения, не требующие вмешательства ИИ.
Стоп-лосс — доверьте его if-else с надёжностью 100%, ИИ даёт «высокую вероятность». Ваш счёт не выдержит этой крошечной вероятности.
Нечёткие решения — здесь нужен ИИ
Но есть решения, которые не напишешь через if-else:
- Анализ новостного фона: вышло заявление ФРС — жёсткая позиция или мягкая? «Процентная ставка остаётся без изменений, но комитет будет внимательно следить за данными». Эта фраза — бычий сигнал или медвежий? Скользящие средние не скажут, регулярные выражения тоже не справятся.
- Обнаружение аномалий: объём обсуждения альткоина в соцсетях вырос на 800% за 3 часа, а цена не изменилась. Это «умные деньги закупаются» или «кто-то пиарит перед пампингом»? Требуется многомерное нечёткое суждение.
- Генерация стратегий: у вас есть интуиция — «после такого паттерна часто бывает резкий рост». Но вы не можете точно сформулировать условия. Вы можете описать эту интуицию LLM и попросить её преобразовать в количественный фактор, поддающийся бэктестингу.
Общая черта этих сценариев: входные данные неструктурированы, критерии нечёткие, требуется «понимание», а не просто «сопоставление».
III. Многоуровневый подход, который можно взять на вооружение
Вернёмся к архитектуре Claude Code. Анализ сообщества выявил чёткое разделение по уровням:
| Уровень | Механизм в Claude Code | Аналог в алгоритмической торговле |
|---|---|---|
| Быстрый фильтр | Регулярные выражения, сопоставление ключевых слов | Пересечение скользящих средних, стоп-лосс по порогу, ограничения по позиции |
| Инженерная инфраструктура | Управление процессами, передача сообщений, контроль доступа | API бирж, управление ордерами, движок риск-менеджмента |
| Семантическое принятие решений | LLM prompt | Анализ новостного фона, распознавание аномальных паттернов, исследование стратегий |
Конечно, Claude Code и алгоритмическая торговля — две совершенно разные области, здесь нет точного отображения. Но архитектурная философия действительно перекликается — выбирать самый подходящий инструмент для каждого уровня, а не забивать все гвозди одним молотком.
Open-source сообщество также движется в этом направлении. TradingAgents — недавно примечательный мультиагентный фреймворк для алгоритмической торговли (построен на LangGraph, есть сопровождающая академическая статья). Он имитирует структуру команды реальной трейдинговой компании: технический аналитик отвечает за свечи и индикаторы, аналитик настроений — за новости и соцсети, трейдеры разных стилей обобщают мнения для принятия финального решения. Не один универсальный ИИ делает всё, а разные роли выполняют свои задачи.
Стоит отметить: TradingAgents — это исследовательский фреймворк, он решает вопрос «как ИИ принимает торговые решения». Но в реальной торговле вам нужна и другая половина: взаимодействие с биржей, управление ордерами, исполнение риск-менеджмента, журналы аудита — все эти инженерно-инфраструктурные вещи как раз уже сделаны за вас в таких платформах, как FMZ.
IV. Как внедрить Vibe Trading: пример многоуровневой архитектуры
Вернёмся к началу — Vibe Trading. Направление правильное, но при условии чёткого разделения уровней.
Представьте: сегодня случилось золотое пересечение скользящих средних по BTC, но все новости — о регуляторных рисках. Как поступить? Если смотреть только на скользящие средние — нужно открыть long; если слушать только новости — страшно. Это типичный сценарий, требующий многоуровневого подхода.
На FMZ упрощённую многоуровневую архитектуру можно реализовать так (примечание: это упрощённый пример, в реальной торговле самостоятельно проработайте настройки контрактов и риск-менеджмент):
javascript
/*
Параметры стратегии (добавляются на странице редактирования стратегии FMZ):
OPENROUTER_API_KEY : тип string, введите ваш API-ключ OpenRouter
AI_MODEL : тип string, по умолчанию "google/gemini-2.5-flash", можно заменить другой моделью
*/
// Семантический уровень принятия решений: получение рыночных настроений через AI с помощью OpenRouter
function getAISentiment() {
var prompt = "Проанализируйте текущие новости рынка криптовалют и дайте оценку настроений (от -1 до 1, где -1 — крайняя паника, 1 — крайняя жадность). Верните только одно число."
var response = HttpQuery("https://openrouter.ai/api/v1/chat/completions", {
method: "POST",
body: JSON.stringify({
model: AI_MODEL,
messages: [{role: "user", content: prompt}],
temperature: 0
}),
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + OPENROUTER_API_KEY
},
timeout: 15000
})
var score = parseFloat(JSON.parse(response).choices[0].message.content)
// При некорректном ответе AI — возвращаем нейтральное значение: надёжность системы не должна зависеть от каждого правильного вывода AI
if (isNaN(score) || score < -1 || score > 1) {
Log("Некорректный формат ответа AI, используем значение по умолчанию 0")
score = 0
}
Log("Оценка настроений AI:", score)
return score
}
function main() {
var lastSignalTime = 0 // Время последней свечи, на которой был подан сигнал, чтобы избежать повторных срабатываний на одной свече
while (true) {
var records = exchange.GetRecords(PERIOD_D1)
if (!records || records.length < 20) { Sleep(1000); continue }
var ma5 = TA.MA(records, 5)
var ma20 = TA.MA(records, 20)
var idx = records.length - 1
var curTime = records[idx].Time
var isBullCross = ma5[idx] > ma20[idx] && ma5[idx-1] <= ma20[idx-1]
var isBearCross = ma5[idx] < ma20[idx] && ma5[idx-1] >= ma20[idx-1]
// Проверка наличия позиции
var pos = exchange.GetPosition()
var hasPosition = pos && pos.length > 0
// Первый уровень: чёткий сигнал как "порог" — золотое пересечение + нет позиции + ещё не обрабатывали эту свечу → только тогда запрашиваем AI
if (isBullCross && !hasPosition && curTime !== lastSignalTime) {
lastSignalTime = curTime
var sentiment = getAISentiment()
// Второй уровень: настроение AI как "референс" — влияет на размер позиции, но не инициирует сделку самостоятельно
if (sentiment > 0.2) {
exchange.SetDirection("buy")
exchange.Buy(records[idx].Close, 1)
Log("Золотое пересечение + AI бычий, открываем полную позицию")
} else if (sentiment > -0.3) {
exchange.SetDirection("buy")
exchange.Buy(records[idx].Close, 0.5)
Log("Золотое пересечение + AI нейтральный, открываем полпозиции")
} else {
Log("Золотое пересечение, но AI медвежий, пропускаем сигнал")
}
}
// Смертельное пересечение — закрытие позиции: чёткое правило, AI не участвует
if (isBearCross && hasPosition) {
exchange.SetDirection("closebuy")
exchange.Sell(records[idx].Close, pos[0].Amount)
Log("Смертельное пересечение скользящих средних, закрываем позицию")
}
// Третий уровень: стоп-лосс — "железное правило", без участия AI
if (hasPosition) {
var curPrice = records[idx].Close
var entryPrice = pos[0].Price
if (curPrice < entryPrice * 0.97) { // Падение на 3% от цены открытия
exchange.SetDirection("closebuy")
exchange.Sell(curPrice, pos[0].Amount)
Log("Стоп-лосс сработал, безусловное закрытие позиции, убыток", ((curPrice/entryPrice - 1)*100).toFixed(2), "%")
}
}
Sleep(60 * 1000)
}
}
Основную логику этого кода стоит разобрать подробнее:
1. Золотое пересечение скользящих средних — это «порог». Только когда чёткий сигнал сначала срабатывает, происходит вызов AI. Не каждый бар опрашивается большая модель — это и экономит деньги (большие модели оплачиваются по токенам), и избегает лишнего шума. Это соответствует подходу Anthropic: сначала фильтр регулярными выражениями, а при совпадении запускается более тяжелая обработка.
2. Настроение AI — это «референс». Оно влияет на размер позиции и на то, следует ли пропустить сигнал, но само по себе не инициирует сделку. Обратите внимание на обработку ошибок в коде: если большая модель вернула неразборчивое содержимое, выполняется откат к нейтральному значению 0. Надёжность системы не должна зависеть от каждого правильного вывода AI.
3. Стоп-лосс — это «железное правило». При падении на 3% от цены открытия позиция закрывается безусловно, без запроса мнения AI. AI может сказать «долгосрочный прогноз позитивный», но ваш счёт может не дожить до долгосрочного. Здесь используется жёсткий стоп-лосс в процентах, без каких-либо нечётких суждений.
Это правильный способ использования Vibe Trading: с помощью естественного языка позволять AI «ощущать» рыночную атмосферу, а с помощью чёткого кода — «исполнять» торговые действия. Граница между ними не должна размываться.
Практический совет: в системе бэктестинга FMZ сначала прогоните чистую стратегию на скользящих средних как базовую линию, затем добавьте уровень настроений AI и сравните доходность и просадку. Если с AI результаты стали хуже — значит, слои настроены неправильно, вероятно, AI вмешивается там, где не должен. Каждый результат AI записывайте через Log(), чтобы потом можно было проанализировать каждое решение.
5. Вывод одной фразой
Самые передовые AI-компании используют регулярные выражения для выявления настроений не потому, что не могут создать более совершенный AI.
А потому, что они знают: выбрать правильный инструмент важнее, чем выбрать мощный инструмент.
Стратегия на скользящих средних не сексуальна, регулярные выражения не продвинуты. Но в своей области они надёжнее любого AI.
И наоборот, когда вам нужно из 5000-словного макроэкономического отчёта извлечь вывод «этот текст к BTC относится бычье или медвежье?» — скользящие средние не помогут, регулярные выражения не помогут. Вот где AI должен вступать в игру.
Это не вопрос «использовать AI или нет», а вопрос «на каком уровне его использовать».
Неприметный файл с регулярными выражениями в исходном коде Claude Code отвечает на вопрос, который часто упускают из виду. А FMZ даёт вам готовую слоистую инфраструктуру — интерфейсы бирж, расчёт индикаторов, управление в реальной торговле, аудит логов уже сделаны за вас. Вам остаётся только продумать: какие решения доверить TA.MA(), а какие — AI.
Источники:
- Alex Kim — Утечка исходного кода Claude Code — Анализ обнаружения фрустрации с помощью регулярных выражений
- FMZ — Создание автоматизированной торговой системы на базе ИИ — Архитектура «мозг ИИ + руки FMZ»
- TradingAgents — Мультиагентный фреймворк для финансовой торговли на основе LLM — Открытый фреймворк для мультиагентной количественной торговли
- Статья TradingAgents — Академическое исследование мультиагентного фреймворка для финансовой торговли
- VentureBeat — Утечка исходного кода Claude Code
- 1


