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

JoinQuant量化平台期货交易中 order_value() 的乘数与保证金是什么意思?

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

问题描述

期货交易中的order_value()函数

这个期货交易中的乘数是什么意思呢?
还有这里的value等于保证金的意思就是说,输入保证金值就会自动买对应价值的期货吗?如果保证金率是0.15的情况下,输入value=15,是不是就会下单调整期货至价值85呢?
那我为什么输入value=g.profolio.total_value*0.15的情况下,收益率这么低呢?感觉是没有把全部钱用出去

解决方案

在 JoinQuant (聚宽) 平台进行期货量化交易时,理解 order_value()order_target_value() 函数中的参数至关重要。针对您的三个问题,下面为您详细解答:

1. 期货交易中的“乘数”是什么意思?

**乘数(合约乘数)**是指一手期货合约所代表的标的物的实际数量或价值倍数。因为期货交易是以“手”为单位的,而不是像股票那样以“股”为单位。

  • 商品期货示例:螺纹钢(RB)的乘数是 10 吨/手。如果当前螺纹钢价格是 4000 元/吨,那么一手螺纹钢合约的总价值就是 4000 * 10 = 40000 元。
  • 股指期货示例:沪深300股指期货(IF)的乘数是 300 元/点。如果当前 IF 指数是 4000 点,那么一手 IF 合约的总价值就是 4000 * 300 = 1200000 元(120万)。

在 API 的计算公式 value = 最新价 * 手数 * 保证金率 * 乘数 中,乘数用于将“报价”转化为“实际合约价值”。

2. value 等于保证金是什么意思?输入 value=15 会怎样?

在 JoinQuant 的期货 API 中,order_value(security, value)order_target_value(security, value) 里的 value 参数,直接代表的是你要动用的“保证金金额”,而不是合约的总价值。

  • 关于您的误区:如果保证金率是 0.15,输入 value=15绝对不是下单调整期货至价值 85。
  • 实际的执行逻辑:当您输入 value=15 时,系统会认为您想拿出 15元人民币 作为保证金去开仓。系统会根据公式反推手数:
    手数 = value / (最新价 * 保证金率 * 乘数)
    由于期货一手需要的保证金通常在几千到十几万不等,15元连 0.01 手都买不到。因为期货只能交易整数手,系统向下取整后,实际下单手数为 0 手,也就是什么都不会买。

注意区分两个函数:

  • order_value(security, value)增量下单。花费 value 金额的保证金去买入/卖出期货。
  • order_target_value(security, value)目标下单。调整该合约的持仓,使其占用的保证金达到 value 金额。

3. 为什么输入 value = context.portfolio.total_value * 0.15 收益率很低,感觉钱没用出去?

您感觉“没有把全部钱用出去”是完全正确的。原因有以下几点:

原因一:您只动用了 15% 的资金作为保证金(没有利用期货的杠杆)
假设您的总资产是 100 万,value = 100万 * 0.15 = 15万。您拿出了 15 万作为保证金去开仓。
如果该品种的保证金率刚好是 15%(0.15),那么这 15 万保证金对应的合约总价值 = 15万 / 0.15 = 100万
这意味着,您虽然只花了 15 万的保证金,但您持有的期货合约总价值是 100 万,刚好等于您的总资产。这相当于1倍杠杆(无杠杆),和您全仓买入 100 万股票的波动率是一样的。剩下的 85 万资金作为可用资金闲置在账户里充当安全垫。如果您想追求高收益(高杠杆),您需要提高 value 的比例,但要注意爆仓风险。

原因二:资金门槛导致向下取整(零头无法成交)
期货必须是整数手交易。假设一手 IF 股指期货需要 18 万保证金。如果您的总资产是 100 万,15% 就是 15 万。系统计算发现 15 万 < 18 万,不足以开 1 手 IF,于是实际下单手数为 0。您的资金完全没有用出去,收益率自然接近于 0。

原因三:使用了 order_value 而不是 order_target_value
如果您在 handle_data 中每天调用 order_value(sec, total_value * 0.15),这意味着您每天都在追加 15% 的保证金去开新仓,直到资金耗尽。如果您本意是“维持 15% 的仓位”,应该使用 order_target_value

💡 建议与调试方法

为了弄清楚您的钱到底有没有用出去,建议在策略中加入 log.info 打印日志:

def handle_data(context, data):
    # 计算目标保证金
    target_margin = context.portfolio.total_value * 0.15
    
    # 打印下单前的可用资金和总资产
    log.info("当前总资产: %.2f, 准备使用的保证金: %.2f, 可用资金: %.2f" % 
             (context.portfolio.total_value, target_margin, context.portfolio.available_cash))
    
    # 建议使用 order_target_value 来控制目标仓位
    order_target_value('RB9999.XSGE', target_margin, side='long')
    
    # 打印当前持仓占用的保证金
    if 'RB9999.XSGE' in context.portfolio.long_positions:
        pos = context.portfolio.long_positions['RB9999.XSGE']
        log.info("实际持仓手数: %d, 实际占用保证金: %.2f" % (pos.total_amount, pos.value * 0.15)) # 假设保证金率0.15

通过查看日志中的“实际持仓手数”,您就能立刻明白资金是否因为不足一手而被闲置了。