🚀 AI 一键生成 ptrade 策略代码

PTrade 策略启动检查:如何使用 permission_test 函数验证账户权限?

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

问题描述

我的策略需要用到两融交易,如何在代码里判断当前登录的账户是否开通了两融权限?

解决方案

在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)

补充说明

  1. 环境差异

    • permission_test() 是专门为实盘交易设计的接口。
    • 回测环境中,账户性质(普通账户还是两融账户)通常是在回测参数配置界面手动选择的,代码中的检测可能不会生效或抛出异常,因此建议在代码中做好异常处理(如上例所示)。
  2. 辅助判断方法

    • 除了 permission_test(),你也可以通过尝试获取信用资产信息来侧面验证。例如调用 get_margin_assert(),如果返回了有效的字典数据(包含 total_debit 等字段),则说明是两融账户;如果返回空字典或 None,则通常意味着没有两融权限。
  3. 标的检查

    • 即使账户拥有两融权限,并非所有股票都支持融资或融券。在下单前,务必使用 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(融资可用额度)字段。