问题描述
解决方案
在聚宽(JoinQuant)平台中,如果您不想使用默认的沪深300指数作为回测基准,而是希望使用自定义的股票组合,可以通过 set_benchmark 函数来实现。
您需要将一个包含标的代码和权重的字典(Dict)传递给 set_benchmark 函数。
实现方法
- 函数位置:代码需写在
initialize(context)函数中。 - 参数格式:传入一个字典,Key 为标的代码(字符串),Value 为权重(浮点数)。
- 权重规则:权重的总和通常应等于 1(即 100%)。如果小于 1,系统会认为基准中包含部分闲置资金(现金)。
代码示例
以下是一个完整的策略初始化代码示例,展示了如何将基准设置为 50% 平安银行 (000001.XSHE) 和 50% 贵州茅台 (600519.XSHG) 的组合:
# -*- coding: utf-8 -*-
def initialize(context):
# 设定自定义组合作为基准
# 格式为 {'标的代码': 权重, ...}
# 这里设置 平安银行 占 50%,贵州茅台 占 50%
custom_benchmark = {
'000001.XSHE': 0.5,
'600519.XSHG': 0.5
}
# 调用API设置基准
set_benchmark(custom_benchmark)
# 其他初始化设置
set_option('use_real_price', True) # 开启动态复权模式(真实价格)
log.info('基准已设置为自定义组合')
def handle_data(context, data):
# 策略逻辑(此处为空,仅作示例)
pass
关键点说明
- 标的类型:字典中的 Key 不仅可以是股票代码,也可以是指数代码(如
'000016.XSHG'上证50)或 ETF 代码(如'510300.XSHG')。 - 权重计算:系统会根据您设定的权重,计算该组合在回测期间的每日收益率,并在回测结果图中绘制出基准收益曲线(蓝色线)。
- 空仓基准:如果您希望基准是一条水平线(即基准收益为0,不对比任何指数),可以设置
set_benchmark({'000001.XSHG': 0})(权重设为0)。
Q&A
Q: 如果我的自定义组合权重之和大于 1 会怎样?
A: set_benchmark 要求权重之和必须小于等于 1。如果大于 1,通常是不符合逻辑的配置,建议归一化处理,确保总和为 1.0。
Q: 基准组合中的股票如果在回测期间退市了怎么办?
A: 聚宽系统会自动处理退市数据。如果基准中的某只股票退市,系统会按照其退市前的最后价格计算其在组合中的价值贡献,或者按照现金处理,具体表现取决于该标的退市后的数据状态,但通常不会导致回测报错。
Q: 我可以在回测中途(例如 handle_data 中)修改基准吗?
A: 不建议这样做。set_benchmark 通常设计用于 initialize 阶段设定全局基准。回测的基准曲线是用于对比整个策略周期的表现,中途修改可能会导致收益率计算逻辑混乱或图表显示异常。
Q: 能否使用这一功能进行配对交易(Pair Trading)的基准设置?
A: 可以。例如您在做多股票 A 做空股票 B 的策略,您可以设置基准为股票 A 和股票 B 的某种比例组合,但这通常用于衡量多头部分的表现。对于复杂的多空策略基准,通常直接对比大盘指数(如沪深300)更能体现策略相对于市场的 Alpha 能力。