3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在ptrade量化平台的研究模块中进行策略研发和数据分析时,频繁拉取大量历史行情或财务数据可能会遇到数据延迟或执行缓慢的问题。为了提升数据获取效率,可以从以下几个方面进行优化:
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)
根据 ptrade 官方文档提示,get_history 与 get_price 接口不支持多线程同时调用。如果在研究模块中使用了多线程,或者在交易/回测模块的 run_daily/run_interval 定时任务中与 handle_data 同一时刻调用这些接口,会导致底层数据请求冲突,偶现获取数据为空或极度延迟的现象。请确保数据请求是串行执行的。
fields:不要盲目拉取所有字段。如果只需要收盘价,就只传入 field='close',而不是拉取开高低收量额等全量数据。security_list:尽量避免一次性传入全市场(如几千只股票)的代码列表。可以先通过 filter_stock_by_status 或其他逻辑筛选出目标股票池,再进行数据请求。在研究模块中,很多基础数据(如财务数据、历史日K线)在一天内是不会变化的。如果每次运行 Cell 都重新请求,会浪费大量时间。
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)
部分在线获取接口(如 get_fundamentals 财务数据接口)有严格的流量限制(例如每秒不得超过100次,单次最大500条数据)。如果触发流控,请求会被阻塞或失败重试,导致严重的延迟。
time.sleep() 进行适当的休眠,防止触发流控。通过综合运用以上方法,特别是使用 is_dict=True 和 本地缓存,可以显著降低 ptrade 研究模块的数据延迟,大幅提升策略研发的体验。