Хочу поделиться историей одного R&D-эксперимента. Не так давно у меня появилась идея: а реально ли сегодня, не будучи Python-разработчиком, с нуля создать что-то относительно сложное, например, торговый алгоритм? И не просто создать, а сделать так, чтобы основной объем кода писали нейросети, как наверное вы уже успели догнаться. В качестве "программистов" я выбрал — ChatGPT и Gemini, я пытался как то разобраться с Cursor и deepseek, но сразу же попрощался, один слишком сложен для начального старта без знания программирования, второй как в дальнейшем выяснилось сильно отстает от своих конкурентов.

Сразу оговорюсь, чтобы задать правильные ожидания от статьи.

Во-первых, цель. Моей целью был не поиск финансовой жилки. Я не возлагал никаких надежд, и вам не советую. Нейросети в нашем мире это пока дети с большим мозгом знаний.
Изначально я поставил нейросетям почти фантастическую задачу — разработать стратегию с винрейтом 90%+, но это было скорее условным вектором, чтобы посмотреть, как они справятся с такой амбициозной постановкой. Настоящая цель — чисто технический интерес: смогу ли я, управляя диалогом, довести идею до рабочего прототипа?

Во-вторых, подход. Я не использовал какие-то хитрые техники промпт-инжиниринга. Все общение с LLM шло в формате "потока мыслей": я описывал задачу так, как она рождалась в голове, со всеми сумбурными деталями.

В-третьих, ограничения. Весь эксперимент занял около четырех дней. Не потому, что задача была сверхсложной, а потому, что я работал над ней урывками и пользовался исключительно бесплатными дневными лимитами на запросы, которые предоставляют ChatGPT и Gemini (и немного DeepSeek, но после нескольких попыток я на него положил болт).

И самое главное, критически важный дисклеймер. Коллеги, эта статья — не финансовый совет и не руководство к действию. Код, который мы дальше разберем — это интересный прототип, рожденный в диалоге с ИИ. Его итоговый результат на исторических данных впечатляет именно как достижение нейросети, но давайте будем честны: 250 строк кода — это игрушка по сравнению с промышленными торговыми системами. Ни в коем случае не пытайтесь использовать это для реальной торговли. Я хочу всего лишь поделиться исключительно техническим опытом, рассказать о подводных камнях и сравнить подходы двух нейросетей к задаче разработки.

Часть 1. ChatGPT,

Все началось с максимально сумбурного промпта в стиле "потока мыслей". Я описал, что хочу создать для себя Telegram-бота, который бы присылал сигналы по одной конкретной монете (AVAX, не стоит заострять внимание на этом, просто лично часто торгую данный инструмент), упомянул про анализ открытого интереса, памп-сигналы и, конечно, замахнулся на винрейт 90%+.(Для чистоты эксперимента)

Реакция ChatGPT была предсказуемой. Да, Джипити пытался доказать, что такой стратегии не существует, но после, резко переобулся мол “сделаем шеф, но не обещаю”.

ChatGPT терпеливо объяснял, какие библиотеки нужно установить (pip install requests pandas), и даже помогал с элементарными ошибками, когда я пытался вставить команду для терминала прямо в .py файл или запускал скрипт не из той директории.

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

Код для скачивания данных OHLCV (свечей)(ссылка)  avax_oi_funding / avax_trades_to_cvd(ссылка)

Часть 2. Спринт к результату: Gemini в роли прагматичного практика

Зайдя в тупик с разрозненными скриптами, я решил переключиться на Gemini. Я загрузил ему те же CSV-файлы с данными и описал ту же самую задачу. Подход Gemini оказался кардинально другим.

Итерация 1: Первый рабочий бэктестер

Первым же ответом Gemini предоставил мне единый, цельный скрипт backtester.py. Он загрузил все CSV, объединил их, реализовывал базовую логику. Ключевая часть логики — поиск "сбора ликвидности" — выглядела так:

# Рассчитываем "дно" за последние N свечей

df['rolling_low'] = df['low'].shift(1).rolling(window=PRICE_LOOKBACK_PERIOD).min()

# Условие 1: Сбор ликвидности и разворот

condition1 = (df['low'] < df['rolling_low']) & (df['close'] > df['open'])

Полный код - ссылка
Ссылка на полный код, тк очень режет глаз при чтении, и я из-за этого прикрепил на telegra.ph.

Здесь нейросеть реализовала поиск паттерна "выбили стопы и развернулись": она находит минимальную цену за прошлое N свечей (rolling_low) и проверяет, опускалась ли текущая свеча ниже этого уровня, но при этом закрылась ростом (close > open).

Итерация 2: Решение проблемы с данными

Первый запуск показал удручающий результат, потому что как оказалось я скачал данные только за один день). Было предложено решение — готовый скрипт download_history.py для загрузки полной истории с Bybit.(Тк на Бинансе у меня не была пройдена верификация для API) Скрипт(ссылка)

Итерация 3: Улучшение логики с помощью Multi-Timeframe Analysis

После загрузки полной истории новый бэктест показал, что short-позиции работают ужасно (винрейт 36%). Я предложил решение: добавить фильтр по перекупленности с помощью осцилляторов RSI и MFI на младшем, 5-минутном таймфрейме. Забегая наперед я ставил Short как зеркальный вход в лонг. Но убрал RSI и MFI, я долго игрался со значениями, но винрейт не пробивал отметку 36%, я вам больше скажу у меня он варьировался от 27-34 плюс минус.

Для этого скрипт был полностью переписан. Сначала он "пересобирал" минутные данные в 5-минутные:

# Готовим 5-минутные данные с RSI и MFI

df_5m = ohlcv_df.resample('5min').agg({'open': 'first', ...}).dropna()

Затем для этого нового таймфрейма рассчитывались индикаторы. А в финальную логику для short-сигнала добавилось новое, четвертое условие:

# НОВОЕ УСЛОВИЕ-ФИЛЬТР ДЛЯ ШОРТОВ

short_cond4_filter = (df['rsi'] > RSI_OVERBOUGHT_LEVEL) | (df['mfi'] > MFI_OVERBOUGHT_LEVEL)

# Итоговый сигнал

df['short_signal'] = short_cond1 & short_cond2 & short_cond3 & short_cond4_filter

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

Сравнение и выводы

После всех итераций и доработок, поиграв с параметрами, я получил вот такой финальный результат на бэктесте (период — последние 2 месяца):

Всего сделок: 58

Винрейт: 51.72%

Чистая прибыль: +406.78% (с начальным капиталом в $90)(это при стартовых рисках в 20% от депа, так то меньше понятное дело)

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

Часть 3. Код

А теперь внутряночка. Давайте разберем, как именно Gemini реализовал нашу торговую логику в коде. Весь бэктестер — это около 250 строк, но в них заложены довольно интересные технические решения.

Условие 1: Поиск "Сбора ликвидности" (Stop Hunt)

Основная идея стратегии — входить в сделку после "манипуляции", когда цена выбивает стопы других трейдеров, а затем разворачивается. Для поиска такого момента для long-позиции нейросеть сгенерировала следующий код:

# Рассчитываем "дно" за последние N свечей

df['rolling_low'] = df['low'].shift(1).rolling(window=PRICE_LOOKBACK_PERIOD).min()

# Условие 1: Сбор ликвидности и разворот

condition1 = (df['low'] < df['rolling_low']) & (df['close'] > df['open'])

 

Что здесь происходит?

df['low'].shift(1): Мы берем столбец с минимальными ценами (low) и "сдвигаем" его на одну свечу назад. Это нужно, чтобы при анализе текущей свечи мы не учитывали ее же low при поиске предыдущего минимума.

rolling(window=PRICE_LOOKBACK_PERIOD).min(): Мы создаем "скользящее окно" размером в PRICE_LOOKBACK_PERIOD (в нашем случае — 10 свечей) и находим в этом окне минимальное значение. Так мы получаем динамический уровень поддержки.

condition1 = (df['low'] < df['rolling_low']) & (df['close'] > df['open']): Итоговое условие. Оно сработает (True), если минимум (low) текущей свечи пробил тот самый динамический уровень поддержки, и при этом свеча закрылась выше, чем открылась (т.е. она "зеленая"). Это и есть наш паттерн "выбили стопы и развернулись".

Условие 2: Фильтр по Открытому Интересу (ОИ)

Просто разворота нам мало. Нужно подтверждение, что в рынок входят "умные деньги". Для этого мы смотрим на рост Открытого Интереса.

# Рассчитываем средний ОИ за последние M свечей

df['oi_average'] = df['openInterest'].shift(1).rolling(window=OI_LOOKBACK_PERIOD).mean()

# Условие 2: Рост Открытого Интереса

condition2 = df['openInterest'] > df['oi_average']

 

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

Условие 3: Фильтр перекупленности/перепроданности (RSI/MFI)

Решение для улучшения short-сигналов. Идея в том, чтобы подтверждать сигнал на основном, 15-минутном таймфрейме, данными с младшего, 5-минутного.

Нейросеть взяла исходные минутные данные и "пересобрала" их в 5-минутные свечи с помощью resample:

# Готовим 5-минутные данные с RSI и MFI

df_5m = ohlcv_df.resample('5min').agg({'open': 'first', ...}).dropna()

 

Для нового 5-минутного датафрейма Gemini написал отдельные функции для расчета RSI и MFI. Вот, например, как выглядит расчет RSI:

def calculate_rsi(data, period):

delta = data.diff()

gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()

loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()

rs = gain / loss

return 100 - (100 / (1 + rs))

Сигнал сработает, только если на 15-минутном графике цена собрала ликвидность сверху, ОИ вырос, фандинг высокий, и при этом на 5-минутном графике RSI или MFI находятся в зоне перекупленности.

# НОВОЕ УСЛОВИЕ-ФИЛЬТР ДЛЯ ШОРТОВ

short_cond4_filter = (df['rsi'] > RSI_OVERBOUGHT_LEVEL) | (df['mfi'] > MFI_OVERBOUGHT_LEVEL)

# Итоговый сигнал

df['short_signal'] = short_cond1 & short_cond2 & short_cond3 & short_cond4_filter

Заключение

Так что же такое современные LLM для разработчика или энтузиаста?

Это не "черный ящик", который по щелчку пальцев выдает готовые, идеальные решения. Как показал этот эксперимент, это мощнейший инструмент для быстрого прототипирования. Весь этот путь, занявший у меня 4 дня из-за дневных лимитов и нечетких промптов, опытный prompt-инженер с платной подпиской, вероятно, прошел бы за 15-20 минут. Нейросеть позволяет мгновенно проверять гипотезы, писать шаблонный код и тестировать идеи, которые раньше потребовали бы дней рутинной работы.(я изначально то хотел разработать папм бота, но в реалезации это было бы очень сложно)

Ключевую роль во всем процессе все равно играет человек. Ни ChatGPT, ни Gemini не придумали саму торговую стратегию. Они лишь помогли ее формализовать, перевести с языка идей на язык Python и быстро доработать на основе тестов.

Мой главный вывод: не стоит слепо доверять LLM и ждать от них магии. Но и игнорировать их как инструмент, способный ускорить ваш R&D-процесс в десятки раз — огромное упущение.
Итоговый код (ссылка)

Спасибо за внимание! Буду рад обсудить в комментариях ваш опыт использования нейросетей для решения технических задач.
Если статья получит фитбек, то у меня уже есть пару идей на продолжение - улучшения проекта. Подключение AI, пишет, что сможем увеличить с 50% до +- 70% винрейт.

Вступайте в наш чат, 24/7 рабочая атмосфера, разбираем рыночные сетапы вместе с комьнити, так же разбираем ошибки, помогаем друг другу выходить из плохих сделок ссылка на чат (ссылка)
Если статья показалась вам интересной, то буду благодарен за подписку на мой тг канал (ссылка)

До скорых встреч. 

Комментарии (15)


  1. RodionGork
    10.09.2025 06:14

    Написать какую-нибудь общеизвестную шляпу с помощью GPT в состоянии буквально каждый из присутствующих, прошу прощения :)

    Вы бы лучше рассказали сколько миллионов с помощью написанного решения уже наторговали - это всем интересно :) Только не в стиле "за один день прибыль составила 128% (а за три остальных профукано вдвое больше)" а на интервале вменяемой длины :)

    Подключение AI, пишет, что сможем увеличить с 50% до +- 70% винрейт.

    эту фразу реально сложно понять, кто вам "пишет", но 50% винрейта можно получить и гораздо проще - рандомом или константой :)))


    1. LehausIT Автор
      10.09.2025 06:14

      Спасибо за ваш комментарий. Как я неоднократно отмечал в статье, этот проект был исключительно R&D-экспериментом, а не руководством к заработку.

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

      По поводу 50% не согласен. Если бы мы торговали с соотношением риск/прибыль 1 к 1, то да, чистый рандом дал бы нам 50% винрейта. Но наша стратегия изначально была построена с соотношением 1 к 1.5, где тейк-профит в полтора раза больше стоп-лосса. При таком подходе, чтобы быть в плюсе, винрейт должен быть не 50%, а всего 40% и выше. А для достижения даже этих 40% нам как раз и нужны дополнительные условия входа, чтобы отсеять плохие сделки. И мы смогли достичь 52% винрейта. И то по хорошему надо проверить на разных интервалах. Об этом я тоже говорил. И сказал что шорт позиции были с 36% винрейтом, что способствовало в итоге в бэктесте минус несколько процентов к депозиту.


  1. Q3_Results
    10.09.2025 06:14

    А что не так с DeepSeek и в чем он уступает этим джеминаям?


    1. hulitolku
      10.09.2025 06:14

      По мне так дипсик лучше жпт справляется, что касается кода.


    1. LehausIT Автор
      10.09.2025 06:14

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

      Однако мне понравилось, что он очень хорошо описывает план работы. Но в плане разработок он пока слабоват, по моему мнению.

      Возможно, с другими задачами он справляется лучше. Например, в учебе я использую его регулярно, и он предоставляет четкую структурированную информацию.

      Если ему дать четкую задачу, он справиться отлично. Просто у меня же сумбурно лились мысли.


  1. WinPooh73
    10.09.2025 06:14

    Может быть, надо было остановиться на той версии, которая не могла пробить 36%, и просто инвертировать её сигналы?


    1. LehausIT Автор
      10.09.2025 06:14

      Я так и сделал потом уже, за кадром


  1. Stol222
    10.09.2025 06:14

    Дипсик не сильно хуже гпт. Если включать думание он понимает код лучше gpt. Честно есть задачи которые гпт не смог решить, а он смог. Конкретная задача на питоне. Ничего не утверждаю


    1. LehausIT Автор
      10.09.2025 06:14

      Ну я его отбрасываю, я так параллельно тоже самое делаю, что и с джемени, иногда он что-то мудрое выдает.


  1. Jeisooo
    10.09.2025 06:14

    Почему не использовать уже готовые liquidation maps, а не давать расчитывать нейронке дно по свечам?


    1. LehausIT Автор
      10.09.2025 06:14

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

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


      1. Jeisooo
        10.09.2025 06:14

        Буквально тем же самым баловался неделю назад с помощью Qoder.

        После пары-тройки итераций правок тот потерял контекст и начал сильно увеличивать объем кода. Я нашел библиотечку бесплатную, которая троит карты ликвидности, скачивая данные с бинанс. Но иногда нейронки советуют coinglass, правда карты там стоят уже 700$ в месяц за про подписку.

        Добавил еще средние и анализ объемов для вычисления тренда.

        Но 5минутки это не интересно, там вы потив hft

        Лечше бектестить на 12h. И тренды проще ловить


        1. LehausIT Автор
          10.09.2025 06:14

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

          Можете подсказать на будущее, какой сервис вы нашли бесплатных карт ликвидности


          1. Jeisooo
            10.09.2025 06:14

            1. LehausIT Автор
              10.09.2025 06:14

              Благодарю)