问题描述
解决方案
在 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
注意事项
- 数据基准:QMT 默认使用十年期国债收益率(CGB10Y)作为无风险利率。如果您的策略需要使用其他利率(如一年期国债或银行定期存款利率),则需要通过
get_market_data获取对应利率品种的行情,或者自行导入外部数据。 - 年化处理:获取到的通常是年化收益率。在计算夏普比率(Sharpe Ratio)时,如果您的收益率序列是日频的,请务必将获取到的无风险利率转换为日频(通常除以 252 或 365),以保持量纲一致。
- 回测有效性:该函数在回测模式下非常有用,它能返回历史时刻对应的真实国债收益率,避免了使用固定常数导致的偏差。
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 函数。但在专业的量化回测中,使用动态的历史无风险利率会更加严谨。