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

joinquant 期货交易指南:order_value 保证金下单逻辑与计算公式详解

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

问题描述

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

Title: joinquant 期货交易指南:order_value 保证金下单逻辑与计算

Question: joinquant 的 order_value 函数在期货交易中是如何根据保证金和合约乘数计算下单手数的?

解决方案

joinquant 期货交易指南:order_value 保证金下单逻辑与计算

在聚宽(JoinQuant)量化交易平台中,order_value 函数用于按照指定的价值/保证金进行下单。与股票交易直接对应交易金额不同,期货交易由于存在杠杆机制(保证金制度)和合约乘数,其价值与手数的换算逻辑有其特殊性。


一、order_value 在期货交易中的公式与计算逻辑

在期货交易中,使用 order_value(security, value, style=None, side='long', pindex=0, close_today=False) 时,参数 value 代表的是期望投入的期货保证金金额

1. 保证金计算公式

一张期货合约所对应的保证金计算公式为:
$$\text{单张合约保证金} = \text{最新价} \times \text{合约乘数} \times \text{保证金率}$$

因此,通过 order_value 计算出的**实际下单手数(amount)**公式为:
$$\text{实际下单手数} = \left\lfloor \frac{\text{value}}{\text{最新价} \times \text{合约乘数} \times \text{保证金率}} \right\rfloor$$

注意:由于期货下单必须为整数手,系统计算出手数后会向下取整。如果计算出的手数不足 1 手,订单将无法下成功。


二、参数详解与注意事项

  1. security(标的代码):具体期货合约代码,例如 'IF2309.CCFX' 或动态获取的主力合约。注意不可直接对主力连续合约(如 'IF9999.CCFX')或指数(如 'IF8888.CCFX')直接下单。
  2. value(目标保证金价值)
    • value > 0:表示开仓或加仓对应保证金金额的头寸。
    • value < 0:表示平仓对应保证金金额的头寸。
  3. side(持仓方向)
    • 'long':多单操作(默认)。
    • 'short':空单操作。
  4. margin_rate(保证金率):默认根据不同品种设定(例如股指期货通常为 15%),也可以通过 set_option('futures_margin_rate', value) 进行自定义设置。

三、Python 策略代码示例

以下示例展示了如何在 JoinQuant 中初始化期货账户,并使用 order_value 按保证金价值对沪深 300 股指期货(IF)进行开仓和平仓操作:

import jqdata

def initialize(context):
    # 1. 设定基准
    set_benchmark('000300.XSHG')
    # 2. 开启动态复权模式
    set_option('use_real_price', True)
    
    # 3. 初始化子账户类型为期货账户 (type='futures')
    init_cash = context.portfolio.starting_cash
    set_subportfolios([SubPortfolioConfig(cash=init_cash, type='futures')])
    
    # 4. 设置股指期货保证金比例 (例如设置为 15%)
    set_option('futures_margin_rate.IF', 0.15)
    
    # 5. 定时运行函数(以 IF 主力合约作为时间参考标的)
    run_daily(market_open, time='every_bar', reference_security='IF9999.CCFX')

def market_open(context):
    # 获取当前 IF 股指期货的主力合约代码
    dominant_future = get_dominant_future('IF')
    
    # 取得可用资金
    available_cash = context.subportfolios[0].available_cash
    
    # 检查当前是否有持仓
    long_positions = context.subportfolios[0].long_positions
    
    # 如果没有持仓且有可用资金,按 500,000 元保证金开多仓
    if dominant_future not in long_positions and available_cash >= 500000:
        # 按保证金价值买入开多仓
        order_value(dominant_future, 500000, side='long', pindex=0)
        log.info("按保证金 500,000 元开多仓: %s" % dominant_future)
        
    # 平仓示例如下(直接对目标方向传入负价值):
    # elif dominant_future in long_positions:
    #     order_value(dominant_future, -500000, side='long', pindex=0)

四、总结

在 JoinQuant 的期货交易中,order_value 的的核心在于把传入的 value 视作保证金总额,系统会自动结合当前的最新价合约乘数保证金率换算为具体的下单手数。在编写策略时,请务必保证子账户类型设置为 futures,并留意下单手数向下取整带来的资金利用率差异。