🚀 AI 一键生成 ptrade 策略代码

PTrade ETF 数据挖掘:如何全面获取 ETF 列表、基本信息与成分券?

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

问题描述

我想查询某个 ETF 的详细信息,比如最小申赎单位和它的所有成分股,应该怎么做?

解决方案

在 PTrade 中,查询 ETF 的详细信息(如最小申赎单位)和成分股列表,主要使用交易模块专用的 ETF 查询接口。

以下是具体的实现步骤和代码示例。

核心 API 说明

  1. get_etf_info(etf_code)
    • 功能:获取 ETF 的基础信息。
    • 关键字段:返回的字典中,report_unit 字段即为最小申购、赎回单位
  2. get_etf_stock_list(etf_code)
    • 功能:获取 ETF 的所有成分股代码列表。

策略代码示例

以下代码展示了如何在策略启动时(before_trading_start)查询指定 ETF(以上证50ETF 510050.SS 为例)的最小申赎单位和成分股列表,并将结果打印到日志中。

def initialize(context):
    # 初始化设置,这里以查询上证50ETF为例
    g.etf_code = '510050.SS'
    # 设置股票池(虽然查询ETF信息不强制要求set_universe,但作为策略规范建议加上)
    set_universe(g.etf_code)

def before_trading_start(context, data):
    # --- 1. 查询 ETF 详细信息(包含最小申赎单位) ---
    # get_etf_info 返回一个字典,key是ETF代码,value是详细信息字典
    etf_info_dict = get_etf_info(g.etf_code)
    
    if etf_info_dict and g.etf_code in etf_info_dict:
        info = etf_info_dict[g.etf_code]
        
        # 获取最小申赎单位 (report_unit)
        min_unit = info.get('report_unit')
        # 获取现金差额 (cash_balance)
        cash_balance = info.get('cash_balance')
        # 获取T-1日基金单位净值 (nav_pre)
        nav_pre = info.get('nav_pre')
        
        log.info("【ETF基础信息】代码: %s" % g.etf_code)
        log.info("最小申赎单位: %s" % min_unit)
        log.info("现金差额: %s, 昨日净值: %s" % (cash_balance, nav_pre))
    else:
        log.info("未查询到 ETF %s 的基础信息" % g.etf_code)

    # --- 2. 查询 ETF 成分股列表 ---
    # get_etf_stock_list 返回一个包含成分股代码的列表
    stock_list = get_etf_stock_list(g.etf_code)
    
    if stock_list:
        log.info("【ETF成分股】代码: %s" % g.etf_code)
        log.info("成分股总数量: %d" % len(stock_list))
        # 打印前10只成分股作为示例
        log.info("前10只成分股: %s" % stock_list[:10])
        
        # 如果需要获取具体某只成分股的详细信息(如现金替代标志),可以使用 get_etf_stock_info
        # 示例:查询列表第一只成分股的详细信息
        first_stock = stock_list[0]
        stock_detail = get_etf_stock_info(g.etf_code, first_stock)
        log.info("成分股 %s 的详细信息: %s" % (first_stock, stock_detail))
    else:
        log.info("未查询到 ETF %s 的成分股列表" % g.etf_code)

def handle_data(context, data):
    pass

注意事项

  1. 适用环境
    • get_etf_infoget_etf_stock_list 等函数通常**仅在股票交易模块(实盘或仿真交易)**中可用。
    • 在纯回测模式下,这些接口可能无法返回数据或返回空值(具体取决于券商服务器的配置),因为回测环境通常不包含历史的 ETF 申赎清单(PCF)数据。
  2. 代码后缀
    • 输入 ETF 代码时,请务必带上后缀。上海市场为 .SS(如 510050.SS),深圳市场为 .SZ(如 159915.SZ)。
  3. 数据更新
    • ETF 的申赎清单(PCF)是每日更新的,建议在 before_trading_start 中调用以获取当日最新的数据。

Q&A

Q: get_etf_info 返回的 publish 字段是什么意思?
A: publish 字段表示是否需要发布 IOPV(基金份额参考净值)。1 表示需要发布,0 表示不需要发布。

Q: 如果我想在回测中获取 ETF 的成分股怎么办?
A: 如果 get_etf_stock_list 在回测中无数据,您可以使用 get_index_stocks(index_code) 作为替代方案。例如,对于跟踪沪深300的 ETF,可以获取沪深300指数(000300.SS)的成分股来模拟,但这只是近似值,因为 ETF 持仓与指数权重可能存在细微跟踪误差。

Q: 如何获取成分股的现金替代标志?
A: 使用 get_etf_stock_info(etf_code, stock_code) 接口。返回字典中的 cash_replace_flag 字段代表替代标志(0-禁止替代,1-允许替代,2-必须替代等)。