问题描述
def ir(context):
h = get_price('000001.XSHE', start_date= context.currdent_dt.data(),frequency='daily', fields=['high','low','close'])
h['close']
输出结果只到18号,为什么不是20号?
解决方案
在 JoinQuant (聚宽) 平台中使用 get_price 函数时,如果发现获取的数据日期没有到您预期的日期(例如只到18号而不是20号),通常是由以下几个原因导致的:
1. 未指定 end_date 参数
在您的代码中,只指定了 start_date,而没有指定 end_date。根据聚宽 API 文档,如果 count 和 start_date 都没有,默认 start_date 是 '2015-01-01',而 end_date 默认是 '2015-12-31'。在某些环境版本中,如果不传 end_date,系统可能会使用默认的截止日期或者当前回测环境的某个默认值。建议始终明确指定 end_date。
2. 避免“未来函数”的限制
如果您是在回测或模拟交易的盘中(例如 20号的 09:30)调用该函数获取 daily(日线)数据,由于 20号 还没有收盘,当天的日线数据尚未生成。为了避免引入未来数据,系统最多只能返回到上一个交易日(即 19号)的收盘数据。
3. 节假日与非交易日因素
如果 20号 是周日,19号 是周六,那么 A股 市场最近的一个交易日就是 18号(周五)。get_price 返回的都是实际有交易的日期,因此数据只到 18号 是完全正常的。
4. 代码拼写错误
您的代码中存在拼写错误:context.currdent_dt.data() 应该是 context.current_dt.date()。
正确的代码写法建议
如果您希望获取从某个开始日期到当前回测时间点(前一个交易日)的数据,建议这样写:
def ir(context):
# 获取当前回测逻辑时间
current_date = context.current_dt.date()
# 明确指定 start_date 和 end_date
# 注意:如果 start_date 和 end_date 是同一天,且当天未收盘,可能获取不到当天的日线数据
h = get_price('000001.XSHE',
start_date='2023-01-01', # 替换为您实际需要的开始时间
end_date=current_date,
frequency='daily',
fields=['high','low','close'])
print(h['close'])
总结:请检查 19号 和 20号 是否为周末或节假日,并确保在调用 get_price 时显式传入 end_date 参数。如果需要获取当天的最新价格,请使用 get_current_data() 或将频率改为分钟级别 (frequency='1m')。