Of course! Quantdigger is a powerful and relatively unique Python library for algorithmic trading and backtesting. It's designed to feel familiar to users of languages like C++ or Java who are used to statically-typed, compiled environments, while still providing the flexibility of Python.
Here's a comprehensive guide to Quantdigger, covering what it is, its core concepts, how to use it, and its pros and cons.
What is Quantdigger?
Quantdigger is an open-source Python framework for quantitative trading. Its primary goal is to provide a robust and efficient environment for developing, backtesting, and executing algorithmic trading strategies.
Its most distinctive feature is its C++/Java-like syntax, which is a deliberate design choice. This makes it particularly appealing to quants who come from a background in high-performance computing or traditional software engineering.
Key Characteristics:
- Statically-Typed Syntax: You declare the type of your variables (e.g.,
int,float,bool), which helps catch errors early and can lead to more optimized performance. - Event-Driven Engine: It's built around an event-driven architecture, meaning your strategy logic reacts to market events like new ticks, bar closes, or order fills.
- Integrated Backtesting: The backtesting engine is tightly coupled with the strategy language, making it easy to write a strategy and test it on historical data with minimal setup.
- Focus on Performance: By leveraging Python's C extensions and its efficient design, Quantdigger aims to be faster than many pure-Python backtesting libraries.
Core Concepts and Architecture
To use Quantdigger, you need to understand its main building blocks:
a) Strategy
This is the heart of your trading logic. A Strategy class contains all the rules for when to enter and exit trades. It inherits from quantdigger.kernel.engine.Strategy.
b) Context
The Context is a global object that holds all the information and state for your strategy during a backtest or live run. It's how your strategy interacts with the engine.
context.portfolio: Information about your current holdings, cash, and total value.context.broker: The interface for placing and managing orders.context.data: Access to the current bar's data (open, high, low, close, volume).
c) Data
This represents your market data. You feed it into the engine in the form of OHLCV (Open, High, Low, Close, Volume) bars. Quantdagger can read data from CSV files or other sources.
d) Broker / Engine
The Broker is the execution engine. It takes orders from your strategy and simulates their execution based on the rules you set (e.g., slippage, commission). It's responsible for calculating P&L and updating your portfolio.
e) Indicators
You can create and use technical indicators (like Moving Averages, RSI, etc.) within your strategy. Quantdigger provides a set of common ones, and you can also write your own.
A Simple Example: Moving Average Crossover
This is the "Hello, World!" of algorithmic trading. The strategy goes long when a short-term moving average crosses above a long-term one and goes short when it crosses below.
Step 1: Installation
First, you need to install Quantdigger. It's best to do this in a virtual environment.
# Create and activate a virtual environment (optional but recommended) python -m venv myenv source myenv/bin/activate # On Windows: myenv\Scripts\activate # Install Quantdigger pip install quantdigger
Step 2: Write the Strategy Code
Save the following code as ma_crossover.py.
# ma_crossover.py
import quantdigger.kernel as qdk
from quantdigger.kernel.indicators import MA
@qdk.strategy
class MovingAverageCrossover(qdk.Strategy):
"""
A simple moving average crossover strategy.
"""
# --- Parameters ---
# You can define parameters that can be changed when running the strategy.
# These are declared with their type.
fast_period = qdk.parameter("int", default=10)
slow_period = qdk.parameter("int", default=20)
# --- Initialization ---
def __init__(self, context):
super().__init__(context)
# --- Indicators ---
# Create two moving averages based on the 'close' price.
self.ma_fast = MA(context.data.close, self.fast_period)
self.ma_slow = MA(context.data.close, self.slow_period)
# --- Trading Logic ---
@qdk.interval('1d') # Run this logic on a daily bar interval
def on_bar(self, data):
# Get the current values of the indicators
current_fast = self.ma_fast.value
current_slow = self.ma_slow.value
prev_fast = self.ma_fast.prev(1)
prev_slow = self.ma_slow.prev(1)
# --- Trading Rules ---
# Check for a crossover (fast moves above slow)
if not self.position().long and current_fast > current_slow and prev_fast <= prev_slow:
# No long position and crossover detected: enter long
self.buy(self.shares(100)) # Buy 100 shares
# Check for a crossunder (fast moves below slow)
elif not self.position().short and current_fast < current_slow and prev_fast >= prev_slow:
# No short position and crossunder detected: enter short
self.sell(self.shares(100)) # Short 100 shares
# Optional: Add a stop-loss or take-profit
# if self.position().long and data.close < self.entry_price * 0.95:
# self.sell(self.shares(100))
def on_exit(self, data):
"""This method is called when the backtest ends."""
print("Backtest finished.")
Step 3: Prepare Your Data
Quantdigger works best with CSV files. Create a simple data.csv file in the same directory. The first row must be the header.
data.csv
datetime,open,high,low,close,volume 2025-01-03,150.10,152.50,149.80,151.20,100000 2025-01-04,151.30,153.00,150.90,152.40,120000 2025-01-05,152.50,154.00,151.80,153.50,110000 ... (add more data)
Step 4: Run the Backtest
Create a separate Python script to run your strategy.
run_backtest.py
# run_backtest.py
import quantdigger.kernel as qdk
from ma_crossover import MovingAverageCrossover
# 1. Define the data source
data = qdk.data_source(
file_path='data.csv',
# datetime_format can be inferred but can be specified
datetime_format='%Y-%m-%d'
)
# 2. Define the initial capital
initial_capital = 100000.0
# 3. Create an instance of your strategy
strategy = MovingAverageCrossover
# 4. Run the backtest
qdk.backtest(
strategy,
data,
initial_capital,
# You can override strategy parameters here
# fast_period=5,
# slow_period=15
)
Now, run the backtest from your terminal:
python run_backtest.py
You will see output in the console detailing the trades and the final portfolio value. Quantdigger can also generate performance charts if you have the necessary plotting libraries installed (like matplotlib).
Pros and Cons
Pros
- High Performance: The C++/Java-like syntax and compiled nature can lead to faster backtesting, especially for complex strategies or large datasets.
- Strict Typing: Reduces runtime errors and makes the code more robust and easier to debug.
- Clean and Structured: The event-driven, class-based approach is very organized and suitable for large, complex projects.
- Good for C++/Java Developers: If you have a background in these languages, Quantdigger will feel very natural.
Cons
- Learning Curve: The syntax is different from standard Python. Newcomers to Python might find it confusing.
- Smaller Community: Compared to giants like
BacktraderorZipline, Quantdigger has a smaller user base and less community support, tutorials, and third-party plugins. - **Less "Pythonic": purists might argue that it sacrifices the simplicity and flexibility of Python for a more rigid structure.
- Documentation: While the documentation exists, it may not be as extensive or beginner-friendly as that of more popular libraries.
Comparison with Other Libraries
| Feature | Quantdigger | Backtrader | Zipline |
|---|---|---|---|
| Syntax | C++/Java-like, static typing | Pythonic, dynamic typing | Pythonic, dynamic typing |
| Performance | High (Compiled backend) | Medium (Pure Python, but optimized) | Medium (Pure Python) |
| Learning Curve | Steeper | Moderate | Moderate |
| Community | Smaller | Very Large | Very Large |
| Primary Use | Backtesting & Live Trading | Backtesting, Data Feeds, Brokers | Backtesting (for Quantopian) |
| Flexibility | High, but within a rigid structure | Extremely High | High, but tied to its event loop |
When to choose Quantdigger?
- You have a C++/Java background and prefer a statically-typed, structured environment.
- You are building a very complex strategy and performance is a critical bottleneck.
- You value strict error checking and code clarity over rapid prototyping.
When to choose something else?
- You are new to Python and algorithmic trading (start with
Backtrader). - You need the largest possible community for help and plugins (choose
BacktraderorZipline). - You prioritize a "Pythonic" feel and rapid development over raw performance.
