问题描述
获取数据,601658.XSHG代表上证指数
current_data_now = get_current_tick('601658.XSHG',dt=context.current_dt)
返回None,换成大盘指数则没有问题:
current_data_now = get_current_tick('000001.XSHG',dt=context.current_dt)
请教如何获取股票回测时的当前价格?
新手小白,见笑了,请教
解决方案
您好!get_current_tick 完全支持普通股票代码。您遇到返回 None 的情况,通常与 Tick 数据的特性有关。下面为您详细解答原因,并提供获取回测时当前价格的最佳方法。
为什么 get_current_tick 查询普通股票会返回 None?
根据 JoinQuant API 文档,get_current_tick 获取的是指定时刻的最新 Tick 快照。返回 None 的常见原因包括:
- 该时刻无 Tick 数据产生:Tick 数据是极其高频的。如果指定的
dt时刻(精确到秒),该股票没有产生成交或盘口变化,接口就会返回None。大盘指数(如 000001.XSHG)因为包含众多成分股,几乎每秒都在变动,所以总能取到数据;而单只股票(如 601658.XSHG 邮储银行)在某些秒内可能没有交易,就会返回None。 - 非交易时段或停牌:如果
context.current_dt处于集合竞价未产生数据时、午休期间,或者该股票当天停牌,也会返回None。
如何正确获取股票回测时的当前价格?
如果您只是想获取股票当前的最新价格(而不是为了做高频的盘口 Tick 分析),不建议使用 get_current_tick。在天级别或分钟级别回测中,推荐使用以下两种方法:
方法一:使用 get_current_data() (最推荐)
get_current_data() 是专门用于获取当前单位时间(当天/当前分钟)最新状态的 API,包含了最新价、涨跌停价、是否停牌等信息。
def handle_data(context, data):
security = '601658.XSHG'
# 获取当前时间的数据字典
current_data = get_current_data()
# 获取最新价
current_price = current_data[security].last_price
log.info(f"{security} 的当前最新价为: {current_price}")
注:last_price 在 09:30 之前调用会返回昨日收盘价。
方法二:使用 handle_data 传入的 data 对象
在 handle_data(context, data) 函数中,data 对象存放了前一个单位时间(按天回测是前一天,按分钟回测是前一分钟)的数据。在分钟回测中,这通常被视为当前的有效价格。
def handle_data(context, data):
security = '601658.XSHG'
# 确保数据有效且未停牌
if not data[security].isnan() and not data[security].paused:
# 获取当前单位时间的收盘价(分钟回测即为当前分钟收盘价)
current_price = data[security].close
log.info(f"{security} 的当前价格为: {current_price}")
总结
- 如果您做的是分钟/天级别策略,请使用
get_current_data()[security].last_price来获取最新价。 - 如果您确实在做 Tick 级别策略,需要处理
get_current_tick返回None的情况(例如使用if tick_data is not None:进行判断,沿用上一个有效的 Tick 价格)。