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

joinquant 平台如何利用 order_target 实现期货目标手数下单与多空仓位控制?

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

问题描述

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

Title: joinquant 期货实战:利用 order_target 进行目标手数下单与多空对冲

Question: 请帮我编写一个在 joinquant 中使用 order_target 调整期货多空头持仓手数的示例

解决方案

在 JoinQuant(聚宽)量化交易平台上进行期货交易时,使用 order_target 函数可以非常方便地将某只期货合约的持仓调整至目标手数。对于期货交易,支持同时持有多头(side='long')和空头(side='short')仓位。

一、order_target 接口说明

order_target(security, amount, style=None, side='long', pindex=0, close_today=False)

  • security: 期货合约代码(例如 'IF2309.CCFX',不可直接对主力连续合约如 'IF9999.CCFX' 下单)。
  • amount: 期望调仓到的目标手数(必须为非负整数)。
  • side: 仓位方向,'long' 表示多头仓位,'short' 表示空头仓位。
  • pindex: 子账户索引,期货账户类型必须为 'futures'
  • close_today: 是否平今仓(适用于上期所、中金所等)。

注意:针对多空对冲策略,调整多头仓位时指定 side='long',调整空头仓位时指定 side='short',二者互不干扰。


二、多空对冲持仓调整完整策略示例

以下示例展示了如何在聚宽平台初始化期货子账户,获取股指期货主力合约,并通过 order_target 动态调整多头与空头持仓手数:

# 导入聚宽函数库
import jqdata

def initialize(context):
    # 开启动态复权/真实价格模式
    set_option('use_real_price', True)
    
    # 1. 初始化期货账户 (设置初始资金并指定账户类型为 futures)
    init_cash = context.portfolio.starting_cash
    set_subportfolios([SubPortfolioConfig(cash=init_cash, type='futures')])
    
    # 2. 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    
    # 3. 设置定时运行函数(每日开盘运行)
    run_daily(rebalance_positions, time='09:31', reference_security='IF9999.CCFX')

def rebalance_positions(context):
    # 获取当前股指期货 IF 的主力合约代码
    dominant_contract = get_dominant_future('IF', context.current_dt)
    log.info("当前沪深300股指期货主力合约: %s" % dominant_contract)
    
    # 假定根据策略信号,我们需要:
    # 将该合约的多头持仓目标调整为 3 手
    # 将该合约的空头持仓目标调整为 2 手(实现多空套利/对冲)
    target_long_amount = 3
    target_short_amount = 2
    
    # 使用 order_target 调整多头仓位
    order_target(dominant_contract, target_long_amount, side='long', pindex=0)
    log.info("已发送多头调仓指令,目标多头手数: %d" % target_long_amount)
    
    # 使用 order_target 调整空头仓位
    order_target(dominant_contract, target_short_amount, side='short', pindex=0)
    log.info("已发送空头调仓指令,目标空头手数: %d" % target_short_amount)

def after_trading_end(context):
    # 打印每日收盘后的持仓情况
    positions_long = context.subportfolios[0].long_positions
    positions_short = context.subportfolios[0].short_positions
    
    for security, pos in positions_long.items():
        log.info("收盘持仓 - 标的: %s, 多头手数: %d" % (security, pos.total_amount))
    for security, pos in positions_short.items():
        log.info("收盘持仓 - 标的: %s, 空头手数: %d" % (security, pos.total_amount))

三、注意事项与常见坑点

  1. 账户类型配置:默认的 subportfolios[0] 账户类型为 stock,直接下单期货会报错。必须在 initialize 中使用 set_subportfolios([SubPortfolioConfig(cash=..., type='futures')]) 明确指定。
  2. 主力合约不可直接下单get_dominant_future('IF') 返回具体合约代码(如 'IF2309.CCFX'),而主力代码(如 'IF9999.CCFX')仅用于行情获取,直接下单会导致委托失败。
  3. 平仓与未完成订单order_target 在执行时,如果该标的存在未完成的订单,会自动先撤销先前未完成的订单再下达新订单。
  4. 保证金检查:期货开仓会冻结保证金,若资金不足会导致创建订单失败返回 None