🚀 AI 一键生成 joinquant 策略代码
立即体验

如何在聚宽策略中同时交易股票和期货?子账户(SubPortfolio)该怎么初始化?

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 子账户配置:股指期货与商品期货混合交易设置

Question: 如何在聚宽策略中同时交易股票和期货?子账户(SubPortfolio)该怎么初始化?

解决方案

JoinQuant 子账户配置:股票与期货混合交易设置指南

在 JoinQuant(聚宽)量化交易平台上,默认的单仓位账户(subportfolios[0])类型为 stock(仅允许买卖股票和场内基金)。如果您希望在同一个策略中同时交易股票和期货(包括股指期货与商品期货),必须在 initialize 初始化函数中调用 set_subportfolios API 来配置多仓位子账户。

本文将详细介绍如何使用 SubPortfolioConfig 进行子账户初始化,并提供完整的配置模板。


一、 核心 API 介绍

1. set_subportfolios

用于初始化或修改策略子账户的配置。只能在 initialize 函数中调用。所有子账户配置的初始资金(cash)之和必须等于策略的总初始资金。

2. SubPortfolioConfig(cash, type)

  • cash: 该子账户分配的初始资金。
  • type: 子账户可操作的标的类型,支持以下选项:
    • 'stock': 股票与场内基金账户。
    • 'futures': 期货账户(包含股指期货和商品期货)。
    • 'index_futures': 金融期货账户(专指股指期货)。
    • 'stock_margin': 融资融券账户。

二、 股票与期货混合账户初始化代码示例

以下示例展示了如何将初始资金等分为两份,分别建立一个股票子账户(subportfolios[0])和一个期货子账户(subportfolios[1]):

# 导入聚宽函数库
import jqdata
from kuanke.user_space_api import *

def initialize(context):
    # 1. 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    
    # 2. 开启动态复权模式(真实价格) - 期货交易必须开启此模式
    set_option('use_real_price', True)
    
    # 3. 获取策略总初始资金,并等分为两份
    total_starting_cash = context.portfolio.starting_cash
    half_cash = total_starting_cash / 2.0
    
    # 4. 初始化子账户配置
    # subportfolios[0] 为股票账户,分配一半资金
    # subportfolios[1] 为期货账户,分配一半资金
    set_subportfolios([
        SubPortfolioConfig(cash=half_cash, type='stock'),
        SubPortfolioConfig(cash=half_cash, type='futures')
    ])
    
    # 5. 设置运行函数(例如每日运行)
    run_daily(market_open, time='every_bar')

def market_open(context):
    # 在交易时,必须通过 pindex 参数指定对应的子账户
    # pindex=0 对应股票账户,pindex=1 对应期货账户
    
    # 示例:在股票账户(pindex=0)买入平安银行
    stock_code = '000001.XSHE'
    if stock_code not in context.subportfolios[0].long_positions:
        order(stock_code, 100, pindex=0)
        
    # 示例:在期货账户(pindex=1)开一手螺纹钢主力合约多单
    # 注意:期货下单前需使用 get_dominant_future 获取具体合约代码
    raw_future = 'RB'
    future_code = get_dominant_future(raw_future, context.current_dt.date())
    if future_code and (future_code not in context.subportfolios[1].long_positions):
        order(future_code, 1, side='long', pindex=1)

三、 混合交易注意事项

  1. 指定 pindex 参数:在进行 orderorder_targetorder_value 等交易操作时,必须传入 pindex 参数。若不传,系统默认指向 pindex=0。如果尝试向 type='stock' 的账户下期货单,或者向 type='futures' 的账户下股票单,系统将会报错或拒绝委托。
  2. 资金转移:如果需要在不同子账户之间调配资金,可以使用 transfer_cash(from_pindex, to_pindex, cash) 函数进行账户间资金转移。
  3. 真实价格模式:进行期货交易时,强烈建议在 initialize 中设置 set_option('use_real_price', True),以确保保证金计算和撮合逻辑符合真实市场。