Carlos
Altamirano
Applied AI Builder with 7 years in finance and valuations — MBA, Industrial Engineer. Shipping AI products that measure, model, and accelerate how businesses work.
— C. Altamirano · 2026 —
Business Analyst and AI Builder with 7+ years in banking and valuations, based in Vancouver (Permanent Resident). I ship production AI systems — Vantage (Vancouver real-estate explorer, PostGIS + Mapbox), FlowLens (process mining, PM4Py + LLM), FinSight Pro (multi-agent LangGraph with pgvector RAG over SEC filings), CleanTably (live SaaS, 100% pipeline success). Finance depth most AI builders don't have ($500M restructured, 500+ valuations, MBA), production shipping most analysts don't have. That's the edge I bring.
Four side projects — each closes a specific technical gap most analyst portfolios can't.
Vantage
Walks any Vancouver lot backward through 11 years of changes
Stack
PostGIS
GeoPandas
DuckDB
Mapbox GL
TanStack Query
The gap
When an analyst searches for "707-833 Seymour Street", every public tool gives them a row of numbers. None gives them the picture: where the lot sits, what surrounds it, how the value moved year-over-year, and what stood on the parcel before today's building. The same workflow that takes ten minutes across BC Assessment, Google Maps, and a spreadsheet should take one click on a map — and the data already supports it. What's missing is the interactive lot-level interface that ties the rows to the geography (PostGIS + Mapbox GL).
What I built
Three steps: (1) for every parcel polygon today, spatially join all historical PIDs whose centroids fall inside it (PostGIS + GeoPandas) — that's the lot's full title history, no precomputed tree needed; (2) diff the PID set year-over-year to detect 5 event types — subdivision, merger, demolition, new construction, churn — stored in a `site_events` table; (3) when an analyst clicks a parcel (Next.js + TanStack Query), the right-side drawer shows both the legal title's 11-year sparkline AND the physical lot's aggregated curve with every structural event labeled inline.
Key decision
Used the 2026 parcel polygon as the geometry for every historical year, instead of buying or inferring historical boundaries. A demolished house's lat/long still falls inside today's condo polygon — so spatial containment recovers the lineage at zero cost. The trade-off: a "how the lot looked in 2018" map view is impossible without inferred boundaries (Phase 2). For the analytical question — what was here before — the simpler model is correct.
Lessons learned
First lineage pass tried to precompute a parent/child tree of every subdivision — fragile, every BCA refresh broke it. Replaced with on-query spatial joins against current polygons → lineage becomes a derived view, never a stored truth that drifts.
FinSight Pro
Routes information across extense datasets and long documents
Stack
LangGraph
pgvector
voyage-finance-2
BM25
Ragas
The gap
Most RAG systems treat every question the same: vector-search the docs, return the top chunks. But real questions split into types — "what's the number" needs a database query, "what does the filing say about X" needs document search, "is this risky" needs both plus rules. One pipeline can't serve all three without inventing answers. You need a router that picks the right tool per question — multi-agent routing (LangGraph).
What I built
Three steps: (1) a router (LangGraph + Gemini 2.0 Flash) sends each question to the right specialist — numbers, text, comparison, or risk; (2) text questions run two searches in parallel — finance-trained embeddings (voyage-finance-2) and keyword search for tickers — then merge the rankings; (3) risk questions run 6 hard-coded financial rules on the actual numbers, with no AI, so the verdict is always reproducible.
Key decision
The risk score doesn't use AI at all. It runs 6 fixed rules on the actual numbers and outputs the same answer every time. An LLM would write a nicer-sounding explanation, but it could also change its mind between two runs of the same question — and an analyst defending a recommendation can't have that. The trade-off: the output reads like a checklist, not a story.
Lessons learned
First run used text-embedding-3-small + high-k retrieval → Ragas Context Precision 0.44 on finance queries. Switched stack after measuring, not after reading a blog.
FlowLens
Finds bottlenecks in event logs
Stack
PM4Py
FastAPI
polars
Gemini 2.0 Flash
React Flow
The gap
Dashboards show you that something is slow. They don't show you where the bottleneck lives or why cases skip steps. With 100k+ events, only process mining (PM4Py) can reconstruct the real path.
What I built
Three steps: (1) rebuild the actual process from raw event logs (PM4Py), (2) rank the slowest steps by worst-case time — not averages, so the long-tail problems don't hide, (3) an AI layer (Gemini 2.0 Flash) explains why each bottleneck happens, using only the numbers (never the raw graph) so it can't make things up.
Key decision
The AI never sees the actual process map — it only gets 8 summary numbers. That way it can't invent steps that don't exist, and every run costs less than a cent. The trade-off: the AI can't reason freely about the shape of the process, only about the numbers it's given.
Lessons learned
Per-activity LLM prompts on every transition → cost 8× and findings got noisier. Reverted to aggregated-metric summary only.
CleanTably
Turns any document into a clean, ready-to-use Excel sheet
Stack
FastAPI
Gemini 2.0 Flash
OpenRouter
Railway
Cloudflare R2
The gap
Most PDF scanners (Adobe, Klippa) work fine when the document is clean and predictable — a printed invoice, fixed layout. They break the moment a page is stamped, rotated, photographed, or written in two currencies. About 3 in 10 real-world documents hit one of those cases, and a bookkeeper ends up retyping anyway. To skip the cleanup step entirely, you need a model that reads the page directly, the way a human does — vision-capable LLMs (Gemini 2.0 Flash via OpenRouter).
What I built
Three steps: (1) look at the first page and classify it across 7 document types (Gemini 2.0 Flash); (2) pull the fields into a clean table using a prompt tuned to that type, chunking long PDFs and stitching the output into one Excel sheet; (3) when the model's reply comes back broken — missing brackets, stray formatting — 5 local repair tricks fix it before paying for a second model call. Total cost stays at $0.0002 per document.
Key decision
The whole pipeline reads PDFs through Gemini 2.0 Flash — no OCR step in front, the model sees the page exactly as a person does, stamps and rotations included. And every call goes through OpenRouter.
Lessons learned
Async batch processing for 20+ page PDFs → Railway's 5-min timeout killed jobs silently. Rewrote to synchronous 12-page chunks with explicit progress.
A
AI & LLMs
07- LangGraph
- RAG / pgvector
- Claude API
- Multi-agent systems
- Prompt Engineering
- OpenRouter
- AI model evaluation
E
Engineering
07- Python
- FastAPI
- SQL (Advanced)
- JavaScript
- HTML / CSS
- Cloudflare Pages
- Railway · CI/CD
F
Finance & Analytics
07- Financial Analysis (7y)
- Portfolio Management
- Asset Valuation
- Risk Assessment
- Excel / Dashboards
- Credit Analysis
- KPI Design
Loan Portfolio▲ restructured
$500M
150,000 accounts / 3 months
Events Analyzed4 datasets
1.8M
FlowLens · compliance to ITSM
AI Appsin production
3
FinSight · CleanTably · FlowLens
Experienceyears
7 yrs
Finance × AI
Mar 2024 —
Present
Present
Valuations Analyst
Verus Valuations Ltd · Maple Ridge, BC
- Led $25M fleet appraisal — 80 Caterpillar units, team of 3 analysts, bank-grade deliverables
- 500+ individual heavy equipment valuations for banking credit decisions
- Promoted within 11 months on manager recommendation
- Designed a 3-phase AI automation prototype — own initiative
2017 — 2021
Collections Strategy → Jr. Manager
BanBif · Lima, Peru
- Managed analytics and strategy for $30M portfolio of 25,000+ delinquent accounts
- Co-developed $500M COVID loan restructuring covering 150,000 accounts in 3 months
- Built SQL pipelines for daily portfolio segmentation, targeting and KPI reporting
- Promoted to Junior Manager within the same department
2015 — 2017
Intern — Credit Risk
Banco de Crédito BCP · Lima, Peru
- Managed real estate appraisal process for 100+ properties valued at $75M
- Coordinated 20+ external appraisal firms across the country
'23Master
MBA — Business Administration
University Canada West · Vancouver, BC
'20Master
Master · Customer Intelligence
Master School UTP · Lima, Peru
'17Bachelor
B.Sc. Industrial Engineering
Universidad de Lima · Peru
Let's work.
caltamiranocampos@gmail.com · Vancouver, BC · © 2026