首页
/ GS Quant项目教程:自定义篮子历史回测数据上传指南

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)

最佳实践建议

  1. 数据准备:确保历史数据完整且准确,特别是公司行动(如拆股、合并)等事件
  2. 频率选择:根据篮子类型选择适当的再平衡频率
  3. 错误处理:建议实现自动化错误检测和通知机制
  4. 测试验证:上传后应验证回测结果是否符合预期

通过本教程,您应该能够成功为自定义篮子上传历史回测数据,为后续的量化分析和策略回测奠定基础。