Oracle3
Oracle3: 예측시장 거래 엔진·MCP 서버
B3 기준금리(DI·프리·환율·IPCA 등) 금리곡선을 일일 이력, 역조회, 시장가격표시, CDI 보정, 대출 시뮬레이션과 함께 제공합니다
Curvas de juros das Taxas Referenciais da B3 (DI x pré, cupom cambial, IPCA e todas as demais), com histórico diário, consulta retroativa, marcação a mercado, correção CDI e simulação de empréstimos.
금융TypeScript · JavaScriptGitHub @dfg-dexterity온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Curvas de Mercado Interpolada
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Produção: — Vercel (time diegogozers-projects, projeto project-c9zq2 reaproveitado) + Supabase Postgres (curvas-b3, sa-east-1). O deploy foi feito por upload de arquivos (o token da integração não cria projetos); cron diário registrado em vercel.json roda ~21h30 (São Paulo) em dias úteis. Diagnóstico de captura: GET /api/debug/b3?secret=$CRON_SECRET&date=AAAA-MM-DD. Dashboard de curvas de juros com todas as Taxas Referenciais publicadas pela B3 (página oficial): DI x pré, cupom cambial, DI x IPCA, DI x IGP-M, Selic x pré, TR, cupons de moeda e as demais.README 전문 보기 ↗
Produção: https://project-c9zq2.vercel.app — Vercel (time
diegogozers-projects, projetoproject-c9zq2reaproveitado) + Supabase Postgres (curvas-b3, sa-east-1). O deploy foi feito por upload de arquivos (o token da integração não cria projetos); cron diário registrado emvercel.jsonroda ~21h30 (São Paulo) em dias úteis. Diagnóstico de captura:GET /api/debug/b3?secret=$CRON_SECRET&date=AAAA-MM-DD.
Dashboard de curvas de juros com todas as Taxas Referenciais publicadas pela B3 (página oficial): DI x pré, cupom cambial, DI x IPCA, DI x IGP-M, Selic x pré, TR, cupons de moeda e as demais.
┌────────────┐ cron diário / CLI ┌──────────────┐
│ B3 (site) │ ◄───────────────────── │ Ingestão │──► Postgres (RateType,
│ Taxas │ on-demand (retro) │ src/lib/ │ CurvePoint, FetchLog)
│ Referen. │ ◄───────────────────── │ ingest.ts │ │
└────────────┘ └──────────────┘ ▼
API (Next.js routes)
│
▼
Dashboard (React)
A fonte é o endpoint público de Taxas Referenciais BM&F
(www2.bmf.com.br/pages/portal/bmfbovespa/lumis/lum-taxas-referenciais-bmf-ptBR.asp),
que aceita qualquer data histórica (Data=DD/MM/AAAA, Data1=AAAAMMDD, slcTaxa=CODIGO)
— é o mesmo dataset exibido na página nova de Taxas de Referência da B3.
O parser (src/lib/b3/parse.ts) é defensivo contra variações do HTML antigo
(tabelas aninhadas, cabeçalhos com rowspan, decimais pt-BR, latin1) e classifica cada captura em
OK, EMPTY (feriado/sem publicação — mensagem oficial da B3) ou ERROR (re-tentável).
Requisitos: Node 20.19+, Docker (para o Postgres local).
cp .env.example .env # ajuste se necessário
npm install # roda prisma generate no postinstall
npm run db:up # Postgres via docker compose
npm run db:migrate # aplica as migrações
npm run dev # http://localhost:3000
Na primeira visita a UI já funciona: a lista de taxas é semeada e a curva do último dia útil é buscada da B3 na hora. Para popular o histórico:
# captura o dia atual + últimos 5 dias úteis de todas as taxas
npm run job:daily
# preenche um período (reexecutável; datas já capturadas são puladas)
npm run job:backfill -- --from=2024-01-02 --to=2024-12-30
npm run job:backfill -- --from=2015-01-02 --rates=PRE,DIC,DOC # só algumas taxas
Diagnóstico da comunicação com a B3 (não grava nada):
npm run probe -- --date=2024-06-14 --rate=PRE --save=pagina.html
No Vercel (recomendado): o vercel.json já define o cron 30 0 * * *
(00:30 UTC = 21:30 em São Paulo, após a publicação das taxas do dia) chamando
/api/cron/daily. Configure as variáveis:
| Variável | Valor |
|---|---|
DATABASE_URL | Postgres (Supabase/Neon; com Supabase use o pooler em modo transação, porta 6543) |
CRON_SECRET | segredo forte — o Vercel envia Authorization: Bearer $CRON_SECRET automaticamente |
O job é idempotente e incremental: reprocessa apenas (taxa × data) pendentes dos
últimos JOB_CATCHUP_BDAYS (padrão 5) dias úteis, então execuções interrompidas ou
duplicadas convergem sozinhas. No plano Hobby a duração de função é limitada — se a
primeira execução não concluir, as seguintes continuam de onde parou (ou rode
npm run job:daily uma vez para aquecer).
Fora do Vercel: agende npm run job:daily (cron do sistema, systemd timer,
GitHub Actions etc.) num ambiente com DATABASE_URL. Exemplo de crontab:
30 21 * * 1-5 cd /app/curvas && npm run job:daily >> /var/log/curvas.log 2>&1
| Endpoint | Descrição |
|---|---|
GET /api/rates | Taxas conhecidas + cobertura no banco (de/até, nº de datas) |
GET /api/curves?rate=PRE&date=2020-05-15 | Curva da taxa na data; se faltar no banco, busca na B3 e grava (fetch=0 desativa) |
GET /api/curves/compare?rate=PRE&dates=2024-01-15,2020-01-15 | Até 6 datas da mesma taxa |
GET /api/history?rate=PRE&days=365&from=…&to=… | Série temporal de um prazo fixo (interpolação linear; só usa o banco) |
GET /api/cron/daily | Dispara o job (exige Authorization: Bearer CRON_SECRET ou ?secret=) |
Respostas de curva incluem status (OK/EMPTY/ERROR), source (db/b3) e,
quando vazio, nearestAvailable (data mais próxima com dados).
RateType — código slcTaxa (PK), nome exibido na B3, active, primeiro/último avistamento.CurvePoint — PK composta (rateCode, date, days); rate252 e rate360
em DECIMAL(12,6) (% a.a.), nulos quando a curva não publica a base.FetchLog — resultado de cada captura (taxa × data): status, nº de pontos, mensagem.
É o que torna jobs/backfills reexecutáveis e evita re-consultar feriados antigos.npm test # parser (fixtures do HTML da B3), calendário B3, interpolação, concorrência
npm run lint
npm run build
User-Agent de navegador já é enviado). B3_TR_URL permite apontar para um mirror/proxy.ERROR (re-tentáveis, visíveis no
FetchLog) em vez de gravar dados errados; use npm run probe para inspecionar e ajustar o parser.active=false e o
histórico permanece consultável.