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

PTrade 期货空头交易指南:sell_open 开空与 buy_close 平空实操

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

问题描述

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

Title: PTrade 期货空头交易指南:sell_open 开空与 buy_close 平空实操

Question: 请教在 PTrade 中进行期货做空交易时,sell_open 和 buy_close 函数的具体用法和示例代码

解决方案

PTrade 期货空头交易指南:sell_open 开空与 buy_close 平空实操

在 PTrade 量化交易平台中,进行期货做空(空头)交易主要依赖于两个核心 API 函数:sell_open(卖出开仓)和 buy_close(买入平仓)。本文将详细解析这两个 API 的参数说明、注意事项以及完整的实操策略代码。


1. 核心 API 详解

1.1 sell_open - 卖出开仓(空开)

用于建立期货空头头寸(卖出开仓)。

  • 函数签名sell_open(contract, amount, limit_price=None)
  • 参数说明
    • contract (str):期货合约代码,例如 'IF2309.CCFX''CU2112.XSGE'
    • amount (int):交易数量,须为正整数(表示开空的手数)。
    • limit_price (float, 可选):委托限价。若不传,则回测环境按当前分钟最新价报单,实盘环境按行情快照最新价报单。
  • 返回值:成功返回 Order 对象的 ID (str),失败返回 None

1.2 buy_close - 买入平仓(空平)

用于平掉已有的空头头寸(买入平仓)。

  • 函数签名buy_close(contract, amount, limit_price=None, close_today=False)
  • 参数说明
    • contract (str):期货合约代码。
    • amount (int):交易数量,须为正整数(表示平空的手数)。
    • limit_price (float, 可选):委托限价。
    • close_today (bool, 可选):平仓方式。默认为 False(优先平昨仓,不足部分平今仓)。仅对上海期货交易所(XSGE/INE)生效;若设置为 True,则仅平今仓。
  • 返回值:成功返回 Order 对象的 ID (str),失败返回 None

2. 完整策略示例:期货双均线空头/多头策略

以下是一个基于 5 日与 10 日均线交叉的期货策略示例,展示了如何结合 buy_opensell_closesell_openbuy_close 进行多空双向交易。

def initialize(context):
    # 设置标的合约:以沪铜为例
    g.security = 'CU2112.XSGE'
    set_universe(g.security)
    # 设置期货保证金比例(例如 8%)
    set_margin_rate('CU', 0.08)

def handle_data(context, data):
    security = g.security
    
    # 获取过去 10 天的收盘价
    df = get_history(10, '1d', 'close', security, fq=None, include=False)
    if df is None or len(df) < 10:
        return
    
    # 计算 5 日均线与 10 日均线
    ma5 = df['close'][-5:].mean()
    ma10 = df['close'][-10:].mean()
    
    # 获取当前持仓对象
    pos = get_position(security)
    
    # 1. 死叉:5日均线跌破10日均线 -> 买入平多,卖出开空
    if ma5 < ma10:
        # 如果持有多头头寸,先平多
        if pos.long_amount > 0:
            sell_close(security, pos.long_amount)
            log.info(f"平多仓:{security},手数:{pos.long_amount}")
        
        # 如果没有空头头寸,则开空 1 手
        if pos.short_amount == 0:
            sell_open(security, 1)
            log.info(f"卖出开空:{security},手数:1")
            
    # 2. 金叉:5日均线突破10日均线 -> 买入平空,买入开多
    elif ma5 > ma10:
        # 如果持有空头头寸,先平空
        if pos.short_amount > 0:
            buy_close(security, pos.short_amount)
            log.info(f"买入平空:{security},手数:{pos.short_amount}")
        
        # 如果没有多头头寸,则开多 1 手
        if pos.long_amount == 0:
            buy_open(security, 1)
            log.info(f"买入开多:{security},手数:1")

3. 注意事项与最佳实践

  1. 最小变动价位(Tick Size):在传入 limit_price 时,请务必注意对应期货品种的价格跳动单位(如沪铜一手变动为 10 元),否则可能导致报单被柜台拒单。
  2. 平今与平昨(上期所规则):上海期货交易所区分平今仓与平昨仓。若需精确控制平今仓,将 buy_closeclose_today 参数设为 True;其他交易所无需特别指定。
  3. 每日结单:根据交易所规则,未成交的委托单在每日收盘后会被自动撤销。
  4. 持仓查询:可通过 get_position(security) 获得 Position 对象,使用 pos.short_amount 获取空头总持仓量,使用 pos.short_enable_amount 获取空头可用持仓量。