Documentation Index
Fetch the complete documentation index at: https://mintlify.com/hummingbot/hummingbot/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Avellaneda Market Making implements the Avellaneda-Stoikov market making algorithm, which dynamically adjusts spreads based on market volatility, order book liquidity, and inventory risk. This strategy is designed for sophisticated traders seeking optimal spread placement.How It Works
The strategy uses quantitative finance principles to calculate optimal bid/ask spreads:- Calculate Reservation Price: Adjusts mid-price based on inventory imbalance
- Estimate Volatility: Measures market volatility from recent price movements
- Compute Optimal Spread: Uses risk parameters to calculate theoretical spread
- Place Orders: Positions orders at calculated spreads
- Adapt Dynamically: Continuously recalculates based on market conditions
Unlike fixed-spread strategies, Avellaneda adjusts spreads wider in volatile markets and tighter in calm markets.
When to Use
Best For
- Volatile markets with changing conditions
- Professional market makers
- Inventory risk management
- Optimizing risk-adjusted returns
Avoid When
- Very stable markets (use Pure MM)
- Extremely low liquidity pairs
- When you need simple, predictable behavior
- Insufficient data for volatility calculation
Core Configuration Parameters
Basic Setup
The exchange connector to useExamples:
binance, coinbase_pro, krakenTrading pair in BASE-QUOTE formatExample:
ETH-USDTOrder size per level in base assetExample:
0.1 for 0.1 ETH per orderExecution Timeframe
Trading session duration for the strategyOptions:
infinite: Run indefinitelyfrom_date_to_date: Specific date rangedaily_between_times: Recurring daily time window
Infinite Mode
From Date to Date
Daily Between Times
Timeframe affects the calculation of optimal spreads. Shorter timeframes lead to tighter spreads.
Risk Parameters
Risk aversion parameter (γ - gamma) that controls spread widthRange: > 0Interpretation:
- Low (0.1-0.5): Aggressive, tighter spreads, higher inventory risk
- Medium (0.5-2.0): Balanced approach
- High (2.0-10.0): Conservative, wider spreads, lower inventory risk
1.0 for moderate riskAmount adjustment parameter (η - eta) for multi-level ordersRange: 0 to 1
0: All orders same size0.5: Moderate size variation1: Maximum size skewing
Inventory Management
Target inventory allocation for base asset. Enter
50 for 50%.Range: 0% to 100%Example: 50 maintains equal base and quote assetsThe algorithm adjusts reservation price to move inventory toward this target.
Spread Control
Minimum spread limit as percentage of mid-price. Enter
1 for 1%.Example: 0.1 ensures spreads never go below 0.1%Prevents unprofitable trades during low volatility.Order Refresh Settings
Frequency in seconds to recalculate and refresh ordersExample:
10.0 refreshes every 10 secondsRecommended: 5-30 seconds depending on market conditionsMaximum seconds an order can remain before forced refreshDefault: 1800 (30 minutes)
Minimum price change percentage to trigger order refresh. Enter
1 for 1%.Range: -10% to 10%Reduces unnecessary order updates.Delay in seconds after order fill before placing new ordersExample:
30 waits 30 seconds after fillsMarket Data Parameters
Number of price ticks stored to calculate volatilityRange: 1 to 10,000Recommended: 200-500 for most marketsMore ticks = smoother but slower-reacting volatility estimate
Number of ticks stored to estimate order book liquidityRange: 1 to 10,000
Order Levels
Number of order levels on each sideOptions:
single_order_level: One order per sidemulti_order_level: Multiple orders per side
Multi-Level Configuration
Number of order levels (when using multi_order_level)Range: >= 2
Distance between levels as percentage of optimal spreadExample:
0.5 places levels at 50% intervals of the calculated spreadAdvanced Features
Adjust orders to top of book (best bid/ask jumping)
Automatically include exchange fees in spread calculationsRecommended for exchanges without maker rebates.
Handling of unfilled orders when opposite side fillsOptions:
ignore_hanging_orders: Cancel all orderstrack_hanging_orders: Keep opposite orders active
Track Hanging Orders
Spread percentage at which to cancel hanging orders. Enter
1 for 1%.Range: 0% to 100%Example Configurations
Basic Avellaneda Strategy
- Moderate risk with gamma = 1.0
- 50/50 inventory target
- 10-second refresh rate
- Minimum 0.1% spread
Conservative Multi-Level
- Conservative risk_factor = 3.0 (wider spreads)
- 5 order levels with increasing sizes
- Only trades during business hours
- Transaction costs included
- Larger volatility buffer for stability
Aggressive with Hanging Orders
- Low risk_factor = 0.5 (tighter spreads)
- Fast 5-second refresh
- Hanging orders for fill optimization
- Smaller volatility buffer for faster reaction
Algorithm Explained
Mathematical Foundation
The Avellaneda-Stoikov algorithm optimizes market making by solving:γ(gamma) =risk_factorparameter- Higher γ = more risk-averse = wider spreads
Key Calculations
Tips for Success
Start with Moderate Risk Factor
Start with Moderate Risk Factor
Begin with
risk_factor: 1.0 and adjust based on results:- Too many fills but losses? Increase risk_factor
- Not enough fills? Decrease risk_factor
Calibrate Timeframe
Calibrate Timeframe
Execution timeframe affects spread calculations:
- Longer timeframes → wider spreads
- For infinite mode, algorithm uses 24-hour window
- Daily windows work well for active trading hours
Monitor Volatility Impact
Monitor Volatility Impact
Check volatility estimates:High volatility → wider spreads automatically
Use Multi-Level for Depth
Use Multi-Level for Depth
Multi-level orders provide:
- Better capital efficiency
- Capture wider price movements
- Improved inventory management
Performance Tuning
Parameter Sensitivity
| Parameter | Effect on Spreads | Effect on Fills |
|---|---|---|
| risk_factor ↑ | Wider | Fewer |
| volatility ↑ | Wider | Fewer |
| inventory_imbalance ↑ | Skewed | Rebalancing |
| min_spread ↑ | Wider floor | Fewer |
Optimization Guidelines
- High Volatility Markets
- Stable Markets
- Trending Markets
Risk Management
Mitigation Strategies:- Set conservative
min_spreadto ensure minimum profitability - Use
inventory_target_base_pctto control inventory exposure - Enable
add_transaction_coststo account for fees - Start with higher
risk_factorand decrease gradually - Use execution timeframes to limit trading to liquid hours
Comparison with Pure Market Making
| Feature | Avellaneda | Pure Market Making |
|---|---|---|
| Spread Calculation | Dynamic (volatility-based) | Fixed |
| Inventory Management | Built-in (reservation price) | Optional (inventory skew) |
| Market Adaptation | Automatic | Manual config changes |
| Complexity | High | Low |
| Best For | Volatile markets | Stable markets |
Source Code Reference
Configuration:/source/hummingbot/strategy/avellaneda_market_making/avellaneda_market_making_config_map_pydantic.py:156
Strategy Implementation: /source/hummingbot/strategy/avellaneda_market_making/
Related Strategies
- Pure Market Making: Simpler fixed-spread market making
- Perpetual Market Making: Avellaneda-style approach for derivatives