问题描述
/
解决方案
在ptrade量化平台的研究模块中进行策略研发和数据分析时,频繁拉取大量历史行情或财务数据可能会遇到数据延迟或执行缓慢的问题。为了提升数据获取效率,可以从以下几个方面进行优化:
1. 开启 is_dict=True 参数(核心加速技巧)
ptrade的多个核心数据获取接口(如 get_history、get_price、get_individual_entrust、get_individual_transaction)都提供了一个隐藏的加速参数:is_dict。
- 原理:默认情况下,这些接口返回的是
pandas.DataFrame或pandas.Panel对象,构建这些对象需要消耗较多的时间和内存。将is_dict设置为True后,接口会直接返回原生的 Python 字典(dict)格式,其底层数据结构为numpy.array,取数速度有大幅提升。 - 示例:
# 默认返回 DataFrame,速度较慢 df_data = get_history(100, '1d', 'close', security_list=['600570.SS']) # 返回 dict,速度极快 dict_data = get_history(100, '1d', 'close', security_list=['600570.SS'], is_dict=True)
2. 避免多线程并发调用冲突
根据 ptrade 官方文档提示,get_history 与 get_price 接口不支持多线程同时调用。如果在研究模块中使用了多线程,或者在交易/回测模块的 run_daily/run_interval 定时任务中与 handle_data 同一时刻调用这些接口,会导致底层数据请求冲突,偶现获取数据为空或极度延迟的现象。请确保数据请求是串行执行的。
3. 精简请求的数据量
- 按需指定
fields:不要盲目拉取所有字段。如果只需要收盘价,就只传入field='close',而不是拉取开高低收量额等全量数据。 - 缩小
security_list:尽量避免一次性传入全市场(如几千只股票)的代码列表。可以先通过filter_stock_by_status或其他逻辑筛选出目标股票池,再进行数据请求。
4. 合理使用本地缓存与持久化(Pickle)
在研究模块中,很多基础数据(如财务数据、历史日K线)在一天内是不会变化的。如果每次运行 Cell 都重新请求,会浪费大量时间。
- 优化方案:使用 Python 的
pickle模块,将首次拉取的数据保存到研究模块的本地目录中。下次运行时先检查本地文件是否存在,若存在则直接读取本地缓存。 - 示例:
import pickle import os from ptrade.api import get_research_path file_path = get_research_path() + 'my_data_cache.pkl' if os.path.exists(file_path): with open(file_path, 'rb') as f: my_data = pickle.load(f) else: my_data = get_history(1000, '1d', 'close', security_list='600570.SS') with open(file_path, 'wb') as f: pickle.dump(my_data, f)
5. 注意 API 的流控限制
部分在线获取接口(如 get_fundamentals 财务数据接口)有严格的流量限制(例如每秒不得超过100次,单次最大500条数据)。如果触发流控,请求会被阻塞或失败重试,导致严重的延迟。
- 优化方案:在批量拉取财务数据时,务必在循环中加入
time.sleep()进行适当的休眠,防止触发流控。
通过综合运用以上方法,特别是使用 is_dict=True 和 本地缓存,可以显著降低 ptrade 研究模块的数据延迟,大幅提升策略研发的体验。