title: 分析器 description: 策略性能分析
分析器¶
分析器计算策略的性能指标。使用它们来评估策略效果。
基本用法¶
cerebro = bt.Cerebro()
# 添加分析器
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
# 运行回测
strats = cerebro.run()
# 获取分析器结果
strat = strats[0]
sharpe = strat.analyzers.sharpe.get_analysis()
print(f'夏普比率: {sharpe["sharperatio"]:.3f}')
```bash
## 可用分析器
### 收益分析
```python
# Returns (基本收益指标)
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
# 年度收益
cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='annual_return')
# 对数收益 (滚动)
cerebro.addanalyzer(bt.analyzers.LogReturnsRolling, _name='log_returns')
```bash
### 风险指标
```python
# 夏普比率
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
# 卡玛比率
cerebro.addanalyzer(bt.analyzers.Calmar, _name='calmar')
# SQN (系统质量数)
cerebro.addanalyzer(bt.analyzers.SQN, _name='sqn')
```bash
### 回撤分析
```python
# 回撤分析器
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
# 获取结果
drawdown = strat.analyzers.drawdown.get_analysis()
print(f'最大回撤: {drawdown["max"]["drawdown"]:.2%}')
print(f'最大回撤金额: {drawdown["max"]["moneydown"]:.2f}')
print(f'最大回撤持续: {drawdown["max"]["len"]} 天')
```bash
### 交易分析
```python
# 交易分析器
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trades')
# 获取结果
trades = strat.analyzers.trades.get_analysis()
print(f'总交易次数: {trades["total"]["total"]}')
print(f'胜率: {trades["won"]["total"] / trades["total"]["total"]:.2%}')
print(f'平均盈利: {trades["won"]["pnl"]["average"]:.2f}')
print(f'平均亏损: {trades["lost"]["pnl"]["average"]:.2f}')
```bash
### 持仓分析
```python
# 持仓分析器
cerebro.addanalyzer(bt.analyzers.Positions, _name='positions')
# 获取结果
positions = strat.analyzers.positions.get_analysis()
print(f'总持仓数: {len(positions)}')
```bash
### 成交分析
```python
# 成交分析器
cerebro.addanalyzer(bt.analyzers.Transactions, _name='transactions')
# 获取结果
transactions = strat.analyzers.transactions.get_analysis()
print(f'总成交数: {len(transactions)}')
```bash
### 周期统计
```python
# 周期统计 (月度、年度等)
cerebro.addanalyzer(bt.analyzers.PeriodStats, _name='period_stats')
# 获取结果
stats = strat.analyzers.period_stats.get_analysis()
```bash
### 时间收益分析
```python
# 时间收益 (按时间段统计)
cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='time_return')
# 获取结果
time_return = strat.analyzers.time_return.get_analysis()
```bash
### VWR (成交量加权收益)
```python
# 成交量加权收益
cerebro.addanalyzer(bt.analyzers.VWR, _name='vwr')
# 获取结果
vwr = strat.analyzers.vwr.get_analysis()
```bash
### PyFolio 集成
```python
# PyFolio 集成用于高级分析
cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')
# 获取结果
pyfolio = strat.analyzers.pyfolio.get_analysis()
# 生成 pyfolio 报表
returns, positions, transactions, gross_lev = pyfolio
```bash
## 完整示例
```python
import backtrader as bt
import datetime
class TestStrategy(bt.Strategy):
pass
# 创建 cerebro
cerebro = bt.Cerebro()
# 添加策略
cerebro.addstrategy(TestStrategy)
# 添加数据
data = bt.feeds.YahooFinanceData(
dataname='AAPL',
fromdate=datetime.datetime(2023, 1, 1),
todate=datetime.datetime(2023, 12, 31)
)
cerebro.adddata(data)
# 添加分析器
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')
# 设置经纪人
cerebro.broker.setcash(10000)
cerebro.broker.setcommission(0.001)
# 运行
strats = cerebro.run()
strat = strats[0]
# 打印结果
print('-' *50)
print('分析结果')
print('-'*50)
# 收益
returns = strat.analyzers.returns.get_analysis()
print(f'总收益: {returns["rtot"]:.2%}')
print(f'平均收益: {returns["ravg"]:.2%}')
# 夏普比率
sharpe = strat.analyzers.sharpe.get_analysis()
print(f'夏普比率: {sharpe["sharperatio"]:.3f}')
# 回撤
drawdown = strat.analyzers.drawdown.get_analysis()
print(f'最大回撤: {drawdown["max"]["drawdown"]:.2%}')
print(f'最大回撤持续: {drawdown["max"]["len"]} 天')
# 交易
trades = strat.analyzers.trades.get_analysis()
print(f'总交易次数: {trades["total"]["total"]}')
if trades["total"]["total"] > 0:
print(f'胜率: {trades["won"]["total"] / trades["total"]["total"]:.2%}')
# 年度收益
annual_return = strat.analyzers.annual_return.get_analysis()
print(f'年化收益: {annual_return.get("rnorm", 0):.2%}')
print('-'* 50)
print(f'最终组合价值: {cerebro.broker.getvalue():.2f}')
```bash
## 分析器输出格式
大多数分析器返回包含分析结果的字典:
```python
analyzer = strat.analyzers.name.get_analysis()
# 常见访问模式
for key, value in analyzer.items():
print(f'{key}: {value}')
```bash
## 自定义分析器
创建您自己的分析器:
```python
class CustomAnalyzer(bt.Analyzer):
"""
自定义分析器示例。
"""
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
## 下一步学习
- [观察器](observers_zh.md) - 监控策略行为
- [绘图](plotting_zh.md) - 可视化结果