问题描述
比如,当天9:30分开始计算5日均线:
计算方法为:
last_data = attribute_history(security, 10, '1d', ['close'])
ma5 = float(last_data[-5:].mean())
但是,计算出来的这个ma5的值,从同花顺等软件上查看就是实际是昨日的MA5的值,
并不是今天的,这是怎么回事啊?
解决方案
你好!出现这个问题的原因在于 JoinQuant 平台对“未来函数”的严格防范机制 以及 看盘软件与量化回测在计算均线时的逻辑差异。
为什么会这样?
-
attribute_history的底层逻辑:
在 JoinQuant 中,当你调用attribute_history(security, 10, '1d', ['close'])获取按天(1d)的数据时,API 默认是不包含当天数据的(即使你是在下午 15:00 收盘后调用)。
也就是说,你在今天 9:30 获取到的过去 5 天的收盘价,实际上是 昨天、前天、大前天等过去 5 个完整交易日 的收盘价。因此,你算出来的ma5自然就是“昨日的 5 日均线”。 -
同花顺等看盘软件的逻辑:
看盘软件上显示的“今日 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获取最新价,再结合历史数据进行计算。