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

JoinQuant聚宽中如何引用attribute_history获取的收盘价数据进行计算?

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

问题描述

如何将已取得的收盘价格进行计算?

已经用Pn = attribute_history(g.security, count=10,fields=['close'])语句取得前10天的收盘价格,想用来计算,比如每两天求差的绝对值,比如求昨天和前天、前天和3天前、3天前和4天前的收盘价的绝对值(如此循环求完10天的),用abs函数求绝对值也知道了,就是怎么引用这个结构里面的数据?一直没搞明白。请教各位大佬了。我也知道这个问题,问得,唉……

解决方案

在 JoinQuant (聚宽) 平台中,attribute_history 函数默认返回的是一个 pandas.DataFrame 数据结构。行索引是时间,列索引是你请求的字段(例如 'close')。

要引用并计算里面的数据,你可以直接利用 pandas 强大的内置方法(推荐,运行效率高),也可以将其转换为数组后使用传统的 for 循环。

以下是具体的解答和代码示例:

1. 理解数据结构

当你执行 Pn = attribute_history(g.security, count=10, fields=['close']) 时,Pn 是一个 DataFrame。你可以通过 Pn['close'] 提取出收盘价这一列,它是一个 pandas.Series 对象。

在这个 Series 中:

  • Pn['close'][-1] 代表最后一个数据(即昨天的收盘价)。
  • Pn['close'][-2] 代表倒数第二个数据(即前天的收盘价)。

2. 方法一:使用 Pandas 内置函数(强烈推荐)

Pandas 提供了 diff() 函数,专门用来计算相邻元素的差值。结合 abs() 函数,只需一行代码即可完成你想要的操作。

# 获取过去10天的收盘价
Pn = attribute_history(g.security, count=10, fields=['close'])

# 提取 close 列
close_prices = Pn['close']

# 使用 diff() 计算与前一天的差值,然后用 abs() 求绝对值
# diff(1) 表示当前行减去上一行
abs_diff = close_prices.diff(1).abs()

# 打印结果查看
log.info("相邻两天收盘价差的绝对值:\n%s", abs_diff)

# 注意:abs_diff 的第一个元素(最旧的一天)会是 NaN,因为没有更前一天的数据与之相减。
# 如果你想把这些差值提取成一个普通的 Python 列表(去掉第一个 NaN):
diff_list = abs_diff.dropna().tolist()
log.info("差值列表: %s", diff_list)

3. 方法二:使用传统的 For 循环(符合你的直觉)

如果你更习惯使用循环来处理,可以将数据提取为 numpy 数组或列表,然后通过索引进行计算。

# 获取过去10天的收盘价
Pn = attribute_history(g.security, count=10, fields=['close'])

# 将 close 列的值转换为普通的 Python 列表
close_list = Pn['close'].values.tolist()

# 创建一个空列表来存储差值的绝对值
abs_diff_list = []

# 循环计算(从索引1开始,到最后)
for i in range(1, len(close_list)):
    # 当前天的价格减去前一天的价格,求绝对值
    diff = abs(close_list[i] - close_list[i-1])
    abs_diff_list.append(diff)

log.info("循环计算的差值绝对值列表: %s", abs_diff_list)

总结

  • 提取数据:使用 Pn['close'] 获取收盘价序列。
  • 获取特定某天:使用 Pn['close'][-1] (昨天), Pn['close'][-2] (前天)。
  • 批量计算:在量化交易中,尽量使用 方法一 (Pandas向量化计算),它的执行速度远快于 Python 的 for 循环,这在回测长周期或多只股票时性能差异非常明显。