问题描述
解决方案
在PTrade中,如果您想使用账户中持有的股票直接归还融券负债(即“现券还券”),而不是从市场买入股票还券,您需要使用 marginsec_direct_refund 函数。
核心函数说明
-
marginsec_direct_refund(security, amount)- 功能:直接还券。使用账户内已有的证券持仓来偿还融券负债。
- 参数:
security: 股票代码(例如'600570.SS')。amount: 还券数量(正整数)。
-
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("当前没有足够的持仓或没有负债用于现券还券")
注意事项
- 持仓要求:您必须在信用账户(两融账户)中持有该股票的“多头”持仓(即作为担保品的股份),才能进行直接还券。如果您是在普通现金账户持有股票,需要先通过“担保品划转”将股票划转到信用账户后,才能使用此接口。
- 交易模块:该函数仅在交易模块(实盘或仿真交易)中可用,且仅适用于融资融券业务。
- 数量限制:
amount必须为正整数。系统会自动校验您的持仓数量和负债数量,取两者较小值作为实际可操作上限,但建议先使用get_margin_entrans_amount查询。 - T+1 限制:通常情况下,当日买入的股票(作为担保品)当日不可用于现券还券(具体视券商柜台规则而定,一般需T+1可用持仓)。
Q&A
Q1: marginsec_close 和 marginsec_direct_refund 有什么区别?
A1: marginsec_close 是买券还券,即使用资金从二级市场买入股票来偿还融券负债;marginsec_direct_refund 是直接还券(现券还券),即使用账户里已经持有的股票直接抵消融券负债,不涉及资金买入操作。
Q2: 我怎么知道我还欠多少券?
A2: 您可以使用 get_margin_contract() 查询具体的合约负债详情,或者使用 get_marginsec_close_amount(security) 查询买券还券的最大可买数量(这通常等同于您的负债数量)。
Q3: 如果我普通账户有股票,能直接调用这个函数吗?
A3: 不能。PTrade 的两融接口操作的是信用账户。如果股票在普通账户,您需要先在交易软件中进行“担保品划入”,将股票从普通账户转入信用账户,之后才能使用 marginsec_direct_refund。