问题描述
解决方案
在PTrade中,查询某只股票是否可以融券(是否为融券标的)以及查询当前账户最大可融券卖出数量,主要涉及以下两个API接口:
get_marginsec_stocks():获取全市场的融券标的列表。get_marginsec_open_amount(security):查询指定标的的最大可融券卖出数量。
以下是详细的说明和代码实现。
1. 核心接口说明
A. 查询是否为融券标的
使用 get_marginsec_stocks() 获取当前市场上所有允许融券的股票代码列表。如果你的目标股票在这个列表中,说明它是融券标的。
B. 查询最大可借数量
使用 get_marginsec_open_amount(security)。
- 参数:股票代码(如
'600570.SS')。 - 返回:一个字典,Key为股票代码,Value为最大可卖数量(
int)。 - 逻辑:该数量是根据券商券池剩余量、你的账户保证金可用额度、融券保证金比例等综合计算得出的实际可下单数量。
2. 策略代码示例
以下代码展示了一个完整的流程:
- 检查股票是否在融券标的池中。
- 查询该股票当前可融券卖出的最大数量。
- 如果数量满足条件,执行融券卖出(
marginsec_open)。
def initialize(context):
# 设置我们要操作的股票
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
stock = g.security
# ---------------------------------------------------
# 第一步:查询该股票是否为融券标的
# ---------------------------------------------------
# 获取所有融券标的列表
margin_sec_list = get_marginsec_stocks()
if stock not in margin_sec_list:
log.info("股票 %s 不是融券标的,无法进行融券交易。" % stock)
return
# ---------------------------------------------------
# 第二步:查询最大可融券卖出数量
# ---------------------------------------------------
# 获取最大可卖数量字典
# 注意:此函数仅在两融交易模块可用
amount_dict = get_marginsec_open_amount(stock)
# 解析返回结果,如果获取失败或无数据,默认为0
max_sell_amount = 0
if amount_dict and stock in amount_dict:
max_sell_amount = amount_dict[stock]
log.info("股票 %s 当前最大可融券卖出数量为: %s" % (stock, max_sell_amount))
# ---------------------------------------------------
# 第三步:根据数量执行交易
# ---------------------------------------------------
# 假设我们要卖出 100 股,且最大可用数量充足
target_amount = 100
if max_sell_amount >= target_amount:
# 融券卖出接口: marginsec_open
marginsec_open(stock, target_amount)
log.info("融券卖出 %s, 数量: %s" % (stock, target_amount))
else:
log.info("股票 %s 券源不足或额度不足,无法卖出目标数量。" % stock)
3. 补充:查询融券详细状态
如果你需要更详细的信息(例如融券状态是否暂停、具体的融券保证金比例等),可以使用 get_enslo_security_info()。
def check_detailed_status(context):
stock = '600570.SS'
# 获取融券详细信息
# 返回的是一个字典,包含 enable_amount(可用数量), slo_status(状态) 等
info = get_enslo_security_info()
if info and stock in info:
stock_info = info[stock]
status = stock_info.get('slo_status') # "0":正常,"1":暂停,"2":作废
enable_amt = stock_info.get('enable_amount') # 可用数量
ratio = stock_info.get('slo_ratio') # 融券保证金比例
log.info("股票: %s, 状态: %s, 券池可用: %s, 保证金比例: %s" % (stock, status, enable_amt, ratio))
if status == '0' and enable_amt > 0:
log.info("该股票融券状态正常且有券。")
else:
log.info("未查询到该股票的融券详细信息。")
注意事项
- 环境限制:上述函数(
get_marginsec_stocks,get_marginsec_open_amount,marginsec_open)仅支持Ptrade客户端可用,且仅在两融交易模块(信用账户)可用。在普通股票回测或普通账户交易中调用会报错或返回空。 - 数据时效:
get_marginsec_open_amount返回的是综合计算后的结果,通常比单纯查询券池更准确,因为它包含了对你账户资金状况的校验。 - 代码后缀:请确保传入的股票代码带有后缀(如
.SS或.SZ),否则可能无法匹配到数据。
Q&A
Q1: get_marginsec_open_amount 返回的数量是实时的吗?
A1: 是的,该接口返回的是基于当前时刻券商柜台数据计算出的最大可操作数量。它不仅考虑了券池剩余量,还考虑了你账户当前的可用保证金余额。
Q2: 如果 get_marginsec_stocks() 返回了该股票,但我下单时提示“无券”,是什么原因?
A2: get_marginsec_stocks() 只是说明该股票在交易所的标的名单里,或者券商允许开展该股票的融券业务。但具体的**券源(Inventory)**是动态的,可能被借光了。因此下单前必须使用 get_marginsec_open_amount() 确认实际可用数量。
Q3: 融券卖出使用哪个下单接口?
A3: 必须使用 marginsec_open(security, amount)。不要使用普通的 order() 接口,普通接口通常用于自有资金买卖或普通卖出持仓。