问题描述
MA KDJ等一些指标,传入的日期格式为Y-m-d的话,实际获取的指标数据,是不是为0点,也就是前一天收盘之后的结果。
比如我要获取2020-02-02的MA指标,实际我应该传入后一个交易日的Y-m-d格式才对?
解决方案
在 JoinQuant 聚宽平台中,关于日期格式 Y-m-d 的处理以及指标数据的获取,需要分具体的 API 场景来理解。您的理解有一部分是正确的(即 Y-m-d 等同于当天的 00:00:00),但在获取日线级别指标时,您不需要传入后一个交易日。
以下是详细的解答:
1. Y-m-d 格式的底层含义
在 JoinQuant 中,如果您只传入日期字符串(如 '2020-02-02'),系统在底层确实会将其解析为该日的 0 点,即 2020-02-02 00:00:00。
2. 获取日线指标(如 MA、KDJ)的正确传参方式
如果您想获取 2020-02-02 这一天收盘后 的 MA 或 KDJ 指标,直接传入 '2020-02-02' 即可,不需要传入后一个交易日。
这取决于您使用的是哪种方式获取指标:
方式一:使用 get_price 或 get_bars 自己计算 MA
如果您使用 get_price 获取历史数据来计算 MA:
# 获取截至 2020-02-02 的 5 根日线数据
df = get_price('000001.XSHE', end_date='2020-02-02', frequency='1d', fields=['close'], count=5)
ma5 = df['close'].mean()
原理解释:对于日线数据(frequency='1d'),end_date='2020-02-02' 会包含 2020-02-02 这一整天的交易数据(即该日收盘后的结果)。系统会自动匹配到该交易日的日线 Bar。
方式二:使用技术分析指标库 (jqlib.technical_analysis)
如果您使用的是聚宽内置的技术指标库:
from jqlib.technical_analysis import *
# 获取 2020-02-02 的 MACD 指标
macd_dif, macd_dea, macd_macd = MACDC('000001.XSHE', check_date='2020-02-02')
原理解释:check_date='2020-02-02' 明确表示查询这一天的指标值,底层计算时会包含 2020-02-02 当天的收盘数据。
方式三:在回测环境中使用 history 或 attribute_history
如果您是在回测的 handle_data 中运行:
def handle_data(context, data):
# 假设当前逻辑时间 context.current_dt 是 2020-02-03 09:30:00
# 获取过去 5 天的收盘价(不包含 2020-02-03 当天)
close_data = attribute_history('000001.XSHE', 5, '1d', ['close'])
ma5 = close_data['close'].mean() # 这里计算出的就是截至 2020-02-02 收盘的 MA5
原理解释:回测专用 API history 和 attribute_history 默认不包含当前单位时间的数据。在 2020-02-03 调用时,获取到的最新一天数据就是 2020-02-02 的收盘数据。
3. 为什么分钟级数据会有“0点”的错觉?
文档中提到:“当取分钟数据时,如果 end_date 只有日期,则日内时间等同于 00:00:00,所以返回的数据是不包括 end_date 这一天的。”
- 分钟线:
end_date='2020-02-02'->2020-02-02 00:00:00,因为 2 号的交易还没开始,所以拿不到 2 号的分钟线,只能拿到 1 号 15:00 之前的分钟线。 - 日线:日线数据的标识通常是按天对齐的,
end_date='2020-02-02'会被引擎理解为“获取截至 2020-02-02 这一天的日线”,因此会包含 2 号当天的收盘数据。
总结
- 不需要传入后一个交易日。要获取哪一天的日线指标,就直接传入哪一天的日期(如
'2020-02-02')。 - 对于日线级别的数据和指标,传入
'Y-m-d'代表获取截至该日收盘后的结果。