🚀 AI 一键生成 joinquant 策略代码
立即体验

聚宽回测运行太慢?教你如何通过 df=False 优化 history 接口大幅提升回测速度

joinquant | 发布时间: 2026/7/21
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 回测加速技巧:使用 df=False 提升数据获取效率

Question: 我的聚宽回测运行非常慢,听说把 history 接口的 df 参数设为 False 能加速,该怎么改代码?

解决方案

在 JoinQuant(聚宽)平台进行量化策略回测时,回测速度慢往往是由于频繁调用数据获取接口(如 historyattribute_history)并生成 pandas.DataFrame 对象导致的。pandas.DataFrame 在创建和高频读写时会有较大的性能开销。

聚宽官方在 historyattribute_history 接口中提供了 df 参数。默认情况下 df=True 返回 DataFrame,而将其设置为 df=False 时,接口会直接返回一个 Python 字典(Dict),其 Value 是 numpy.ndarray(Numpy 数组)。由于 Numpy 数组的底层是 C 语言实现,创建和索引速度极快,这能显著提升高频或多股票回测的运行效率。

一、接口参数说明

根据聚宽 API 文档:

  • history(count, unit='1d', field='avg', security_list=None, df=True, ...)
    • df: 若是 True,返回 pandas.DataFrame;否则返回一个 dict,key 是股票代码,value 是 numpy.ndarray
  • attribute_history(security, count, unit='1d', fields=[...], df=True, ...)
    • df: 若是 True,返回 pandas.DataFrame;否则返回一个 dict,key 是属性名字(如 'open'/'close'),value 是 numpy.ndarray

二、代码修改对比示例

1. 使用 history 获取多只股票单个字段

修改前(默认 df=True):

# 获取 5 天的收盘价 DataFrame
close_df = history(5, unit='1d', field='close', security_list=['000001.XSHE', '000002.XSHE'])
# 获取平安银行昨天的收盘价
pa_close = close_df['000001.XSHE'].iloc[-1]
# 求平安银行 5 天均价
pa_ma5 = close_df['000001.XSHE'].mean()

修改后(推荐 df=False 加速):

# 获取 5 天的收盘价 Dict,Value 为 numpy.ndarray
close_dict = history(5, unit='1d', field='close', security_list=['000001.XSHE', '000002.XSHE'], df=False)
# 获取平安银行昨天的收盘价(数组最后一项)
pa_close = close_dict['000001.XSHE'][-1]
# 求平安银行 5 天均价(使用 numpy 的 mean 方法,速度极快)
pa_ma5 = close_dict['000001.XSHE'].mean()

2. 使用 attribute_history 获取单只股票多个字段

修改前(默认 df=True):

# 获取单只股票的多个字段 DataFrame
h_df = attribute_history('000001.XSHE', 5, '1d', ['open', 'close', 'volume'])
# 获取昨天的收盘价
last_close = h_df['close'].iloc[-1]
# 获取昨天的成交量
last_volume = h_df['volume'].iloc[-1]

修改后(推荐 df=False 加速):

# 获取单只股票的多个字段 Dict,Value 为 numpy.ndarray
h_dict = attribute_history('000001.XSHE', 5, '1d', ['open', 'close', 'volume'], df=False)
# 获取昨天的收盘价
last_close = h_dict['close'][-1]
# 获取昨天的成交量
last_volume = h_dict['volume'][-1]

三、核心注意事项

  1. 索引方式改变:当 df=False 时,返回的对象不再支持 pandas 的 .iloc.loc 或时间字符串索引(如 h['open']['2015-01-05'] 将不可用)。你必须使用标准的 Python 列表/Numpy 数组切片,例如 [-1] 代表最新(昨天)的数据,[0] 代表最老的数据。
  2. 关闭缓存机制:如果你的策略内存占用依然很大,除了设置 df=False 之外,还可以在 initialize 初始化函数中调用 disable_cache() 来关闭聚宽的缓存机制,防止因内存超限被系统终止进程。
  3. 性能分析工具:建议在策略最上方加入 enable_profile() 开启性能分析,运行一次简短的回测,观察数据获取函数在修改前后的耗时占比,以验证加速效果。