问题描述
需要同时获取多只ETF的信息,是否需要循环调用get_etf_info多次?
解决方案
在 ptrade 量化交易平台中,get_etf_info 接口完全支持同时获取多只 ETF 的信息,您不需要通过循环多次调用该接口。
接口说明
根据 ptrade API 文档,get_etf_info(etf_code) 的参数 etf_code 支持传入单支 ETF 代码(字符串)或者多个 ETF 代码组成的列表(List)。
当您传入一个列表时,接口会返回一个嵌套的字典(dict),其中外层字典的键(key)为 ETF 代码,值(value)为包含该 ETF 详细信息的字典。
为什么推荐批量获取?
在量化策略中,频繁地在循环中调用网络请求或数据查询接口会显著降低策略的运行效率,甚至可能触发平台的流控限制。通过传入列表一次性获取多只 ETF 的信息,可以大幅提升代码的执行速度和稳定性。
代码示例
以下是如何同时获取多只 ETF 信息的示例代码:
def initialize(context):
# 设置股票池
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 获取单只 ETF 信息
etf_info_single = get_etf_info('510020.SS')
log.info("单只 ETF 信息:")
log.info(etf_info_single)
# 2. 批量获取多只 ETF 信息(推荐做法)
etf_list = ['510020.SS', '510050.SS']
etfs_info_multiple = get_etf_info(etf_list)
log.info("多只 ETF 信息:")
log.info(etfs_info_multiple)
# 提取特定 ETF 的信息
if '510050.SS' in etfs_info_multiple:
nav_pre = etfs_info_multiple['510050.SS'].get('nav_pre')
log.info(f"510050.SS 的 T-1 日基金单位净值为: {nav_pre}")
返回数据结构示例
当您传入 ['510020.SS', '510050.SS'] 时,返回的数据结构大致如下:
{
'510020.SS': {
'nav_percu': 206601.39,
'redeem_max': 0.0,
'nav_pre': 0.207,
'report_unit': 1000000,
'max_cash_ratio': 0.4,
'cash_balance': -813.75,
'etf_redemption_code': '510021',
'pre_cash_componet': 598.39,
'allot_max': 0.0,
'publish': 1
},
'510050.SS': {
# 510050 的相关信息...
}
}
总结:为了提高策略性能,强烈建议在需要获取多只 ETF 信息时,将代码组合成列表,一次性传递给 get_etf_info 接口。