🚀 AI 一键生成 ptrade 策略代码

PTrade 融资融券教程:如何查询可还券数量并执行现券还券?

ptrade | 发布时间: 2025/12/9
以下内容由 EasyQuant 生成。

问题描述

我融券卖出了一只股票,现在我普通账户里有这只股票的持仓,怎么直接用持仓去还券,而不是买券还券?

解决方案

在PTrade中,如果您想使用账户中持有的股票直接归还融券负债(即“现券还券”),而不是从市场买入股票还券,您需要使用 marginsec_direct_refund 函数。

核心函数说明

  1. marginsec_direct_refund(security, amount)

    • 功能:直接还券。使用账户内已有的证券持仓来偿还融券负债。
    • 参数
      • security: 股票代码(例如 '600570.SS')。
      • amount: 还券数量(正整数)。
  2. get_margin_entrans_amount(security)

    • 功能:查询最大可现券还券数量。在执行还券前,建议先调用此函数查询当前账户中有多少持仓可以用于直接还券(这取决于您的持仓量和负债量的较小值)。

策略代码示例

以下是一个完整的策略示例,展示了如何查询最大可还券数量并执行直接还券操作:

def initialize(context):
    # 设置我们要操作的股票,假设是恒生电子
    g.security = '600570.SS'
    set_universe(g.security)
    # 设置一个标志位,防止重复操作
    g.refund_done = False

def handle_data(context, data):
    # 如果已经执行过还券,则不再执行
    if g.refund_done:
        return

    # 1. 查询该股票最大可“现券还券”的数量
    # get_margin_entrans_amount 返回的是一个字典,key是股票代码,value是数量
    entrans_info = get_margin_entrans_amount(g.security)
    
    if entrans_info is None:
        log.info("查询现券还券数量失败或无数据")
        return

    # 获取具体数量
    max_refund_amount = entrans_info.get(g.security, 0)
    
    log.info("股票 %s 当前最大可现券还券数量为: %s" % (g.security, max_refund_amount))

    # 2. 如果有可还券数量,执行直接还券
    if max_refund_amount > 0:
        # 这里演示全部偿还,也可以根据需求指定具体数值,如 100
        marginsec_direct_refund(g.security, max_refund_amount)
        log.info("已触发直接还券操作,数量: %s" % max_refund_amount)
        g.refund_done = True
    else:
        log.info("当前没有足够的持仓或没有负债用于现券还券")

注意事项

  1. 持仓要求:您必须在信用账户(两融账户)中持有该股票的“多头”持仓(即作为担保品的股份),才能进行直接还券。如果您是在普通现金账户持有股票,需要先通过“担保品划转”将股票划转到信用账户后,才能使用此接口。
  2. 交易模块:该函数仅在交易模块(实盘或仿真交易)中可用,且仅适用于融资融券业务。
  3. 数量限制amount 必须为正整数。系统会自动校验您的持仓数量和负债数量,取两者较小值作为实际可操作上限,但建议先使用 get_margin_entrans_amount 查询。
  4. T+1 限制:通常情况下,当日买入的股票(作为担保品)当日不可用于现券还券(具体视券商柜台规则而定,一般需T+1可用持仓)。

Q&A

Q1: marginsec_closemarginsec_direct_refund 有什么区别?
A1: marginsec_close买券还券,即使用资金从二级市场买入股票来偿还融券负债;marginsec_direct_refund直接还券(现券还券),即使用账户里已经持有的股票直接抵消融券负债,不涉及资金买入操作。

Q2: 我怎么知道我还欠多少券?
A2: 您可以使用 get_margin_contract() 查询具体的合约负债详情,或者使用 get_marginsec_close_amount(security) 查询买券还券的最大可买数量(这通常等同于您的负债数量)。

Q3: 如果我普通账户有股票,能直接调用这个函数吗?
A3: 不能。PTrade 的两融接口操作的是信用账户。如果股票在普通账户,您需要先在交易软件中进行“担保品划入”,将股票从普通账户转入信用账户,之后才能使用 marginsec_direct_refund