status: available for work

Valtteri Murtomäki

Quantitative Analyst — Risk Modelling

I build statistical models that answer decisions, not just questions: what a price change really costs in sales, how wrong a demand forecast could be, how bad a bad day on electricity prices gets. Each one ships as a typed, tested, containerized system — not a notebook.

Statistics & Modelling

Time Series & Volatility Modelling (GARCH) Extreme Value Theory Causal Inference (Double ML) Conformal Prediction Model Validation & Backtesting Bayesian Inference

Languages & Tools

Python SQL / T-SQL R Pandas / NumPy / SciPy Scikit-learn LightGBM Streamlit / Plotly

Cloud & Engineering

Azure SQL Terraform Docker GitHub Actions (OIDC) Pytest MyPy (strict) / Ruff uv
// case studies

Selected Work

Three projects spanning causal inference, uncertainty quantification, and tail-risk forecasting.

P01

Causal Pricing Engine

View repo
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.
P02

Adaptive Conformal Forecasting

View repo
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.