🚀 AI 一键生成 ptrade 策略代码

ptrade 平台 REITs 交易与持仓读取指南:解决 get_positions 为空的问题

ptrade | 发布时间: 2026/5/21
以下内容由 EasyQuant 生成。

问题描述

ptrade不支持reits,连持仓已有的也读取不出来

之前有个老账号,reits打新中的一只retis基金。

然后调用get_positions获取持仓,居然为空。

解决方案

针对您遇到的 ptrade 无法读取 REITs 持仓的问题,首先需要澄清一点:ptrade 官方 API 实际上是支持公募 REITs 的。API 文档中明确提供了 get_reits_list() 接口用于获取基础设施公募 REITs 基金代码列表。

如果您在调用 get_positions 时发现已有的 REITs 持仓为空,通常是由以下几个原因导致的。以下是详细的排查方向和解决方案:

1. 检查代码后缀格式是否正确

ptrade 平台对标的代码有严格的后缀要求。上海市场的证券需要加 .SS(或 .XSHG),深圳市场的证券需要加 .SZ(或 .XSHE)。
如果您在查询特定持仓时(例如 get_positions('180101'))没有加后缀,或者后缀写错,接口将返回空或报错。正确的格式应为 180101.SZ508099.SS

2. 券商柜台同步限制(最常见原因)

虽然 ptrade 引擎本身支持 REITs,但 ptrade 是部署在各家券商的服务器上的。部分券商的量化交易柜台(或普通交易网关)在同步持仓数据到 ptrade 环境时,可能默认过滤掉了某些非主流交易品种(如 REITs、某些特殊的新股/新债等)。

  • 现象:在券商的普通交易软件(如同花顺、通达信版)中能看到该 REITs 持仓,但在 ptrade 的 get_positions() 返回的字典中找不到该代码。
  • 解决办法:这种情况属于券商后台配置问题,您需要联系所属券商的客户经理或 IT 支持,确认其 ptrade 环境是否开通了 REITs 的交易和持仓同步权限。

3. 调试与排查代码示例

为了准确定位问题,建议您在策略中运行以下排查代码,查看 ptrade 环境到底读取到了哪些信息:

def initialize(context):
    # 1. 检查 ptrade 是否能获取到市场上的 REITs 列表
    reits_list = get_reits_list()
    log.info("当前市场共有 %s 只公募 REITs" % len(reits_list))
    if len(reits_list) > 0:
        log.info("示例 REITs 代码: %s" % reits_list[:3])

def handle_data(context, data):
    # 2. 不传参数调用 get_positions(),获取账户所有持仓
    all_positions = get_positions()
    log.info("当前账户所有持仓代码: %s" % list(all_positions.keys()))
    
    # 3. 假设您打新中的 REITs 代码是 '508099.SS' (请替换为您实际的代码)
    my_reit_code = '508099.SS'
    
    if my_reit_code in all_positions:
        pos = all_positions[my_reit_code]
        log.info("成功读取到 %s 的持仓,总数量: %s, 可用数量: %s" % (my_reit_code, pos.amount, pos.enable_amount))
    else:
        log.warning("警告:在 ptrade 持仓中未找到 %s!请联系券商确认是否同步了该品种的持仓。" % my_reit_code)

总结建议

  1. 确保您在代码中使用的 REITs 代码包含了正确的 .SS.SZ 后缀。
  2. 使用无参数的 get_positions() 打印出所有持仓的 key,看看该 REITs 是否以某种意想不到的代码格式存在。
  3. 如果打印出的所有持仓中确实没有该 REITs,请直接联系您的券商,说明“在普通交易端有 REITs 持仓,但 ptrade 量化端的 get_positions 接口未同步该持仓”,请求他们放开相应的柜台同步权限。