问题描述
之前有个老账号,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.SZ 或 508099.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)
总结建议
- 确保您在代码中使用的 REITs 代码包含了正确的
.SS或.SZ后缀。 - 使用无参数的
get_positions()打印出所有持仓的 key,看看该 REITs 是否以某种意想不到的代码格式存在。 - 如果打印出的所有持仓中确实没有该 REITs,请直接联系您的券商,说明“在普通交易端有 REITs 持仓,但 ptrade 量化端的 get_positions 接口未同步该持仓”,请求他们放开相应的柜台同步权限。