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

JoinQuant聚宽平台如何实现股票与期货混合策略的模拟交易?

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

问题描述

模拟交易是否能同时交易股票和期货?

请问:一个股票、期货混合策略(如:时间段A买入持有若干股票,不持有期货;时间段B卖出股票,买入持有期货),模拟交易可以实现(既能交易股票又能交易期货)吗?

P.S.本人有股票策略的模拟交易,也有期货策略的模拟交易,都正常运行,成功下单。但是,混合策略在模拟交易中只成功买卖了股票,期货交易未能成功下单(回测中是可以实现交易股票和期货的)。

解决方案

核心解答

可以实现。 在JoinQuant(聚宽)平台的模拟交易中,完全可以同时交易股票和期货。

您遇到的“股票成功下单,但期货未能成功下单”的问题,根本原因在于未正确配置多子账户(subportfolios)以及下单时未指定对应的账户索引(pindex

问题原因解析

在聚宽平台中,如果不显式配置账户类型,系统默认只初始化一个子账户 subportfolios[0],且其类型(type)默认为 'stock'(仅允许买卖股票与场内基金等)。

  • 回测环境:有时对账户类型的校验相对宽松,可能会让您误以为单账户也能混合下单。
  • 模拟交易环境:校验非常严格。如果您用类型为 'stock' 的账户去下期货订单,系统会直接拒绝(报错或返回None),导致期货下单失败。

解决方案:配置多子账户(Subportfolios)

要实现股票和期货的混合交易,您必须在 initialize 函数中将初始资金分配到两个不同的子账户中:一个用于股票(type='stock'),另一个用于期货(type='futures')。并且在调用下单API时,通过 pindex 参数明确告诉系统使用哪个账户的资金。

1. 初始化多账户配置

initialize 函数中使用 set_subportfolios 进行配置:

def initialize(context):
    # 获取总初始资金
    init_cash = context.portfolio.starting_cash
    
    # 将资金分为两份,分别给股票和期货账户
    stock_cash = init_cash * 0.5
    futures_cash = init_cash * 0.5
    
    # 设定 subportfolios[0] 为股票账户
    # 设定 subportfolios[1] 为期货账户
    set_subportfolios([
        SubPortfolioConfig(cash=stock_cash, type='stock'),
        SubPortfolioConfig(cash=futures_cash, type='futures')
    ])
    
    # 其他初始化设置...
    set_benchmark('000300.XSHG')
    set_option('use_real_price', True)

2. 下单时指定 pindex

在您的交易逻辑中,调用 orderorder_target 等函数时,必须加上 pindex 参数:

  • pindex=0 代表使用股票账户。
  • pindex=1 代表使用期货账户。
def handle_data(context, data):
    # --- 股票交易逻辑 ---
    stock_code = '000001.XSHE'
    # 买入股票,必须指定 pindex=0
    order(stock_code, 100, pindex=0)
    
    # --- 期货交易逻辑 ---
    # 获取主力合约(注意:不能直接交易'RB9999.XSGE',必须获取具体合约)
    future_code = get_dominant_future('RB')
    
    # 买入期货多单,必须指定 pindex=1
    order(future_code, 1, side='long', pindex=1)

关键注意事项

  1. 资金隔离subportfolios[0]subportfolios[1] 的资金是隔离的。如果股票账户资金不足,即使期货账户有钱,股票也无法下单。如果需要在运行中动态调配资金,可以使用 transfer_cash(from_pindex, to_pindex, cash) 函数。
  2. 期货合约代码:切记不要直接对主力连续合约(如 IF9999.CCFX)下单,必须使用 get_dominant_future 获取真实的交易合约代码(如 IF2309.CCFX)。
  3. 平今/平昨:期货交易中,如果涉及上期所、中金所、能源中心等,平仓时可能需要注意 close_today 参数的设置。

按照上述方法修改您的策略代码,明确区分股票账户和期货账户,您的混合策略就可以在模拟交易中顺利运行了。