问题描述
解决方案
编写ETF一二级市场套利策略(即瞬时套利或延时套利)时,核心逻辑是捕捉二级市场交易价格与一级市场IOPV(参考净值)之间的价差。
在PTrade中,你需要重点使用以下几类API函数来实现这一逻辑:
1. 获取ETF基础与成分股信息
在进行套利前,必须知道ETF的最小申赎单位、现金替代标志以及成分股构成。
get_etf_info(etf_code)- 作用:获取ETF的IOPV(实时参考净值)、最小申赎单位(
report_unit)、现金差额、申购赎回上限等关键信息。 - 用途:计算是否存在套利空间(对比二级市场价格与IOPV),以及确定下单的手数必须是
report_unit的整数倍。
- 作用:获取ETF的IOPV(实时参考净值)、最小申赎单位(
get_etf_stock_list(etf_code)/get_etf_stock_info(etf_code, security)- 作用:获取ETF的成分股列表及具体的替代标志(允许现金替代、必须现金替代等)。
- 用途:在折价套利(赎回ETF卖出股票)时,需要知道赎回后会得到哪些股票。
2. 获取实时行情
套利对速度要求极高,通常需要Tick级别的数据。
get_snapshot(security)- 作用:获取ETF及其成分股的实时快照数据(包括最新价、买一卖一价量等)。
- 用途:
- 获取ETF的二级市场价格(
last_px)与IOPV进行对比。 - 获取盘口深度(
bid_grp,offer_grp),判断是否有足够的流动性吃掉你的套利单。
- 获取ETF的二级市场价格(
3. 一级市场申购与赎回(核心)
这是套利策略中连接一二级市场的桥梁。
-
etf_purchase_redemption(etf_code, amount, limit_price=None)- 作用:直接向柜台发送ETF申购或赎回指令。
- 参数:
amount为正数表示申购(Creation),负数表示赎回(Redemption)。 - 用途:
- 溢价套利:买入成分股后,调用此函数申购ETF份额。
- 折价套利:买入ETF份额后,调用此函数赎回成一篮子股票。
-
etf_basket_order(etf_code, amount, price_style=None, position=True, info=None)- 作用:ETF成分券篮子下单。这是一个非常强大的便捷接口,它能自动根据ETF清单买入一篮子股票。
- 用途:在溢价套利(申购套利)时,你需要先买入一篮子股票。使用此函数可以避免手动循环几百只股票下单,极大提高速度和准确性。
4. 二级市场交易
用于买卖ETF份额或卖出赎回后的股票。
order(security, amount)/order_market(...)- 作用:普通的股票/基金买卖接口。
- 用途:
- 溢价套利:申购得到ETF份额后,在二级市场卖出ETF。
- 折价套利:在二级市场买入ETF,或者赎回后卖出成分股(也可以用
etf_basket_order传入负数尝试卖出篮子,或循环调用order卖出成分股)。
策略逻辑简述与API对应关系
场景 A:溢价套利 (市价 > IOPV + 成本)
- 监控:调用
get_snapshot获取ETF最新价,调用get_etf_info获取IOPV。 - 买入成分股:调用
etf_basket_order买入一篮子股票。 - 申购ETF:调用
etf_purchase_redemption(amount > 0) 将股票换成ETF份额。 - 卖出ETF:T+0日(如果是深市或特定ETF)或T+1日,调用
order在二级市场卖出ETF。
场景 B:折价套利 (市价 < IOPV - 成本)
- 监控:同上。
- 买入ETF:调用
order在二级市场买入ETF份额。 - 赎回ETF:调用
etf_purchase_redemption(amount < 0) 将ETF换回一篮子股票。 - 卖出成分股:调用
etf_basket_order(amount < 0) 或循环调用order卖出所有股票。
注意事项
- T+0规则:不同市场的ETF(沪市单市场、深市单市场、跨市场等)对于申购后的份额何时可用、赎回后的股票何时可卖有不同的T+0或T+1规定,编写策略时需严格遵守。
- 最小单位:申赎数量必须是
get_etf_info返回的report_unit的整数倍(通常是100万份或几十万份)。 - 精度:ETF价格通常为3位小数,下单时需注意价格精度。