问题描述
解决方案
在 PTrade 中,查询 ETF 的详细信息(如最小申赎单位)和成分股列表,主要使用交易模块专用的 ETF 查询接口。
以下是具体的实现步骤和代码示例。
核心 API 说明
get_etf_info(etf_code)- 功能:获取 ETF 的基础信息。
- 关键字段:返回的字典中,
report_unit字段即为最小申购、赎回单位。
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
注意事项
- 适用环境:
get_etf_info和get_etf_stock_list等函数通常**仅在股票交易模块(实盘或仿真交易)**中可用。- 在纯回测模式下,这些接口可能无法返回数据或返回空值(具体取决于券商服务器的配置),因为回测环境通常不包含历史的 ETF 申赎清单(PCF)数据。
- 代码后缀:
- 输入 ETF 代码时,请务必带上后缀。上海市场为
.SS(如510050.SS),深圳市场为.SZ(如159915.SZ)。
- 输入 ETF 代码时,请务必带上后缀。上海市场为
- 数据更新:
- ETF 的申赎清单(PCF)是每日更新的,建议在
before_trading_start中调用以获取当日最新的数据。
- ETF 的申赎清单(PCF)是每日更新的,建议在
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-必须替代等)。