Epistêmico vs Aleatório: Medindo o que um Modelo de Retorno Não Sabe
Todas as regras de dimensionamento de posição neste blog colapsam a incerteza em um escalar único. Kelly divide pela variância. Previsão conforme divide pela largura do intervalo. Direcionamento de volatilidade divide por uma previsão GARCH. Todas as três estão corretas, e todas as três descartam uma distinção que importa para trading: a diferença entre um mercado ruidoso e um modelo ignorante.
Não são o mesmo risco. O ruído de mercado é precificado — é o que você é compensado por suportar. A ignorância do modelo não é precificada, não é compensada, e é precisamente o estado em que sua estimativa de vantagem é menos confiável. Uma regra de dimensionamento que os penaliza igualmente deixa algo na mesa.
Este post é sobre tornar essa divisão mensurável. Concretamente:
Coloque isso no denominador de Kelly em vez da variância total. O resto do artigo é sobre como estimar os dois componentes (MC Dropout, deep ensembles), e como a divisão se parece em dados reais.
A Tese: Duas Incertezas, Duas Respostas
| Epistêmico | Aleatório | |
|---|---|---|
| Fonte | Dados limitados / modelo | Ruído inerente nos dados |
| Redutível? | Sim (mais dados ajudam) | Não |
| Ação de trading | Reduzir posição ou abster-se | Alargar stops, reduzir alavancagem |
| Sinal | "Eu nunca vi este regime" | "Este mercado está ruidoso agora" |
A assimetria na linha "ação de trading" é todo o argumento. Alta variância aleatória é um desconhecido conhecido: você pode dimensionar para ela, proteger, e esperar ser pago um prémio de risco por segurá-la. Alta variância epistêmica é um desconhecido desconhecido: o modelo está extrapolando, sua estimativa de média é tão suspeita quanto sua estimativa de variância, e não há prémio anexado a estar errado sobre seus próprios parâmetros.
Um modelo que con funde os dois ou negocia excessivamente em regimes não familiares (ignorando incerteza epistêmica) ou negocia de menos em regimes familiares mas ruidosos (superpenalizando incerteza aleatória). Kelly padrão, aplicado a , faz ambos dependendo de qual componente acontece de dominar.
A Decomposição
Incerteza epistêmica vem de incerteza sobre os parâmetros do modelo . Em vez de um único (como em máxima verossimilhança), mantemos uma distribuição e integramos:
A dispersão induzida pela integração sobre é epistêmica. Ela encolhe à medida que cresce para cobrir a região de entrada.
Incerteza aleatória é o ruído condicional do processo gerador de dados. Em uma rede neural, é modelada por uma segunda cabeça de saída que emite variância dependente de entrada:
`
Essa cabeça heteroscedástica está estimando o mesmo objeto que o GARD estima classicamente — variância condicional dependente de estado que é alta durante a noite e baixa nos horários de pico. Se você quiser a empiria desse objeto em cripto, GARCH(1,1) for crypto volatility cobre adequadamente, incluindo por que a previsão condicional em tempo real (não a variância amostral incondicional) pertence ao denominador de Kelly. A cabeça NN é apenas um estimador diferente do mesmo objeto, ajustado em conjunto com a média.
O que GARD não pode dar é o outro termo. É para isso que serve o resto deste post.
Onde Isto Se Senta em Relação ao Que Já Foi Publicado
Dois posts anteriores cobrem terreno adjacente e valem a pena ser lidos primeiro, pois este post deliberadamente não os repete:
- Previsão conforme para dimensionamento de posição consciente do risco fornece intervalos com garantia de cobertura de amostra finita, sem suposição de distribuição, mais dimensionamento inverso da largura e filtro no-trade de rácio de borda. É a ferramenta mais forte se tudo que você quer é um intervalo corretamente dimensionado.
- Temporal Fusion Transformers emitem quantis diretamente e já alertam que quantis de perda de pinball não são automaticamente calibrados fora da amostra.
A troca é limpa. Conforme fornece garantia mas um número — a largura do intervalo não é decomponível, então não pode te dizer por que ela alargou. Métodos Bayesianos fornecem decomposição mas nenhuma garantia — os intervalos de MC Dropout são tão bons quanto a posterior aproximada. Este artigo é sobre comprar a decomposição; você provavelmente deve manter conforme no topo dela para a cobertura.
Método 1: Inferência Variacional (Bayes por Backprop)

Uma rede neural Bayesiana coloca um prior sobre os pesos e busca a posterior . O normalizador requer integração sobre cada configuração de pesos, o que é intratável para qualquer coisa com mais do que um punhado de parâmetros.
Inferência variacional substitui a posterior intratável por uma família tratável — tipicamente um Gauss fatorado — e minimiza
Como isso envolve a posterior desconhecida, em vez disso maximizamos o Limite Inferior de Evidência:
O primeiro termo empurra para explicar os dados; o segundo o mantém perto do prior. Bayes by Backprop (Blundell et al., 2015) torna isso diferenciável com o truço de reparametrização: amostra , define .
Na prática VI dobra a contagem de parâmetros, aumenta a variância do gradiente (cada passe para frente usa pesos diferentes), e a suposição de campo médio ignora correlações de pesos, o que tende a subestimar incerteza epistêmica. Para um stack de trading onde você já tem um modelo determinístico treinado, os dois métodos mais baratos abaixo são geralmente o melhor ponto de entrada.
Método 2: MC Dropout

Gal e Ghahramani (2016) mostraram que uma rede treinada com dropout e avaliada com dropout ainda ativo no tempo de teste é um procedimento de inferência variacional aproximada em um processo Gaussiano profundo. O dropout já induz uma distribuição sobre sub-redes; mantê-lo ligado durante inferência e executar passes para frente amostra dessa posterior implícita.
Isto não existe em nenhum outro lugar deste blog. O código publicado aqui usa dropout apenas como regularizador no tempo de treinamento (modelagem de spread, TFT em dropout=0.1–0.3). Mantê-lo ligado na inferência é uma mudança de uma linha com um significado totalmente diferente.
Estatísticas Preditivas
Dadas passes para frente estocásticos produzindo e variâncias por passe :
Média preditiva:
Epistêmico (desacordo entre passes):
Aleatório (média do ruído predito):
A decomposição é exatamente a lei da variância total: variância da média condicional mais média da variância condicional. A variância preditiva total é sua soma.
Implementação PyTorch
import torch
import torch.nn as nn
import numpy as np
class MCDropoutNet(nn.Module):
"""
Rede de predição de retorno com MC Dropout para estimativa de incerteza.
Produz tanto média predita quanto log-variância (aleatória).
"""
def __init__(self, input_dim: int, hidden_dim: int = 128, dropout_p: float = 0.1):
super().__init__()
self.net = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Dropout(p=dropout_p),
nn.Linear(hidden_dim, hidden_dim),
nn.ReLU(),
nn.Dropout(p=dropout_p),
)
self.head_mu = nn.Linear(hidden_dim, 1) # retorno predito
self.head_logvar = nn.Linear(hidden_dim, 1) # log(variância aleatória)
def forward(self, x: torch.Tensor):
h = self.net(x)
return self.head_mu(h), self.head_logvar(h)
def heteroscedastic_loss(mu, log_var, target):
"""Log-verossimilhança negativa para um Gauss com variância dependente de entrada aprendida."""
precision = torch.exp(-log_var)
return torch.mean(0.5 * precision * (target - mu) ** 2 + 0.5 * log_var)
@torch.no_grad()
def mc_predict(model: MCDropoutNet, x: torch.Tensor, n_samples: int = 100):
"""
Inferência MC Dropout: mantenha dropout LIGADO, colete T passes para frente,
decompõe variância preditiva em partes epistêmica e aleatória.
"""
model.train() # NOT eval() -- isto mantém dropout ativo
mus, log_vars = [], []
for _ in range(n_samples):
mu, log_var = model(x)
mus.append(mu)
log_vars.append(log_var)
mus = torch.stack(mus) # (T, batch, 1)
log_vars = torch.stack(log_vars) # (T, batch, 1)
pred_mean = mus.mean(dim=0)
epistemic_var = mus.var(dim=0) # Var sobre passes
aleatoric_var = log_vars.exp().mean(dim=0) # E sobre passes
return {
"mean": pred_mean.squeeze(-1),
"epistemic_std": epistemic_var.sqrt().squeeze(-1),
"aleatoric_std": aleatoric_var.sqrt().squeeze(-1),
"total_std": (epistemic_var + aleatoric_var).sqrt().squeeze(-1),
}
O treinamento usa a perda heteroscedástica, que é o que dá significado à cabeça de variância. Note a estrutura auto-reguladora: o termo 0.5 * precision * (target - mu)**2 quer variância pequena, o termo 0.5 * log_var pune isso, e o ponto de equilíbrio é o nível de ruído condicional.
model = MCDropoutNet(input_dim=50, hidden_dim=128, dropout_p=0.1)
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1e-4)
for epoch in range(200):
model.train()
for x_batch, y_batch in train_loader:
mu, log_var = model(x_batch)
loss = heteroscedastic_loss(mu, log_var, y_batch)
optimizer.zero_grad()
loss.backward()
optimizer.step()
O gotcha que mata silenciosamente o método: chamar model.eval() dentro de mc_predict. Isso desabilita o dropout, cada passe retorna o valor idêntico, epistemic_var colapsa para exatamente zero, e sua regra de dimensionamento reverte silenciosamente para Kelly simples na variância aleatória. Falha sem erro. Assert que epistemic_var > 0 em seu caminho de inferência.
Escolhendo o Número de Passes para Frente
- : limite inferior razoável para uma média estável
- : padrão utilizável para média e variância
- : retornos decrescentes a menos que você precise de quantis de cauda
Método 3: Deep Ensembles

Lakshminarayanan et al. (2017) treinam redes independentes de diferentes inicializações aleatórias e agregam. Embora não formalmente Bayesianas, deep ensembles consistentemente superam métodos mais principiados em benchmarks de calibração de incerteza.
O desacordo entre membros é a estimativa epistêmica. Ensembles aparecem em outros lugares neste blog como dispositivos de agregação — detecção de anomalia, detecção de regime HMM, bootstrap de bloco EnbPI conforme — mas nunca como estimador de incerteza via dispersão entre membros. Esse é o uso aqui.
Implementação de Ensemble
A diversidade vem de treinamento independente, não da construção de objetos. Um ensemble de membros não treinados ou treinados identicamente retorna ruído ou variância epistêmica zero:
class DeepEnsemble:
def __init__(self, input_dim: int, n_models: int = 5, hidden_dim: int = 128):
self.models = []
for seed in range(n_models):
torch.manual_seed(seed) # init diferente por membro
self.models.append(
MCDropoutNet(input_dim, hidden_dim, dropout_p=0.0)
)
def fit(self, train_loader, epochs: int = 200, lr: float = 1e-3):
"""Cada membro é treinado independentemente. É aqui que vem a diversidade --
init diferente, ordem de embaralhamento diferente. Pular isso
resulta em epistemic_var == 0 (membros idênticos) ou ruído puro (não treinado)."""
for seed, model in enumerate(self.models):
torch.manual_seed(1000 + seed) # stream de embaralhamento/dropout diferente
opt = torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=1e-4)
model.train()
for _ in range(epochs):
for x_batch, y_batch in train_loader:
mu, log_var = model(x_batch)
loss = heteroscedastic_loss(mu, log_var, y_batch)
opt.zero_grad()
loss.backward()
opt.step()
return self
@torch.no_grad()
def predict(self, x: torch.Tensor):
mus, variances = [], []
for model in self.models:
model.eval() # correto aqui: sem amostragem dropout
mu, log_var = model(x)
mus.append(mu.squeeze(-1))
variances.append(log_var.exp().squeeze(-1))
all_mus = torch.stack(mus)
all_vars = torch.stack(variances)
epistemic_var = all_mus.var(dim=0) # spread ATRAVÉS membros
aleatoric_var = all_vars.mean(dim=0)
return {
"mean": all_mus.mean(dim=0),
"epistemic_std": epistemic_var.sqrt(),
"aleatoric_std": aleatoric_var.sqrt(),
"total_std": (epistemic_var + aleatoric_var).sqrt(),
}
Note que model.eval() está correto em DeepEnsemble.predict e errado em mc_predict. A fonte estocástica difere: ensembles obtêm de treinamento independente, MC Dropout obtém de máscaras dropout ao vivo.
Trade-offs: MC Dropout vs Deep Ensembles
| MC Dropout | Deep Ensembles | |
|---|---|---|
| Custo de treinamento | 1x (modelo único) | x ( modelos) |
| Custo de inferência | passes para frente | passes para frente |
| Memória | 1x parâmetros | x parâmetros |
| Qualidade de incerteza | Tende a subestimar epistêmico | Melhor calibrado geralmente |
| Facilidade de implementação | Trivial (trocar bandeira) | Trivial (treinar modelos) |
| Paralelismo | Passes sequenciais (mesmo modelo) | Embarassadamente paralelo |
Um híbrido pragmático: treine um ensemble pequeno () onde cada membro também usa MC Dropout, capturando tanto desacordo inter-modelo quanto estocasticidade intra-modelo.
O Pagamento: Dimensionamento Assimétrico

Aqui está a contribuição real. Kelly Gaussiano é ; a derivação, a parábola de crescimento, a tabela de probabilidade de drawdown e as quatro razões para executar Kelly fracionário em vez de completo estão todas em The Kelly Criterion for Strategies, e não são repetidas aqui. Tome em uma fração de um quarto de Kelly como dada.
A modificação é o denominador. Em vez de variância preditiva total:
O argumento para : variância aleatória é o ruído do mercado, é precificada, e segurá-la é como uma estratégia ganha. Variância epistêmica é sua ignorância — não carrega prémio, e pior, está correlacionada com sua estimativa estar errada. Quando é grande, o numerador de Kelly não é confiável ao mesmo tempo que o denominador, então o erro de dimensionamento se compõe. Penalizá-lo superlinearmente em relação ao ruído de mercado é a expressão direta disso.
def uncertainty_adjusted_position_size(
pred_mean: float,
epistemic_std: float,
aleatoric_std: float,
max_position: float = 1.0,
lam: float = 2.0, # penalidade epistêmica; ajuste na validação
max_epi_ratio: float = 0.5, # abster-se acima desta razão epi/alea
base_kelly_fraction: float = 0.25,
) -> float:
"""Dimensionamento Kelly onde variância epistêmica é penalizada mais duramente que a aleatória."""
effective_var = aleatoric_std ** 2 + lam * epistemic_std ** 2
if effective_var < 1e-10:
return 0.0
position = (pred_mean / effective_var) * base_kelly_fraction
epi_ratio = epistemic_std / (aleatoric_std + 1e-8)
if epi_ratio > max_epi_ratio:
position *= max(0.0, 1.0 - epi_ratio)
return float(np.clip(position, -max_position, max_position))
A porta merece uma nota. Zerar posições abaixo de um limiar de confiança não é novo aqui — o post conforme especifica e codifica o filtro geral no-trade como com um limite min_edge, incluindo como escolher o limite e a leitura geométrica de um intervalo que cruza zero. Veja conformal prediction para essa maquinaria. O que é novo é o denominador: portar em dispara especificamente quando o modelo está mais confuso sobre seus próprios parâmetros do que o mercado está ruidoso — um estado que a portaria de incerteza total não pode detectar, porque um regime calmo mas não familiar pode ter baixa variância total e uma razão epistêmica terrível.
Calibração: Delegue Isso
Uma estimativa de incerteza só é útil se calibrada: um intervalo nominal de 95% deve conter a verdade ~95% das vezes. Não role sua própria verificação de confiabilidade de quantil Gaussiano aqui — um intervalo paramétrico em resíduos de retorno com cauda grossa é exatamente o modo de falha que previsão conforme existe para evitar, e ele envia um evaluate() funcionando que relata cobertura alvo versus empírica com uma garantia de amostra finita atrás dele. O post TFT faz o mesmo ponto para cabeças de quantil.
Reescalonamento pós-hoc ( ajustado em um conjunto de validação) é a correção barata, e é o primo mais fraco de Inferência Conforme Adaptativa, que mantém um nível de miscobertura online com um limite de cobertura de longo prazo em vez de um redimensionamento estático. ACI é a opção mais forte; a única razão para preferir redimensionamento linear é que ele preserva a razão epistêmica/aleatória, o que a largura única do ACI não faz.
O Que Precisa Ser Medido Antes Disso Publicar
Os métodos acima são estabelecidos. A alegação de que a divisão compra algo em trading não é, e este blog não publica regras de dimensionamento baseadas apenas em argumento. A barra:
**1. Conjunto de dados e alvo. ** Nomeie o instrumento, tamanho da barra, intervalo de datas explícito, conjunto de features e alvo de predição.
**2. A divisão em si. ** Que fração da variância preditiva total é epistêmica versus aleatória, e como essa razão se move entre uma janela calma nomeada e uma janela volátil nomeada. Este é o gráfico de dinheiro e ainda não existe. A hipótese que vale a pena falsificar: a razão dispara antes da volatilidade realizada, porque o desconhecido precede a turbulência.
**3. Cobertura versus conforme. ** Cobertura fora da amostra medida de intervalos MC Dropout contra nominal, comparada com intervalos split-conforme do artigo publicado nos mesmos dados. Esse head-to-head é em si um novo resultado e a ponte natural entre os dois posts.
**4. compra algo? ** Varra a penalidade epistêmica na validação e relata PnL e drawdown máximo contra a linha de base . Se não comprar nada, diga — The Honest Negative é o modelo para esse resultado e é um resultado publicável.
**5. Custo de inferência. ** Medido, no hardware alvo, em cada .
Qualquer avaliação aqui roda sob disciplina walk-forward optimization — é um hiperparâmetro, e um ajustado na amostra completa não é um resultado.
Dicas Práticas para Produção
**1. Aqueça o prior. ** Com inferência variacional, inicialize a média variacional de uma rede determinística pré-treinada em vez de aleatoriamente. Tipicamente reduz o tempo de convergência pela metade.
**2. Observe colapso de variância. ** Variâncias aprendidas podem derivar para quase zero, revertendo silenciosamente o BNN para uma rede determinística. Monitore a média durante o treinamento; adicione annealing KL se necessário.
**3. Recalibre em base rolling, não um conjunto de validação fixo. ** Mercados são não estacionários e uma calibração ajustada uma vez degrada. Retreine em uma janela rolling sob disciplina walk-forward, ou deixe ACI absorver estagnação do modelo online — o post conforme cobre o trade-off de frequência de retreinamento diretamente.
**4. Diversidade de ensemble importa. ** Sementes diferentes, embaralhamentos diferentes, opcionalmente hiperparâmetros diferentes por membro. Diversidade de inicialização é o condutor principal da qualidade do ensemble, é por isso que o loop fit() acima não é opcional.
**5. Registre a decomposição, não apenas o total. ** Armazene ambos os componentes junto com resultados realizados. Sem isso você não pode responder a única pergunta que importa na revisão: quando o dimensionador cortou exposição, foi porque o mercado estava ruidoso ou porque o modelo estava perdido — e estava certo?
**6. Incerteza como feature. ** Estatísticas epistêmicas rolling podem elas mesmas ser preditivas de drawdowns. Plausível, não medido, e vale um post separado.
Limitações e Advertências Honestas
- **Posteriores aproximadas ainda são aproximadas. ** MC Dropout e VI fornecem uma visão limitada da posterior verdadeira. Melhor que nada, não verdade absoluta, e nenhuma garantia de cobertura está anexada a nenhum.
- **Calibração degrada exatamente quando você precisa. ** Em um regime verdadeiramente novo o modelo ainda pode estar mal calibrado — apenas tende a ser menos mal calibrado do que um determinístico. Estimativas de incerteza de uma entrada fora da distribuição são elas mesmas saídas fora da distribuição.
- **Variância aleatória pode absorver sinal epistêmico. ** Se a cabeça heteroscedástica for flexível o suficiente, ela aprende a explicar incerteza do modelo como ruído de dados, colapsando em direção a zero e derrotando silenciosamente toda a decomposição. Este é o modo de falha mais importante neste post e ele não se anuncia. Monitore a razão entre regimes; uma razão que nunca se move é uma decomposição quebrada, não um mercado estável.
- ** é um parâmetro livre. ** Introduzir um botão ajustável em uma regra de dimensionamento é como regras de dimensionamento superfit são construídas. Precisa de justificativa walk-forward ou precisa ser fixado em 1.
Conclusão
Previsão conforme já fornece a este blog larguras de intervalo com garantia de cobertura, e Kelly já fornece uma regra de dimensionamento. O que nenhum fornece é uma resposta ao por que o intervalo é largo. Dividir a variância preditiva em partes epistêmica e aleatória responde a isso, e a resposta é acionável de uma forma que o total não é: ruído de mercado é risco compensado, ignorância de modelo não é, e o denominador de dimensionamento deve dizer isso.
MC Dropout torna a divisão quase gratuita — uma linha(model.train() na inferência) transforma qualquer rede dropout em um Bayesiano aproximado. Deep ensembles custam x e calibram melhor. Ambos alimentam o mesmo denominador assimétrico .
Se realmente paga é uma questão empírica que este rascunho ainda não responde. As medições listadas acima são o preço de publicá-lo.
Referências:
- Blundell, C., Cornebise, J., Kavukcuoglu, K., & Wierstra, D. (2015). Weight Uncertainty in Neural Networks. ICML.
- Gal, Y. & Ghahramani, Z. (2016). Dropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learning. ICML.
- Lakshminarayanan, B., Pritzel, A., & Blundell, C. (2017). Simple and Scalable Predictive Uncertainty Estimation using Deep Ensembles. NeurIPS.
- Kendall, A. & Gal, Y. (2017). What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision? NeurIPS.
- Gibbs, I. & Candes, E. (2021). Adaptive Conformal Inference Under Distribution Shift. NeurIPS.
- Kelly, J. L. (1956). A New Interpretation of Information Rate. Bell System Technical Journal.
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.