怎样获取股票停牌前一日收盘价?
目前掘金提供的接口没有能够直接获取停牌前一交易日收盘价,想要查询停牌价格,只能利用其他数据接口判断。因此小编将一些接口组合,写成了一个函数供大家参考交流。
设计思路
1. 函数功能
查询停牌日及停牌日前一日的收盘价
2. 输入参数和输出变量
输入参数:为了函数的便捷,希望只需要输入股票代码、开始时间和结束时间。
输出变量:停牌日、停牌日前一日收盘价
3. 需要的原始数据
股票在开始时间到结束时间的历史收盘价(日频)、交易所在开始时间到结束时间全部交易日。
4. 注意事项
如果是实时模式,日频数据返回时间在收盘以后,在盘中不会返回。如果不加以优化,会导致当前时间被误认为是停牌日,因此需要优化。
5. 步骤
第一步:按照开始时间和结束时间查询股票日收盘价。
第二步:查询股票最新tick数据,取时间。若最新tick的时间不在第一步取到的历史日收盘价中,说明最新的日线数据尚未合成,但未停牌。因此要补充到股票日收盘价数据中。
第三步:将股票的交易日和交易所交易日做对比。
若股票交易日列表中第N个元素不在交易所交易日列表中的元素,则第N个元素对应的日期为停牌日。如果股票交易日列表中第N-1个元素在交易所对应的日期列表中,则第N个元素对应的日期为第一个停牌日。
代码实现
# 输入token
set_token('输入你的token')
# 输入参数
symbol = 'SHSE.600519'
start_date = '2020-12-01'
end_date = '2020-12-30'
def get_stop_price(symbol,start_date,end_date):
'''获取停牌价,停牌日函数'''
'''输入参数:
symbol:查询标的 <- str
start_date:开始日期 <- str
end_date:结束日期 <- str
返回值:
pre_close:前一日收盘价 <- float
'''
# 查询历史数据
data = history(symbol=symbol, frequency='1d', start_time=start_date, end_time=end_date, adjust=ADJUST_PREV,
df=True)
# 如果全部停牌
# 全部是停牌日
if len(data) == 0:
pre_data = history_n(symbol=symbol, frequency='1d', count=1, end_time=start_date, adjust=ADJUST_PREV,
df=True)
stopday = get_next_trading_date(date=str(pre_data['bob']).split(' ')[3], exchange='SHSE')
pre_close = float(pre_data['close'].values)
print('{}开始停牌'.format(stopday))
print('停牌日前一交易日收盘价为{}'.format(pre_close))
else:
data['bob'] = data['bob'].apply(lambda x: str(x).split(' ')[0])
stoDate = data['bob'].tolist() # 存为stockdate
# 查询最近1期tick数据对应的时间,即最新交易日
new = str(current(symbols=symbol)[0]['created_at']).split(' ')[0]
# 如果输入的结束日期是最新交易日,则需要把最新交易日填到股票交易日中
if (new == end_date) and (new != data.iloc[-1, ]['bob']):
stoDate.append(new)
# 获取交易日数据
traDate = get_trading_dates(exchange='SZSE', start_date=start_date, end_date=end_date)
# 如果不存在停牌日
if len(traDate) == len(stoDate):
print('该标的在这段时间内未停牌')
pre_close = 0
# 存在停牌日
else:
for i in range(1, len(traDate)):
# 情形1:输入时间段包括停牌前+停牌这个过程
if traDate[i] not in stoDate:
if traDate[i-1] in stoDate:
pre_close = float(data[data['bob'] == traDate[i-1]]['close'].values)
print('{}开始停牌'.format(traDate[i]))
print('停牌日前一交易日收盘价为{}'.format(pre_close))
# 情形2:输入时间段仅包括停牌这个过程,即选取的第一天就停牌
if traDate[0] not in stoDate:
pre_data = history_n(symbol=symbol, frequency='1d', count=1, end_time=start_date, adjust=ADJUST_PREV,
df=True)
stopday = get_next_trading_date(date=str(pre_data['bob']).split(' ')[3],exchange='SHSE')
pre_close = float(pre_data['close'].values)
print('{}开始停牌'.format(stopday))
print('停牌日前一交易日收盘价为{}'.format(pre_close))
return pre_close
p_close = get_stop_price(symbol, start_date, end_date)
来源:掘金量 作者:四两
-------------------------------------------------------