Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Build Status

About Empirical

Empirical is a language for time-series analysis. It has statically typed Dataframes with integrated queries and builtin timestamps.


Read CSV files and infer their types (at compile time!):

>>> let trades = load("trades.csv"), quotes = load("quotes.csv")

Compute a one-minute volume-weighted average price (VWAP):

>>> from trades select vwap = wavg(size, price) by symbol, bar(timestamp, 1m)

Get the most recent quote for each trade:

>>> join trades, quotes on symbol asof timestamp

Get the closest event within three seconds:

>>> join trades, events on symbol asof timestamp nearest within 3s

See the website for more examples and full documentation.

Building Empirical

The build is handled by CMake. There are some scripts to help with the process, both for POSIX (*.sh) and Windows (*.bat). These can be called by make or make.bat for an easy workflow.

POSIX Windows
debug build make make.bat
production build make prod make.bat prod
run tests make test make.bat test
deploy binary make deploy make.bat deploy
clean build make clean make.bat clean

Additionally, POSIX has make website.

While the actual code is all C++, there are code generators that need the JVM (ANTLR) and Python (ASDL). These generators are included in this repo, so there is nothing to download.

The build is statically linked, so no libraries are needed to distribute the resulting binary.


The code for Empirical is structured as follows:

  • src/ - source code for Empirical
  • tests/ - regression tests
  • doc/ - documentation
  • cmake/ - CMake files
  • scripts/ - build scripts
  • thirdparty/ - open-source dependencies


See the Contributor's Notes. There is also the Maintainer's Notes for the curious.


Affero General Public License (AGPL) with the Commons Clause.

A proprietary license is available to vendors and customers that need more commercial-friendly terms.