Глава 71: Prompt Engineering для Трейдинга — Техники Оптимизации LLM
Эта глава рассматривает техники Prompt Engineering, специально разработанные для торговых приложений. Мы изучим, как создавать эффективные промпты, которые максимизируют точность и надёжность больших языковых моделей (LLM) для анализа настроений, генерации торговых сигналов, анализа рынка и автоматизированных торговых стратегий.
Содержание
- Введение в Prompt Engineering
- Основы Prompt Engineering
- Финансовые шаблоны промптов
- Продвинутые техники
- Практические примеры
- Реализация на Rust
- Реализация на Python
- Лучшие практики
- Ресурсы
Введение в Prompt Engineering
Что такое Prompt Engineering?
Prompt engineering — это искусство и наука создания входных инструкций (промптов) для управления большими языковыми моделями с целью получения желаемых результатов. В торговых приложениях хорошо спроектированные промпты могут значительно улучшить качество инсайтов, генерируемых LLM.
РАБОЧИЙ ПРОЦЕСС PROMPT ENGINEERING:┌──────────────────────────────────────────────────────────────────┐│ СЫРОЙ ВВОД ││ "Акции Apple выросли на 5% сегодня" │└─────────────────────────┬────────────────────────────────────────┘ │ ▼┌──────────────────────────────────────────────────────────────────┐│ СПРОЕКТИРОВАННЫЙ ПРОМПТ ││ ┌────────────────────────────────────────────────────────────┐ ││ │ Вы финансовый аналитик, специализирующийся на │ ││ │ технологических акциях. Проанализируйте следующую новость: │ ││ │ 1. Настроение (ПОЗИТИВНОЕ/НЕГАТИВНОЕ/НЕЙТРАЛЬНОЕ) │ ││ │ 2. Оценка уверенности (0-100) │ ││ │ 3. Торговая рекомендация │ ││ │ 4. Ключевые факторы вашего анализа │ ││ │ │ ││ │ Новость: "Акции Apple выросли на 5% сегодня" │ ││ └────────────────────────────────────────────────────────────┘ │└─────────────────────────┬────────────────────────────────────────┘ │ ▼┌──────────────────────────────────────────────────────────────────┐│ СТРУКТУРИРОВАННЫЙ ВЫВОД ││ { ││ "sentiment": "POSITIVE", ││ "confidence": 85, ││ "recommendation": "HOLD - ждите подтверждения", ││ "factors": ["Ценовой импульс", "Катализатор не указан"] ││ } │└──────────────────────────────────────────────────────────────────┘Почему Prompt Engineering важен для трейдинга
Финансовый трейдинг представляет уникальные вызовы для LLM:
СПЕЦИФИЧЕСКИЕ ВЫЗОВЫ ТРЕЙДИНГА:┌──────────────────────────────────────────────────────────────────┐│ 1. ТРЕБОВАНИЯ К ТОЧНОСТИ ││ Торговые решения требуют точных чисел, а не размытых оценок ││ Плохо: "Акция может вырасти" ││ Хорошо: "85% вероятность роста на 2-3% в течение 24 часов" │├──────────────────────────────────────────────────────────────────┤│ 2. ВРЕМЕННАЯ ЧУВСТВИТЕЛЬНОСТЬ ││ Финансовый контекст быстро меняется ││ - "Ставки высокие" означает разное в 2000 и 2024 году ││ - "Рынок рухнул" требует указания конкретной даты │├──────────────────────────────────────────────────────────────────┤│ 3. ПРОФЕССИОНАЛЬНЫЙ ЖАРГОН ││ Финансовая терминология требует точного понимания ││ - "Бычья дивергенция" vs "Медвежья дивергенция" ││ - "Расширение P/E" vs "Сжатие мультипликатора" │├──────────────────────────────────────────────────────────────────┤│ 4. РИСК ГАЛЛЮЦИНАЦИЙ ││ LLM могут генерировать правдоподобные, но неверные данные ││ - Выдуманные цены акций или показатели прибыли ││ - Сфабрикованные рекомендации аналитиков │├──────────────────────────────────────────────────────────────────┤│ 5. ИСПОЛНИМЫЙ ВЫВОД ││ Трейдингу нужны чёткие, исполнимые рекомендации ││ - Точки входа/выхода, размеры позиций ││ - Уровни стоп-лосса и тейк-профита │└──────────────────────────────────────────────────────────────────┘Обзор ключевых техник
| Техника | Лучше всего для | Сложность |
|---|---|---|
| Zero-Shot | Простая классификация | Низкая |
| Few-Shot | Консистентный формат вывода | Средняя |
| Chain-of-Thought | Сложные рассуждения | Средняя |
| Ролевой | Экспертиза в предметной области | Низкая |
| Self-Consistency | Критически важные решения | Высокая |
| ReAct | Многошаговый анализ | Высокая |
| Tree-of-Thought | Стратегическое планирование | Очень высокая |
Основы Prompt Engineering
Zero-Shot промптинг
Zero-shot промптинг предоставляет инструкции без примеров. Он полагается на предобученные знания LLM.
# Пример: Zero-shot анализ настроенийzero_shot_prompt = """Проанализируйте настроение следующей финансовой новости.Ответьте только: ПОЗИТИВНОЕ, НЕГАТИВНОЕ или НЕЙТРАЛЬНОЕ
Новость: "{news_text}"
Настроение:"""
# Использованиеnews = "Tesla сообщила о рекордных квартальных поставках, превысив ожидания аналитиков на 15%"# Ожидаемый вывод: ПОЗИТИВНОЕПреимущества:
- Простота реализации
- Не требует примеров
- Быстрая итерация
Ограничения:
- Меньший контроль над форматом вывода
- Может быть непоследовательным
- Плохо справляется со сложными задачами
Few-Shot промптинг
Few-shot промптинг включает примеры для направления LLM к желаемому формату вывода и поведению.
# Пример: Few-shot анализ настроений для трейдингаfew_shot_prompt = """Проанализируйте настроение финансовой новости и предоставьте торговый сигнал.
Примеры:
Новость: "Apple превысила ожидания по прибыли благодаря сильным продажам iPhone"Анализ: { "sentiment": "POSITIVE", "confidence": 92, "signal": "BUY", "reasoning": "Превышение прибыли обычно ведёт к росту цены на 2-5%"}
Новость: "FDA отклонила заявку на лекарство от Pfizer"Анализ: { "sentiment": "NEGATIVE", "confidence": 88, "signal": "SELL", "reasoning": "Отклонение лекарства существенно влияет на стоимость пайплайна"}
Новость: "Microsoft объявила о дроблении акций в следующем месяце"Анализ: { "sentiment": "NEUTRAL", "confidence": 75, "signal": "HOLD", "reasoning": "Дробление акций — механическое действие, без фундаментальных изменений"}
Теперь проанализируйте эту новость:Новость: "{news_text}"Анализ:"""Лучшие практики для Few-Shot:
- Используйте 3-5 разнообразных примеров
- Включайте пограничные случаи
- Поддерживайте единый формат
- Покройте все категории вывода
Chain-of-Thought промптинг
Chain-of-Thought (CoT) промптинг поощряет пошаговые рассуждения, что критически важно для сложного финансового анализа.
# Пример: Chain-of-Thought для торгового решенияcot_prompt = """Пошагово проанализируйте следующую рыночную ситуацию для определения оптимального торгового действия.
Рыночные данные:- Актив: {symbol}- Текущая цена: ${current_price}- Изменение за 24ч: {change_24h}%- Объём: {volume} (vs среднее за 20 дней: {volume_ratio}x)- RSI(14): {rsi}- Новость: "{news_headline}"
Рассуждайте пошагово:
Шаг 1: Оцените ценовое движение- Что говорит нам изменение за 24ч о моментуме?- Как это соотносится с типичными дневными движениями?
Шаг 2: Оцените объём- Подтверждает ли объём ценовое движение?- Высокий объём при росте = бычье подтверждение
Шаг 3: Проверьте технические индикаторы- RSI > 70 указывает на перекупленность- RSI < 30 указывает на перепроданность
Шаг 4: Учтите новостное настроение- Как новость может повлиять на будущую цену?- Уже ли движение заложено в цену?
Шаг 5: Синтезируйте и примите решение- Объедините все факторы- Определите уровень уверенности- Предоставьте конкретную рекомендацию
Финальный анализ:"""Преимущества CoT для трейдинга:
- Заставляет проводить систематический анализ
- Раскрывает логику для проверки
- Снижает импульсивные сигналы
- Позволяет бэктестить логику
Ролевой промптинг
Ролевой промптинг назначает LLM конкретную персону для использования экспертизы в предметной области.
# Пример: Ролевые промпты для разных стилей торговлиrole_prompts = { "quant_analyst": """Вы количественный аналитик в ведущем хедж-фонде с 15-летним опытом.Ваш стиль анализа:- Ориентирован на данные, скептичен к нарративам- Фокус на статистической значимости- Риск-скорректированная доходность важнее абсолютной- Всегда учитывайте размер позиции и корреляцию""",
"technical_trader": """Вы профессиональный технический аналитик, специализирующийся на крипторынках.Ваш стиль анализа:- Ценовое действие и объём — главные факторы- Уровни поддержки/сопротивления ключевые- Следование за трендом с подтверждением моментума- Строгая дисциплина стоп-лоссов""",
"fundamental_analyst": """Вы фундаментальный аналитик, фокусирующийся на долгосрочном стоимостном инвестировании.Ваш стиль анализа:- Качество и устойчивость прибыли- Анализ конкурентного рва- Послужной список менеджмента- Маржа безопасности обязательна""",
"risk_manager": """Вы старший риск-менеджер на институциональном торговом деске.Ваш стиль анализа:- Максимальная просадка — главная забота- Корреляционный и концентрационный риск- Хвостовой риск и события "чёрного лебедя"- Лимиты позиций и VaR портфеля"""}Финансовые шаблоны промптов
Промпты для анализа настроений
# Шаблон: Комплексный анализ настроенийSENTIMENT_TEMPLATE = """Вы анализируете финансовые новости для торговых сигналов.
НОВОСТНАЯ СТАТЬЯ:"{article_text}"
Проанализируйте эту статью и предоставьте:
1. ОБЩЕЕ НАСТРОЕНИЕ - Классификация: [БЫЧЬЕ | МЕДВЕЖЬЕ | НЕЙТРАЛЬНОЕ] - Уверенность: [0-100]% - Обоснование: [Краткое объяснение]
2. НАСТРОЕНИЕ ПО СУЩНОСТЯМ Для каждой упомянутой компании/актива: - Сущность: [Название/Тикер] - Настроение: [БЫЧЬЕ | МЕДВЕЖЬЕ | НЕЙТРАЛЬНОЕ] - Уровень влияния: [ВЫСОКИЙ | СРЕДНИЙ | НИЗКИЙ]
3. ВРЕМЕННОЙ АНАЛИЗ - Краткосрочное влияние (1-5 дней): [Описание] - Среднесрочное влияние (1-4 недели): [Описание] - Уже заложено в цену: [ДА | НЕТ | ЧАСТИЧНО]
4. ТОРГОВЫЕ ПОСЛЕДСТВИЯ - Основной сигнал: [ПОКУПАТЬ | ПРОДАВАТЬ | ДЕРЖАТЬ] - Рекомендуемый вход: [Немедленно | Ждать откат | Ждать подтверждение] - Уровень риска: [ВЫСОКИЙ | СРЕДНИЙ | НИЗКИЙ]
Ответьте в формате JSON."""Промпты для торговых сигналов
# Шаблон: Генерация торгового сигналаSIGNAL_TEMPLATE = """Вы систематический генератор торговых сигналов.
РЫНОЧНЫЙ КОНТЕКСТ:- Актив: {symbol}- Таймфрейм: {timeframe}- Текущая цена: ${price}- Рыночный режим: {regime}
ТЕХНИЧЕСКИЕ ДАННЫЕ:- Тренд (50 SMA): {trend_direction}- Моментум (RSI): {rsi}- Волатильность (ATR%): {atr_percent}%- Тренд объёма: {volume_trend}
ФУНДАМЕНТАЛЬНЫЕ ДАННЫЕ:- Коэффициент P/E: {pe_ratio}- Сюрприз по прибыли (последний): {earnings_surprise}%- Консенсус аналитиков: {analyst_rating}
ДАННЫЕ НАСТРОЕНИЙ:- Новостное настроение (24ч): {news_sentiment}- Социальное настроение: {social_sentiment}- Институциональные потоки: {inst_flow}
Сгенерируйте торговый сигнал:
1. СИГНАЛ - Направление: [LONG | SHORT | FLAT] - Сила: [СИЛЬНЫЙ | УМЕРЕННЫЙ | СЛАБЫЙ] - Уверенность: [0-100]%
2. ВХОД - Тип: [MARKET | LIMIT] - Цена (если LIMIT): $___ - Размер (% от портфеля): ___
3. ПЛАН ВЫХОДА - Тейк-профит 1: $___ (___% позиции) - Тейк-профит 2: $___ (___% позиции) - Стоп-лосс: $___ - Трейлинг стоп: [ДА/НЕТ] на ___% ATR
4. ОБОСНОВАНИЕ [Объяснение сигнала в 2-3 предложениях]
5. ОЦЕНКА РИСКА - Макс. убыток: $___ - Соотношение риск/прибыль: ___ - Ключевые риски: [Список основных рисков]
Вывод в JSON."""Промпты для оценки рисков
# Шаблон: Оценка рисков портфеляRISK_TEMPLATE = """Вы специалист по управлению рисками, оценивающий риски портфеля.
ТЕКУЩИЙ ПОРТФЕЛЬ:{portfolio_positions}
РЫНОЧНЫЕ УСЛОВИЯ:- Уровень VIX: {vix}- Рыночный тренд: {market_trend}- Корреляционный режим: {correlation_regime}- Ключевые предстоящие события: {upcoming_events}
Проведите комплексную оценку рисков:
1. РИСК НА УРОВНЕ ПОЗИЦИЙ Для каждой позиции оцените: - Концентрационный риск (% портфеля) - Риск ликвидности (дней на выход) - Специфические факторы риска
2. РИСК НА УРОВНЕ ПОРТФЕЛЯ - Общая рыночная экспозиция (бета) - Секторная концентрация - Географическая концентрация - Факторные экспозиции
3. СЦЕНАРНЫЙ АНАЛИЗ Оцените влияние на портфель при: - Обвал рынка (-20%): ___% потери портфеля - Ротация секторов: ___% влияние на портфель - Шок процентных ставок (+100bps): ___% влияние - Событие "чёрного лебедя": Худший сценарий потерь
4. РЕКОМЕНДАЦИИ - Позиции для сокращения: [Список] - Хеджи для рассмотрения: [Список] - Пробелы в диверсификации: [Список] - Приоритетные действия: [Ранжированный список]
5. МЕТРИКИ РИСКА - VaR портфеля (95%, 1 день): $___ - Ожидаемый дефицит: $___ - Максимальная просадка (историческая): ____% - Коэффициент Шарпа: ___
Предоставьте детальный JSON вывод."""Промпты для анализа рынка
# Шаблон: Определение рыночного режимаREGIME_TEMPLATE = """Вы анализируете текущие рыночные условия для определения рыночного режима.
РЫНОЧНЫЕ ДАННЫЕ:- S&P 500: {sp500_price} ({sp500_change}% за месяц)- VIX: {vix}- 10-летние казначейские: {treasury_10y}%- Индекс доллара (DXY): {dxy}- Сырая нефть: ${oil}- Золото: ${gold}
ИНДИКАТОРЫ ШИРОТЫ:- Рост/Падение: {adv_dec_ratio}- % выше 200 SMA: {pct_above_200sma}%- Новые максимумы - Новые минимумы: {high_low_diff}
МЕЖРЫНОЧНЫЕ СИГНАЛЫ:- Корреляция акции/облигации: {stock_bond_corr}- Корреляция доллар/акции: {dollar_equity_corr}
Классифицируйте текущий рыночный режим:
1. КЛАССИФИКАЦИЯ РЕЖИМА Выберите один: - RISK_ON_TRENDING: Сильный восходящий тренд, низкая волатильность - RISK_ON_VOLATILE: Восходящий тренд с высокой волатильностью - RISK_OFF_TRENDING: Сильный нисходящий тренд, растущая волатильность - RISK_OFF_PANIC: Режим краха, экстремальный страх - RANGING: Боковое движение, низкая уверенность - TRANSITIONAL: Смена режима в процессе
2. УВЕРЕННОСТЬ: [0-100]%
3. КЛЮЧЕВЫЕ ДРАЙВЕРЫ [Перечислите 3-5 факторов, определяющих текущий режим]
4. ИСТОРИЧЕСКАЯ АНАЛОГИЯ [Наиболее похожий исторический период и что произошло дальше]
5. ПРОГНОЗ РЕЖИМА - Ожидаемая продолжительность: [Дни/Недели/Месяцы] - Вероятный следующий режим: [Название режима] - Триггеры перехода: [На что смотреть]
6. СТРАТЕГИЧЕСКИЕ ПОСЛЕДСТВИЯ - Рекомендуемые стратегии: [Список] - Стратегии для избегания: [Список] - Корректировка размера позиций: [Увеличить/Уменьшить/Сохранить]
Вывод в JSON."""Продвинутые техники
Self-Consistency
Self-consistency улучшает надёжность путём генерации нескольких ответов и их агрегации.
# Пример: Self-consistency для торговых сигналовimport jsonfrom typing import List, Dictimport asyncio
async def self_consistent_analysis( prompt: str, llm_client, num_samples: int = 5, temperature: float = 0.7) -> Dict: """ Генерирует несколько анализов и агрегирует для согласованности.
Args: prompt: Промпт для анализа llm_client: Клиент LLM API num_samples: Количество независимых выборок temperature: Температура сэмплирования (выше = разнообразнее)
Returns: Агрегированный анализ с уверенностью """ # Генерация нескольких выборок tasks = [ llm_client.complete(prompt, temperature=temperature) for _ in range(num_samples) ] responses = await asyncio.gather(*tasks)
# Парсинг ответов analyses = [] for response in responses: try: analysis = json.loads(response) analyses.append(analysis) except json.JSONDecodeError: continue
if not analyses: return {"error": "Нет валидных ответов"}
# Агрегация результатов signals = [a.get("signal", "HOLD") for a in analyses] confidences = [a.get("confidence", 50) for a in analyses]
# Мажоритарное голосование для сигнала signal_counts = {} for signal in signals: signal_counts[signal] = signal_counts.get(signal, 0) + 1
majority_signal = max(signal_counts, key=signal_counts.get) agreement_ratio = signal_counts[majority_signal] / len(signals)
# Корректировка уверенности на основе согласия avg_confidence = sum(confidences) / len(confidences) final_confidence = avg_confidence * agreement_ratio
return { "signal": majority_signal, "confidence": final_confidence, "agreement_ratio": agreement_ratio, "sample_count": len(analyses), "individual_signals": signals, "reasoning_samples": [a.get("reasoning", "") for a in analyses[:3]] }ReAct (Рассуждение + Действие)
ReAct объединяет рассуждения с действиями, позволяя многошаговый анализ с использованием инструментов.
# Пример: Паттерн ReAct для исследования рынкаREACT_TEMPLATE = """Вы торговый аналитик, который может исследовать и анализировать рынки.
Доступные инструменты:- get_price(symbol): Получить текущую цену и дневное изменение- get_news(symbol, days): Получить недавние заголовки новостей- get_technicals(symbol): Получить технические индикаторы- get_fundamentals(symbol): Получить фундаментальные метрики- calculate_position_size(symbol, risk_pct): Рассчитать размер позиции
Задача: {task}
Используйте следующий формат:
Мысль: [Ваши рассуждения о том, что делать дальше]Действие: [Название инструмента и параметры]Наблюдение: [Результат инструмента]... (повторяйте Мысль/Действие/Наблюдение по необходимости)Мысль: У меня теперь достаточно информации для финального ответаФинальный ответ: [Ваш полный анализ и рекомендация]
Начните!
Мысль:"""Tree-of-Thought
Tree-of-Thought исследует множественные пути рассуждений для сложных стратегических решений.
# Пример: Tree-of-Thought для распределения портфеляTREE_OF_THOUGHT_TEMPLATE = """Вы оптимизируете решение по распределению портфеля.
СЦЕНАРИЙ:{scenario_description}
ОГРАНИЧЕНИЯ:- Макс. размер позиции: {max_position}%- Макс. секторная концентрация: {max_sector}%- Целевая волатильность: {target_vol}%- Частота ребалансировки: {rebalance_freq}
Исследуйте ТРИ разные стратегии распределения:
СТРАТЕГИЯ A: Консервативная- Философия: [Опишите подход]- Распределение: [Детализируйте позиции]- Ожидаемая доходность: [Оценка]- Ожидаемый риск: [Оценка]- Ключевое допущение: [Что должно быть верно для успеха]
СТРАТЕГИЯ B: Умеренная- Философия: [Опишите подход]- Распределение: [Детализируйте позиции]- Ожидаемая доходность: [Оценка]- Ожидаемый риск: [Оценка]- Ключевое допущение: [Что должно быть верно для успеха]
СТРАТЕГИЯ C: Агрессивная- Философия: [Опишите подход]- Распределение: [Детализируйте позиции]- Ожидаемая доходность: [Оценка]- Ожидаемый риск: [Оценка]- Ключевое допущение: [Что должно быть верно для успеха]
ОЦЕНКА:Сравните стратегии по:1. Риск-скорректированная доходность (коэффициент Шарпа)2. Защита от падения3. Устойчивость к нарушению допущений4. Сложность реализации
РЕКОМЕНДАЦИЯ:[Выберите лучшую стратегию с детальным обоснованием]
ГИБРИДНЫЙ ВАРИАНТ:[Предложите комбинацию, берущую лучшие элементы из каждой]"""Цепочки промптов
Цепочки промптов разбивают сложный анализ на последовательные специализированные промпты.
# Пример: Цепочка промптов для торгового решенияclass TradingPromptChain: """ Многошаговая цепочка промптов для комплексного торгового анализа.
Цепочка: Анализ данных → Оценка рисков → Генерация сигнала → План исполнения """
PROMPTS = { "data_analysis": """Проанализируйте следующие рыночные данные для {symbol}:
Ценовые данные: {price_data}Данные объёма: {volume_data}Технические индикаторы: {technicals}
Предоставьте:1. Анализ тренда (короткий/средний/длинный срок)2. Ключевые уровни поддержки/сопротивления3. Анализ объёма4. Аномалии или примечательные паттерны
Вывод в JSON с ключами: trend, levels, volume, patterns""",
"risk_assessment": """На основе следующего анализа данных:{data_analysis_result}
Текущий контекст портфеля:{portfolio_context}
Оцените риск открытия позиции в {symbol}:1. Риски конкретной позиции2. Влияние на портфель3. Риск тайминга рынка4. Максимальный рекомендуемый размер позиции
Вывод в JSON с ключами: risks, portfolio_impact, timing_risk, max_size""",
"signal_generation": """Дано:- Анализ данных: {data_analysis_result}- Оценка рисков: {risk_assessment_result}- Рыночный режим: {market_regime}
Сгенерируйте торговый сигнал для {symbol}:1. Направление сигнала (LONG/SHORT/FLAT)2. Уровень уверенности (0-100)3. Условия входа4. Подтверждающие факторы5. Противоречащие факторы
Вывод в JSON с ключами: signal, confidence, entry, pros, cons""",
"execution_plan": """Торговый сигнал: {signal_result}Параметры риска: {risk_assessment_result}Текущая цена: {current_price}
Создайте детальный план исполнения:1. Метод входа (market/limit/scaled)2. Расчёт размера позиции3. Размещение стоп-лосса4. Цели тейк-профита5. Правила управления позицией6. Триггеры выхода
Вывод в JSON с ключами: entry, size, stop_loss, take_profit, management, exit_triggers""" }
async def execute(self, symbol: str, market_data: Dict, llm_client) -> Dict: """Выполнить полную цепочку промптов.""" results = {}
# Шаг 1: Анализ данных prompt1 = self.PROMPTS["data_analysis"].format( symbol=symbol, price_data=market_data["price"], volume_data=market_data["volume"], technicals=market_data["technicals"] ) results["data_analysis"] = await llm_client.complete(prompt1)
# Шаг 2: Оценка рисков prompt2 = self.PROMPTS["risk_assessment"].format( data_analysis_result=results["data_analysis"], portfolio_context=market_data["portfolio"], symbol=symbol ) results["risk_assessment"] = await llm_client.complete(prompt2)
# Шаг 3: Генерация сигнала prompt3 = self.PROMPTS["signal_generation"].format( data_analysis_result=results["data_analysis"], risk_assessment_result=results["risk_assessment"], market_regime=market_data["regime"], symbol=symbol ) results["signal"] = await llm_client.complete(prompt3)
# Шаг 4: План исполнения prompt4 = self.PROMPTS["execution_plan"].format( signal_result=results["signal"], risk_assessment_result=results["risk_assessment"], current_price=market_data["price"]["current"] ) results["execution_plan"] = await llm_client.complete(prompt4)
return resultsПрактические примеры
Полные примеры кода находятся в папках python/ и rust/.
01: Анализ финансовых настроений
class FinancialSentimentAnalyzer: """ Анализатор финансовых настроений на основе prompt engineering.
Использует тщательно разработанные промпты для извлечения торгово-релевантных настроений из финансового текста. """
async def analyze(self, text: str) -> SentimentResult: """Анализ настроения финансового текста.""" prompt = self.prompt_template.format(text=text) response = await self.llm.complete(prompt, temperature=0.3) return self._parse_response(response)02: Генерация торговых сигналов
class PromptBasedSignalGenerator: """ Генерация торговых сигналов с использованием engineered промптов.
Комбинирует несколько техник промптинга: - Ролевой (персона quant-аналитика) - Chain-of-thought (систематические рассуждения) - Few-shot (консистентность формата вывода) """
async def generate_signal(self, symbol: str, market_data: Dict) -> TradingSignal: """Генерация торгового сигнала из рыночных данных.""" prompt = self._build_prompt(symbol, market_data) response = await self.llm.complete(prompt, temperature=0.2) return self._parse_signal(response)03: Определение рыночного режима
class MarketRegimeDetector: """ Определение рыночных режимов с использованием LLM анализа.
Комбинирует количественные индикаторы с LLM рассуждениями для надёжной классификации режимов. """
async def detect_regime(self, market_data: Dict) -> RegimeAnalysis: """Определить текущий рыночный режим.""" prompt = self.REGIME_PROMPT.format(**market_data) response = await self.llm.complete(prompt, temperature=0.3) return self._parse_response(response)04: Бэктестинг с LLM сигналами
class LLMSignalBacktester: """ Бэктестинг торговых сигналов, генерируемых LLM анализом.
Обрабатывает уникальные характеристики LLM-сигналов: - Переменные уровни уверенности - Размер позиции на основе рассуждений - Затухание сигнала во времени """
def run_backtest( self, signals: pd.DataFrame, prices: pd.DataFrame ) -> BacktestResult: """Запустить бэктест на LLM-генерируемых сигналах.""" # Реализация бэктеста... return BacktestResult(returns, equity_curve, trades, metrics)Реализация на Rust
См. rust/ для полной реализации на Rust с асинхронной обработкой промптов.
rust/├── Cargo.toml├── README.md├── src/│ ├── lib.rs # Основные экспорты библиотеки│ ├── prompts/ # Шаблоны промптов│ ├── llm/ # LLM клиент│ ├── analysis/ # Модули анализа│ └── backtest/ # Движок бэктестинга└── examples/ ├── sentiment.rs ├── signals.rs └── backtest.rsБыстрый старт (Rust)
cd rust
# Запуск примера анализа настроенийcargo run --example sentiment
# Генерация торговых сигналовcargo run --example signals -- --symbol BTCUSDT
# Запуск бэктестаcargo run --example backtest -- --start 2024-01-01 --end 2024-06-30Реализация на Python
См. python/ для полной реализации на Python.
python/├── __init__.py├── sentiment_analysis.py├── signal_generator.py├── regime_detection.py├── backtest.py├── prompts/├── llm_client.py├── data_loader.py├── requirements.txt└── examples/Быстрый старт (Python)
cd python
# Установка зависимостейpip install -r requirements.txt
# Запуск анализа настроенийpython examples/01_sentiment_demo.py
# Генерация сигналовpython examples/02_signal_generation.py --symbol BTCUSDT
# Запуск бэктестаpython examples/04_full_backtest.py --capital 100000Лучшие практики
Рекомендации по дизайну промптов
-
Будьте конкретны в формате вывода
# Плохо: "Проанализируйте эту новость"# Хорошо: "Проанализируйте и ответьте в JSON с ключами: sentiment, confidence, reasoning" -
Включайте доменный контекст
# Плохо: "Это позитивно или негативно?"# Хорошо: "Как финансовый аналитик, классифицируйте торговое настроение..." -
Используйте консистентные примеры
# Используйте 3-5 разнообразных примеров, покрывающих пограничные случаи# Поддерживайте идентичный формат во всех примерах -
Ограничивайте числовой вывод
# Плохо: "Оцените вашу уверенность"# Хорошо: "Уверенность (целое число 0-100):" -
Запрашивайте обоснование
# Всегда просите обоснование для проверки логики# Позволяет пост-анализ и улучшение
Частые ошибки, которых стоит избегать
-
Размытые инструкции
- LLM интерпретируют неоднозначность непоследовательно
- Будьте явными о каждом ожидаемом выводе
-
Отсутствие обработки ошибок
- LLM могут выводить некорректный JSON или неожиданные значения
- Всегда валидируйте и предоставляйте fallback-значения
-
Чрезмерная зависимость от одного ответа
- Используйте self-consistency для критических решений
- Несколько выборок снижают дисперсию
-
Игнорирование контекстного окна
- Длинные промпты могут обрезать важную информацию
- Суммаризируйте данные при необходимости
-
Статические промпты
- Рыночные условия меняются; промпты должны эволюционировать
- A/B тестируйте вариации промптов
Оптимизация производительности
# Советы для production prompt engineering
1. **Кэшируйте эмбеддинги** # Переиспользуйте эмбеддинги для похожих запросов
2. **Пакетные запросы** # Обрабатывайте несколько анализов в одном API вызове
3. **Асинхронная обработка** # Используйте async/await для параллельной генерации сигналов
4. **Сжатие промптов** # Удаляйте ненужные токены, сохраняя смысл
5. **Настройка температуры** # Ниже (0.1-0.3) для консистентных сигналов # Выше (0.5-0.7) для разнообразного анализаРесурсы
Научные статьи
- A Survey on In-context Learning — Комплексный обзор техник промптинга (2023)
- Chain-of-Thought Prompting — Оригинальная статья CoT от Google (2022)
- Self-Consistency Improves Chain of Thought Reasoning — Техника self-consistency (2023)
- ReAct: Synergizing Reasoning and Acting — Фреймворк ReAct (2023)
- Tree of Thoughts — ToT для осознанного решения проблем (2023)
- FinGPT: Financial LLMs — Open-source финансовая LLM (2023)
Инструменты и библиотеки
| Инструмент | Описание | Ссылка |
|---|---|---|
| LangChain | Фреймворк для LLM приложений | langchain.com |
| OpenAI API | Модели GPT-4 и эмбеддинги | platform.openai.com |
| Anthropic API | Модели Claude | anthropic.com |
| Ollama | Запуск LLM локально | ollama.ai |
Связанные главы
- Глава 61: FinGPT Financial LLM — Open-source финансовая LLM
- Глава 66: Chain-of-Thought для трейдинга — Углублённое изучение CoT
- Глава 67: LLM Sentiment Analysis — Анализ настроений
- Глава 62: BloombergGPT — Доменно-специфичная LLM
- Глава 65: RAG для трейдинга — Retrieval-augmented generation
Уровень сложности
Средний - Продвинутый
Предварительные требования:
- Понимание LLM и архитектуры трансформеров
- Опыт программирования на Python
- Базовые знания трейдинга (сигналы, бэктестинг)
- Опыт интеграции с API
Литература
- Brown, T., et al. (2020). “Language Models are Few-Shot Learners.” NeurIPS.
- Wei, J., et al. (2022). “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.”
- Wang, X., et al. (2023). “Self-Consistency Improves Chain of Thought Reasoning.”
- Yao, S., et al. (2023). “ReAct: Synergizing Reasoning and Acting in Language Models.”
- Yao, S., et al. (2023). “Tree of Thoughts: Deliberate Problem Solving with Large Language Models.”
- Yang, H., et al. (2023). “FinGPT: Open-Source Financial Large Language Models.”