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

ptrade 平台如何批量获取公募 REITs 列表并监控实时折溢价?(附 Python 源码)

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

问题描述

ptrade 公募 REITs 投资:如何批量获取 REITs 列表并监控实时折溢价?
我想利用 get_reits_list 获取所有公募 REITs 基金,并结合实时快照计算折溢价率进行轮动,请提供代码示例。

解决方案

1. 核心接口解析

在 ptrade 平台中,针对公募 REITs 的投资与监控,主要依赖以下两个核心 API:

  • get_reits_list(date=None):用于获取指定日期沪深市场的所有公募 REITs 基金代码列表。在回测中默认取当前回测日期,在交易或研究中默认取当天日期。
  • get_snapshot(security):用于获取实时行情快照,从中可以提取最新成交价(last_px)等关键数据。

注:折溢价率的计算通常需要 REITs 的实时价格与单位基金净值(IOPV 或最新公布的 NAV)。由于净值数据通常在盘后或通过特定财务接口更新,本示例将展示如何批量获取 REITs 列表、获取实时价格,并结合基础数据计算折溢价率的框架。

2. 批量获取 REITs 并监控折溢价策略源码

以下是一个完整的 ptrade 策略示例。策略在盘前获取所有公募 REITs 列表,并在盘中定时获取实时快照,计算折溢价并进行排序监控:

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

def initialize(context):
    # 设置基准
    set_benchmark('000300.SS')
    # 初始化 REITs 股票池
    g.reits_list = []
    # 每天 9:30 运行一次初始化列表
    run_daily(context, prepare_reits_pool, time='09:30')
    # 盘中每隔 5 分钟监控一次折溢价(交易环境推荐使用 run_interval,此处以 handle_data 演示分钟级监控)
    g.monitor_interval = 5
    g.count = 0

def prepare_reits_pool(context):
    # 获取当前交易日的所有公募 REITs 列表
    g.reits_list = get_reits_list()
    log.info("今日获取到公募 REITs 数量: %d" % len(g.reits_list))
    # 更新股票池
    if g.reits_list:
        set_universe(g.reits_list)

def handle_data(context, data):
    g.count += 1
    if g.count % g.monitor_interval != 0:
        return
        
    if not g.reits_list:
        return

    log.info("------ 开始监控 REITs 实时价格与折溢价 ------")
    
    # 1. 批量获取 REITs 实时行情快照
    snapshot_dict = get_snapshot(g.reits_list)
    
    # 2. 批量获取 REITs 基础净值信息(此处以 get_cb_info 或 get_fundamentals 框架模拟,实际中可结合估值表获取最新 NAV)
    # 提示:公募 REITs 的最新净值(NAV)可通过财务数据接口或第三方数据源维护在全局变量中
    # 假定我们有一个模拟的最新净值字典(实际中应从 get_fundamentals 或外部输入获取)
    # 格式:{ 'REITs代码': 基金单位净值 }
    mock_nav_dict = {
        '508099.SS': 2.500,
        '180101.SZ': 3.120
    }

    reits_premium_list = []

    for reit in g.reits_list:
        if reit in snapshot_dict:
            last_price = snapshot_dict[reit].get('last_px', 0.0)
            # 获取参考净值(若无则跳过或设为默认)
            nav = mock_nav_dict.get(reit, None)
            
            if last_price > 0 and nav:
                # 折溢价率 = (二级市场价格 - 基金净值) / 基金净值 * 100%
                premium_rate = (last_price - nav) / nav * 100
                reits_premium_list.append({
                    'code': reit,
                    'name': get_stock_name(reit).get(reit, '未知'),
                    'price': last_price,
                    'nav': nav,
                    'premium_rate': premium_rate
                })

    # 3. 按折溢价率升序排序(寻找折价率最高,即最便宜的 REITs)
    reits_premium_list.sort(key=lambda x: x['premium_rate'])

    # 4. 打印监控结果
    for item in reits_premium_list[:5]:
        log.info("代码: %s | 名称: %s | 当前价: %.3f | 净值: %.3f | 折溢价率: %.2f%%" % 
                 (item['code'], item['name'], item['price'], item['nav'], item['premium_rate']))

    # 5. 轮动逻辑(示例):买入折价率最高(溢价率为负且最小)的前 2 只 REITs
    if is_trade(): # 仅在实盘/模拟盘环境执行交易
        # 具体的买入卖出逻辑可在此处展开,例如 order_target_value(target_code, target_value)
        pass

3. 注意事项

  1. 净值更新频率:公募 REITs 的单位净值(NAV)通常不是实时变动的,而是定期(如季报、半年报、年报)公布。在计算折溢价时,需注意净值数据的滞后性。
  2. 价格精度:公募 REITs 的申报价格最小变动单位通常为 0.001 元,在使用限价单(limit_price)委托时,务必对价格进行 3 位小数的四舍五入处理。