问题描述
获取股票的收盘价
close_data5 = get_bars(security, count=5, unit='1d', fields=['close'])
# 取得过去五天的平均价格
MA5 = close_data5['close'].mean()
这样写只是取到最新5天的MA5的值,但是我想取3天或前10天的MA5值应该怎样写呢?
解决方案
在JoinQuant(聚宽)平台上,如果您想获取过去连续多天(例如过去3天或过去10天)的MA5序列,最标准且高效的方法是多获取几天的数据,然后使用 pandas 的 rolling(滑动窗口)函数来计算。
计算MA5需要5天的数据。因此,如果您想获取过去 $N$ 天的MA5序列,您需要获取过去 $N + 5 - 1$ 天的收盘价数据。
以下是具体的实现方法:
方法一:获取过去10天的MA5序列(推荐)
如果您想获取过去10天每天的MA5值,您需要获取 $10 + 5 - 1 = 14$ 天的收盘价数据。
import pandas as pd
def handle_data(context, data):
security = '000001.XSHE'
# 1. 获取过去14天的收盘价数据,注意设置 df=True 以返回 pandas.DataFrame
# 这样方便后续使用 rolling 函数
close_data = get_bars(security, count=14, unit='1d', fields=['close'], df=True)
# 2. 使用 pandas 的 rolling 函数计算5日滑动平均
# 这会计算出每一天对应的过去5天均值
ma5_series = close_data['close'].rolling(window=5).mean()
# 3. 截取最后10天的数据,这就是您需要的过去10天的MA5序列
ma5_last_10 = ma5_series.tail(10)
# 打印查看结果
print("过去10天的MA5序列:\n", ma5_last_10)
# 如果您想取3天前的MA5值(即倒数第4天的MA5)
# 可以通过索引获取,例如:
ma5_3_days_ago = ma5_series.iloc[-4]
print("3天前的MA5值为:", ma5_3_days_ago)
方法二:只获取特定某一天(如3天前)的MA5值
如果您不需要整个序列,仅仅是想获取“3天前”那一天的MA5值,您可以通过切片来实现。3天前的MA5,实际上是倒数第4天到倒数第8天这5天的收盘价均值。
def handle_data(context, data):
security = '000001.XSHE'
# 获取过去8天的收盘价(因为3天前+5天窗口 = 8天)
# 这里 df=False 返回的是 numpy 数组,切片速度更快
close_data = get_bars(security, count=8, unit='1d', fields=['close'], df=False)
# close_data['close'] 是一个长度为8的数组
# 倒数第1天是今天(或昨天,取决于是否包含当前bar),倒数第4天是3天前
# 我们取前5个数据(即索引0到4),这就是3天前那一天的过去5天收盘价
ma5_3_days_ago = close_data['close'][0:5].mean()
print("3天前的MA5值为:", ma5_3_days_ago)
总结建议
- 获取序列:强烈建议使用
df=True配合pandas.Series.rolling(window=5).mean(),代码简洁且不易出错,非常适合计算MACD、多条均线等技术指标序列。 - 获取单点:如果只取历史某一个特定点的均线,直接用
get_bars获取对应区间的数据求.mean()即可,效率最高。