Excel Add-in

Bloomberg-style formulas for energy market data. Live cell functions, change tracking, new data alerts. Not Power Query — real formulas that update in place.

77 functions · C# ExcelDNA · .NET 8 · Arrow Flight + lz4 compression

Can I use the Excel Add-in without the EnergyScope data layer?

Yes — for data. The add-in can connect directly to your Snowflake for all data functions (ES.Get, ES.Table, ES.ColX, ES.Latest, ES.Search, batching, change tracking, weekly→monthly synthesis). Analytics functions (ES.Forecast, ES.Spread, ES.CrackSpread, ES.Percentile, ES.Seasonal, ES.TermStructure, ES.Breakpoints, ES.Volatility, ES.ARIMA, ES.Prophet, etc.) run on the EnergyScope Flight server and require an API key.

Start free with Snowflake direct for data access. Add the EnergyScope data layer for analytics, shared caching, per-user alerts, and 95% less Snowflake cost.

What makes it different

The only Excel add-in that connects to Snowflake using Arrow Flight — the fastest data transport protocol available. Not accessible to Excel users any other way.

ES.ColX — Intelligent Data Insertion

Writes data cell-by-cell with change tracking, weekly→monthly synthesis, Prophet forecasts, and automatic breakpoint detection — all in one column. Only changed cells are written — no screen flicker.

Cell B5: 72.10 │ green = actual monthly data Cell B8: 74.85 │ blue = synthesised from weekly Cell B11: 76.30 │ orange italic = Prophet forecast Cell B3: 68.20 │ orange border + comment: "Breakpoint: Before: 75.2 → After: 58.1, Shift: -17.1" Cell B5: 72.10 │ comment: "Before: 71.95 → Now: 72.10" Status bar: EnergyScope: 204 series, 12 new, 2 breakpoints ✓

ES.NewData — Know Before You Refresh

Checks every 30 seconds if your series have new data. The ribbon shows "NEW DATA (3)" in bold. You decide when to refresh — no surprises, no stale data.

Ribbon: NEW DATA (3) | Last check: 14:32:05 Series with updates: PET.RWTC.D last: 2026-03-28 → 2026-03-31 PET.RBRTE.D last: 2026-03-28 → 2026-03-31 NG.RNGWHHD.D last: 2026-03-27 → 2026-03-31

Single-Call Batching

200 formulas on a sheet? One gRPC call fetches all 200 series. 200ms debounce collects everything, one batch, one network round trip. The server knows your history and pre-fetches your data before you even click Refresh.

Without batching: 200 series × 1 call each = 200 round trips = minutes With EnergyScope batching: 200 series → 1 call → 83,490 rows → 86ms Compression: Arrow IPC + lz4 = 3.5x smaller on the wire

All 64 functions

SF-DIRECT OR FLIGHT · 19 FUNCTIONS

Data retrieval, date alignment, utilities, settings. Work whether you connect to your own Snowflake or to the EnergyScope Flight server.

FLIGHT SERVER ONLY · +45 FUNCTIONS

Analytics run server-side (statsmodels, scipy, arch, Prophet, ruptures, sklearn). Require an EnergyScope Flight API key.

Data Retrieval SF-direct or Flight

=ES.Get(series, start, end)
Fetch time series data. Spills period + value columns.
=ES.Get("PET.RWTC.D", "2024-01-01", "2024-12-31")
=ES.Table(series_range, start, end, fill, freq)
Pivoted table — dates as rows, one column per series. Multiple fill and interpolation methods. Frequency control.
=ES.Table(B1:Z1, "2000-01-01", , "ffill", "M")
=ES.ColX(series, weekly, start, end, freq, mode, data_row, forecast, breakpoints)
Formatted column with change tracking, forecasts, and breakpoint detection. Three data types in one column: green = actual monthly, blue = synthesised from weekly, orange italic = Prophet forecast. Optional breakpoint comments auto-detect regime changes. (Base column works in SF-direct; forecast & breakpoint overlays require Flight server.)
=ES.ColX("PET.WCESTUS1.M", "PET.WCESTUS1.W", "2020-01-01", , "M", , 5, 3, TRUE)
=ES.Col(series, dates_range, fill)
Single data column aligned to a date range. Auto-synthesises weekly data into monthly when dates are monthly. Flow series = day-weighted average, stock series = last value + interpolation nudge.
=ES.Col("PET.WCESTUS1.W", A2:A300) — weekly stocks shown as monthly
=ES.Dates(start, end, freq)
Generate a date column. D, W, M, ME, Q, A frequencies.
=ES.Dates("2020-01-01", "2024-12-31", "M")
=ES.Monthly(series, dates_range)
Synthesised monthly from monthly + weekly data. Flow = day-weighted avg, stock = last value + nudge.
=ES.Monthly("PET.WCESTUS1.W", A2:A300)
=ES.GetMulti(series_range, start, end)
Fetch multiple series from a vertical range of IDs.
=ES.GetMulti(A1:A10, "2024-01-01")
=ES.Fetch(series, start, end)
Synchronous fetch for VBA macros. Blocks until done.
=ES.Fetch("PET.RWTC.D", "2024-01-01")

Fill & Interpolation Options

ES.Table, ES.Col, ES.ColX, and ES.Interpolate all accept a fill parameter to control how missing values are handled.

FillMethodBest for
"ffill"Forward-fill last known value (default, like Bloomberg BDH)Most use cases — carry forward until new data
"linear"Linear interpolation between known valuesSmooth gaps in regularly-spaced data
"log-linear"Log-linear interpolation (exponential growth)Price data, indices, ratios
"spline"Cubic spline (Catmull-Rom) — smooth curves through known pointsSmooth series with few gaps
"blank"Empty cellsShow gaps explicitly
"#N/A"#N/A errorsPropagate errors in downstream formulas
0Fill with zero (or any number)Accumulations, sums

Interpolation runs server-side — all clients (Excel, Python, C#) get the same results. Use =ES.Interpolate() for standalone gap-filling with interpolated flag per value.

Weekly → Monthly Synthesis

ES.Col and ES.ColX automatically synthesise weekly data into monthly when your date column is monthly. Drop a weekly series column next to, or inline with, your monthly columns — it just works.

TypeMethodExample
Flow (production, imports)Day-weighted average across month boundariesWeekly crude imports → monthly average
Stock (inventories, levels)Last weekly value + interpolation nudge (trading desk algorithm)Weekly crude stocks → month-end level

Synthesised values are highlighted in blue (ES.ColX) so analysts know which numbers are derived vs reported. Mix weekly and monthly series freely in the same workbook.

Discovery & Monitoring SF-direct or Flight (except ES.FetchSearch)

=ES.Search(query)
Search 2.8M series by keyword. Returns series_id, name, units, frequency.
=ES.Search("crude oil")
=ES.NewData(series_range, date_cell, interval)
TRUE if server has newer data than your last refresh. Rechecks every N seconds.
=ES.NewData(W1:BA1, T5, 30)
=ES.Latest(series)
Latest value for one or more series. Period, value, name, units.
=ES.Latest("PET.RWTC.D, PET.RBRTE.D")
=ES.LastDate(series_range)
Latest data date across a range of series.
=ES.LastDate(W1:BA1)
=ES.FetchSearch(query)
Synchronous search for VBA.
=ES.FetchSearch("henry hub")
=ES.Registered()
Show all registered series and their last data dates.
=ES.Registered()

Time Series Handling Flight server required

=ES.Transform(series, operation, window)
Time series transforms — diff, pct, log, logdiff, lag, ma (moving average), ema (exponential MA), cumsum, zscore. Window parameter for ma/ema/lag.
=ES.Transform("PET.RWTC.D", "ma", 20)
=ES.Smooth(series, horizon, method)
Exponential smoothing with forecast. Single, double, Holt-Winters, or ETS (auto-select). AIC model selection.
=ES.Smooth("PET.RWTC.D", 12, "holt-winters")
=ES.HPFilter(series, start, end)
Boosted Hodrick-Prescott filter. Separates trend from cycle — iterated until cycle is stationary.
=ES.HPFilter("PET.RWTC.D", "2015-01-01")
=ES.BandPass(series, low, high, method)
Band-pass filter — extract cycles at specific frequencies. Baxter-King or Christiano-Fitzgerald (default). Isolate 6–32 period business cycles.
=ES.BandPass("PET.RWTC.M", 6, 32, "cf")
=ES.Seasonality(series, start, end)
Seasonal decomposition — trend, seasonal, and residual components. Multiplicative for price data, additive otherwise.
=ES.Seasonality("PET.WGTSTUS1.W")
=ES.Interpolate(series, method)
Fill missing values — linear, log-linear, spline (Catmull-Rom), or cardinal interpolation. Flags which values were interpolated.
=ES.Interpolate("PET.RWTC.D", "spline")
=ES.UnitRoot(series, test, start, end)
Unit root tests — is this series stationary? ADF, KPSS, Phillips-Perron, or all. Consensus vote across tests.
=ES.UnitRoot("PET.RWTC.D", "all")
=ES.Cointegration(series_range, method)
Cointegration test — do WTI and Brent move together long-term? Johansen (multivariate) or Engle-Granger (bivariate).
=ES.Cointegration("PET.RWTC.D, PET.RBRTE.D")
=ES.ACF(series, nlags, start, end)
Autocorrelation (ACF), partial autocorrelation (PACF), and Ljung-Box Q-statistics. Helps pick ARIMA orders.
=ES.ACF("PET.RWTC.D", 20)
=ES.Outliers(series, method, threshold)
Outlier detection — Z-score, IQR, or Isolation Forest. Flag bad data points in EIA releases.
=ES.Outliers("PET.RWTC.D", "zscore", 3)
=ES.Breakpoints(series, n_bkps, start, end)
Structural break detection — find regime changes (COVID crash, Ukraine war, OPEC cuts). Auto or fixed count.
=ES.Breakpoints("PET.RWTC.D")

Analytics Flight server required

=ES.Forecast(series, target, horizon, method, engine, start, end)
Multi-factor regression forecast. XGBoost default (R²=0.97). Auto-forecasts predictors with ARIMA + Prophet. Shows both engines side-by-side. See backtests →
=ES.Forecast("PET.RWTC.D, PET.WCESTUS1.W, PET.WGTSTUS1.W", "PET.RWTC.D", 12)
=ES.Theta(series, horizon, start, end)
Theta method — M3 forecasting competition winner. Simple, fast, surprisingly hard to beat. Best monthly benchmark (RMSE $1.05).
=ES.Theta("PET.RWTC.D", 12)
=ES.Stats(series, start, end)
Descriptive statistics — min, max, mean, median, stdev, skewness, kurtosis, percentiles, total return.
=ES.Stats("PET.RWTC.D", "2020-01-01")
=ES.Corr(series_range, start, end)
Pairwise correlation matrix for multiple series. Aligned on common periods.
=ES.Corr("PET.RWTC.D, PET.RBRTE.D, PET.EER_EPJK_PF4_RGC_DPG.D", "2020-01-01")
=ES.ARIMA(series, horizon, start, end)
Auto-fit ARIMA with N-period forecast and 95% confidence intervals. Tries 9 model orders, picks lowest AIC.
=ES.ARIMA("PET.RWTC.D", 30)
=ES.Prophet(series, horizon, holidays, seasonality, changepoints, growth)
Facebook Prophet forecast with full parameter control. Country holidays (US, UK, DE), additive/multiplicative seasonality, changepoint sensitivity, linear/logistic growth. Returns forecast + confidence intervals + trend components.
=ES.Prophet("PET.RWTC.D", 30, "US", "multiplicative", 0.1)
=ES.Volatility(series, window, start, end)
Rolling + GARCH(1,1) conditional volatility, annualised. Configurable window (default 20).
=ES.Volatility("PET.RWTC.D", 20, "2020-01-01")
=ES.Returns(series, start, end)
Log returns, cumulative returns, and drawdown analysis. Max drawdown with peak/trough dates.
=ES.Returns("PET.RWTC.D", "2020-01-01")
=ES.VAR(series_range, lags, start, end)
Vector Autoregression with impulse response functions and Granger causality tests. "What happens to gasoline if crude spikes?"
=ES.VAR("PET.RWTC.D, PET.RBRTE.D, PET.EER_EPJK_PF4_RGC_DPG.D")
=ES.ElasticNet(series_range, target, alpha)
Elastic net regression with variable selection. Which series predict the target? Ranked by coefficient strength.
=ES.ElasticNet(A1:A10, "PET.RWTC.D", 1.0)
=ES.QuantileReg(series, lags, start, end)
Quantile autoregression — conditional quantile estimates (5th, 25th, 50th, 75th, 95th) for tail risk analysis.
=ES.QuantileReg("PET.RWTC.D", 1)
=ES.BubbleTest(series, start, end)
GSADF test for explosive bubbles (Phillips, Shi & Yu 2015). Detects start/end of speculative episodes.
=ES.BubbleTest("PET.RWTC.D")
=ES.LPIRF(series_range, shock, response, horizons)
Local Projection Impulse Response (Jordà 2005). Non-parametric IRF — more robust than VAR for nonlinear dynamics.
=ES.LPIRF("PET.RWTC.D, PET.EER_EPJK_PF4_RGC_DPG.D", "PET.RWTC.D", "PET.EER_EPJK_PF4_RGC_DPG.D")
=ES.MIDAS(low_freq, high_freq, start, end)
MIDAS mixed-frequency volatility — use daily returns to forecast monthly vol. Realized variance decomposition.
=ES.MIDAS("PET.RWTC.M", "PET.RWTC.D")
Outlier detection — Z-score, IQR, or Isolation Forest. Flag bad data points in EIA releases.
=ES.Outliers("PET.RWTC.D", "zscore", 3)
=ES.HPFilter(series, start, end)
Boosted Hodrick-Prescott filter. Separates trend from cycle — iterated until cycle is stationary.
=ES.HPFilter("PET.RWTC.D", "2015-01-01")
=ES.Breakpoints(series, n_bkps, start, end)
Structural break detection — find regime changes (COVID crash, Ukraine war, OPEC cuts). Auto or fixed count.
=ES.Breakpoints("PET.RWTC.D")
=ES.ElasticNet(series_range, target, alpha)
Elastic net regression with variable selection. Which series predict the target? Ranked by coefficient strength.
=ES.ElasticNet(A1:A10, "PET.RWTC.D", 1.0)
=ES.QuantileReg(series, lags, start, end)
Quantile autoregression — conditional quantile estimates (5th, 25th, 50th, 75th, 95th) for tail risk analysis.
=ES.QuantileReg("PET.RWTC.D", 1)
=ES.BubbleTest(series, start, end)
GSADF test for explosive bubbles (Phillips, Shi & Yu 2015). Detects start/end of speculative episodes.
=ES.BubbleTest("PET.RWTC.D")
=ES.LPIRF(series_range, shock, response, horizons)
Local Projection Impulse Response (Jordà 2005). Non-parametric IRF — more robust than VAR for nonlinear dynamics.
=ES.LPIRF("PET.RWTC.D, PET.EER_EPJK_PF4_RGC_DPG.D", "PET.RWTC.D", "PET.EER_EPJK_PF4_RGC_DPG.D")
=ES.MIDAS(low_freq, high_freq, start, end)
MIDAS mixed-frequency volatility — use daily returns to forecast monthly vol. Realized variance decomposition.
=ES.MIDAS("PET.RWTC.M", "PET.RWTC.D")
=ES.Spread(series_a, series_b, start, end)
Spread analysis between two series. Z-score, percentile, half-life of mean reversion, rolling z. Summary stats + time series.
=ES.Spread("PET.RWTC.D", "PET.RBRTE.D")
=ES.RollingCorr(series_a, series_b, window, start, end)
Rolling correlation with configurable window. Tracks regime shifts in co-movement.
=ES.RollingCorr("PET.RWTC.D", "PET.RBRTE.D", 90)
=ES.CrackSpread(ratio, crude, gasoline, distillate, start, end)
Refining crack spread — 3-2-1, gasoline, or diesel. Defaults to WTI / Gulf gasoline / NY heating oil.
=ES.CrackSpread("3-2-1")
=ES.Changes(series_range, lookback_days, start)
Detect significant changes across multiple series. Ranked by significance, z-score flags outliers.
=ES.Changes(A1:A10, 7)
=ES.Percentile(series, as_of, start, end)
Percentile rank + z-score for a single series. "Is this value high or low?" Quartile breakdown p5–p95.
=ES.Percentile("CFTC.WTI.MM_Net")
=ES.Seasonal(series, lookback_years, start)
Current value vs same-week/month N-year average. Delta, z-score, per-year history. Essential for stocks/production/utilization.
=ES.Seasonal("PET.WCESTUS1.W", 5)
=ES.TermStructure(prefix, n_maturities)
Futures curve shape — contango/backwardation, calendar spreads (M1-M2, M1-M12), roll slope.
=ES.TermStructure("ICE.BRENT")
=ES.Feedback(message, category, context, user)
Send bug report / feature request / question to the team. Writes to server log + push notification.
=ES.Feedback("need crude grades", "data-gap")
=ES.ArbSignal(wti, brent, freight, start)
US crude export arb score (-2 to +2). Combines Brent-WTI spread percentile + tanker freight + ICE Brent curve shape. Extremes flagged.
=ES.ArbSignal()
=ES.CorrelateAll(target, candidates, window, start, end)
Scan many series against a target, rank by rolling correlation. "What tracks WTI best?" Discovery tool.
=ES.CorrelateAll("PET.RWTC.D", A1:A10, 60)
=ES.ForecastEnsemble(series, horizon, start, end)
Theta + ARIMA + Prophet side-by-side with consensus line and model agreement/disagreement signal.
=ES.ForecastEnsemble("PET.RWTC.D", 12)
=ES.MaintenanceSignal(series, mode, scan_weeks, threshold_z)
Detect refinery turnaround events from utilization drops vs trailing trend. Clusters flagged weeks into events.
=ES.MaintenanceSignal("PET.WPULEUS3.W", "trend", 52)
=ES.SndBalance(production, imports, exports, refinery_input, forecast_horizon)
US crude supply & demand balance. Theta forecast per component, implied stock change, scenario pinning.
=ES.SndBalance()
=ES.UpcomingEvents(days)
Catalyst calendar — EIA weekly (Wed/Thu), API (Tue), CFTC (Fri), OPEC, IEA, Fed FOMC, NFP, CPI dates.
=ES.UpcomingEvents(14)
=ES.KeySeries(category)
Cheat sheet of key series IDs. Categories: crude, crude_grades, crude_imports, products, gas, stocks, macro, positioning, freight, curve.
=ES.KeySeries("crude_grades")
=ES.Report(series, preset, start, end)
Full market report with presets: morning, eia_weekly, cftc_weekly, refining, arb, grades, macro, quarterly, regime, storage.
=ES.Report(A1:A16, "morning")

EViews-class analytics, in Excel

All analytics run server-side using statsmodels, scipy, arch, Prophet, ruptures, and scikit-learn — no Python installation needed. Results arrive via Arrow Flight in sub-second times. Analysts get institutional-grade time series analysis without leaving their spreadsheet.

FunctionEngineWhat you get
ES.ARIMAstatsmodels ARIMAAuto model selection (9 candidates), forecast + confidence bands
ES.ProphetFacebook ProphetRobust forecast with trend + seasonality decomposition
ES.Seasonalitystatsmodels seasonal_decomposeTrend, seasonal pattern, residual noise — separated cleanly
ES.Volatilityarch GARCH(1,1) + rollingConditional vol estimate, annualised, with EWMA fallback
ES.MIDASMIDAS realized varianceDaily→monthly mixed-frequency volatility forecast
ES.VARstatsmodels VARImpulse response + Granger causality across multiple series
ES.LPIRFLocal projection (Jordà)Non-parametric IRF — robust to nonlinearity and misspecification
ES.HPFilterBoosted HP filterIterated trend/cycle decomposition — cleaner than standard HP
ES.Breakpointsruptures (PELT/BinSeg)Regime changes with segment means — COVID, wars, OPEC
ES.BubbleTestGSADF (Phillips-Shi-Yu)Explosive bubble detection with episode start/end dates
ES.ElasticNetscikit-learnVariable selection — which series matter for predicting the target?
ES.QuantileRegstatsmodels quantile regConditional quantiles (5th–95th) for VaR and tail risk
ES.OutliersZ-score / IQR / Isolation ForestFlag bad data points in EIA releases automatically
ES.CorrPearson on aligned periodsN×N correlation matrix — WTI vs Brent vs gasoline in one call
ES.Smoothstatsmodels Holt-Winters/ETSExponential smoothing + forecast with auto model selection
ES.BandPassBaxter-King / Christiano-FitzgeraldExtract business cycles at specific frequencies
ES.TransformnumpyDiff, pct, log, logdiff, lag, MA, EMA, cumsum, z-score
ES.Interpolatescipy CubicSplineLinear, log-linear, spline, cardinal interpolation
ES.UnitRootADF / KPSS / Phillips-PerronStationarity testing with consensus across 3 tests
ES.CointegrationJohansen / Engle-GrangerDo WTI and Brent move together long-term?
ES.ACFstatsmodels ACF/PACFAutocorrelation + Ljung-Box Q-stats for ARIMA order selection

History & Management Flight server required (except ES.Server, ES.Key, ES.SFConfig, ES.Refresh)

=ES.History(limit)
Your browsing history — recent activity + per-series access counts.
=ES.History(50)
=ES.HistoryLog(limit)
Flat per-series log with timestamps. Every series, every refresh.
=ES.HistoryLog(500)
=ES.ClearHistory(mode)
Clear history. "all" or specific series IDs.
=ES.ClearHistory("all")
=ES.Refresh()
Force refresh all formulas. Busts cache.
=ES.Refresh()
=ES.BatchLog()
Debug info — batch timing, fetch vs render split, cache hits.
=ES.BatchLog()
=ES.Health()
Server status — series count, data rows, uptime.
=ES.Health()
=ES.Server(address)
Change server endpoint. Or show current.
=ES.Server("http://your-server:8815")
=ES.Key(api_key)
Set or show API key. Saved to registry.
=ES.Key("your-api-key-here")
=ES.SFConfig(account, user, password, database, warehouse)
Configure a direct connection to your own Snowflake account. Credentials saved to the Windows registry. Switches the add-in into Snowflake-Direct mode so all data functions (Get, Table, ColX, Latest, Search) route straight to your warehouse — no EnergyScope server required.
=ES.SFConfig("myorg-account", "analyst", "password", "MY_DB", "MY_WH")

Server endpoints

Switch between servers from the ribbon dropdown. Data refreshes automatically.

ServerAddressUse Case
data (Cloudflare)https://data.energyscope.ioProduction — TLS, port 443, passes firewalls
Snowflake-backedhttp://server:8835Your Snowflake data, accelerated
Local / LANhttp://your-server:8815On-premise, sub-ms latency
Snowflake Directsnowflake://directNo Flight server — straight to Snowflake (for benchmarking)

Under the hood

TechnologyDetails
PlatformC# .NET 8, ExcelDNA 1.9, single packed .xll (32-bit + 64-bit)
TransportArrow Flight (gRPC) with lz4/zstd IPC compression
Batching200ms debounce, all series collected into one gRPC call
CachingPer-epoch cache, pre-fetch on Refresh, series dates tracked per user
AsyncAll functions async via ExcelAsyncUtil — Excel never freezes
CompressionCustom Apache Arrow .NET build (PR #285) — lz4/zstd in Arrow IPC
AuthAPI key via ribbon editbox or =ES.Key(). Saved to registry + workbook.
Snowflake DirectBuilt-in Snowflake .NET connector for direct SQL queries (no Flight server)

Three ways to use it

Start free. Scale when you need to.

Measured: 539 series x 26 years = 189,024 rows

US Distillates Supply & Demand workbook, real EIA petroleum data, April 2026

Mode1st Refresh2nd Refresh3rd RefreshNotes
Snowflake Direct2,740ms1,991ms2,801msEvery refresh hits Snowflake. Costs credits.
EnergyScope + Snowflake229ms172ms181msPre-loaded from Snowflake, served from memory.
EnergyScope + Local Data153ms165ms178msLocal data, lazy year cache.

15x faster with EnergyScope. Zero ongoing Snowflake credits.

What changes between tiers

Free+ Data+ Server
Refresh speed2–3s (every time)~180ms (from cache)~160ms (from cache)
Snowflake creditsEvery queryZero95% less
20 analysts20x the costShared cacheShared cache
New data alertsNoPer userPer user
Pre-fetch on loginNoData ready before you askData ready before you ask
OfflineNoYesYes
Add-in FreeAdd-in + EnergyScope dataAdd-in + EnergyScope on your server and data
WhatExcel add-in onlyAdd-in + our dataAdd-in + licensed server
Data sourceYour SnowflakeEnergyScope hostedYour Snowflake
Data functions (Get, Table, ColX, Latest, Search…)AllAllAll
Server-side analytics (Forecast, Spread, CrackSpread, Percentile, Seasonal, TermStructure, Breakpoints, Volatility, ARIMA, Prophet, GARCH, VAR, etc.)No (requires Flight server)AllAll
BatchingYes (to Snowflake via HTTPS)Yes (Arrow Flight + lz4)Yes (Arrow Flight + lz4)
Change tracking (ColX)YesYesYes
Weekly→monthly synthesisYesYesYes
Shared cacheNo (per-machine)YesYes
Pre-fetchNoYesYes
New data alertsNoYes (per user)Yes (per user)
User historyNoYesYes
OfflineNoYesYes
Snowflake creditsYou pay allNone (our infra)95% less
Users1UnlimitedUnlimited
DataYours only2.8M energy seriesYours
PriceFreeSubscriptionLicense

How it compares

No other Excel add-in uses Arrow Flight + lz4 compression to deliver energy data.

ProductExcelTransportSpeedPrice
EnergyScope + Server64 cell functionsArrow Flight + lz4153–229msFree → License
EnergyScope add-in → Snowflake19 cell functions (data only)Snowflake .NET + Arrow2,000–2,800msFree + SF credits
Snowflake (no add-in)Power Query / ODBCHTTPS/JSONslower *SF credits
Bloomberg TerminalBDH/BDP formulasProprietaryFast$24K/yr/seat
Refinitiv / LSEGAdd-inREST/JSONModerate$$$$
FactSetAdd-inProprietaryModerate$$$$
Quandl / NasdaqAdd-inREST/JSONModerate$$

EnergyScope is the only add-in using Arrow Flight with lz4 compression (custom Apache Arrow .NET PR #285). Binary columnar format, single-call batching, zero JSON parsing.

Download

Single packed .xll — no installer, no dependencies. Download, double-click, done. If Excel blocks it, right-click the file → Properties → Unblock.

Download for Excel 64-bit    32-bit version

Most Excel installations since 2019 are 64-bit (File → Account → About Excel shows which). Then in any cell:

=ES.Key("YOUR_API_KEY")
=ES.Get("PET.RWTC.D", "2024-01-01")

No key yet? Sign up free. Local folder-of-files mode needs no key at all.

Start free, scale when ready

Download the add-in, connect to your Snowflake or ours. 77 functions, batching, compression, change tracking — all free.

Download the Add-in    Sign Up Free    Contact for licensing