title: Analyzers description: Strategy performance analysis
Analyzers¶
Analyzers calculate performance metrics for your strategies. Use them to evaluate strategy effectiveness.
Basic Usage¶
cerebro = bt.Cerebro()
# Add analyzer
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
# Run backtest
strats = cerebro.run()
# Get analyzer results
strat = strats[0]
sharpe = strat.analyzers.sharpe.get_analysis()
print(f'Sharpe Ratio: {sharpe["sharperatio"]:.3f}')
```bash
## Available Analyzers
### Return Analysis
```python
# Returns (basic return metrics)
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
# Annual Return
cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='annual_return')
# Log Returns (Rolling)
cerebro.addanalyzer(bt.analyzers.LogReturnsRolling, _name='log_returns')
```bash
### Risk Metrics
```python
# Sharpe Ratio
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
# Calmar Ratio
cerebro.addanalyzer(bt.analyzers.Calmar, _name='calmar')
# SQN (System Quality Number)
cerebro.addanalyzer(bt.analyzers.SQN, _name='sqn')
```bash
### Drawdown Analysis
```python
# Drawdown analyzer
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
# Get results
drawdown = strat.analyzers.drawdown.get_analysis()
print(f'Max Drawdown: {drawdown["max"]["drawdown"]:.2%}')
print(f'Max Drawdown Money: {drawdown["max"]["moneydown"]:.2f}')
print(f'Max Drawdown Duration: {drawdown["max"]["len"]} days')
```bash
### Trade Analysis
```python
# Trade Analyzer
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trades')
# Get results
trades = strat.analyzers.trades.get_analysis()
print(f'Total trades: {trades["total"]["total"]}')
print(f'Win rate: {trades["won"]["total"] / trades["total"]["total"]:.2%}')
print(f'Avg win: {trades["won"]["pnl"]["average"]:.2f}')
print(f'Avg loss: {trades["lost"]["pnl"]["average"]:.2f}')
```bash
### Position Analysis
```python
# Positions Analyzer
cerebro.addanalyzer(bt.analyzers.Positions, _name='positions')
# Get results
positions = strat.analyzers.positions.get_analysis()
print(f'Total positions: {len(positions)}')
```bash
### Transactions Analysis
```python
# Transactions Analyzer
cerebro.addanalyzer(bt.analyzers.Transactions, _name='transactions')
# Get results
transactions = strat.analyzers.transactions.get_analysis()
print(f'Total transactions: {len(transactions)}')
```bash
### Period Statistics
```python
# Period Statistics (monthly, yearly, etc.)
cerebro.addanalyzer(bt.analyzers.PeriodStats, _name='period_stats')
# Get results
stats = strat.analyzers.period_stats.get_analysis()
```bash
### Time Return Analysis
```python
# Time Return (returns by time period)
cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='time_return')
# Get results
time_return = strat.analyzers.time_return.get_analysis()
```bash
### VWR (Volume Weighted Return)
```python
# Volume Weighted Return
cerebro.addanalyzer(bt.analyzers.VWR, _name='vwr')
# Get results
vwr = strat.analyzers.vwr.get_analysis()
```bash
### PyFolio Integration
```python
# PyFolio integration for advanced analysis
cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')
# Get results
pyfolio = strat.analyzers.pyfolio.get_analysis()
# Generate pyfolio tearsheet
returns, positions, transactions, gross_lev = pyfolio
```bash
## Complete Example
```python
import backtrader as bt
import datetime
class TestStrategy(bt.Strategy):
pass
# Create cerebro
cerebro = bt.Cerebro()
# Add strategy
cerebro.addstrategy(TestStrategy)
# Add data
data = bt.feeds.YahooFinanceData(
dataname='AAPL',
fromdate=datetime.datetime(2023, 1, 1),
todate=datetime.datetime(2023, 12, 31)
)
cerebro.adddata(data)
# Add analyzers
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trades')
cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='annual_return')
# Set broker
cerebro.broker.setcash(10000)
cerebro.broker.setcommission(0.001)
# Run
strats = cerebro.run()
strat = strats[0]
# Print results
print('-' *50)
print('ANALYSIS RESULTS')
print('-'*50)
# Returns
returns = strat.analyzers.returns.get_analysis()
print(f'Total return: {returns["rtot"]:.2%}')
print(f'average return: {returns["ravg"]:.2%}')
# Sharpe Ratio
sharpe = strat.analyzers.sharpe.get_analysis()
print(f'Sharpe Ratio: {sharpe["sharperatio"]:.3f}')
# Drawdown
drawdown = strat.analyzers.drawdown.get_analysis()
print(f'Max Drawdown: {drawdown["max"]["drawdown"]:.2%}')
print(f'Max Drawdown Duration: {drawdown["max"]["len"]} days')
# Trades
trades = strat.analyzers.trades.get_analysis()
print(f'Total trades: {trades["total"]["total"]}')
if trades["total"]["total"] > 0:
print(f'Win rate: {trades["won"]["total"] / trades["total"]["total"]:.2%}')
# Annual Return
annual_return = strat.analyzers.annual_return.get_analysis()
print(f'Annual Return: {annual_return.get("rnorm", 0):.2%}')
print('-'* 50)
print(f'Final Portfolio Value: {cerebro.broker.getvalue():.2f}')
```bash
## Analyzer Output Format
Most analyzers return a dictionary with analysis results:
```python
analyzer = strat.analyzers.name.get_analysis()
# Common access patterns
for key, value in analyzer.items():
print(f'{key}: {value}')
```bash
## Custom Analyzer
Create your own analyzer:
```python
class CustomAnalyzer(bt.Analyzer):
"""
Custom analyzer example.
"""
def __init__(self):
super().__init__()
self.trades = []
self.start_cash = None
def start(self):
self.start_cash = self.strategy.broker.getcash()
def notify_trade(self, trade):
if trade.isclosed:
self.trades.append({
'pnl': trade.pnl,
'pnlnet': trade.pnlnet,
'commission': trade.commission,
})
def get_analysis(self):
return {
'start_cash': self.start_cash,
'total_trades': len(self.trades),
'total_pnl': sum(t['pnl'] for t in self.trades),
'total_commission': sum(t['commission'] for t in self.trades),
}
```bash
## Next Steps
- [Observers](observers.md) - Monitor strategy behavior
- [Plotting](plotting.md) - Visualize results