🚀 AI 一键生成 qmt 策略代码

QMT 实战:get_risk_free_rate 在夏普比率计算和资产定价中的应用

qmt | 发布时间: 2025/12/8
以下内容由 EasyQuant 生成。

问题描述

我需要计算夏普比率,怎么才能动态获取每日的无风险利率数据?

解决方案

在 QMT 平台中,计算夏普比率时所需的每日无风险利率可以通过内置的 API 函数 ContextInfo.get_risk_free_rate() 动态获取。

该函数默认使用 十年期国债收益率 (CGB10Y) 作为无风险利率基准。

核心函数说明

  • 函数名ContextInfo.get_risk_free_rate(index)
  • 参数index (int),即当前 K 线的索引号,通常使用 ContextInfo.barpos
  • 返回值number,返回对应时间点的无风险利率数值。
  • 适用模式:支持回测模式和实盘/模拟运行模式。

代码实现示例

以下代码展示了如何在策略运行过程中(handlebar 函数内)动态获取每一根 K 线对应的无风险利率。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 设置股票池,这里仅作示例
    ContextInfo.set_universe(['600000.SH'])
    # 设置基准
    ContextInfo.benchmark = '000300.SH'

def handlebar(ContextInfo):
    # 1. 获取当前 K 线的索引位置
    index = ContextInfo.barpos
    
    # 2. 获取当前时间点的无风险利率 (十年期国债收益率)
    # 注意:返回的数值通常是小数形式或百分比形式,具体取决于数据源,建议打印确认
    rf_rate = ContextInfo.get_risk_free_rate(index)
    
    # --- 以下为辅助打印代码,用于验证数据 ---
    
    # 获取当前 K 线的时间戳
    timetag = ContextInfo.get_bar_timetag(index)
    # 将时间戳转换为可读日期格式
    date_str = timetag_to_datetime(timetag, '%Y-%m-%d')
    
    # 打印结果
    print(f"日期: {date_str}, 当日无风险利率: {rf_rate}")

    # 在计算夏普比率时,通常需要将年化无风险利率转换为日度无风险利率
    # 假设 rf_rate 为年化利率(例如 0.03 代表 3%),转换公式如下:
    # daily_rf = rf_rate / 252 

注意事项

  1. 数据基准:QMT 默认使用十年期国债收益率(CGB10Y)作为无风险利率。如果您的策略需要使用其他利率(如一年期国债或银行定期存款利率),则需要通过 get_market_data 获取对应利率品种的行情,或者自行导入外部数据。
  2. 年化处理:获取到的通常是年化收益率。在计算夏普比率(Sharpe Ratio)时,如果您的收益率序列是日频的,请务必将获取到的无风险利率转换为日频(通常除以 252 或 365),以保持量纲一致。
  3. 回测有效性:该函数在回测模式下非常有用,它能返回历史时刻对应的真实国债收益率,避免了使用固定常数导致的偏差。

Q&A

Q: QMT 的无风险利率数据来源是什么?
A: QMT 底层使用的是十年期国债收益率(CGB10Y)作为无风险利率的标准数据。

Q: get_risk_free_rate 返回的值是百分数还是小数?
A: 通常返回的是小数形式(例如 0.035 代表 3.5%),但在不同版本或数据源更新下可能有所变动,建议在策略编写初期使用 print 打印出来确认量级。

Q: 如果我想用固定的无风险利率(比如 3%)计算夏普比率怎么办?
A: 您可以直接在代码中定义一个全局变量(如 ContextInfo.rf = 0.03),而不调用 get_risk_free_rate 函数。但在专业的量化回测中,使用动态的历史无风险利率会更加严谨。