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

ptrade 两融实战:卖券还款(margincash_close)与直接还款(margincash_direct_refund)详解

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

问题描述

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

Title: ptrade 两融实战:卖券还款与直接还款的区别与 API 应用

Question: ptrade 中 margincash_close 和 margincash_direct_refund 有什么区别?如何正确使用?

解决方案

在 ptrade 平台的两融(融资融券)交易中,margincash_close(卖券还款)与 margincash_direct_refund(直接还款)是两种用于偿还融资负债的 API 接口。二者在还款资金来源、接口入参以及交易机制上存在本质区别。


一、核心区别对比

区别维度 卖券还款 (margincash_close) 直接还款 (margincash_direct_refund)
资金/证券来源 卖出当前持有的担保品股票,使用变现资金偿还融资负债。 使用账户内已有的可用现金(可用资金)直接偿还融资负债。
交易行为 会产生证券卖出报单(向柜台报委托单)。 不产生证券买卖报单,仅涉及账户资金的内部划转与负债清偿。
核心参数 security(股票代码), amount(卖出数量), limit_price(委托限价)。 value(还款金额,单位:元)。
交易限制 受交易时间、股票停牌、限价笼子及成交流动性影响。 只要账户内有足够的可用现金即可随时/即时执行。

二、API 详细说明与正确使用方式

1. 卖券还款 margincash_close

  • 适用场景:当账户内没有足够的可用现金,但希望通过卖出持有的融资标的或担保品股票来归还融资欠款时使用。
  • 语法结构
    margincash_close(security, amount, limit_price=None)
    
  • 注意事项
    • amount 需输入正整数(如卖数 100 股则填 100)。
    • 若未指定 limit_price,系统默认使用行情快照最新价报单。

2. 直接还款 margincash_direct_refund

  • 适用场景:当账户内已有闲置可用现金(例如现金平仓收入、转入资金或卖出其他非融资资产所得),希望直接转为偿还融资利息或本金时使用。
  • 语法结构
    margincash_direct_refund(value)
    
  • 注意事项
    • value 为还款金额(float),不能超过账户当前负债总额或可用资金。
    • 可配合 get_margin_assert() 获取当前融资负债总额。

三、策略实战代码示例

以下示例展示了如何在 ptrade 策略中查询信用资产,并根据条件分别执行直接还款与卖券还款:

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    # 1. 查询两融信用资产信息
    margin_assert = get_margin_assert()
    if not margin_assert:
        return
    
    # 获取融资合约金额(负债)与可用现金
    fin_compact_balance = margin_assert.get('fin_compact_balance', 0.0)
    cash = context.portfolio.cash
    
    # 场景 A:如果可用现金大于等于负债金额,且存在负债,执行【直接还款】
    if fin_compact_balance > 0 and cash >= fin_compact_balance:
        log.info("执行直接还款,还款金额: %s" % fin_compact_balance)
        margincash_direct_refund(fin_compact_balance)
    
    # 场景 B:如果现金不足以还债,但达到卖出止盈条件,执行【卖券还款】
    elif fin_compact_balance > 0:
        # 查询当前股票最大可卖还款数量
        close_dict = get_margincash_close_amount(g.security)
        max_close_amount = close_dict.get(g.security, 0) if close_dict else 0
        
        if max_close_amount >= 100:
            log.info("执行卖券还款,卖出数量: %s" % max_close_amount)
            margincash_close(g.security, max_close_amount)