PythonDoubleML
LightGBMStreamlit
uvPytestMyPy
Tells a pricing team what a price change would actually cost them in sales, separating real
customer response from the brand loyalty and competitor discounting that make raw sales data
misleading — and lets them test a scenario in a dashboard before committing to it.
Identifies the true causal effect of pricing on purchase probability by stripping high-dimensional
confounding from observational retail data — a 10-cent price increase lowers purchase probability by
~5.6 percentage points (θ₀ = -0.5570, p = 1.79 x 10⁻⁸; a local slope, not a
dollar-scale extrapolation — observed prices span $1.69-$2.09), robust to unobserved confounders
explaining up to ~14.9% of residual treatment variance before the effect is nulled.
- Engineered a Partially Linear Regression estimator with LightGBM nuisance learners and cross-fitting to recover orthogonal, bias-resistant causal effects.
- Quantified estimator fragility with Omitted Variable Bias sensitivity bounds, exposing exactly how much unobserved confounding the causal claim could tolerate.
- Architected a strictly typed
src/ layout with deterministic uv locking, Ruff/MyPy CI gates, and a Streamlit scenario simulator serving live pipeline artifacts.
PythonMAPIE
DockerPlotly
uvPytest
Turns a single-number electricity demand forecast into an honest best-case/worst-case range that
planners can size capacity and hedging decisions against — one that tightens or widens on its own
when demand becomes volatile, instead of quietly going stale.
Delivers mathematically guaranteed prediction intervals for volatile energy demand series — the
Adaptive Conformal Inference layer tracks the target 90% coverage rate to within
0.4 percentage points empirically, versus a 2.7-point excess-conservatism
gap for a static conformal baseline, trading band width for a tighter, more honest read on realized risk
instead of defaulting to blanket over-coverage.
- Implemented EnbPI with block-bootstrap residuals to preserve chronological exchangeability where standard conformal methods break down on time series.
- Corrected a coarse-grained Adaptive Conformal Inference update to a per-timestep Gibbs & Candes formulation, restoring true reactivity to regime shifts and shocks.
- Containerized the full inference stack with Docker and validated it end-to-end via an automated smoke-test script covering builds, health checks, and live serving.
P03
GARCH-EVT Risk Engine — Azure Production Pipeline
View repo
Azure SQLTerraform
GitHub Actions OIDCPandera
archSciPy
Runs unattended every day to answer one question for anyone exposed to Finnish electricity prices —
how bad could a bad day get — and refuses to publish a number when the data is incomplete or the
model has stopped tracking reality.
An early out-of-sample Kupiec backtest correctly flagged under-coverage (8 breaches vs.
2.44 expected at 99% confidence, p = 0.0047); root-causing it to a KS-based threshold
selector blind in the tail led to a parameter-stability selection method that resolved
282/282 rolling fits with zero fallbacks and restored coverage
(p = 0.5064 — different evaluation period than the original run; not a controlled
before/after, see devlog) — documented end to end in the project devlog.
- Re-architected a local research pipeline into a passwordless, zero-secret Azure deployment: Terraform-provisioned Azure SQL Serverless, Blob-backed remote state, and GitHub Actions authenticated entirely via OIDC federated credentials.
- Built an idempotent ingestion layer (staging table + T-SQL
MERGE) with Pandera contracts enforcing gapless, timezone-aware hourly data — with exponential backoff to survive Azure SQL Serverless cold starts (error 40613).
- Fitted a rolling GJR-GARCH(1,1,1) + Peaks-Over-Threshold EVT engine with daily automated Kupiec, Christoffersen, and Acerbi-Szekely backtests; the pipeline hard-fails on data gaps or convergence errors rather than silently dropping days.
- Diagnosed and resolved three distinct Azure/ODBC/SQLAlchemy production issues (OIDC subject-claim mismatch, driver auth keyword collision, SQL type inference bug) — documented in a running devlog.