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

聚宽平台无法使用 rolling 函数?AttributeError 报错原因及解决方案

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

问题描述

rolling函数无法使用?

聚宽在线编译器无法使用rolling函数么?

low_list = weekly_data['low'].rolling(9, min_periods=9).min()

报错提示:
AttributeError: 'numpy.ndarray' object has no attribute 'rolling'

解决方案

在 JoinQuant(聚宽)量化平台上,完全可以使用 rolling 函数。您遇到的报错 AttributeError: 'numpy.ndarray' object has no attribute 'rolling',其根本原因在于数据类型的错用,而不是平台不支持该函数。

报错原因分析

rolling()Pandas 库中 DataFrameSeries 对象专有的方法,用于进行滑动窗口计算。而报错信息明确指出,您的 weekly_data['low'] 是一个 NumPy 数组 (numpy.ndarray)。NumPy 数组原生并没有 rolling 这个方法,因此引发了 AttributeError

在聚宽的数据获取 API 中(例如 get_barshistoryattribute_history 等),通常会有一个 df 参数来控制返回的数据格式:

  • df=False(某些 API 的默认值,如 get_bars)时,返回的数据格式是 numpy.ndarraydict
  • df=True 时,返回的数据格式才是 pandas.DataFrame

解决方案

要解决这个问题,您有两种方法:

方法一:在获取数据时直接指定返回 Pandas DataFrame(推荐)

如果您使用的是 get_barshistoryattribute_history 等函数获取数据,请确保传入参数 df=True

示例代码:

# 假设您使用的是 get_bars 获取数据,务必加上 df=True
weekly_data = get_bars('000001.XSHE', count=20, unit='1w', fields=['date', 'open', 'high', 'low', 'close'], df=True)

# 此时 weekly_data 是 DataFrame,可以直接使用 rolling
low_list = weekly_data['low'].rolling(9, min_periods=9).min()

方法二:将 NumPy 数组手动转换为 Pandas Series

如果您由于某些原因必须保持 df=False 以追求极致的运行速度,或者数据来源本身就是 NumPy 数组,您可以在调用 rolling 之前,手动将其转换为 pandas.Series

示例代码:

import pandas as pd

# 假设 weekly_data['low'] 是一个 numpy.ndarray
low_array = weekly_data['low']

# 将其转换为 pandas.Series
low_series = pd.Series(low_array)

# 然后再调用 rolling 函数
low_list = low_series.rolling(9, min_periods=9).min()

总结

在聚宽编写量化策略时,经常需要在 NumPy 的高计算效率和 Pandas 的丰富数据处理功能(如 rollingshift 等)之间做切换。遇到类似 has no attribute 的报错时,第一步建议使用 print(type(您的变量)) 检查一下当前的数据类型,确认它是 pandas.DataFrame 还是 numpy.ndarray,这样就能快速定位并解决问题。