3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant 聚宽平台中,关于日期格式 Y-m-d 的处理以及指标数据的获取,需要分具体的 API 场景来理解。您的理解有一部分是正确的(即 Y-m-d 等同于当天的 00:00:00),但在获取日线级别指标时,您不需要传入后一个交易日。
以下是详细的解答:
Y-m-d 格式的底层含义在 JoinQuant 中,如果您只传入日期字符串(如 '2020-02-02'),系统在底层确实会将其解析为该日的 0 点,即 2020-02-02 00:00:00。
如果您想获取 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 的收盘数据。
文档中提到:“当取分钟数据时,如果 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' 代表获取截至该日收盘后的结果。