问题描述
解决方案
在PTrade量化交易平台中,判断当前登录账户是否开通了两融(融资融券)权限,主要使用 permission_test() 函数。
该函数通常在策略初始化阶段(initialize)或盘前阶段(before_trading_start)调用,用于设置全局标志位,从而决定后续策略逻辑是执行两融交易还是普通股票交易。
核心函数说明
- 函数名:
permission_test() - 适用范围:仅在交易模块(实盘)可用。
- 返回值:
True:表示账户具有两融权限。False:表示账户没有两融权限。
策略代码示例
以下是一个完整的策略示例,展示了如何在初始化时检查权限,并在交易逻辑中根据权限决定是进行“融资买入”还是“普通买入”。
def initialize(context):
"""
策略初始化函数
"""
# 设置股票池
g.security = '600570.SS'
set_universe(g.security)
# 定义一个全局变量,用于存储是否有两融权限
g.has_margin_permission = False
# 检查两融权限
check_account_permission(context)
def check_account_permission(context):
"""
自定义函数:检查账户权限
"""
# permission_test() 仅在交易模式下有效
# 在回测模式下,通常由回测参数配置决定账户类型,此函数可能无法准确反映回测设置
# 这里使用 try-except 结构是为了防止在不支持的环境下报错
try:
if permission_test():
g.has_margin_permission = True
log.info("【权限检查】当前账户已开通两融权限,将尝试使用信用账户接口。")
else:
g.has_margin_permission = False
log.info("【权限检查】当前账户未开通两融权限,将仅使用普通账户接口。")
except Exception as e:
# 如果在回测或其他不支持该函数的环境中
log.info("【权限检查】无法检测两融权限(可能是回测环境),默认设置为False。错误信息: %s" % str(e))
g.has_margin_permission = False
def handle_data(context, data):
"""
盘中运行函数
"""
security = g.security
# 示例交易逻辑:简单的买入操作
# 假设我们要买入 100 股
amount = 100
# 根据权限选择不同的下单接口
if g.has_margin_permission:
# --- 拥有两融权限,尝试融资买入 ---
# 1. 查询融资标的列表,确认该股票是否可融资
margincash_stocks = get_margincash_stocks()
if security in margincash_stocks:
# 2. 查询最大可融资买入数量
max_open = get_margincash_open_amount(security)
# 注意:get_margincash_open_amount 返回的是字典
max_amount = max_open.get(security, 0)
if max_amount >= amount:
log.info("【两融交易】融资买入: %s, 数量: %s" % (security, amount))
# 融资买入接口
margincash_open(security, amount)
else:
log.info("【两融交易】融资额度不足或不可买入,最大可买: %s" % max_amount)
else:
log.info("【两融交易】标的 %s 不在融资标的列表中,无法融资买入" % security)
else:
# --- 无两融权限,使用普通买入 ---
log.info("【普通交易】普通买入: %s, 数量: %s" % (security, amount))
# 普通买入接口
order(security, amount)
补充说明
-
环境差异:
permission_test()是专门为实盘交易设计的接口。- 在回测环境中,账户性质(普通账户还是两融账户)通常是在回测参数配置界面手动选择的,代码中的检测可能不会生效或抛出异常,因此建议在代码中做好异常处理(如上例所示)。
-
辅助判断方法:
- 除了
permission_test(),你也可以通过尝试获取信用资产信息来侧面验证。例如调用get_margin_assert(),如果返回了有效的字典数据(包含total_debit等字段),则说明是两融账户;如果返回空字典或None,则通常意味着没有两融权限。
- 除了
-
标的检查:
- 即使账户拥有两融权限,并非所有股票都支持融资或融券。在下单前,务必使用
get_margincash_stocks()(融资标的)或get_marginsec_stocks()(融券标的)检查目标股票是否在标的池中。
- 即使账户拥有两融权限,并非所有股票都支持融资或融券。在下单前,务必使用
Q&A
Q: permission_test() 在回测模式下返回什么?
A: 在回测模式下,该函数通常不可用或行为未定义(取决于具体的PTrade版本和券商部署环境)。在回测中,你应该通过设置回测配置中的“账户类型”来模拟两融环境,而不是依赖代码检测。
Q: 如果我有两融权限,可以混用 order() 和 margincash_open() 吗?
A: 可以。两融账户通常包含“普通买卖”和“信用交易”两种功能。
- 使用
order()会使用自有资金进行担保品买入(普通买入)。 - 使用
margincash_open()会使用融资额度进行买入。 - 注意:在两融账户中使用
order()买入的股票会成为担保品。
Q: 如何查询我的融资可用额度?
A: 可以使用 get_margin_assert() 函数,查看返回字典中的 fin_enable_quota(融资可用额度)字段。