问题描述
解决方案
在 JoinQuant(聚宽)平台中,如果您希望将回测的基准(Benchmark)设置为由几只股票或指数按不同权重组成的自定义组合,可以使用 set_benchmark 函数,并传入一个**字典(dict)**作为参数。
以下是具体的实现方法和代码示例。
核心代码实现
您需要在策略的 initialize(context) 函数中调用 set_benchmark。
# -*- coding: utf-8 -*-
def initialize(context):
# 设定自定义组合作为基准
# 格式为 {'标的代码': 权重, ...}
# 示例:50%的平安银行,30%的沪深300指数,20%的浦发银行
custom_benchmark = {
'000001.XSHE': 0.5, # 平安银行
'000300.XSHG': 0.3, # 沪深300
'600000.XSHG': 0.2 # 浦发银行
}
# 调用API设置基准
set_benchmark(custom_benchmark)
# 其他初始化代码...
set_option('use_real_price', True)
log.info("基准已设置为自定义组合")
def handle_data(context, data):
pass
详细说明
- 函数位置:
set_benchmark通常在initialize函数中调用,只需设置一次。 - 参数格式:
- 参数必须是一个字典(dict)。
- Key(键):股票、指数或 ETF 的代码(字符串),如
'000001.XSHE'。 - Value(值):对应的权重(浮点数)。
- 权重规则:
- 字典中所有 Value(权重)之和必须 小于等于 1。
- 如果权重之和小于 1(例如总和为 0.8),剩余的部分(0.2)将被视为持有现金(收益率为 0)。
- 如果权重之和大于 1,系统会报错。
常见应用场景
- 对冲策略:如果您做的是多空对冲策略,可能需要将基准设为特定的指数(如中证500)或一篮子股票。
- 行业轮动:如果您只关注特定行业,可以将基准设为该行业几只龙头股的加权组合,以更准确地衡量超额收益(Alpha)。
- FOF/MOM:模拟基金组合的表现作为基准。
Q&A
Q: 如果我设置的权重之和小于1,剩余的部分怎么计算收益?
A: 如果权重之和小于1(例如0.8),剩余的0.2部分代表基准中这部分资金闲置(持有现金),其收益率为0。这意味着基准的波动率会降低,通常也会拉低基准在牛市中的表现。
Q: set_benchmark 可以动态调整吗?
A: set_benchmark 主要用于设定回测整体的参考标准,通常在 initialize 中设定一次。虽然技术上可以在运行过程中再次调用,但基准收益曲线的计算通常是基于初始设定的,中途修改可能会导致收益曲线计算逻辑混乱或不符合预期,因此建议仅在初始化时设定。
Q: 自定义基准支持期货合约吗?
A: 支持。您可以传入期货合约代码。如果在期货策略中不希望看到基准曲线,可以设置 set_benchmark({"000001.XSHG":0}),即权重为0,这样基准收益将一直为0。