No início da década de 2010, as redes cerca de US $ 300 milhões em uma linha de fibra óptica direta entre Chicago e Nova York. Na época, Chicago era o principal hub para negociação de futuros, enquanto Nova York lidava com ações. rotas regulares tomaram desvios que adicionaram dezenas de quilômetros, mas o novo cabo reduziu a latência de ~17 para ~13 milissegundos. investido investido Para o comércio de alta frequência, esses 3-4 ms eram uma vantagem enorme.Quem viu os dados um pouco antes poderia colocar ordens primeiro e aproveitar a liquidez.Acessar a linha custou milhões de dólares por ano, mas pagou – milissegundos literalmente convertidos em dinheiro. Se as empresas estivessem dispostas a gastar centenas de milhões apenas para raspar 3-4 milissegundos, imagine a vantagem de um modelo ML que não reage (mesmo que instantaneamente), mas na verdade prevê os movimentos do mercado. Então, por que não vemos histórias de sucesso públicas de ML em finanças? Você pode olhar para isso de duas maneiras. Um é que os resultados existem, mas não são compartilhados. Às vezes, você verá um papel com bons números, mas eles são raros e geralmente selecionados por cerejeiras. O outro é que existem obstáculos reais. Dados financeiros são apenas mais difíceis de trabalhar com do que dados em outros domínios, principalmente por três razões: Muito barulho Não há dados suficientes Mercados em constante mudança Essa combinação torna os dados financeiros muito diferentes dos dados meteorológicos, onde o ruído é menor porque o sistema segue as leis da física, os dados são abundantes graças a satélites e sensores que produzem terabytes de observações todos os dias, e a física subjacente permanece estável, então mesmo os dados antigos permanecem úteis. Para cada um desses problemas em Finanças, existem correções conhecidas. Vou passar por eles abaixo. O problema é que eles só funcionam isoladamente. Ninguém conseguiu colocá-los todos juntos em uma única máquina de negociação. Como dizem, você só pode escolher dois. Reducing noise with filters and aggregation Redução de ruído com filtros e agregação As séries de tempo financeiro vêm com um sinal fraco enterrado em barulho. Os preços flutuam a cada segundo - notícias, boatos, movimentos de grandes jogadores. Mesmo links simples como “boa notícia → preço sobe” muitas vezes quebram. Existem duas principais fontes de ruído: The first source of noise is a The core issue is not the magnitude of the noise itself, but the weakness of the signal: meaningful price movements are usually fractions of a percent, while random swings can easily reach several percent. As a result, the share of informative changes within the overall data stream is extremely small. weak signal-to-noise ratio. According to the Efficient Market Hypothesis, prices already reflect all available information from news — which is exactly what we typically aim to predict. However, markets also include whose actions generate additional noise. uninformed participants Noise filtering Noise filtering via FFT remains a staple tool. The approach decomposes a time series into frequency components: low frequencies capture the underlying trend, while high frequencies represent noise. By discarding the high-frequency parts and reconstructing only the low-frequency component, we obtain a smoothed signal that’s much easier to model. (The high-frequency remainder can still serve for volatility estimation if needed.) was able to augment classical computing workflows to better unravel hidden pricing signals in noisy market data than standard, classical-only approaches in use by HSBC, resulting in strong improvements in the bond trading process. IBM Heron Heuristics and reframing the problem Noise from market participants is handled differently. One useful trick is to reframe the question itself. Instead of asking you can ask: “What will Apple’s stock price be one second from now?” “What will it cost to buy 1 share?” “What will it cost to buy 100k shares?” In the second case we predict the average price for a large volume, and that is much more stable and better reflects market movement. def avg_price(order_book, volume): taken, cost = 0, 0 for price, avail in order_book: take = min(avail, volume - taken) cost += take * price taken += take if taken >= volume: break return cost / taken Example: the averaged price for 100k shares y = avg_price(order_book, 100_000) Sobre o IBM Heron “Qual será o preço das ações da Apple a partir de agora?” When More Volume Means More Noise No entanto, há também um efeito inverso: às vezes contabilizar O volume pode realmente adicionar ruído aos dados. Compare os dois gráficos: eles mostram os preços médios BTCUSDT em Binance, ponderados por diferentes volumes de negociação. No primeiro caso, o gráfico ponderado por volume de US $ 50M parece "menos barulhento" - isso aconteceu durante uma queda de preço rápida. No segundo caso, no entanto, a mesma média ponderada mostra saltos muito mais "acidental". Isto ocorreu porque, durante um período de preço mais calmo, os participantes estavam movendo suas grandes ordens mais frequentemente no livro de ordens, o que, por sua vez, afetou o preço médio ponderado. Mais Pode parecer surpreendente: se você simplesmente calcular o número de mudanças para cada um desses três indicadores durante o período de 22 de agosto a 22 de setembro, você realmente obtém um aumento nos dados quando “media” o preço. P1_1_market_hits.csv: 2 374 605 pontos de dados P2_500k_market_hits.csv: 51,309,973 pontos de dados P3_50m_market_hits.csv: 133.191.896 pontos de dados A desvantagem é esta: medir às vezes pode piorar as coisas. Smarter Targets Beat Raw Prices Outra maneira de “reduzir o ruído” e “ajudar o ML” é reformular o próprio alvo de previsão, medindo o ruído ao longo do tempo. Um mais robusto é: Isso resolve dois problemas de uma só vez: “Vamos prever o preço exato 10 segundos a partir de agora.” “Vamos prever o preço médio ponderado em volume nos próximos 10 segundos.” If a price jump occurs within those 10 seconds, the exact moment doesn’t matter as much — averaging smooths it out. The algorithm therefore has fewer ways to fail. Secondly (and here we get a bit more mathematical), averaging the target also reduces the average penalty the model receives during training for “wrong predictions.” In the simplest case of a regression model, the loss is proportional to (y^* - y)^2, where y^* is the “true answer” and y is the model output. The larger the error, the quadratically higher the penalty. Now, suppose that over the next 10 seconds the price trend is generally upward, but at some random moment there is a brief downward spike. The model would have to predict that spike, otherwise it gets penalized. But in reality, we don’t care much about that random blip — what we want the model to capture is the overall upward movement.\ Como exemplo: no gráfico, comparamos a média sobre 1 segundo versus 10 segundos.A meta de 10 segundos é muito mais fácil de prever, pelo menos para uma regressão simples - porque contém muito menos ruído aleatório. Don’t Predict Price, Predict the Crowd Às vezes é mais inteligente prever não o preço em si, mas a reação da multidão. padrões técnicos como “cabeça e ombros” podem não ter rigor científico – no entanto, se suficientes comerciantes acreditam neles e agem, o preço realmente se move. Em outras palavras, se você “sugerir” ao modelo ML o que exatamente estamos procurando nos dados (por exemplo, casos em que os participantes do mercado estão tentando completar um determinado padrão de análise técnica), o modelo aprende muito mais eficazmente. Bootstrapping and augmenting limited data Bootstrapping e aumento de dados limitados Se você amostrar preços uma vez por segundo, você acaba com algo como 60 vezes × 60 vezes × 8 horas de negociação × 5 dias por semana × ~ 50 semanas (excluindo feriados) ≈ 7 200 000 pontos por ano - abaixo de 10 milhões. Claro, há dados HFT onde algo acontece a cada milissegundo, mas isso só traz de volta o primeiro problema: toneladas de ruído e muito pouco sinal real. No seu núcleo, o aprendizado de máquina é estatística, e a estatística tem truques para trabalhar com pequenas amostras. Bootstrapping A ideia é simples: digamos que você tenha 100 observações, mas gostaria de 1.000. Você repetidamente toma subconjuntos aleatórios – por exemplo, 50 itens cada – e computa estatísticas. O número de combinações possíveis “100 escolha 50” é enorme. Como resultado, você obtém centenas de conjuntos de dados re-sampled e estimativas mais confiáveis do que se você confiasse apenas no original 100. A atração é que para a série de tempo isso mal funciona – você não pode simplesmente cortar uma seqüência em pedaços sem perder a cronologia.É por isso que o bootstrapping clássico raramente é usado para a previsão de preços.Mas em tarefas como analisar 100 negócios comerciais, ele pode ser aplicado: você pode medir acima da centena original, ou construir vários subconjuntos aleatórios de 50 e medir esses resultados. Data augmentation A segunda estratégia é expandir artificialmente o conjunto de dados. Em imagens, isso é simples: girar, distorcer - e você recebe um novo exemplo. No texto, também. Com finanças é mais difícil, mas alguns truques ainda funcionam. Um exemplo simples: se um modelo é treinado apenas em um mercado de touros, ele sempre sugerirá “comprar”. Assim que o mercado virar para baixo - as perdas começam. Para mitigar isso, você pode inverter os dados: transformar o crescimento em declínio, transformar as compras em vendas, Transforme as boas notícias em más. O algoritmo aprende com esses cenários e começa a vender em um mercado em queda. Synthetic trade generation is a that still has many open questions field Campo Campo A abordagem é relativamente simples: faça negócios reais, encaixe-os em uma distribuição (ou conjunto de distribuições) e, em seguida, obtenha amostras dessa distribuição para produzir dados sintéticos adicionais.Mas o desafio principal permanece nas caudas de distribuição (caudas gordas) - eventos raros, mas grandes. A pesquisa recente se baseia cada vez mais em modelos gerativos: modelos de difusão, GANs, auto-codificadores variativos. Por exemplo, o artigo “Geração de séries de tempo financeiras sintéticas por modelos de difusão” descreve um método em que as séries de livro de ordens são transformadas em espaço de wavelet, geradas através de DDPM, e depois invertidas de volta para séries de tempo. Outro exemplo é a TransFusion, que combina arquiteturas de difusão e transformador para gerar longas séries de tempo sintéticas de alta fidelidade. A principal tarefa é conciliar duas exigências: por um lado, preservar os fatos estilizados do mercado (caudas gordas, agrupamento de volatilidade, autocorrelações, etc.), e, por outro, evitar artefatos excessivamente sintéticos. Time shifts Há também uma técnica de mudança de tempo: usando os mesmos dados, mas com um atraso.O problema é que é fácil acidentalmente “pegar no futuro” (preconceito de olhar para a frente).Este é um erro de engenharia clássico: o conjunto de treinamento termina contendo dados que o modelo deve prever.Em gráficos, parece ótimo – mas em mercados reais, rompe. Outra técnica é a mudança do tempo: reutilizar os mesmos dados com um atraso.O principal problema aqui é o risco de introduzir o preconceito de olhar para a frente – um erro de engenharia clássico onde o conjunto de treinamento contém acidentalmente os mesmos dados que o modelo deve prever. Uma analogia útil é o tempo: se está chovendo agora, a probabilidade é alta de que continuará a chover. Mas prever a chuva quando todos já estão carregando guarda-chuvas acrescenta pouco valor. **Adaptação a mercados em mudança com conjuntos e janelas deslizantes **O terceiro problema – os mercados se comportam como o Ocidente Selvagem.Tudo muda rapidamente.Você poderia dizer: “Vamos treinar apenas com dados novos dos últimos meses.”Mas se os dados são escassos para começar, isso torna o problema ainda pior. Ensembles Uma abordagem prática é ensembles. Você treina vários modelos: one on the most recent days or weeks, another on the entire history, a third on some mid-range horizon. and a fourth that focuses on special cases — for example, detecting noise patterns or technical-analysis formations, as discussed earlier. Then you aggregate their predictions (e.g., by averaging, or taking the min/max). This is a standard trick for dealing with heteroscedastic data — where the distribution is non-stationary and constantly shifting. Markets are exactly that kind of case. pred1 = model_recent.predict(x) pred2 = model_history.predict(x) pred3 = model_midterm.predict(x) final = np.mean([pred1, pred2, pred3]/ # final = np.max([pred1, pred2, pred3]) The idea is that the market may change tomorrow, but some of the old information is still useful. Averaging helps smooth out these distortions. Sliding windows Another technique is training on sliding windows. Take the last 7 days, predict the next one. Then shift the window: add new data, drop the old. The model keeps updating, allowing it to adapt to new market regimes. window = 7 for t in range(window, len(data)): model.fit(data[t-window:t]) pred = model.predict(data[t]) So why is there no universal ML for trading? So, each of the three problems can be solved on its own, but together they don’t add up to a universal solution. One reason is the lack of quality feedback for training models. In finance, you don’t have the usual ML metrics like accuracy or F1-score. The only metric is money made. Imagine two hedge funds. One shows average returns, the other twice as high. If someone consistently outperforms the rest, everyone immediately assumes it’s a scam. Why? First, because nothing like that shows up in the market — other participants don’t feel like someone is “skimming” them on every trade. Second, there’s the survivor bias. Classic example: take a thousand people, half go long on oil, half go short. The next day, half of them are right. From the remaining 500, split again, and repeat for several rounds. After ten days, you’ll have one “genius” who made the right call ten times in a row. But in reality, he was just lucky — the illusion comes from starting with a thousand players. This is the core problem of verification. There isn’t much data to train on, and there’s even less to validate results. Even if we could see trades from a fund that outperforms the market twofold, over a relatively short horizon we still wouldn’t be able to tell luck from real skill. A good example is the many “one-day wonders” — funds or companies that show great returns when the overall market is going up (say, during an S&P 500 rally). But as soon as conditions turn south, their performance collapses. Over the long run, there are indeed legendary cases like the Medallion Fund. They consistently beat the market, delivering returns above so-called risk-free bonds. But the edge isn’t by orders of magnitude — it’s a few percentage points. To do better than them means being ahead by fractions of a percent, sustained over a very long horizon. The reality is that few funds survive long enough to prove such stability. Over six months, almost anyone can “look like a genius” if they get lucky — that’s the classic survivor bias. And not surprisingly, it’s exactly this illusion that a lot of flashy marketing campaigns for “successful” funds are built on. The philosophical takeaway is a harsh one: an algorithm can’t be called successful until it’s been tested by time. Even if it’s profitable on average, in real life it can get wiped out in a single day with a million-dollar drawdown — simply because you don’t have an extra million lying around to survive that day.