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

解决JoinQuant中5日均线(MA5)计算与看盘软件不一致的问题

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

问题描述

为啥子计算的5日均线价格不对啊?

比如,当天9:30分开始计算5日均线:
计算方法为:

last_data = attribute_history(security, 10, '1d', ['close'])
ma5 = float(last_data[-5:].mean())

但是,计算出来的这个ma5的值,从同花顺等软件上查看就是实际是昨日的MA5的值,
并不是今天的,这是怎么回事啊?

解决方案

你好!出现这个问题的原因在于 JoinQuant 平台对“未来函数”的严格防范机制 以及 看盘软件与量化回测在计算均线时的逻辑差异

为什么会这样?

  1. attribute_history 的底层逻辑
    在 JoinQuant 中,当你调用 attribute_history(security, 10, '1d', ['close']) 获取按天(1d)的数据时,API 默认是不包含当天数据的(即使你是在下午 15:00 收盘后调用)。
    也就是说,你在今天 9:30 获取到的过去 5 天的收盘价,实际上是 昨天、前天、大前天等过去 5 个完整交易日 的收盘价。因此,你算出来的 ma5 自然就是“昨日的 5 日均线”。

  2. 同花顺等看盘软件的逻辑
    看盘软件上显示的“今日 MA5”,其计算公式是:
    今日 MA5 = (今日实时最新价 + 过去 4 个交易日的收盘价) / 5

如何在 JoinQuant 中计算“今日实时的 MA5”?

如果你希望在盘中(如 9:30)计算出和同花顺一致的、包含当天最新价格的实时 MA5,你需要将“过去 4 天的收盘价”与“今天的最新价”拼接起来计算。代码如下:

def handle_data(context, data):
    security = '000001.XSHE'
    
    # 1. 获取过去 4 个交易日的收盘价(不含今天)
    last_4_data = attribute_history(security, 4, '1d', ['close'])
    past_4_closes = last_4_data['close'].values.tolist()
    
    # 2. 获取今天的实时最新价
    current_data = get_current_data()
    today_price = current_data[security].last_price
    
    # 3. 将今天的最新价加入列表中,凑齐 5 天的数据
    past_4_closes.append(today_price)
    
    # 4. 计算实时的 MA5
    ma5_realtime = sum(past_4_closes) / 5.0
    
    log.info("包含今日实时价格的 MA5 为: %s" % ma5_realtime)

总结

  • attribute_history(..., '1d') 永远只取到昨天为止的数据,这是为了防止你在盘中不小心用到了今天收盘后才能知道的“今日收盘价”(未来函数)。
  • 要算盘中动态均线,必须手动用 get_current_data()[security].last_price 获取最新价,再结合历史数据进行计算。