Documentation

Workflows de IA

Como usar modelos de IA pra gerar, iterar e melhorar estratégias — com prompts, padrões e salvaguardas.

Visão geral

A EmidLabs trata IA como uma ferramenta de pesquisa quantitativa, não um gerador mágico de sinais de trading. A infraestrutura é explicitamente projetada pra trabalhar com estratégias geradas por IA: a DSL de estratégia é legível por máquina, o formato JSON é limpo e sem ambiguidade, e os resultados contêm dados de diagnóstico suficientes pra refinamento iterativo.

IA não prevê mercados. IA ajuda com geração de hipóteses, formalização de estratégia, e iteração sistemática. O edge — se existir — precisa ser validado pelo engine de backtest, não assumido a partir da saída da IA.

O Loop de Workflow de IA

O workflow recomendado é um loop de quatro estágios:

1
HipóteseVocê forma uma hipótese de mercado em linguagem natural. Que comportamento você acredita que existe? O que o move?
2
Geração da estratégiaVocê dá um prompt a um modelo de IA (GPT-4, Claude, etc.) com sua hipótese e a spec da DSL da EmidLabs. A IA gera um JSON de estratégia válido.
3
Execução do backtestVocê submete a estratégia gerada pra API da EmidLabs. O engine roda o backtest no servidor.
4
Análise e iteraçãoVocê analisa as métricas e diagnósticos do resultado. Você alimenta os resultados de volta pra IA e pede pra ela refinar a estratégia.

Esse loop pode ser automatizado. Você pode construir agentes que geram estratégias, executam backtests via a API, fazem parse dos resultados, e iteram — sem intervenção humana entre cada ciclo.

#Engenharia de Prompt

O system prompt essencial

A coisa mais importante a incluir no seu system prompt é a especificação completa da DSL de estratégia. A IA precisa saber o schema exato e todas as funções disponíveis. A página Strategy System tem uma versão condensada e pronta pra colar dessa spec, construída exatamente pra esse propósito.

Informação chave pra incluir no system prompt:

  • As seis chaves de nível superior: configuration, inputs, conditions, score, decision, riskManagement (opcional).
  • Todas as funções nativas com suas assinaturas.
  • A lista de operadores (AND, OR, operadores de comparação).
  • As variáveis de dados de mercado (close, open, high, low, volume).
  • A regra de que a saída deve ser só JSON válido (sem markdown, sem explicações).
  • A regra contra dados futuros, aleatoriedade, e variáveis indefinidas.

Exemplo de estrutura de prompt do usuário

Estrutura do prompt
Hipótese:
Eu acredito que o BTC tende a ter tendência consistente quando a
EMA de 9 períodos está acima da EMA de 21 períodos no gráfico de
1H, e o RSI está numa faixa saudável (nem sobrecomprado, nem
sobrevendido). Confirmação de volume reduz sinais falsos em
mercados agitados.

Gere uma estratégia que:
- Usa timeframe de 1H
- Captura o alinhamento de tendência das EMAs
- Exige RSI entre 40 e 65
- Adiciona confirmação de pico de volume como sinal bônus
- Define um limiar de score que exige trend + rsi no mínimo

Retorne só o JSON da estratégia. Sem markdown. Sem explicações.

Alimentando resultados de volta pra IA

Depois de rodar um backtest, compartilhe os dados de diagnóstico com a IA pra guiar o refinamento:

Prompt de iteração
A estratégia produziu esses resultados:
- trades: 284, winRate: 0.524, expectancyR: 0.18
- conditionsDistributionPct: { trendUp: 0.41, rsiHealthy: 0.55, volConfirm: 0.72 }
- scoreDistributionPct: { 0: 0.38, 20: 0.21, 45: 0.24, 60: 0.17 }

Problemas a resolver:
1. volConfirm dispara 72% das vezes — não é seletivo o suficiente.
   Aumente o multiplicador de pico de volume (em volume > sma(volume, 20) * multiplier) pra 2.0 ou 2.5.
2. winRate é 52.4% mas a expectância é só 0.18R — o RR de 1:3
   parece estar performando abaixo do esperado. Tente adicionar
   um sinal de crossover pra melhorar o timing de entrada.

Revise a estratégia e retorne só o JSON atualizado.

#Iteração Automatizada

A API é projetada pra suportar loops de iteração programáticos. Aqui está um padrão básico em Python pra um ciclo de pesquisa automatizado:

research_loop.py
import anthropic
import requests
import json
import time

EMID_API_KEY = "em_YOUR_KEY"
BASE_URL = "https://backtest.emidlabs.com/api/public/v1"

def generate_strategy(hypothesis: str, previous_result: dict = None) -> dict:
    client = anthropic.Anthropic()
    prompt = f"Hypothesis: {hypothesis}"
    if previous_result:
        prompt += f"\n\nPrevious results: {json.dumps(previous_result, indent=2)}"
        prompt += "\n\nRevise the strategy based on these results. Output JSON only."

    msg = client.messages.create(
        model="claude-opus-4-7",
        max_tokens=1024,
        system=STRATEGY_SYSTEM_PROMPT,  # Include full DSL spec
        messages=[{"role": "user", "content": prompt}]
    )
    return json.loads(msg.content[0].text)

def run_backtest(strategy: dict) -> dict:
    resp = requests.post(
        f"{BASE_URL}/backtest",
        headers={"x-api-key": EMID_API_KEY},
        json={
            "assetPair": "BTC-USDC",
            "initialDate": "2023-01-01",
            "finalDate": "2023-12-31",
            "strategySnapshotJson": strategy
        }
    )
    backtest_id = resp.json()["id"]

    # Poll for result
    while True:
        result = requests.get(
            f"{BASE_URL}/backtest/{backtest_id}",
            headers={"x-api-key": EMID_API_KEY}
        ).json()
        if result["status"] in ("Completed", "Failed"):
            return result
        time.sleep(0.5)

# Run 5 iterations
hypothesis = "EMA crossover with RSI confirmation on BTC 1H"
result = None
for i in range(5):
    strategy = generate_strategy(hypothesis, result)
    result = run_backtest(strategy)
    print(f"Iteration {i+1}: expectancyR={result['result']['expectancyR']}")

#Boas Práticas

Evite overfitting

  • Não otimize parâmetros rodando centenas de variações no mesmo intervalo de datas e escolhendo a melhor. Isso é curve-fitting, não descoberta de edge.
  • Valide estratégias promissoras num intervalo de datas out-of-sample separado antes de tirar conclusões.
  • Prefira estratégias com uma história causal clara em vez das que simplesmente "parecem boas no papel."

Valide a saída da IA antes de submeter

  • Confirme que todo input referenciado em conditions está definido no bloco inputs.
  • Confirme que toda condition referenciada em score está definida em conditions.
  • Verifique que o JSON é válido antes de aninhar no payload da API.

Use diagnósticos pra guiar a iteração

  • Se uma condition dispara em mais de 70% dos candles, ela não é seletiva. Aperte o limiar.
  • Se uma condition dispara em menos de 5% dos candles, considere se ela é rara o suficiente pra ser ruído.
  • Foque em melhorar expectancyR, não só winRate. Um win rate de 40% com RR de 1:3 é expectância positiva.

Limitações de IA a reconhecer

  • IA não tem acesso a dados de mercado ao vivo. Ela raciocina sobre dinâmicas de mercado usando conhecimento de treinamento, que pode estar desatualizado ou errado.
  • Estratégias geradas por IA podem conter erros lógicos sutis (referências indefinidas, inputs circulares). Sempre valide.
  • IA não consegue prever quais estratégias serão lucrativas. Ela só consegue gerar e formalizar hipóteses.