问题描述
get_price 函数传入的股票代码是否有个数限制?返回的数据量是否有限制?我看很多接口都有返回4000条数据的限制,但是这个接口没有明确提到,不知实际到底有没有限制?
解决方案
在 JoinQuant (聚宽) 量化平台中,关于 get_price 函数的限制,具体情况如下:
1. API 层面没有硬性的条数限制
与 get_fundamentals(限制 5000 条)或 finance.run_query(限制 4000 条)不同,get_price 函数在 API 设计层面没有明确限制传入的股票代码个数,也没有硬性限制返回的数据行数。你可以传入一个包含几百甚至上千只股票代码的列表,也可以请求长达数年的历史数据。
2. 实际受限于系统的物理资源
虽然 API 没有硬性限制,但在实际的回测或模拟交易环境中,您的策略会受到平台分配的物理资源限制。如果一次性请求的数据量过大,会导致以下两种常见错误:
- 内存超限 (Memory Error):聚宽平台规定,单个策略进程占用的内存不能超过 3G。如果您一次性请求全市场 4000 多只股票过去 10 年的分钟级数据,返回的 DataFrame 将极其庞大,瞬间撑爆内存,导致策略被系统强制终止(OOM)。
- 超时错误 (Timeout Error):平台规定每个函数的运行时间不能超过 1800 秒 (30分钟)。一次性拉取海量数据需要较长的网络传输和数据拼接时间,极易触发超时异常。
3. 给量化开发者的优化建议
为了保证策略的稳定运行,避免因数据量过大导致崩溃,建议采取以下最佳实践:
- 分批获取数据:如果您确实需要全市场的数据,请将股票列表切分成多个小批次(例如每次 100 只股票),或者将时间段切分(例如每次获取 1 个月的数据),处理完一批后再获取下一批。
- 设置
panel=False:当获取多只股票的数据时,get_price默认返回pandas.Panel对象。由于 Panel 结构在内存占用上不够高效,且在较新版本的 pandas 中已被彻底移除,强烈建议在调用时设置panel=False,让其返回等效的 DataFrame 或 Dict,这能显著降低内存占用并提高处理速度。 - 按需获取字段:通过
fields参数仅指定您真正需要的字段(如仅获取['close', 'volume']),不要默认拉取所有字段。 - 使用
history或attribute_history:在handle_data等周期性调用的函数中,如果只需要获取当前股票池过去几天的少量数据,使用history或attribute_history通常比get_price更高效。