问题描述
解决方案
在 PTrade 量化交易平台中,获取 ETF 的现金差额(Cash Balance)和最小申赎单位(Report Unit)可以通过调用 get_etf_info 接口来实现。
该接口仅在股票交易模块(实盘或仿真交易)中可用,回测模式下通常不支持此特定数据的获取。
以下是具体的代码实现及字段说明:
核心代码实现
def initialize(context):
# 设置需要查询的 ETF 代码,例如上证50ETF
g.etf_code = '510050.SS'
set_universe(g.etf_code)
def handle_data(context, data):
# 调用接口获取 ETF 信息
# 注意:该函数返回的是一个字典,key为ETF代码,value为包含详细信息的字典
etf_info_dict = get_etf_info(g.etf_code)
if etf_info_dict and g.etf_code in etf_info_dict:
# 获取该 ETF 的具体信息对象
info = etf_info_dict[g.etf_code]
# 获取现金差额 (cash_balance)
cash_balance = info.get('cash_balance')
# 获取最小申赎单位 (report_unit)
report_unit = info.get('report_unit')
# 打印结果
log.info("ETF代码: %s" % g.etf_code)
log.info("现金差额 (cash_balance): %s" % cash_balance)
log.info("最小申赎单位 (report_unit): %s" % report_unit)
else:
log.info("未获取到 ETF: %s 的信息" % g.etf_code)
字段详细说明
调用 get_etf_info(etf_code) 后,返回的数据字典中包含以下关键字段:
-
cash_balance(现金差额)- 含义:T-1 日的现金差额(单位:元)。
- 类型:字符串形式的浮点数 (
str:float)。 - 用途:用于计算 ETF 申购或赎回时需要补足或退还的现金部分。
-
report_unit(最小申赎单位)- 含义:ETF 的最小申购、赎回单位(单位:份)。
- 类型:字符串形式的整数 (
str:int)。 - 用途:申购或赎回 ETF 时,数量必须是该数值的整数倍(例如 900,000 份或 1,000,000 份)。
注意事项
- 适用范围:该函数 (
get_etf_info) 仅支持 PTrade 客户端的股票交易模块。如果在回测环境中调用,可能会返回空数据或报错。 - 参数格式:
etf_code可以是单个字符串(如'510050.SS')或代码列表。 - 返回值处理:接口返回的是一个嵌套字典,第一层 Key 是 ETF 代码,因此取值时需要先通过代码索引到具体的详情字典。
Q&A
Q1: get_etf_info 接口还能获取哪些其他 ETF 信息?
A1: 除了现金差额和最小申赎单位外,该接口还可以获取是否发布 IOPV (publish)、现金替代比例上限 (max_cash_ratio)、T-1 日申购基准单位现金余额 (pre_cash_componet)、T-1 日基金单位净值 (nav_pre)、申购上限 (allot_max) 和赎回上限 (redeem_max) 等信息。
Q2: 如果我想进行 ETF 的申购或赎回交易,应该使用哪个函数?
A2: 在 PTrade 交易模块中,可以使用 etf_purchase_redemption(etf_code, amount, limit_price=None) 函数。其中 amount 为正数表示申购,负数表示赎回,且 amount 的绝对值必须是 report_unit(最小申赎单位)的整数倍。
Q3: 为什么我在回测中调用 get_etf_info 返回了空字典?
A3: get_etf_info 是柜台交易类接口,依赖于实盘柜台或仿真柜台推送的实时参考数据(如 PCF 清单)。回测环境通常只包含历史行情数据,不包含历史的每日申赎清单数据,因此该接口在回测中通常不可用。