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

如何在 joinquant 中使用 set_subportfolios 创建股票与期货混合的子账户?

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

问题描述

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

Title: joinquant 子账户配置:set_subportfolios 初始化多资产仓位

Question: 如何在 joinquant 中使用 set_subportfolios 创建股票与期货混合的子账户?

解决方案

如何在 JoinQuant 中使用 set_subportfolios 创建股票与期货混合的子账户?

在聚宽(JoinQuant)策略开发中,默认的账户仅支持单一资产类型(通常为股票/基金)。如果策略需要同时交易股票和期货,或者需要进行资金分仓管理,必须在 initialize 初始化函数中使用 set_subportfolios 函数配置多个子账户(SubPortfolio)。


1. set_subportfolios 函数说明

set_subportfolios 用于初始化策略子账户,只能在 initialize 函数中调用。所有子账户的初始资金(cash)之和必须等于总初始资金(context.portfolio.starting_cash)。

语法格式

set_subportfolios([SubPortfolioConfig(cash, type), ...])

参数解析

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

2. 股票与期货混合子账户配置示例

以下代码展示了如何将账户初始资金一分为二,分别创建股票子账户(pindex=0)和期货子账户(pindex=1):

import jqdata

def initialize(context):
    # 开启动态复权模式
    set_option('use_real_price', True)
    
    # 获取总初始资金,并均分为两份
    total_cash = context.portfolio.starting_cash
    half_cash = total_cash / 2
    
    # 配置 2 个子账户:
    # subportfolios[0]: 股票账户
    # subportfolios[1]: 期货账户
    set_subportfolios([
        SubPortfolioConfig(cash=half_cash, type='stock'),
        SubPortfolioConfig(cash=half_cash, type='futures')
    ])
    
    # 设置定时运行函数(期货策略建议指定 reference_security)
    run_daily(market_open, time='open', reference_security='IF9999.CCFX')

3. 多子账户交易与查询操作指南

3.1 下单时指定子账户 (pindex)

在调用下单函数(如 orderorder_targetorder_value 等)时,需要通过 pindex 参数指定使用哪一个子账户:

def market_open(context):
    # 1. 在股票子账户 (pindex=0) 中买入平安银行 100 股
    order('000001.XSHE', 100, pindex=0)
    
    # 2. 在期货子账户 (pindex=1) 中开一手沪深300股指期货多单
    order('IF2309.CCFX', 1, side='long', pindex=1)

3.2 获取子账户资金与持仓信息

可以通过 context.subportfolios[pindex] 访问特定子账户的资金与持仓:

# 获取股票子账户可用资金
stock_cash = context.subportfolios[0].available_cash

# 获取期货子账户的总资产
futures_value = context.subportfolios[1].total_value

# 获取期货子账户的多头持仓
futures_positions = context.subportfolios[1].long_positions

3.3 子账户间资金划转

如果需要在不同子账户之间转移资金,可以使用 transfer_cash 函数:

# 从股票子账户 (pindex=0) 转移 500,000 元到期货子账户 (pindex=1)
transfer_cash(from_pindex=0, to_pindex=1, cash=500000)

4. 注意事项

  1. 资金一致性:所有 SubPortfolioConfigcash 总和必须精确等于 context.portfolio.starting_cash,否则系统会抛出异常。
  2. 账户类型匹配:不能在 type='stock' 的子账户中对期货标的下单,反之亦然。否则订单会创建失败(返回 None)。
  3. 上限限制:一个策略中最多可以创建 100 个 subportfolio