掘金社区

【掘金使用技巧6】获取股票停牌价Pinned highlighted

四两 发表在策略研究 2020-12-30 15:45:14

策略研究
363
2
0

怎样获取股票停牌前一日收盘价?

目前掘金提供的接口没有能够直接获取停牌前一交易日收盘价,想要查询停牌价格,只能利用其他数据接口判断。因此小编将一些接口组合,写成了一个函数供大家参考交流。

设计思路

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)


评论: 2
  • File "D:/DPYTHON/GM/掘金学习.py", line 58, in <module>
    p_close = get_stop_price(symbol, start_date, end_date)

    File "D:/DPYTHON/GM/掘金学习.py", line 55, in get_stop_price
    return pre_close

    UnboundLocalError: local variable 'pre_close' referenced before assignment

    ----------------出现上述错误,求解

    2021-01-05 19:10:56
  • @gmpqq8 应该是输入的开始日期股票就停牌了,这种情形没有考虑到函数中,现已修改好,可以重新试一下。

    2021-01-06 09:54:47

Looks like your connection to 掘金量化社区 - 量化交易者的交流社区 was lost, please wait while we try to reconnect.