问题描述
咨询一个问题,我今天运行一个策略(10月12日),首先要选股,日期我设置在今天,10月12号,我使用 close_data = attribute_history(i, 20, '1d', ['close'])来获取股票之前的数据,我发现现在能够获取到的最新的数据是10月8号的。为什么10月11号的取不到呢?如果我今天要获取到10月11和10月12日的数据应该使用哪个API?
解决方案
在 JoinQuant 聚宽平台中,遇到 attribute_history 无法获取到最新数据的情况,通常与 API 的设计机制、交易日历以及股票的停复牌状态有关。以下是详细的原因分析及获取最新数据的解决方案:
一、 为什么取不到 10月11日 和 10月12日 的数据?
-
关于 10月12日(今天)的数据:
根据 JoinQuant API 文档规定,attribute_history和history函数在获取天级别(1d)数据时,严格不包含当天的数据(即使是在收盘后运行)。这是为了防止策略在回测时引入“未来函数”。因此,在 10月12日 运行策略时,attribute_history最多只能取到 10月11日 的数据。 -
关于 10月11日(昨天)的数据缺失,可能的原因有:
- 非交易日: 如果 10月11日 是周末或法定节假日,A股不开盘,自然没有行情数据。系统会返回距离 10月12日 最近的上一交易日(例如 10月8日)的数据。
- 股票停牌:
attribute_history默认参数skip_paused=True(跳过停牌日)。如果该股票在 10月9日-11日 期间处于停牌状态,API 会自动跳过这些日期,返回停牌前最近的交易日(10月8日)的数据。
二、 如何获取 10月11日 和 10月12日 的数据?
如果您需要获取包含今天(10月12日)在内的最新数据,可以使用以下 API 替代:
1. 获取今天(10月12日)的盘中实时数据
如果您只需要获取今天的最新价、开盘价、涨跌停价等,推荐使用 get_current_data():
def handle_data(context, data):
# 获取当前时刻的实时数据
current_data = get_current_data()
# 获取某只股票今天的最新价和开盘价
last_price = current_data['000001.XSHE'].last_price
day_open = current_data['000001.XSHE'].day_open
print(f"今日最新价: {last_price}, 今日开盘价: {day_open}")
2. 获取包含今天在内的历史 K 线数据(使用 get_bars)
get_bars 函数支持获取包含当前未结束的 Bar(即今天)的数据,只需设置 include_now=True:
def handle_data(context, data):
# 获取包含今天在内的过去 20 个交易日的收盘价
# include_now=True 表示包含当天的最新快照数据
bars = get_bars('000001.XSHE', count=20, unit='1d', fields=['date', 'close'], include_now=True, df=True)
print(bars)
注:get_bars 获取的当天数据为截至当前时刻的快照数据(例如 10:30 运行,则当天的 close 为 10:30 的最新价)。
3. 获取指定日期的历史数据(使用 get_price)
如果您想明确获取到 10月11日 的数据,且不希望跳过停牌日(停牌日用前收盘价填充),可以使用 get_price:
# 获取截至 10月11日 的过去 20 个交易日数据,不跳过停牌日
df = get_price('000001.XSHE', end_date='2023-10-11', count=20, frequency='1d', fields=['close'], skip_paused=False)
print(df)
总结建议
- 查历史(不含今天): 继续使用
attribute_history,如果发现少日期,检查是否是周末或停牌(可设置skip_paused=False验证)。 - 查今天实时切片: 使用
get_current_data()。 - 查历史 + 今天实时 K 线: 使用
get_bars(..., include_now=True)。