绩效评估指标

1. 收益率指标

1.1 总收益率

def calculate_total_return(cumulative_returns):
    """
    计算总收益率
    
    参数:
        cumulative_returns: 累计收益率
    
    返回:
        total_return: 总收益率
    """
    total_return = cumulative_returns.iloc[-1]
    return total_return

1.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_return

1.3 超额收益率

def calculate_excess_return(strategy_return, benchmark_return):
    """
    计算超额收益率
    
    参数:
        strategy_return: 策略收益率
        benchmark_return: 基准收益率
    
    返回:
        excess_return: 超额收益率
    """
    excess_return = strategy_return - benchmark_return
    return excess_return

2. 风险指标

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_vol

2.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, drawdown

2.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 var

3. 风险调整收益指标

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_ratio

3.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_ratio

3.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_ratio

4. 交易相关指标

4.1 换手率

def calculate_turnover(portfolio_changes, avg_value):
    """
    计算换手率
    
    参数:
        portfolio_changes: 持仓变化(绝对值)
        avg_value: 平均资产价值
    
    返回:
        turnover: 换手率
    """
    turnover = portfolio_changes.abs().sum() / avg_value
    return turnover

4.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_rate

4.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_ratio

5. 综合评估

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}")

总结

绩效评估是量化投资的重要环节:

  1. 收益率指标:总收益、年化收益、超额收益
  2. 风险指标:波动率、最大回撤、VaR
  3. 风险调整收益指标:夏普比率、信息比率、卡尔马比率
  4. 交易相关指标:换手率、胜率、盈亏比

建议

  • 综合使用多个指标评估策略
  • 关注风险调整后收益
  • 考虑交易成本影响
  • 进行样本外验证