Skip to content

Python's pluggable backtester

Schedule your functions today, run them tomorrow... or backtest them yesterday. Always with your data.

Start backtesting Use cases

  •   Schedule, backtest, and plug


    Schedule your functions and backtest them with your own data in a few lines of code.

    Features

  •   Set up in 5 minutes


    Install Anterior with pip and get up and running in minutes.

    Quickstart

  •   Domain-agnostic


    Backtest anything, from trading bots to marketing campaigns and rolling forecasts.

    Tutorials


Schedule with ease

Writing Python schedules doesn't have to be hard! Declare, combine, or attach schedules directly to your functions with Anterior, and let time run its course.

Learn More

from anterior import BackTester

bt = BackTester()

def func():
    print("I run every 3 hours!")

bt.every(hours=3).do(my_func)

bt.run('2010-01-01', '2020-12-31')
from anterior import BackTester

bt = BackTester()

def func():
    print("I run every 3 hours on weekdays!")

(bt.every(hours=3) & 
 bt.between(days_of_week="mon-fri")).do(func)
bt.run('2010-01-01', '2020-12-31')
from anterior import BackTester

bt = BackTester()

@bt.do_every(hours=3)
def func():
    print("I run every 3 hours!")


bt.run('2010-01-01', '2020-12-31')
from anterior import BackTester

fibonacci = [0, 1]

def hourly_fibonacci():
    fibonacci.append(sum(fibonacci[-2:]))

bt = BackTester()
bt.every(hours=1).do(hourly_fibonacci)
bt.run()
from anterior import BackTester

fibonacci = [0, 1]

def hourly_fibonacci():
    fibonacci.append(sum(fibonacci[-2:]))

bt = BackTester()
bt.every(hours=1).do(hourly_fibonacci)
bt.run(start='2010-01-01', end='2020-12-31')
from anterior import BackTester

fibonacci = [0, 1]

def hourly_fibonacc():
    fibonacci.append(sum(fibonacci[-2:]))

bt = BackTester()
bt.every(hours=1).do(hourly_fibonacci)
bt.run(start='2010-01-01')

Consistent results

Performance decays over time. Anterior's backtester validates your pipelines live or against historical data to ensure consistency and highlight improvement areas.

Learn More

Plug your data

Slicing and dicing time series is cumbersome. With Anterior's Oracle data structures, you can dynamically access your DataFrame and Series objects on-the-fly during backtests.

Learn More

from anterior import BackTester, OracleDataFrame

df = OracleDataFrame.from_csv("data.csv")
bt = Backtester()

@bt.do_every(months=1)
def hour_update():
    df.iloc[:-1] # last value as of every month

bt.run(start="2012-01-01", end="2024-01-01")
from anterior import BackTester, OracleDataFrame

df = OracleDataFrame.from_csv("data.csv")
bt = Backtester()

@bt.do_every(months=1)
def hour_update():
    df.iloc[:-1] # last value as of every month

bt.run(start="2012-01-01", end="2024-01-01")
from anterior import BackTester, OracleDataFrame

df = OracleDataFrame.from_csv("data.csv")
bt = Backtester()

@bt.do_every(months=1)
def hour_update():
    df.iloc[:-1] # last value as of every month

bt.run(start="2012-01-01", end="2024-01-01")