3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
针对您遇到的 ptrade 无法读取 REITs 持仓的问题,首先需要澄清一点:ptrade 官方 API 实际上是支持公募 REITs 的。API 文档中明确提供了 get_reits_list() 接口用于获取基础设施公募 REITs 基金代码列表。
如果您在调用 get_positions 时发现已有的 REITs 持仓为空,通常是由以下几个原因导致的。以下是详细的排查方向和解决方案:
ptrade 平台对标的代码有严格的后缀要求。上海市场的证券需要加 .SS(或 .XSHG),深圳市场的证券需要加 .SZ(或 .XSHE)。
如果您在查询特定持仓时(例如 get_positions('180101'))没有加后缀,或者后缀写错,接口将返回空或报错。正确的格式应为 180101.SZ 或 508099.SS。
虽然 ptrade 引擎本身支持 REITs,但 ptrade 是部署在各家券商的服务器上的。部分券商的量化交易柜台(或普通交易网关)在同步持仓数据到 ptrade 环境时,可能默认过滤掉了某些非主流交易品种(如 REITs、某些特殊的新股/新债等)。
get_positions() 返回的字典中找不到该代码。为了准确定位问题,建议您在策略中运行以下排查代码,查看 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)
.SS 或 .SZ 后缀。get_positions() 打印出所有持仓的 key,看看该 REITs 是否以某种意想不到的代码格式存在。