问题描述
解决方案
在 QMT (Quantitative Trading Platform) 中,获取用于计算夏普比率(Sharpe Ratio)的无风险利率,可以使用平台内置的 API 函数 ContextInfo.get_risk_free_rate。
该函数默认使用 十年期国债收益率 (CGB10Y) 作为无风险利率的标准。
1. 核心函数说明
- 函数名:
ContextInfo.get_risk_free_rate(index) - 参数:
index(int),表示当前 K 线的索引号,通常使用ContextInfo.barpos获取。 - 返回值:
number,返回对应时间点的无风险利率数值。 - 数据来源: 十年期国债收益率 (CGB10Y)。
2. 代码实现示例
以下是一个完整的 Python 策略示例,展示如何在 handlebar 函数中获取每个时间点的无风险利率:
# -*- coding: gbk -*-
def init(ContextInfo):
# 初始化策略,设置股票池等
ContextInfo.set_universe(['600000.SH'])
print("策略初始化完成")
def handlebar(ContextInfo):
# 1. 获取当前 K 线的索引位置
index = ContextInfo.barpos
# 2. 获取当前时间点的无风险利率
# 注意:该函数返回的是十年期国债收益率
rf_rate = ContextInfo.get_risk_free_rate(index)
# 3. 获取当前时间(用于日志展示)
timetag = ContextInfo.get_bar_timetag(index)
import datetime
date_str = datetime.datetime.fromtimestamp(timetag / 1000).strftime('%Y-%m-%d')
# 4. 打印结果
# 注意:通常返回的数值可能是百分比形式(如 3.5 代表 3.5%)或小数形式
# 在计算夏普比率时,请务必检查数值单位是否与收益率单位统一
print(f"日期: {date_str}, 无风险利率: {rf_rate}")
# 示例:如果用于夏普比率计算 (Rp - Rf) / Sigma
# 假设 rf_rate 返回的是 3.0 (即3%),而你的收益率是小数 0.15 (15%)
# 你需要将 rf_rate 转换为 0.03
# rf_decimal = rf_rate / 100
3. 注意事项
- 单位换算: API 返回的无风险利率数值通常是百分数(例如返回
3.5代表3.5%)。在计算夏普比率时,如果你的策略收益率是按小数计算的(例如0.2代表20%),请务必将无风险利率除以 100 进行统一。 - 数据依赖: 该函数依赖于 QMT 基础数据中的宏观经济数据。如果在回测非常久远的日期或数据缺失,可能会返回 0 或空值。建议在代码中加入判空或默认值处理(例如:
rf_rate = rf_rate if rf_rate else 3.0)。 - 固定值替代: 如果你希望在回测中使用固定的无风险利率(例如固定 3% 或 0%),可以直接在
init中定义全局变量,而不使用该 API。
Q&A
Q: 为什么 ContextInfo.get_risk_free_rate(index) 返回的值是 0?
A: 这通常是因为当前回测的时间点缺少对应的十年期国债收益率数据,或者数据未下载完整。请尝试在“数据管理”中补充宏观或基础数据。如果数据缺失,建议在代码中设置一个默认值(如 0.03)作为兜底。
Q: QMT 中计算夏普比率的公式是什么?
A: 夏普比率 = (策略年化收益率 - 无风险利率) / 策略收益波动率。QMT 的回测报告中会自动计算该指标,但如果你需要在代码中手动计算,需要自行维护收益率序列并计算标准差。
Q: 这个函数支持实盘模式吗?
A: 支持。在实盘模式下,它会尝试获取最近的十年期国债收益率数据。