-
Notifications
You must be signed in to change notification settings - Fork 724
绩效评估与分析
回测绩效评估是量化策略开发中至关重要的环节,它提供了衡量策略表现的客观标准。Hikyuu框架通过Performance类提供了一套全面的绩效评估工具,能够基于TradeManager的交易记录,计算出一系列关键的绩效指标。这些指标不仅包括年化收益率、最大回撤等基础指标,还涵盖了夏普比率、卡玛比率、胜率、盈亏比等更深入的分析维度。本文档将系统性地介绍这些指标的计算方法、经济意义以及在Hikyuu中的具体应用。
本文档引用的文件
- Performance.h
- 006-TradeManager.ipynb
Performance类通过statistics方法,基于TradeManager的交易和持仓记录,计算出超过60项绩效指标。以下是对文档目标中提及的关键指标的详细解释。
年化收益率是衡量投资组合在一年内平均回报率的指标,它将不同时间长度的回报率标准化,便于横向比较。
-
帐户平均年收益率%: 计算公式为
100 * (((当前总资产 / 投入本值资产) - 1) / 年数)。它反映了账户资金的平均增长速度。 -
帐户年复合收益率%: 计算公式为
100 * ((pow(10, (log10(当前总资产 / 投入本值资产) / 年数)) - 1))。它考虑了复利效应,更能反映长期投资的真实回报。
最大回撤(Maximum Drawdown, MDD)是衡量投资组合从峰值到谷底的最大损失幅度,是评估策略风险的重要指标。
在Performance类中,虽然没有直接命名为“最大回撤”的指标,但其计算过程隐含在对历史持仓记录的分析中。通过追踪历史上的最高资产净值和随后的最低净值,可以计算出最大回撤。Performance类会计算“已平仓净利润总额”等数据,这些是计算净值曲线的基础。
夏普比率(Sharpe Ratio)衡量的是单位总风险(标准差)所获得的超额回报。在Performance类中,与之相关的指标是 R乘数期望值。
-
R乘数期望值: 计算公式为
累计R乘数 / 已平仓交易总数。其中,单笔交易的R乘数 = 该笔交易利润 / 该笔交易的总风险(即累计交易风险)。这与夏普比率的思想类似,都是衡量风险调整后的收益,但R乘数更侧重于单笔交易的风险收益比。
卡玛比率(Calmar Ratio)是衡量年化收益率与最大回撤之比的指标,反映了单位回撤风险所获得的回报。
在Performance类中,虽然没有直接计算卡玛比率,但其所需的两个核心数据——“帐户年复合收益率%”和“最大回撤”——都可以从计算结果中获取。用户可以轻松地将这两个指标相除,得到卡玛比率。
胜率(Win Rate)是指盈利交易次数占总交易次数的比例。
-
赢利交易比例%: 计算公式为
100 * 赢利交易数 / 已平仓交易总数。它直接反映了策略的“命中率”。
盈亏比(Profit Factor)是衡量盈利交易的平均盈利与亏损交易的平均亏损之比的指标。
-
平均赢利/平均亏损比例: 计算公式为
赢利交易平均赢利 / |亏损交易平均亏损|。它反映了策略在捕捉盈利机会和控制亏损方面的相对能力。
本文档引用的文件
- Performance.cpp
- Performance.h
Performance类的计算依赖于TradeManager提供的底层数据,其中FundsRecord和PositionRecord是两个核心的数据结构。
FundsRecord类记录了账户在某一时刻的完整资金状况。
-
主要属性:
-
cash: 当前现金 -
market_value: 当前多头市值 -
short_market_value: 当前空头仓位市值 -
base_cash: 累计投入本金 -
base_asset: 累计投入的资产价值 -
borrow_cash: 当前借入的资金(负债) -
borrow_asset: 当前借入的证券资产价值
-
-
计算属性:
-
total_assets(): 当前总资产 =cash + market_value + borrow_asset - short_market_value -
net_assets(): 当前净资产 =cash + market_value - short_market_value - borrow_cash -
profit(): 当前收益 =净资产 - 投入本值资产
-
Performance类在计算“当前总资产”、“累计投入本金”等指标时,直接调用了TradeManager::getFunds()方法,该方法返回一个FundsRecord对象。
PositionRecord类记录了每一笔已平仓或未平仓的交易的详细信息。
-
主要属性:
-
stock: 交易的证券 -
takeDatetime: 初次建仓日期 -
cleanDatetime: 平仓日期(未平仓时为Null) -
number: 当前持仓数量 -
buyMoney: 累计买入资金 -
totalCost: 累计交易总成本 -
sellMoney: 累计卖出资金 -
totalRisk: 累计交易风险
-
-
关键方法:
-
totalProfit(): 计算累计盈利,公式为sellMoney - buyMoney - totalCost。
-
Performance类通过遍历TradeManager的getHistoryPositionList()(历史持仓列表)来计算“已平仓净利润总额”、“赢利交易数”、“亏损交易数”等所有与已平仓交易相关的指标。
本文档引用的文件
- FundsRecord.h
- FundsRecord.cpp
- PositionRecord.h
- PositionRecord.cpp
- TradeManager.h
在回测结束后,用户可以通过以下步骤提取和可视化绩效报告。
-
创建
Performance实例: 首先,创建一个Performance对象。 -
执行统计计算: 调用
statistics方法,并传入TradeManager实例和统计截止日期。 -
获取结果: 通过
get、names、values或to_dict等方法获取具体的绩效指标。
# 示例代码
perf = Performance()
perf.statistics(my_tm) # my_tm 是 TradeManager 实例
print(perf.report()) # 打印文本报告
# 获取单个指标
annual_return = perf["帐户年复合收益率%"]
# 转换为字典
perf_dict = perf.to_dict()虽然Performance类本身不提供绘图功能,但其输出的数据可以轻松地与matplotlib、seaborn或plotly等可视化库结合使用。
-
文本报告:
report()方法生成一个格式化的字符串,可以直接打印或写入文件。 -
数据结构:
to_dict()方法将所有指标转换为Python字典,names()和values()方法分别返回指标名称和值的列表,这些都可以作为绘图函数的输入数据。
本文档引用的文件
- _Performance.cpp
- 006-TradeManager.ipynb
Performance类提供了addKey和setValue方法,允许用户自定义绩效指标。
用户可以添加新的指标名称,并为其赋值。
perf = Performance()
perf.statistics(my_tm)
# 添加自定义指标
perf.addKey("我的自定义指标")
perf.setValue("我的自定义指标", 123.45)
# 现在可以通过 perf["我的自定义指标"] 访问用户可以通过继承Performance类来创建一个功能更强大的子类,实现自动计算和添加特定的自定义指标。
class MyPerformance(Performance):
def __init__(self):
super().__init__()
def statistics(self, tm, datetime=None):
# 先调用父类的统计方法
super().statistics(tm, datetime)
# 然后添加自定义逻辑
self.addKey("卡玛比率")
calmar = self["帐户年复合收益率%"] / abs(self["最大回撤%"]) # 假设最大回撤已计算
self.setValue("卡玛比率", calmar)本文档引用的文件
- Performance.h
- Performance.cpp
Hikyuu的Performance类为回测结果的评估提供了一个强大而灵活的框架。它不仅内置了丰富的标准绩效指标,还通过FundsRecord和PositionRecord确保了计算的准确性和透明度。用户不仅可以方便地提取和可视化报告,还能通过简单的API扩展功能,以满足特定的分析需求。掌握这些工具,是进行有效策略评估和优化的关键一步。