问题描述
解决方案
在 ptrade 量化交易平台中,get_fundamentals 函数用于获取财务三大报表数据、日频估值数据及各项财务能力指标数据。由于该接口为 HTTP 在线获取,为了保证系统的稳定运行,平台对其设置了严格的流量限制。
get_fundamentals 流量限制规则
根据 ptrade API 文档,get_fundamentals 函数的流量限制主要包括以下几点:
- 调用频率限制:每秒不得调用超过 100次。
- 单次调用量限制:单次最大调用量是 500条数据。
- 数据条数定义:每一条数据的定义为“一个股票对应一个表的一个字段”,相当于单次请求最大不超过 5万条 基础数据单元。
此外,由于网络拥堵等原因,接口可能会出现应答失败的情况。如果返回数据结果为空,建议在策略中增加保护机制并多次尝试。
应对限流的策略与代码示例
如果您的策略涉及多只股票、多字段或长时间跨度的查询,极易触发上述流控限制。为了避免因限流导致的数据获取失败,建议在实际调用场景中加入 time.sleep() 做时间间隔。
示例代码
以下是一个在盘前准备阶段(before_trading_start)分批获取财务数据并使用 sleep 规避限流的示例:
import time
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
def before_trading_start(context, data):
# 假设取4000股*10年一季报数据为4万条,之后再取中报又是4万条
# 因为规则要求每秒不得调用超过100次(单次最大调用量是500条数据)
# 调用过程就需要 sleep 1秒,防止流控触发
# 获取一季报数据
funda_data_q1 = get_fundamentals(g.security, 'balance_statement', fields='total_assets', start_year='2011', end_year='2020', report_types='1')
# 暂停1秒,规避流量限制
time.sleep(1)
# 获取中报数据
funda_data_q2 = get_fundamentals(g.security, 'balance_statement', fields='total_assets', start_year='2010', end_year='2020', report_types='2')
def handle_data(context, data):
pass
通过合理规划数据获取的批次和频率,可以有效提升策略在 ptrade 平台上的稳定性和健壮性。