🚀 AI 一键生成 ptrade 策略代码

PTrade 两融实战:如何计算标的证券的最大可买卖数量?

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

问题描述

在进行融资融券交易时,如何查询一只股票最多可以融资买入或融券卖出多少股?

解决方案

在PTrade量化交易平台中,针对融资融券(两融)业务,查询某只股票的最大可融资买入数量和最大可融券卖出数量,分别使用以下两个专用接口:

  1. 查询融资买入最大数量:使用 get_margincash_open_amount
  2. 查询融券卖出最大数量:使用 get_marginsec_open_amount

这两个函数仅支持在Ptrade客户端两融交易模块中使用。

1. 接口说明

A. 查询融资标的最大可买数量

函数名get_margincash_open_amount(security, price=None)

  • 参数
    • security:股票代码(字符串,如 '600570.SS')。
    • price:限定价格(浮点数,可选)。如果不传,通常按当前最新价计算。
  • 返回值:返回一个字典 dict,key为股票代码,value为最大可买数量(int)。

B. 查询融券标的最大可卖数量

函数名get_marginsec_open_amount(security, price=None)

  • 参数
    • security:股票代码(字符串)。
    • price:限定价格(浮点数,可选)。
  • 返回值:返回一个字典 dict,key为股票代码,value为最大可卖数量(int)。

2. 策略代码示例

以下是一个完整的策略示例,展示了如何在盘中获取指定股票的融资买入和融券卖出额度,并打印到日志中。

def initialize(context):
    # 设置我们要操作的股票,例如恒生电子
    g.security = '600570.SS'
    # 设置股票池
    set_universe(g.security)

def handle_data(context, data):
    # 1. 查询融资买入最大数量
    # 注意:该函数返回的是字典,如 {'600570.SS': 10000}
    cash_amount_dict = get_margincash_open_amount(g.security)
    
    if cash_amount_dict:
        max_cash_buy = cash_amount_dict.get(g.security)
        log.info("股票 %s 最大可融资买入数量: %s" % (g.security, max_cash_buy))
    else:
        log.info("股票 %s 获取融资买入数量失败或非融资标的" % g.security)

    # 2. 查询融券卖出最大数量
    sec_amount_dict = get_marginsec_open_amount(g.security)
    
    if sec_amount_dict:
        max_sec_sell = sec_amount_dict.get(g.security)
        log.info("股票 %s 最大可融券卖出数量: %s" % (g.security, max_sec_sell))
    else:
        log.info("股票 %s 获取融券卖出数量失败或非融券标的" % g.security)

    # 示例:如果融资可买数量大于1000股,则进行融资买入(仅作演示,请谨慎下单)
    # if cash_amount_dict and cash_amount_dict.get(g.security, 0) > 1000:
    #     margincash_open(g.security, 100)

3. 注意事项

  1. 环境限制:上述函数只能在两融账户的交易环境中使用,普通股票账户回测或交易不支持此功能。
  2. 返回值类型:接口返回的是字典(Dict),不是直接的数值。务必使用 .get(security) 来获取具体的数量。
  3. 价格影响price 参数会影响最大数量的计算。因为融资融券涉及保证金比例,价格越高,消耗的保证金越多,可买/可卖数量可能会减少。如果不传 price,系统通常使用当前最新成交价或昨收价进行估算。
  4. 标的限制:如果查询的股票不是两融标的,或者券商没有券源(针对融券),返回的字典可能为空或数量为0。

Q&A

Q1: 为什么调用 get_marginsec_open_amount 返回的字典是空的或者数量为0?
A1: 这通常有几种原因:

  1. 该股票不是交易所规定的融券标的。
  2. 券商端该股票的券源已耗尽,无法提供融券。
  3. 账户的可用保证金不足以支持开仓。
  4. 策略运行在非两融交易模块(如普通股票回测)。

Q2: get_margincash_open_amount 计算出的数量是基于什么计算的?
A2: 它是基于您账户当前的可用保证金、该股票的融资保证金比例以及当前的委托价格综合计算得出的。公式大致为:最大可买数量 = 可用保证金 / (价格 * 融资保证金比例)(具体计算需考虑券商的折算率和手续费设置)。

Q3: 如果我想查询卖券还款或买券还券的最大数量怎么办?
A3: PTrade提供了另外两个对应的接口:

  • 卖券还款最大数量get_margincash_close_amount(security)
  • 买券还券最大数量get_marginsec_close_amount(security)