问题描述
老师,MA(security_list,check_date,timeperiod=5)是获取到指定日期(过去时间)的均线数值,如何在盘中获取到当前时间(当前K线)的均线数值?
解决方案
在 JoinQuant(聚宽)平台中,技术分析指标库(如 MA 函数)通常是基于历史已经走完的 K 线数据进行计算的。如果您需要在盘中(例如 handle_data 或分钟级的定时运行函数中)获取包含当前正在交易的 K 线的实时均线数值,最推荐的方法是使用 get_bars 函数,并将 include_now 参数设置为 True。
核心解决思路
使用 get_bars 函数获取包含当前时刻的过去 N 根 K 线的收盘价(close),然后直接对这些收盘价求平均值(.mean()),即可得到实时的均线数值。
具体代码示例
以下是在策略中获取实时均线的代码示例:
# 导入聚宽函数库
import jqdata
def initialize(context):
# 设定要操作的股票
g.security = '000001.XSHE'
# 按分钟运行
run_daily(market_open, time='every_bar')
def market_open(context):
# 1. 获取包含当前分钟的实时 5分钟 均线 (以1分钟K线为基础计算过去5分钟)
# include_now=True 表示包含当前尚未走完的这一分钟的最新价
bars_1m = get_bars(g.security, count=5, unit='1m', fields=['close'], include_now=True)
if len(bars_1m) == 5:
realtime_ma5_1m = bars_1m['close'].mean()
print(f"当前时间 {context.current_dt},实时5分钟均线值为: {realtime_ma5_1m}")
# 2. 获取包含今天最新价的实时 5日 均线 (以日K线为基础)
# include_now=True 表示当天的收盘价取的是当前的最新价
bars_1d = get_bars(g.security, count=5, unit='1d', fields=['close'], include_now=True)
if len(bars_1d) == 5:
realtime_ma5_1d = bars_1d['close'].mean()
print(f"当前时间 {context.current_dt},包含今日最新价的实时5日均线值为: {realtime_ma5_1d}")
为什么不使用 history 或 attribute_history?
history和attribute_history函数在设计上不包含当前单位时间的数据。例如,在按天回测时,它们只能获取到昨天的收盘价;在按分钟回测时,只能获取到上一分钟的数据。这主要是为了防止新手在回测中不小心引入“未来函数”。get_bars是更底层的行情获取 API,通过显式指定include_now=True,您可以明确告诉系统您需要包含当前时刻的快照数据(即当天的最新价或当前分钟的最新价),从而准确计算出盘中实时指标。
注意事项
- 数据长度校验:在计算均线前,建议像示例代码中那样判断一下获取到的
bars长度是否等于您请求的count(例如停牌刚复牌的股票可能数据不足)。 - 复权设置:
get_bars默认不复权,如果您需要计算复权价格的均线,请务必传入fq_ref_date参数(例如fq_ref_date=context.current_dt.date()获取动态前复权数据)。