🚀 AI 一键生成 ptrade 策略代码
立即体验

ptrade 平台如何利用 get_reits_list 筛选全市场公募 REITs 进行量化交易?

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: ptrade 创新品种投资:如何利用 get_reits_list 筛选全市场公募 REITs?

Question: ptrade能做REITs的量化策略吗?怎么获取REITs的代码列表?

解决方案

ptrade 创新品种投资:如何利用 get_reits_list 筛选全市场公募 REITs?

是的,ptrade 完全支持公募 REITs(基础设施公募REITs基金)的量化交易与回测。

作为近年来备受关注的创新投资品种,公募 REITs 兼具股债特性。在 ptrade 中,官方提供了专门的 API 接口 get_reits_list,方便开发者一键获取沪深两市所有的公募 REITs 代码列表,并结合行情接口进行多因子筛选与自动化交易。


一、核心接口:get_reits_list 详解

1. 接口说明

用于获取指定日期沪深市场的所有公募 REITs 基金代码列表。

  • 使用场景:在研究、回测、交易模块均可用。
  • 参数
    • date (str):查询日期,格式为 YYYYmmdd(例如 '20230403')。
    • 注意:在回测中,如果不传 date 参数,默认取当前回测周期的历史日期(即 context.current_dt);在研究和交易中,默认取当天日期。
  • 返回
    • 返回一个包含公募 REITs 基金代码的列表(list[str]),例如:['180101.SZ', '180102.SZ', ..., '508099.SS']

二、ptrade 公募 REITs 量化策略示例

以下是一个完整的 ptrade 策略示例。该策略在每天尾盘(14:50)自动获取全市场公募 REITs 列表,计算它们的 5 日均线,并采用简单的均线突破策略进行轮动交易。

# -*- coding: utf-8 -*-

def initialize(context):
    # 设置基准为沪深300
    set_benchmark('000300.SS')
    # 每天 14:50 运行一次 REITs 交易逻辑
    run_daily(context, trade_reits, time='14:50')

def trade_reits(context):
    # 1. 获取当前交易日全市场所有的公募 REITs 代码
    reits_list = get_reits_list()
    if not reits_list:
        log.info("未获取到 REITs 列表")
        return
        
    log.info(f"当前交易日全市场公募 REITs 数量: {len(reits_list)}")
    
    # 2. 获取这些 REITs 过去 5 天的历史收盘价(不包含当前周期)
    # 使用 is_dict=True 可以加快数据获取速度
    history_data = get_history(5, '1d', 'close', security_list=reits_list, is_dict=True)
    
    if not history_data:
        return

    # 3. 遍历 REITs 列表,执行均线突破策略
    for reit in reits_list:
        try:
            # 提取单只 REIT 的历史价格数据
            reit_history = history_data.get(reit)
            if reit_history is None or len(reit_history) < 5:
                continue
            
            # 计算 5 日均价
            close_prices = [x[2] for x in reit_history] # 对应 dict 格式中的 close 字段
            ma5 = sum(close_prices) / len(close_prices)
            
            # 获取当前最新行情快照
            snapshot = get_snapshot(reit)
            if not snapshot or reit not in snapshot:
                continue
                
            current_price = snapshot[reit].get('last_px', 0)
            if current_price == 0:
                continue
                
            # 获取当前持仓状态
            position = get_position(reit)
            
            # 4. 交易信号判断
            # 价格突破 5 日均线且无持仓 -> 买入 1000 份
            if current_price > ma5 and position.amount == 0:
                order(reit, 1000)
                log.info(f"【买入信号】REIT: {reit}, 当前价: {current_price} 突破 5日均线: {ma5:.3f}")
                
            # 价格跌破 5 日均线且有持仓 -> 卖出平仓
            elif current_price < ma5 and position.amount > 0:
                order_target(reit, 0)
                log.info(f"【卖出信号】REIT: {reit}, 当前价: {current_price} 跌破 5日均线: {ma5:.3f}")
                
        except Exception as e:
            log.error(f"处理 REIT {reit} 时发生异常: {str(e)}")

def handle_data(context, data):
    # 定时任务已在 run_daily 中处理,此处保持 pass 即可
    pass

三、开发注意事项

  1. 价格精度:公募 REITs 的交易价格精度通常为小数点后三位。在使用限价单(limit_price)时,请务必对价格进行四舍五入处理(保留3位小数),否则可能导致柜台废单。
  2. 流动性风险:部分公募 REITs 的日内成交量较低,量化策略在实盘运行时,建议配合 set_volume_ratio 限制单笔成交比例,或在策略中加入日均成交额过滤,剔除流动性极差的标的。