Skip to content

绩效评估与分析

fasiondog edited this page Nov 22, 2025 · 1 revision

绩效评估与分析

**本文档引用的文件** - [Performance.h](file://hikyuu_cpp/hikyuu/trade_manage/Performance.h) - [Performance.cpp](file://hikyuu_cpp/hikyuu/trade_manage/Performance.cpp) - [FundsRecord.h](file://hikyuu_cpp/hikyuu/trade_manage/FundsRecord.h) - [FundsRecord.cpp](file://hikyuu_cpp/hikyuu/trade_manage/FundsRecord.cpp) - [PositionRecord.h](file://hikyuu_cpp/hikyuu/trade_manage/PositionRecord.h) - [PositionRecord.cpp](file://hikyuu_cpp/hikyuu/trade_manage/PositionRecord.cpp) - [_Performance.cpp](file://hikyuu_pywrap/trade_manage/_Performance.cpp) - [TradeManager.h](file://hikyuu_cpp/hikyuu/trade_manage/TradeManager.h) - [006-TradeManager.ipynb](file://hikyuu/examples/notebook/006-TradeManager.ipynb)

目录

  1. 引言
  2. 核心绩效指标详解
  3. 底层数据支持
  4. 绩效报告提取与可视化
  5. 自定义与扩展
  6. 结论

引言

回测绩效评估是量化策略开发中至关重要的环节,它提供了衡量策略表现的客观标准。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提供的底层数据,其中FundsRecordPositionRecord是两个核心的数据结构。

FundsRecord(资金记录)

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(持仓记录)

PositionRecord类记录了每一笔已平仓或未平仓的交易的详细信息。

  • 主要属性:

    • stock: 交易的证券
    • takeDatetime: 初次建仓日期
    • cleanDatetime: 平仓日期(未平仓时为Null
    • number: 当前持仓数量
    • buyMoney: 累计买入资金
    • totalCost: 累计交易总成本
    • sellMoney: 累计卖出资金
    • totalRisk: 累计交易风险
  • 关键方法:

    • totalProfit(): 计算累计盈利,公式为 sellMoney - buyMoney - totalCost

Performance类通过遍历TradeManagergetHistoryPositionList()(历史持仓列表)来计算“已平仓净利润总额”、“赢利交易数”、“亏损交易数”等所有与已平仓交易相关的指标。

本文档引用的文件

  • FundsRecord.h
  • FundsRecord.cpp
  • PositionRecord.h
  • PositionRecord.cpp
  • TradeManager.h

绩效报告提取与可视化

在回测结束后,用户可以通过以下步骤提取和可视化绩效报告。

提取绩效报告

  1. 创建Performance实例: 首先,创建一个Performance对象。
  2. 执行统计计算: 调用statistics方法,并传入TradeManager实例和统计截止日期。
  3. 获取结果: 通过getnamesvaluesto_dict等方法获取具体的绩效指标。
# 示例代码
perf = Performance()
perf.statistics(my_tm)  # my_tm 是 TradeManager 实例
print(perf.report())  # 打印文本报告

# 获取单个指标
annual_return = perf["帐户年复合收益率%"]

# 转换为字典
perf_dict = perf.to_dict()

可视化

虽然Performance类本身不提供绘图功能,但其输出的数据可以轻松地与matplotlibseabornplotly等可视化库结合使用。

  • 文本报告: report()方法生成一个格式化的字符串,可以直接打印或写入文件。
  • 数据结构: to_dict()方法将所有指标转换为Python字典,names()values()方法分别返回指标名称和值的列表,这些都可以作为绘图函数的输入数据。

本文档引用的文件

  • _Performance.cpp
  • 006-TradeManager.ipynb

自定义与扩展

Performance类提供了addKeysetValue方法,允许用户自定义绩效指标。

自定义指标

用户可以添加新的指标名称,并为其赋值。

perf = Performance()
perf.statistics(my_tm)

# 添加自定义指标
perf.addKey("我的自定义指标")
perf.setValue("我的自定义指标", 123.45)

# 现在可以通过 perf["我的自定义指标"] 访问

扩展Performance

用户可以通过继承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类为回测结果的评估提供了一个强大而灵活的框架。它不仅内置了丰富的标准绩效指标,还通过FundsRecordPositionRecord确保了计算的准确性和透明度。用户不仅可以方便地提取和可视化报告,还能通过简单的API扩展功能,以满足特定的分析需求。掌握这些工具,是进行有效策略评估和优化的关键一步。

Clone this wiki locally