3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant (聚宽) 平台中,attribute_history 函数默认返回的是一个 pandas.DataFrame 数据结构。行索引是时间,列索引是你请求的字段(例如 'close')。
要引用并计算里面的数据,你可以直接利用 pandas 强大的内置方法(推荐,运行效率高),也可以将其转换为数组后使用传统的 for 循环。
以下是具体的解答和代码示例:
当你执行 Pn = attribute_history(g.security, count=10, fields=['close']) 时,Pn 是一个 DataFrame。你可以通过 Pn['close'] 提取出收盘价这一列,它是一个 pandas.Series 对象。
在这个 Series 中:
Pn['close'][-1] 代表最后一个数据(即昨天的收盘价)。Pn['close'][-2] 代表倒数第二个数据(即前天的收盘价)。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)
如果你更习惯使用循环来处理,可以将数据提取为 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] (前天)。for 循环,这在回测长周期或多只股票时性能差异非常明显。