Projeto B · Artefato open-source · Engine + paper redigidos
Quant Research Framework
Um framework de trading sistemático com rigor de pesquisa que qualquer pessoa pode usar para gerar estratégias, baseadas em regras ou em ML, com walk-forward optimisation à prova de balas, otimizador de lookback embutido que rotaciona por regime, segmentador de regime customizável e suíte de robustez de 5 cenários. Entregue como uma referência em Python e uma porta em Rust spec-equivalente, presas a um contrato de paridade numérica publicado em todo PR.
Duas engines, uma especificação
Não é um wrapper Python em torno de Rust, são duas implementações independentes do mesmo backtester
Um padrão comum em ferramentas quant é uma fachada Python sobre um hot loop em Rust. Este framework é outra coisa: duas engines completas e standalone, uma em Python, uma em Rust, que implementam a mesma especificação algorítmica de forma independente e que são presas a uma saída numérica idêntica por um protocolo de paridade rodado em todo PR.
Escolha a linguagem que combina com o seu stack. Se você vive em pandas, numpy, scikit-learn e notebooks, instale a referência Python (pip install quant-research-framework) e você tem uma engine de pesquisa completa, contrato de estratégia, walk-forward, regime, suíte de robustez, metric ledger, diagnósticos Monte Carlo e Deflated-Sharpe, rodando nativamente em Python, com numba JIT dentro do loop de execução de trades.
Se você está fazendo deploy em produção, quer um único binário estático ou está rodando dentro de um stack de trading em Rust, instale a porta Rust (cargo add quant-research-framework-rs). Não é um binding Python: é uma reimplementação independente da mesma especificação, com um data path Vec<Bar> e um contrato de estratégia nativo em Rust fn(&[Bar], usize) → Vec<i8>.
As duas engines computam a escada de indicadores em precisão dupla IEEE 754. Layouts de memória diferentes, regimes de arredondamento diferentes (LLVM-via-rustc vs LLVM-via-numba), RNGs diferentes. O fato de produzirem métricas impressas idênticas em 210 pontos verificados com tolerância relativa ≤10⁻³, com desvio máximo observado de 5×10⁻⁵, é exatamente o que o protocolo de paridade existe para demonstrar. Um bug em uma implementação tem que ou casar com um bug correspondente na outra, ou ser pego.
O que diferencia
O que esse framework acerta que outros backtesters não acertam
Cada componente desse framework existe em algum lugar do ecossistema open-source. A contribuição é a combinação, e a disciplina que mantém a combinação coesa. A tabela abaixo resume um levantamento que fizemos em abril de 2026 contra seis backtesters amplamente usados, nos quatro eixos que mais importam para trabalho com rigor de pesquisa.
Walk-forward optimisation embutida, seleção de lookback por regime, no-look-ahead estrito imposto por testes de propriedade automatizados no nível do trade-ledger, e testes de paridade byte-a-byte entre linguagens, essa combinação é, do nosso conhecimento, única deste framework. Cada eixo individual existe em algum lugar; a QuantConnect Lean ship WFO, o vectorbt tem uma API de splitter sofisticada, o NautilusTrader roda um stack dual Python+Rust, mas nenhum deles junta os quatro com um contrato de paridade publicado.
O outro eixo que vale notar: cada controle de realismo, fees, slippage, funding, SL/TP intrabar, janelas de sessão, sizing de pip em forex, caps de leverage parcial, é um parâmetro da engine, não da estratégia. O autor da estratégia não pode esquecer de aplicar slippage ou pular charges de funding; a engine aplica isso a todo trade em toda janela WFO em todo overlay de robustez.
Comparação de features · abril de 2026
| Framework | Licença | WFO embutido | LB por regime | Testes LAH estritos | Paridade entre linguagens |
|---|---|---|---|---|---|
| este trabalho (Py + Rs) | Apache-2.0 | ✓ | ✓ | ✓ | ✓ |
| vectorbt | Apache + CC | ✓ (Splitter) | - | - | n/a |
| backtrader | GPL-3.0 | - (comunidade) | - | - | n/a |
| NautilusTrader | LGPL-3.0 | - (só engine) | - | - | - (bilíngue; sem paridade) |
| zipline-reloaded | Apache-2.0 | - (3rd-party) | - | - | n/a |
| QuantConnect Lean | Apache-2.0 | ✓ | - | - | n/a |
| bt | MIT | - | - | - | n/a |
Testes LAH estritos = no-look-ahead estrito imposto por testes de propriedade automatizados no nível do trade-ledger.
Verificado contra a documentação primária, abril de 2026. A combinação WFO + LB por regime + testes LAH estritos + paridade entre linguagens é, do nosso conhecimento, única deste trabalho.
Velocidade empírica
Mesma carga, seis engines, um protocolo de tempo
100 estratégias amostradas do gerador combinatório do framework, cada uma percorrendo end-to-end um sweep de lookback in-sample, uma otimização de RRR e uma avaliação out-of-sample. Mesmos candles SOLUSDT 1h, mesmos custos (fees + slippage onde a engine suporta), mesmo orçamento single-thread, com geração de sinal e a engine de backtest dentro da região cronometrada.
Wall single-thread, 100 estratégias, SOLUSDT 1h
| Engine | Wall | vs port Rust |
|---|---|---|
| este trabalho (port Rust) | 6,3 s | 1×, mais rápido |
| este trabalho (Python) | 37,5 s | 6× mais lento |
| vectorbt | 4,1 min | 39× mais lento |
| backtesting.py | 23,7 min | 226× mais lento |
| backtrader | 13,4 h | 7.670× mais lento |
| bt | 37,2 h | 21.340× mais lento |
Single-thread, end-to-end (geração de sinal + engine de backtest). Estratégias idênticas, mesma divisão IS/OOS, mesmos pressupostos de fee + slippage; funding é cobrado apenas onde a engine suporta out of the box.
Backtrader e bt foram paralelizados em 15 workers para caber em tempo real; o total equivalente single-thread é o relatado aqui para uma comparação like-for-like. O bt é um framework de rebalanceamento de portfólio em vez de um simulador direcional, e está incluído apenas para limitar o extremo mais lento da comparação.
Modelo de confiança
Por que confiar nos números
Reprodutibilidade é uma claim em quatro camadas: o algoritmo tem testes que pegam os modos de falha que importam, duas implementações independentes concordam na saída, a metodologia cita e aplica a literatura estatística publicada, e cada artefato é openly licensed e arquivado com DOI para que um terceiro possa reconstruir e re-verificar tudo.
01 · Invariantes property-tested
Property tests baseados em Hypothesis verificam o invariante de no-look-ahead no nível do trade-ledger: o índice de entrada de todo trade tem que ser estritamente maior que o índice em que o parâmetro foi fitado. Um teste separado de detector-fit-invariant fixa o detector de regime default como causal sob perturbações de tail de barra, e marca explicitamente os detectores KMeans / vol-quantile / trend-vol como anti-padrões documentados em vez de deixar o leak deles passar em silêncio.
02 · Paridade entre linguagens
210 pontos métricos verificados em três superfícies de configuração (default · regime + WFO · forex) com tolerância relativa de 10⁻³. Pior desvio observado nos 210 pontos é 5×10⁻⁵, vinte vezes mais apertado que a faixa declarada. O harness de paridade roda em todo PR; uma claim metodológica que sobrevive a essa barra ou casa com um bug correspondente nas duas engines, ou é pega.
03 · Citações da literatura publicada
O preprint que acompanha (44 páginas, 12 rodadas internas de revisão, score médio 7,0 → trajetória final 8/8/9) cita 42 referências cobrindo o Deflated Sharpe Ratio (Bailey & López de Prado), CSCV / PBO (Bailey-Borwein-LdP-Zhu), a literatura de múltiplos testes (Harvey-Liu, Bonferroni / Holm / BHY), a família bootstrap de data-snooping (Reality Check de White, step-down de Romano-Wolf), e os fundamentos de regime-switching (Hamilton, Ang-Timmermann). Os diagnósticos que ship com a engine implementam esses métodos, não aproximações deles.
04 · Open, com DOI, re-verificável
Os dois artefatos são Apache-2.0-licensed e arquivados com DOI no Zenodo (10.5281/zenodo.19798594 para Python · 10.5281/zenodo.19798592 para Rust). O repositório do paper traz requirements-paper.txt com deps Python pinadas e um target make verify do Makefile que re-roda os harnesses de paridade contra SHAs irmãos pinados e regenera o CSV de resíduos por métrica. Reproduzir cada figura e cada claim de paridade neste trabalho leva 5–10 minutos em um laptop recente.
Por dentro do optimiser
O que torna o optimiser mais efetivo que uma varredura de grade
A maioria dos backtesters expõe uma grade de parâmetros e deixa o usuário rodar uma varredura exaustiva. Esse framework adiciona três coisas em cima disso: uma busca coarse-then-fine que corta o custo da busca pela metade sem perder o ótimo, uma smart-optimisation guard que rejeita picos sharp de PF antes que eles sobreajustem a janela in-sample, e um RRR probe que escolhe o risk-to-reward ratio que maximiza o R total realizado por janela WFO.
A passada coarse varre a faixa de lookback {12, 14, ..., 76} numa grade step-2 (33 candidatos), avalia a estratégia em cada um e ranqueia pela métrica configurada (Sharpe por default; Profit Factor, Expectancy, MaxDD também configuráveis). O candidato top da coarse aciona uma passada fine-tune na vizinhança ±1 dele, três avaliações adicionais. Não vimos a passada fine-tune discordar do ótimo exaustivo em nenhum dataset testado.
A smart-optimisation guard fica na frente do resultado coarse-then-fine. Um candidato cujo Profit Factor excede a mediana do PF da vizinhança imediata em mais de 10% é rejeitado como pico sharp e o vice-campeão é promovido. O threshold de 10% é honestamente divulgado como folk engineering, é o valor em que se observou redução qualitativa de overfitting OOS num painel de estratégias sintéticas, e o comportamento on/off da guard faz parte da superfície de paridade, então qualquer um pode flipar e ver o efeito.
O RRR probe é o terceiro estágio. Para cada candidato RRR ∈ {1, 2, 3} (clássico) ou {1, 2, 3, 4, 5} (regime-path), a engine recomputa o R realizado por trade como min(peak_R, RRR) para trades que bateram no SL primeiro (lucro capado) e o close-R real para trades que saíram antes de bater no candidato TP. O RRR★ escolhido é aquele que maximiza ΣR. É isso que permite ao autor da estratégia plugar uma única regra e ter a engine encontrando um fit risco-retorno sensato em vez de chutar.
- Os três estágios rodam dentro de toda sub-janela WFO, nunca na amostra inteira, então o invariante de no-look-ahead é preservado no nível do ledger.
- A seleção de lookback por regime roda os mesmos três estágios restritos a barras cujo label é r, produzindo um vetor {lb★_r} de comprimento igual à contagem de labels de regime. Em OOS a engine rotaciona o span do EMA lento barra-a-barra.
- Todos os knobs do optimiser são campos do Config. Não há defaults escondidos dentro de kernels numba ou closures Rust, flipar qualquer um deles é uma mudança de uma linha reproduzível contra o registro de paridade.
Rotação de parâmetro por regime
A maioria dos backtesters expõe um parâmetro e deixa o usuário escolher. Alguns expõem uma grade de parâmetros e deixam o usuário rodar uma varredura. Quase nenhum entrega um optimiser embutido, e os que entregam não otimizam por regime. Esse framework faz as duas coisas: ele varre a faixa de lookback dentro da janela in-sample restrita às barras cujo label de regime é r, e produz um lb★_r separado por regime. Em OOS a engine então rotaciona o span do EMA lento barra-a-barra de acordo com o label de regime ao vivo, então a estratégia roda com o lookback que performou melhor nas barras que efetivamente parecem com o regime atual.
Toda a maquinaria, varredura coarse-then-fine, smart-optimisation guard, RRR probe, restrição por regime, rotação OOS, roda sem nenhuma intervenção do usuário. O autor da estratégia escreve a função (df, lb) → int8[] e configura o detector de regime (default 8 barras EMA-200; plugável para vol-quantile, KMeans ou função custom). Todo o resto é trabalho da engine. Existe uma proteção de regime-vazio: se um regime tem menos que min_trades dentro da janela IS, seu lb★_r faz fallback para o ótimo IS global, então a rotação nunca produz silenciosamente comportamento de zero trades.
Roadmap por fases
5 prontas · 1 em andamento · 3 planejadas · clique em qualquer nó
- Done
quant-research-framework v0.6.0, backtester Apache-2.0 instalável via pip, com WFO, segmentação de regime e suíte de robustez de 5 cenários prontos pra uso.
- Done
quant-research-framework-rs v0.6.0, engine Rust orientada por especificação, com semântica de estratégia idêntica e pronta para deploy em produção.
- Done
Duas engines, uma especificação: 210 pontos métricos em 3 superfícies (default · regime+WFO · forex) verificados com tolerância relativa de 10⁻³.
- Done
A porta Rust é rápida o suficiente para produção: 33–65× menos memória no processo todo e speedup end-to-end de 23.8–57× no benchmark incluído.
- Done
Preprint LaTeX de 44 páginas, 12 rodadas internas de revisão (média 7,0 → trajetória final 8/8/9). Submissão ao arXiv pendente.
- Done
Cross-compile ARM64 sob QEMU: cada métrica determinística é byte-idêntica ao x86_64 em todos os seis datasets. Jobs ARM nativo e QEMU ambos integrados ao CI.
- Done
Pares, baskets, portfólios beta-hedged sobre um ledger por-leg redesenhado. Lançado na v0.5.0; oito superfícies de paridade concordam dentro de 1e-3, saída de ativo único byte-idêntica.
- Done
Regime + WFO + forex + session. Fechada: um descasamento de knob no harness mais três divergências de barra de fim de sessão no core Rust, agora alinhadas. O combo é byte-exato e tem gate no CI (v0.5.0).
- Done
O Deflated Sharpe Ratio agora está espelhado em Rust e verificado em paridade cross-linguagem (dentro de 1e-3, e abaixo de 1e-9 nos casos finitos), levando o bloco de diagnóstico à paridade de features com a engine.
Clique em um nó verde para ver o que já foi entregue; nó em destaque para o que está em andamento; nó em contorno para o que está planejado
Fase 01 · Pronta · v0.6.0 · Apache-2.0
Engine de referência em Python
A referência em Python é o framework que qualquer pessoa pode instalar hoje e usar para gerar estratégias, baseadas em regras ou em ML, dentro de um pipeline com rigor de pesquisa. Você escreve uma função que recebe (df, lb) e devolve sinais int8 em {−1, 0, +1}; o framework cuida da otimização, da orquestração walk-forward, da rotação de regime, da suíte de overlays de robustez de 5 cenários e do cálculo de métricas. O loop interno em numba JIT aplica fees, slippage, funding (apenas cripto), SL/TP intrabar, janelas de sessão e lógica de forced-close sobre um trade ledger tipado, então o PnL simulado é o que uma camada de execução real veria.
Sete subsistemas principais já vêm na caixa, data loader, núcleo de indicadores, contrato de estratégia, núcleo de execução, optimizer, orquestrador walk-forward, engine de regime, mais os blocos de diagnóstico Monte Carlo e Deflated-Sharpe. A release v0.4.0 destrinchou Config dos globals, o que é o que permite dois backtests coexistirem no mesmo interpretador e também o que destravou o protocolo de paridade entre linguagens lá na frente.
- Instalação: pip install quant-research-framework. DOI: 10.5281/zenodo.19798594. Licença Apache-2.0.
- Contrato de estratégia deliberadamente mínimo: (df, lb) → int8[] em {−1, 0, +1}. Mesma superfície para regras escritas à mão e para modelos de ML.
- CSVs incluídos pra deixar o primeiro backtest a uma linha de distância: SOLUSDT 1h (48.094 barras) e EURUSD 1h (53.160 barras).
Fase 02 · Pronta · v0.6.0 · Apache-2.0
Porta em Rust, reimplementação orientada por especificação
A porta Rust te dá a mesma engine, mesmo WFO, mesmo segmentador de regime, mesma suíte de robustez, mesma semântica de estratégia, em um binário que cabe num deploy de produção sem interpretador Python. É uma implementação separada da mesma especificação, não uma transliteração: layout de memória diferente, regime de arredondamento diferente (LLVM-via-rustc vs LLVM-via-numba), RNG diferente. O ponto é exercitar a especificação algorítmica com duas engines cuja única linhagem compartilhada é a própria especificação.
O contrato de estratégia espelha o Python exatamente: fn(&[Bar], usize) → Vec<i8>. A camada de detecção de flip traduz níveis de sinal brutos em códigos de entrada/saída; essa separação permite que o autor da estratégia especifique o estado desejado (long/short/flat) em vez de transições, o que é muito mais fácil de manter no-look-ahead-correto.
- DOI: 10.5281/zenodo.19798592. crates.io: cargo add quant-research-framework-rs.
- Dependências deliberadamente pequenas e pinadas: rand =0.9 (exato), chrono 0.4, chrono-tz 0.10. O pin exato em rand está documentado porque rand 0.10 transforma random_range em método de trait, quebrando os call sites.
- O binário Rust não precisa de warm-up; o Python paga um custo único de cache JIT do numba antes da primeira run medida.
Fase 03 · Pronta · evidência de que as duas engines são a mesma engine
Protocolo de paridade entre linguagens
A paridade é o protocolo que nos permite afirmar que Python e Rust estão rodando o mesmo backtester, em vez de dois backtesters que apenas se parecem. Três superfícies de configuração determinísticas são verificadas end-to-end em todo PR: config default (56 pontos métricos · WFO por candle-trigger + lookback smart-otimizado + auto-RRR), regime + WFO (98 pontos métricos · otimização de LB por regime + rotação de LB OOS + warmup de 200 barras + 4 janelas WFO) e modo forex (56 pontos métricos · sizing de posição em pip + cap de PnL em modo forex).
Tolerância é 10⁻³ relativa; o pior desvio observado entre os 210 pontos métricos é 5×10⁻⁵, vinte vezes mais apertado que a faixa declarada, o que tomamos como evidência de que equivalência algorítmica, não acumulação numérica, é a restrição que prende. A replicação de tempo-de-paper, com 210 pontos, casou bit-a-bit na precisão de impressão \%.4f.
- Re-rodar a paridade é um comando por superfície, runtime total ≈ 5–10 min em um laptop recente.
- Desabilitado por design: percentis Monte Carlo (implementações de RNG diferentes entre as engines) e o overlay INDICATOR_VARIANCE — um deslocamento de lookback de ±1 não-semeado, aleatório por intenção, então essas linhas variam de execução para execução em cada engine e ficam fora da superfície de paridade.
- Escopo não verificado divulgado honestamente: Windows MSVC. A combinação quádrupla regime+WFO+forex+session agora é byte-exata e tem gate no CI (Fase 08), e a paridade cross-arquitetura em aarch64 é verificada por CI (Fase 06).
Fase 04 · Pronta · harness de benchmark publicado
Performance, a porta Rust é rápida o suficiente para produção
O ponto da fase de perf é que a engine Rust é operacionalmente utilizável em um deploy de produção, não que a referência Python seja lenta. No benchmark incluído, a porta Rust roda 23.8–57× mais rápido end-to-end com RSS de pico do processo 33–65× menor, o delta de memória atribuível à engine é plausivelmente apenas 3–5× quando se subtrai o baseline do interpretador Python (pandas/numpy/numba), e o paper lê o número headline com essa ressalva.
A comparação de speedup é significativa precisamente porque a paridade prende: sem paridade, uma reimplementação mais rápida pode estar apenas fazendo menos trabalho; com paridade, você está cronometrando duas implementações do mesmo algoritmo.
- Os benchmarks rodam em fatias do SOLUSDT 1h em 15k / 25k / 35k / 48k barras, três runs warm (com um warm-up descartado para o cache JIT do numba).
- O pipeline default completo roda end-to-end: baseline IS/OOS, busca smart-otimizada de lookback com auto-RRR, walk-forward por candle-trigger, diagnósticos Monte Carlo e os quatro overlays de robustez da v0.1.x.
Fase 05 · Pronta · 44 páginas · ~715 KB de PDF
Preprint do backtester walk-forward reproduzível
O paper que acompanha o projeto documenta a arquitetura, o pipeline WFO + regime + robustez, a metodologia de paridade, a comparação de performance e um blueprint de reprodutibilidade adequado para publicação acadêmica. Ele posiciona o framework contra seis backtesters open-source amplamente usados e a literatura estatística relevante; a contribuição é a combinação mais o protocolo de paridade, não uma nova máquina estatística.
Doze rodadas internas de revisão levaram o paper de uma média de score de 7,0 para a trajetória final 8/8/9. O repositório do paper traz requirements-paper.txt com deps Python pinadas, um Makefile que roda make verify contra SHAs irmãos pinados e um parity_residuals.csv gerado que sustenta cada figura.
- Fonte completa: github.com/DaruFinance, repositório do paper + repositório python + repositório rust como irmãos.
- Os dois artefatos têm DOIs Zenodo separados; o repositório do paper receberá seu próprio DOI quando arquivado no Zenodo no momento da publicação.
Fase 06 · Concluída · byte-idêntica em aarch64, CI QEMU + ARM nativo verde
Paridade cross-arquitetura
A porta Rust foi cross-compilada para aarch64-unknown-linux-gnu e rodada sob emulação user-mode QEMU contra os mesmos inputs do binário x86_64. Após semear o overlay de variância-de-indicador antes não-semeado (uma falha descoberta e corrigida durante a preparação do paper), cada métrica determinística impressa é byte-idêntica entre as duas arquiteturas em todos os seis datasets, 1.176 linhas de métrica, zero diferenças. Apenas o load e o wall-clock total diferem, ambos inflados pelo overhead de emulação do QEMU.
A comparação é igualdade exata de string do bloco de métricas impresso, estritamente mais forte que a checagem por tolerância relativa usada na paridade cross-linguagem, e se sustenta porque o hot path usa apenas operações IEEE-754 corretamente arredondadas, sem fast-math nem codegen de fused-multiply-add. Um job ARM nativo num runner ARM público gratuito roda a mesma asserção de byte-identidade em silício real ao lado do job QEMU, de modo que ambas as arquiteturas são checadas a cada mudança e o resultado QEMU fica como backstop reprodutível.
Fase 07 · Concluída · lançada como v0.5.0 nas duas engines
Core multi-ativo
O núcleo de execução, na versão fixada pelo paper, operava sobre uma única série OHLC de cada vez. O substrato multi-ativo que remove essa limitação foi lançado na v0.5.0 nas duas engines: uma camada panel (detecção de regime cross-asset, baskets long/short, sizing por equal-risk-contribution, neutralizações beta / dólar / sigma, restrições de portfólio) mais primitivas de pairs e carry, sobre um trade-ledger por-leg redesenhado que carrega leg id, trade-group id e uma decomposição completa de custos (fee, slippage, funding, bruto e líquido) satisfazendo bruto − custos = líquido até tolerância de ponto flutuante.
Cada primitiva é espelhada Python ↔ Rust e exercida por seu próprio gate de paridade no CI, com a mesma disciplina das superfícies originais, oito superfícies agora concordam dentro de 1e-3 (contagem de trades exata). A saída de ativo único é byte-idêntica à do release anterior. A pesquisa de estratégias proprietária que roda sobre esse substrato permanece privada; o release público é a capacidade da engine, não as estratégias.
Fase 08 · Concluída · byte-exata e com gate no CI (lançada na v0.5.0)
Superfície de paridade quádrupla (regime + WFO + forex + session)
O record publicado de paridade cobria três superfícies; a combinação quádrupla, regime + WFO + forex + session, era a que faltava, e agora está fechada. Ao investigar a divergência do combo, encontraram-se duas causas. A dominante era um descasamento no harness, não um bug de engine: o driver do combo alimentava as duas engines com knobs de seleção diferentes (mínimo de trades e otimização de risk-to-reward são constantes de compilação no lado Rust, mas estavam sendo sobrescritos no lado Python), então a fase in-sample escolhia um lookback diferente.
O resíduo eram três divergências na barra de fim de sessão no core Rust: na última barra em-sessão do dia ele deixava um sinal de flip oposto abrir posição, nunca bloqueava uma nova entrada, e rodava a checagem intrabar de stop/alvo, enquanto a engine de referência força o fechamento incondicionalmente e pula a checagem de stop/alvo ali. Alinhar os três (totalmente protegido pela flag de sessão, então as superfícies de feature única ficam byte-idênticas) torna o combo byte-exato em todos os estágios. Agora roda como uma quarta superfície de paridade com gate no CI, encolhendo o footprint não-verificado-divulgado-honestamente para Windows MSVC.
Fase 09 · Concluída · mirror em Rust entregue e verificado em paridade
Deflated Sharpe Ratio em Rust
O utilitário de DSR (Bailey & López de Prado 2014) era só em Python porque depende da distribuição normal do scipy e é invocado uma vez por trajetória de otimização, não por barra. Agora está espelhado em Rust atrás de uma feature flag leve, com a mesma disciplina de paridade aplicada à sua saída escalar: um harness dedicado alimenta fixtures idênticas de (Sharpe, trial-Sharpes, retornos), incluindo casos assimétricos, de cauda pesada e todos os casos-guarda degenerados, para as duas implementações e confirma concordância no Sharpe-máximo-esperado e no Sharpe deflacionado dentro da tolerância padrão, e de fato abaixo de 1e-9 em todos os casos finitos, já que ambos são fechados em forma.
A CDF normal e sua inversa vêm de um crate de estatística confiável que casa com o scipy em cerca de 1e-12; a aproximação grosseira da função-erro usada em outras partes do port é deliberadamente não reusada, porque seu erro de cauda corromperia o termo de Sharpe-máximo-esperado no quantil relevante. O benefício é um deploy só-Rust que computa diagnósticos de Sharpe deflacionado sobre suas próprias trajetórias de otimizador sem round-tripping pelo Python.
Reprodutibilidade
quant-research-framework
Python · Apache-2.0 · DOI 10.5281/zenodo.19798594
quant-research-framework-rs
Rust · Apache-2.0 · DOI 10.5281/zenodo.19798592
Reproduzir a paridade em 5–10 minutos
git clone …/quant-research-framework
git clone …/quant-research-framework-rs
cd quant-research-framework-rs
cargo build --release
QRF_PY_DIR=../quant-research-framework \
python tools/parity_check.py --tol 0.001
QRF_PY_DIR=../quant-research-framework \
python tools/parity_regime.py --tol 0.001
QRF_PY_DIR=../quant-research-framework \
python tools/parity_forex.py --tol 0.001
