🚀 AI 一键生成 joinquant 策略代码

JoinQuant 期货策略:使用 set_subportfolios 配置专用子账户

joinquant | 发布时间: 2025/12/21
以下内容由 EasyQuant 生成。

问题描述

如何在initialize中初始化一个期货交易账户?

解决方案

在聚宽(JoinQuant)平台中,默认的账户类型是股票账户(stock)。若要进行期货交易,必须在 initialize 函数中显式地使用 set_subportfolios 函数将账户类型配置为期货账户(futures)。

以下是具体的代码实现及详细说明。

初始化期货账户代码示例

# -*- coding: utf-8 -*-

def initialize(context):
    # 1. 设定初始资金
    # 这里假设初始资金为 500,000 元
    init_cash = 500000
    
    # 2. 设置账户类型为期货
    # type='futures' 同时支持商品期货和金融期货
    # 如果不调用此函数,默认账户类型为 'stock',无法交易期货
    set_subportfolios([SubPortfolioConfig(cash=init_cash, type='futures')])
    
    # 3. 设置基准
    # 期货策略通常不使用默认的沪深300作为基准,建议设置为相关的主力合约或指数
    # 例如:螺纹钢主力合约
    set_benchmark('RB9999.XSGE')
    
    # 4. 开启动态复权模式(真实价格)
    # 强烈建议开启,以确保回测价格与真实市场一致
    set_option('use_real_price', True)
    
    # 5. (可选) 设置期货保证金比例
    # 如果不设置,系统会使用默认保证金比例(通常为交易所标准)
    # 这里设置为 15%
    set_option('futures_margin_rate', 0.15)
    
    # 6. (可选) 设置手续费
    # 设置期货交易手续费,例如万分之 0.23
    set_order_cost(OrderCost(open_commission=0.000023, 
                             close_commission=0.000023, 
                             close_today_commission=0.0023, 
                             min_commission=0), type='futures')
    
    # 7. (可选) 设置滑点
    # 期货通常使用跳数滑点,例如 1 跳
    set_slippage(StepRelatedSlippage(1), type='futures')
    
    # 打印日志确认初始化完成
    log.info("期货账户初始化完成")

def handle_data(context, data):
    # 策略逻辑写在这里
    pass

关键函数说明

1. set_subportfolios

这是初始化期货账户的核心函数。

  • 语法: set_subportfolios([SubPortfolioConfig(cash, type)])
  • 参数:
    • cash: 账户的初始资金。
    • type: 账户类型。期货交易必须设置为 'futures'。该类型包含了商品期货和股指期货。
  • 注意: 如果不调用此函数,系统默认创建的是股票账户,此时调用 order 等函数交易期货会报错。

2. set_benchmark

  • 默认基准是沪深300(000300.XSHG)。
  • 对于期货策略,建议将其修改为对应的期货主力合约(如 RB9999.XSGE)或相关指数,以便更准确地计算 Alpha 和 Beta 等风险指标。

3. set_option('futures_margin_rate', value)

  • 用于调整保证金比例。
  • value 是一个浮点数,例如 0.1 代表 10%。
  • 也可以针对特定品种设置,例如 set_option('futures_margin_rate.RB', 0.1)

Q&A

Q: 我可以同时交易股票和期货吗?
A: 可以。你需要配置多个子账户(SubPortfolio)。例如:

set_subportfolios([
    SubPortfolioConfig(cash=500000, type='stock'),   # 仓位索引 pindex=0
    SubPortfolioConfig(cash=500000, type='futures')  # 仓位索引 pindex=1
])

下单时需要指定 pindex 参数,例如 order('RB9999.XSGE', 1, pindex=1)

Q: type='index_futures'type='futures' 有什么区别?
A: 在旧版 API 中,index_futures 指金融期货。现在建议统一使用 type='futures',它涵盖了商品期货和金融期货(股指期货、国债期货)。

Q: 初始化后如何获取账户资金信息?
A: 可以通过 context.portfolio 获取。

  • context.portfolio.available_cash: 可用资金。
  • context.portfolio.total_value: 总权益(包含持仓盈亏)。
  • 如果是多账户模式,需通过 context.subportfolios[i] 获取对应子账户信息。