问题描述
研究环境中:
from jqdata import *
import datetime
current_dt = datetime.datetime.now()
next_day = get_trade_days(current_dt, '2021-12-31')[1]
limit = get_price('AU2109.XSGE', end_date=next_day, frequency='1d', fields=['high_limit','low_limit'], count=1)
high_limit = list(limit['high_limit'])[-1]
low_limit = list(limit['low_limit'])[-1]
print(high_limit, low_limit)
在上午8:50,输出:
378.76 378.76
请问,到了今天收盘后,如15:00、20:00,数据能否恢复正常?
解决方案
出现涨停价和跌停价相同的情况,主要是因为您在代码中尝试获取**未来日期(next_day)**的数据。
原因分析
在您的代码中,next_day 被定义为当前日期的下一个交易日。当您使用 get_price 并将 end_date 设置为 next_day 时,由于该未来的交易日尚未发生,系统数据库中并没有该日的真实行情数据(包括涨跌停价)。
在这种情况下,系统可能会返回最后一次可用的快照数据或默认的填充值,导致 high_limit 和 low_limit 显示为相同的值(通常是前一交易日的收盘价或结算价)。
收盘后数据能否恢复正常?
- 对于
next_day的数据:即使到了今天的 15:00 或 20:00,明天的数据依然是不存在的。期货的下一交易日涨跌停价是根据今天的结算价计算的,通常在今天结算完成后(一般在下午或傍晚)交易所才会公布。但在 JoinQuant 的历史数据接口(如get_price)中,通常只有在当天交易结束后,数据才会落库。 - 对于今天的数据:如果您将
end_date修改为今天(current_dt),在今天的数据更新后(通常是盘后),您可以获取到正确的今天涨跌停价。
正确的获取方法
如果您想获取今天的涨跌停价,应该将 end_date 设置为今天,而不是下一个交易日。此外,在回测或模拟交易中,推荐使用 get_current_data() 来获取当天的涨跌停价,因为它可以避免未来函数并获取实时的盘口限制。
在研究环境中,您可以这样修改代码来获取最近一个有效交易日的涨跌停价:
from jqdata import *
import datetime
# 获取当前时间
current_dt = datetime.datetime.now()
# 获取截至今天的最近一个交易日的数据
limit = get_price('AU2109.XSGE', end_date=current_dt, frequency='1d', fields=['high_limit','low_limit'], count=1)
high_limit = limit['high_limit'].iloc[-1]
low_limit = limit['low_limit'].iloc[-1]
print(f"涨停价: {high_limit}, 跌停价: {low_limit}")
总结:不要使用 get_price 去请求未来的日期。如果您需要预测或计算下一交易日的涨跌停价,需要根据交易所的规则,使用当天的结算价和规定的涨跌停比例自行计算。