3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
你好!出现这个问题的原因在于 JoinQuant 平台对“未来函数”的严格防范机制 以及 看盘软件与量化回测在计算均线时的逻辑差异。
attribute_history 的底层逻辑:
在 JoinQuant 中,当你调用 attribute_history(security, 10, '1d', ['close']) 获取按天(1d)的数据时,API 默认是不包含当天数据的(即使你是在下午 15:00 收盘后调用)。
也就是说,你在今天 9:30 获取到的过去 5 天的收盘价,实际上是 昨天、前天、大前天等过去 5 个完整交易日 的收盘价。因此,你算出来的 ma5 自然就是“昨日的 5 日均线”。
同花顺等看盘软件的逻辑:
看盘软件上显示的“今日 MA5”,其计算公式是:
今日 MA5 = (今日实时最新价 + 过去 4 个交易日的收盘价) / 5
如果你希望在盘中(如 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 获取最新价,再结合历史数据进行计算。