GS Quant项目教程:自定义篮子历史回测数据上传指南
2025-07-06 08:10:40作者:秋泉律Samson
概述
在金融量化分析中,自定义篮子(Custom Basket)是一种重要的投资组合工具。通过GS Quant项目提供的功能,用户可以创建并管理自己的投资组合。本教程将详细介绍如何为已创建的自定义篮子上传历史回测数据,这对于回溯测试和绩效分析至关重要。
准备工作
环境初始化
首先需要初始化GS Quant会话环境,这是与平台交互的基础:
import datetime as dt
from gs_quant.api.gs.reports import GsReportApi
from gs_quant.markets.baskets import Basket
from gs_quant.markets.position_set import Currency, Position, PositionSet, PositionSetWeightingStrategy
from gs_quant.session import Environment, GsSession
# 配置客户端凭证
client = '您的客户端ID'
secret = '您的客户端密钥'
# 初始化会话
GsSession.use(Environment.PROD, client_id=client, client_secret=secret, scopes=('modify_product_data',))
构建历史持仓数据集
创建持仓集合
历史回测需要按日期组织持仓数据。每个持仓集合(PositionSet)代表特定日期的投资组合快照:
# 示例持仓数据
positions = [
Position(identifier='AAPL UW', weight=0.5),
Position(identifier='MSFT UW', weight=0.5)
]
# 创建不同日期的持仓集合
pos_set_1 = PositionSet(positions, dt.date(2021, 6, 3))
pos_set_2 = PositionSet(positions, dt.date(2022, 1, 2))
pos_set_3 = PositionSet(positions, dt.date(2022, 6, 1))
pos_set_4 = PositionSet(positions, dt.date(2023, 1, 4))
position_sets = [pos_set_1, pos_set_2, pos_set_3, pos_set_4]
数据验证与处理
持仓解析与映射检查
上传前必须确保所有持仓标识符都能正确映射到证券:
for position_set in position_sets:
position_set.resolve()
if position_set.unresolved_positions:
print(f'解析错误日期: {position_set.date.strftime("%Y-%m-%d")}')
print(f'无法映射的资产: {position_set.unresolved_positions}')
# 可选择移除无法映射的持仓
# position_set.remove_unresolved_positions()
权重计算与调整
如果原始数据只有数量没有权重,需要进行转换:
currency = Currency.USD # 设置目标货币
for position_set in position_sets:
position_set.price(
currency=currency,
use_unadjusted_close_price=False,
weighting_strategy=PositionSetWeightingStrategy.Quantity
)
if position_set.unpriced_positions:
print(f'定价错误日期: {position_set.date.strftime("%Y-%m-%d")}')
print(f'无法定价的资产: {position_set.unpriced_positions}')
# 可选择移除无法定价的持仓
# position_set.remove_unpriced_positions()
权重重新分配
移除部分持仓后,可能需要重新分配权重:
for position_set in position_sets:
position_set.redistribute_weights()
数据上传
执行上传
验证通过后,即可将历史数据上传至指定篮子:
basket = Basket.get('您的篮子ID')
basket.upload_position_history(position_sets)
异常处理
报告任务管理
上传后可能遇到报告生成失败的情况,可以管理相关任务:
backcast_reports = GsReportApi.get_reports(
position_source_id=basket.get_marquee_id(),
report_type='Basket Backcast'
)
# 获取失败的任务ID
report_job_ids = []
for report in backcast_reports:
report_jobs = GsReportApi.get_report_jobs(report.id)
report_job_ids.extend(
rj.get('id') for rj in report_jobs
if rj.get('status') == 'error'
)
# 重新调度失败任务
# for job_id in report_job_ids:
# GsReportApi.reschedule_report_job(job_id)
# 取消失败任务
# for job_id in report_job_ids:
# GsReportApi.cancel_report_job(job_id)
最佳实践建议
- 数据准备:确保历史数据完整且准确,特别是公司行动(如拆股、合并)等事件
- 频率选择:根据篮子类型选择适当的再平衡频率
- 错误处理:建议实现自动化错误检测和通知机制
- 测试验证:上传后应验证回测结果是否符合预期
通过本教程,您应该能够成功为自定义篮子上传历史回测数据,为后续的量化分析和策略回测奠定基础。