Heads up: This is a framework in development, with only basic functionality.
An event-driven backtesting framework to test stock trading strategies based on fundamental analysis. Preferably this package will be the core of a backend service exposed via a REST API.
Basic example:
package main
import (
"github.com/dirkolbrich/gobacktest"
"github.com/dirkolbrich/gobacktest/data"
"github.com/dirkolbrich/gobacktest/strategy"
)
func main() {
// initiate a new backtester
test := gobacktest.New()
// define and load symbols
symbols := []string{"TEST.DE"}
test.SetSymbols(symbols)
// create a data provider and load the data into the backtest
data := &data.BarEventFromCSVFile{FileDir: "../testdata/test/"}
data.Load(symbols)
test.SetData(data)
// choose a strategy
strategy := strategy.BuyAndHold()
// create an asset and append it to the strategy
strategy.SetChildren(gobacktest.NewAsset("TEST.DE"))
// load the strategy into the backtest
test.SetStrategy(strategy)
// run the backtest
test.Run()
// print the results of the test
test.Stats().PrintResult()
}
More example tests are in the /examples
folder.
The single parts of the backtester can be set independently:
// initiate new backtester
test := &Backtest{}
// set the portfolio with initial cash and a default size and risk manager
portfolio := &gobacktest.Portfolio{}
portfolio.SetInitialCash(10000)
sizeManager := &gobacktest.Size{DefaultSize: 100, DefaultValue: 1000}
portfolio.SetSizeManager(sizeManager)
riskManager := &gobacktest.Risk{}
portfolio.SetRiskManager(riskManager)
test.SetPortfolio(portfolio)
// create a new strategy with an algo stack
strategy := gobacktest.NewStrategy("basic")
strategy.SetAlgo(
algo.CreateSignal("buy"), // always create a buy signal on a data event
)
// create an asset and append to strategy
strategy.SetChildren(gobacktest.NewAsset("TEST.DE"))
// load the strategy into the backtest
test.SetStrategy(strategy)
// create an execution provider and load it into the backtest
exchange := &gobacktest.Exchange{
Symbol: "TEST",
Commission: &FixedCommission{Commission: 0},
ExchangeFee: &FixedExchangeFee{ExchangeFee: 0},
}
test.SetExchange(exchange)
// choose a statistic and load into it the backtest
statistic := &gobacktest.Statistic{}
test.SetStatistic(statistic)
None so far. Only the standard library.
These are the basic components of an event-driven framework.
- BackTester - general test case, bundles the following elements into a single test
- EventHandler - the different types of events, which travel through this system - data event, signal event, order event and fill event
- DataHandler - interface to a set of data, e.g historical quotes, fundamental data, dividends etc.
- StrategyHandler - generates a buy/sell signal based on the data
- PortfolioHandler - generates orders and manages profit & loss
- (SizeHandler) - manages the size of an order
- (RiskHandler) - manages the risk allocation of a portfolio
- ExecutionHandler - sends orders to the broker and receives the “fills” or signals that the stock has been bought or sold
- StatisticHandler - tracks all events during the backtests and calculates useful statistics like equity return, drawdown or sharp ratio etc., could be used to replay the complete backtest for later reference
- (ComplianceHandler) - tracks and documents all trades to the portfolio for compliance reasons
An overviev of the infrastructure of a complete backtesting and trading environment. Taken from the production roadmap of QuantRocket.
- General
- API gateway
- configuration loader
- logging service
- cron service
- Data
- database backup and download service
- securities master services
- historical market data service
- fundamental data service
- earnings data service
- dividend data service
- real-time market data service
- exchange calendar service
- Strategy
- performance analysis service - tearsheet
- Portfolio
- account and portfolio service
- risk management service
- Execution
- trading platform gateway service
- order management and trade ledger service
- backtesting and trading engine
These links to articles are a good starting point to understand the intentions and basic functions of an event-driven backtesting framework.
- Initial idea via a blog post Python For Finance: Algorithmic Trading by Karlijn Willems @willems_karlijn.
- Very good explanation of the internals of a backtesting system by Michael Halls-Moore @mhallsmoore in the blog post series Event-Driven-Backtesting-with-Python.
- QuantConnect
- Quantopian
- QuantRocket - in development, available Q2/2018
- Quandl - financial data
- QSTrader - open-source backtesting framework from QuantStart
- bt - Flexible Backtesting for Python - an inspiration for algorithm building blocks and a strategy/assets tree
- Quantocracy - forum for quant news
- QuantStart - articels and tutorials about quant finance