一、前言
策略评估是量化交易的重要环节。选择合适的评估指标,可以准确衡量策略表现。本文将介绍各种策略评估指标及其计算方法。
本文将介绍:
- 收益指标
- 风险指标
- 风险调整收益指标
- 交易指标
- 综合评估方法
二、为什么选择天勤量化(TqSdk)
TqSdk策略评估支持:
| 功能 | 说明 |
|---|---|
| 回测框架 | 支持策略回测 |
| 数据统计 | pandas/numpy支持指标计算 |
| 灵活扩展 | 支持自定义指标 |
| 结果分析 | 支持结果分析 |
安装方法:
pipinstalltqsdk pandas numpy scipy三、收益指标
3.1 总收益率
#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:策略评估指标 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuthimportpandasaspdimportnumpyasnpdefcalculate_total_return(returns):"""计算总收益率"""total_return=(1+returns).cumprod().iloc[-1]-1returntotal_return# 使用示例strategy_returns=pd.Series([0.01,-0.005,0.02,0.01,-0.01])total_return=calculate_total_return(strategy_returns)print(f"总收益率:{total_return:.2%}")3.2 年化收益率
defcalculate_annualized_return(returns,periods_per_year=252):"""计算年化收益率"""total_return=(1+returns).cumprod().iloc[-1]-1n_periods=len(returns)annualized_return=(1+total_return)**(periods_per_year/n_periods)-1returnannualized_return# 使用示例annual_return=calculate_annualized_return(strategy_returns)print(f"年化收益率:{annual_return:.2%}")3.3 累计收益曲线
defcalculate_cumulative_returns(returns):"""计算累计收益"""cumulative=(1+returns).cumprod()returncumulative四、风险指标
4.1 波动率
defcalculate_volatility(returns,periods_per_year=252):"""计算年化波动率"""volatility=returns.std()*np.sqrt(periods_per_year)returnvolatility# 使用示例volatility=calculate_volatility(strategy_returns)print(f"年化波动率:{volatility:.2%}")4.2 最大回撤
defcalculate_max_drawdown(returns):"""计算最大回撤"""cumulative=(1+returns).cumprod()running_max=cumulative.expanding().max()drawdown=(cumulative-running_max)/running_max max_drawdown=drawdown.min()returnmax_drawdown# 使用示例max_dd=calculate_max_drawdown(strategy_returns)print(f"最大回撤:{max_dd:.2%}")4.3 下行波动率
defcalculate_downside_volatility(returns,periods_per_year=252,target=0):"""计算下行波动率"""downside_returns=returns[returns<target]iflen(downside_returns)==0:return0downside_vol=downside_returns.std()*np.sqrt(periods_per_year)returndownside_vol五、风险调整收益指标
5.1 夏普比率
defcalculate_sharpe_ratio(returns,risk_free_rate=0.0,periods_per_year=252):"""计算夏普比率"""excess_returns=returns-risk_free_rate/periods_per_year sharpe=excess_returns.mean()/returns.std()*np.sqrt(periods_per_year)returnsharpe# 使用示例sharpe=calculate_sharpe_ratio(strategy_returns)print(f"夏普比率:{sharpe:.2f}")5.2 索提诺比率
defcalculate_sortino_ratio(returns,risk_free_rate=0.0,periods_per_year=252,target=0):"""计算索提诺比率"""excess_returns=returns-risk_free_rate/periods_per_year downside_vol=calculate_downside_volatility(returns,periods_per_year,target)ifdownside_vol==0:return0sortino=excess_returns.mean()/downside_vol*np.sqrt(periods_per_year)returnsortino# 使用示例sortino=calculate_sortino_ratio(strategy_returns)print(f"索提诺比率:{sortino:.2f}")5.3 卡玛比率
defcalculate_calmar_ratio(returns,periods_per_year=252):"""计算卡玛比率"""annual_return=calculate_annualized_return(returns,periods_per_year)max_drawdown=abs(calculate_max_drawdown(returns))ifmax_drawdown==0:return0calmar=annual_return/max_drawdownreturncalmar# 使用示例calmar=calculate_calmar_ratio(strategy_returns)print(f"卡玛比率:{calmar:.2f}")六、交易指标
6.1 胜率
defcalculate_win_rate(trades):"""计算胜率"""iflen(trades)==0:return0wins=sum(1fortradeintradesiftrade['pnl']>0)win_rate=wins/len(trades)returnwin_rate# 使用示例trades=[{'pnl':100},{'pnl':-50},{'pnl':200},{'pnl':-30}]win_rate=calculate_win_rate(trades)print(f"胜率:{win_rate:.2%}")6.2 盈亏比
defcalculate_profit_loss_ratio(trades):"""计算盈亏比"""profits=[trade['pnl']fortradeintradesiftrade['pnl']>0]losses=[abs(trade['pnl'])fortradeintradesiftrade['pnl']<0]iflen(losses)==0:returnfloat('inf')iflen(profits)>0else0avg_profit=np.mean(profits)ifprofitselse0avg_loss=np.mean(losses)profit_loss_ratio=avg_profit/avg_lossifavg_loss>0else0returnprofit_loss_ratio# 使用示例pl_ratio=calculate_profit_loss_ratio(trades)print(f"盈亏比:{pl_ratio:.2f}")6.3 交易次数
defcalculate_trade_count(trades):"""计算交易次数"""returnlen(trades)6.4 平均持仓时间
defcalculate_avg_holding_period(trades):"""计算平均持仓时间"""iflen(trades)==0:return0holding_periods=[]fortradeintrades:if'entry_time'intradeand'exit_time'intrade:period=(trade['exit_time']-trade['entry_time']).total_seconds()/3600holding_periods.append(period)iflen(holding_periods)==0:return0avg_period=np.mean(holding_periods)returnavg_period七、综合评估
7.1 综合评估函数
defcomprehensive_evaluation(returns,trades=None):"""综合评估"""metrics={}# 收益指标metrics['total_return']=calculate_total_return(returns)metrics['annualized_return']=calculate_annualized_return(returns)# 风险指标metrics['volatility']=calculate_volatility(returns)metrics['max_drawdown']=calculate_max_drawdown(returns)# 风险调整收益指标metrics['sharpe_ratio']=calculate_sharpe_ratio(returns)metrics['sortino_ratio']=calculate_sortino_ratio(returns)metrics['calmar_ratio']=calculate_calmar_ratio(returns)# 交易指标iftrades:metrics['win_rate']=calculate_win_rate(trades)metrics['profit_loss_ratio']=calculate_profit_loss_ratio(trades)metrics['trade_count']=calculate_trade_count(trades)metrics['avg_holding_period']=calculate_avg_holding_period(trades)returnmetrics# 使用示例metrics=comprehensive_evaluation(strategy_returns,trades)forkey,valueinmetrics.items():ifisinstance(value,float):print(f"{key}:{value:.4f}")else:print(f"{key}:{value}")7.2 评估报告
defgenerate_evaluation_report(returns,trades=None):"""生成评估报告"""metrics=comprehensive_evaluation(returns,trades)report=f""" 策略评估报告 ============ 收益指标: 总收益率:{metrics['total_return']:.2%}年化收益率:{metrics['annualized_return']:.2%}风险指标: 年化波动率:{metrics['volatility']:.2%}最大回撤:{metrics['max_drawdown']:.2%}风险调整收益: 夏普比率:{metrics['sharpe_ratio']:.2f}索提诺比率:{metrics['sortino_ratio']:.2f}卡玛比率:{metrics['calmar_ratio']:.2f}"""iftrades:report+=f""" 交易指标: 胜率:{metrics['win_rate']:.2%}盈亏比:{metrics['profit_loss_ratio']:.2f}交易次数:{metrics['trade_count']}平均持仓时间:{metrics['avg_holding_period']:.2f}小时 """returnreport# 使用示例report=generate_evaluation_report(strategy_returns,trades)print(report)八、总结
8.1 评估指标分类
| 类别 | 指标 | 用途 |
|---|---|---|
| 收益 | 总收益率、年化收益率 | 衡量收益 |
| 风险 | 波动率、最大回撤 | 衡量风险 |
| 风险调整 | 夏普、索提诺、卡玛 | 综合评估 |
| 交易 | 胜率、盈亏比 | 交易质量 |
8.2 注意事项
- 综合评估- 使用多个指标综合评估
- 样本外验证- 使用样本外数据验证
- 持续监控- 持续监控策略表现
- 对比基准- 与基准对比评估
免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。
更多资源:
- 天勤量化官网:https://www.shinnytech.com
- GitHub开源地址:https://github.com/shinnytech/tqsdk-python
- 官方文档:https://doc.shinnytech.com/tqsdk/latest