绩效评估指标
1. 收益率指标
1.1 总收益率
def calculate_total_return(cumulative_returns):
"""
计算总收益率
参数:
cumulative_returns: 累计收益率
返回:
total_return: 总收益率
"""
total_return = cumulative_returns.iloc[-1]
return total_return1.2 年化收益率
def calculate_annual_return(returns, periods_per_year=252):
"""
计算年化收益率
参数:
returns: 日收益率序列
periods_per_year: 每年交易天数
返回:
annual_return: 年化收益率
"""
cumulative_return = (1 + returns).prod() - 1
n_periods = len(returns)
annual_return = (1 + cumulative_return) ** (periods_per_year / n_periods) - 1
return annual_return1.3 超额收益率
def calculate_excess_return(strategy_return, benchmark_return):
"""
计算超额收益率
参数:
strategy_return: 策略收益率
benchmark_return: 基准收益率
返回:
excess_return: 超额收益率
"""
excess_return = strategy_return - benchmark_return
return excess_return2. 风险指标
2.1 波动率
def calculate_volatility(returns, periods_per_year=252):
"""
计算波动率
参数:
returns: 日收益率序列
periods_per_year: 每年交易天数
返回:
volatility: 年化波动率
"""
daily_vol = returns.std()
annual_vol = daily_vol * np.sqrt(periods_per_year)
return annual_vol2.2 最大回撤
def calculate_max_drawdown(cumulative_returns):
"""
计算最大回撤
参数:
cumulative_returns: 累计收益率
返回:
max_drawdown: 最大回撤
drawdown_series: 回撤序列
"""
# 计算累计净值
cumulative_value = (1 + cumulative_returns).cumprod()
# 计算历史最高点
running_max = cumulative_value.expanding().max()
# 计算回撤
drawdown = (cumulative_value - running_max) / running_max
# 最大回撤
max_drawdown = drawdown.min()
return max_drawdown, drawdown2.3 VaR (在险价值)
def calculate_var(returns, confidence_level=0.95):
"""
计算VaR (在险价值)
参数:
returns: 收益率序列
confidence_level: 置信水平
返回:
var: VaR值
"""
var = np.percentile(returns, (1 - confidence_level) * 100)
return var3. 风险调整收益指标
3.1 夏普比率
def calculate_sharpe_ratio(returns, risk_free_rate=0.03, periods_per_year=252):
"""
计算夏普比率
参数:
returns: 日收益率序列
risk_free_rate: 无风险利率
periods_per_year: 每年交易天数
返回:
sharpe_ratio: 夏普比率
"""
annual_return = calculate_annual_return(returns, periods_per_year)
annual_vol = calculate_volatility(returns, periods_per_year)
sharpe_ratio = (annual_return - risk_free_rate) / annual_vol
return sharpe_ratio3.2 信息比率
def calculate_information_ratio(strategy_returns, benchmark_returns, periods_per_year=252):
"""
计算信息比率
参数:
strategy_returns: 策略收益率
benchmark_returns: 基准收益率
periods_per_year: 每年交易天数
返回:
information_ratio: 信息比率
"""
excess_returns = strategy_returns - benchmark_returns
annual_excess_return = calculate_annual_return(excess_returns, periods_per_year)
tracking_error = calculate_volatility(excess_returns, periods_per_year)
information_ratio = annual_excess_return / tracking_error
return information_ratio3.3 卡尔马比率
def calculate_calmar_ratio(returns, periods_per_year=252):
"""
计算卡尔马比率
参数:
returns: 日收益率序列
periods_per_year: 每年交易天数
返回:
calmar_ratio: 卡尔马比率
"""
cumulative_returns = returns.cumsum()
annual_return = calculate_annual_return(returns, periods_per_year)
max_drawdown, _ = calculate_max_drawdown(cumulative_returns)
calmar_ratio = annual_return / abs(max_drawdown)
return calmar_ratio4. 交易相关指标
4.1 换手率
def calculate_turnover(portfolio_changes, avg_value):
"""
计算换手率
参数:
portfolio_changes: 持仓变化(绝对值)
avg_value: 平均资产价值
返回:
turnover: 换手率
"""
turnover = portfolio_changes.abs().sum() / avg_value
return turnover4.2 胜率
def calculate_win_rate(trades):
"""
计算胜率
参数:
trades: 交易记录 (DataFrame with 'pnl' column)
返回:
win_rate: 胜率
"""
winning_trades = len(trades[trades['pnl'] > 0])
total_trades = len(trades)
win_rate = winning_trades / total_trades if total_trades > 0 else 0
return win_rate4.3 盈亏比
def calculate_profit_loss_ratio(trades):
"""
计算盈亏比
参数:
trades: 交易记录 (DataFrame with 'pnl' column)
返回:
profit_loss_ratio: 盈亏比
"""
winning_trades = trades[trades['pnl'] > 0]['pnl']
losing_trades = trades[trades['pnl'] < 0]['pnl']
if len(losing_trades) == 0:
return float('inf')
avg_profit = winning_trades.mean()
avg_loss = abs(losing_trades.mean())
profit_loss_ratio = avg_profit / avg_loss
return profit_loss_ratio5. 综合评估
def evaluate_portfolio(returns, benchmark_returns=None, risk_free_rate=0.03):
"""
综合评估投资组合
参数:
returns: 策略收益率
benchmark_returns: 基准收益率
risk_free_rate: 无风险利率
返回:
metrics: 评估指标字典
"""
cumulative_returns = returns.cumsum()
metrics = {}
# 收益率指标
metrics['total_return'] = calculate_total_return(cumulative_returns)
metrics['annual_return'] = calculate_annual_return(returns)
if benchmark_returns is not None:
metrics['excess_return'] = calculate_excess_return(
metrics['annual_return'],
calculate_annual_return(benchmark_returns)
)
# 风险指标
metrics['volatility'] = calculate_volatility(returns)
metrics['max_drawdown'], _ = calculate_max_drawdown(cumulative_returns)
metrics['var_95'] = calculate_var(returns, 0.95)
# 风险调整收益指标
metrics['sharpe_ratio'] = calculate_sharpe_ratio(returns, risk_free_rate)
if benchmark_returns is not None:
metrics['information_ratio'] = calculate_information_ratio(
returns, benchmark_returns
)
metrics['calmar_ratio'] = calculate_calmar_ratio(returns)
return metrics
# 示例
import numpy as np
import pandas as pd
np.random.seed(42)
returns = pd.Series(np.random.randn(252) * 0.02)
metrics = evaluate_portfolio(returns)
print("投资组合评估指标:")
for key, value in metrics.items():
print(f" {key}: {value:.4f}")总结
绩效评估是量化投资的重要环节:
- 收益率指标:总收益、年化收益、超额收益
- 风险指标:波动率、最大回撤、VaR
- 风险调整收益指标:夏普比率、信息比率、卡尔马比率
- 交易相关指标:换手率、胜率、盈亏比
建议:
- 综合使用多个指标评估策略
- 关注风险调整后收益
- 考虑交易成本影响
- 进行样本外验证