掘金社区

如何在集合竞价之后获得现价?Pinned highlighted

小丑皇 发表在问题反馈 2021-04-26 18:06:16

问题反馈
148
10
0

on bar的回测,我在9:29运行
history(symbol=code, frequency='60s', start_time=(context.now-timedelta(minutes=5)),end_time=context.now,
fields='symbol, open, close, low, high, created_at',adjust=ADJUST_PREV))
但是输出是空的list。
current又要等到9:31.
history_n也是输出空的。。
我想要在9:30之前获得开盘价,如何做到?

评论: 10
  • (1)实时模式可用current获取,回测可使用history或者history_n获取,示例
    df = history(symbol='SZSE.000001', frequency='tick', start_time=datetime(2021, 4, 26, 9, 10), end_time=datetime(2021, 4, 26, 9, 30), adjust=1, df=True)
    (2)回测current只获取上一交易分钟的close
    (3)开盘价以9.30为准,集合竞价有tick的字段,不代表最终的开盘价

    2021-04-27 09:20:10
  • @charkong 按照你的方法,输出还是empty dataframe。麻烦看看代码,谢谢!

    coding=utf-8

    from future import print_function, absolute_import, unicode_literals
    from gm.api import *
    from datetime import timedelta

    def init(context):
    schedule(schedule_func=algo, date_rule='1d', time_rule='09:29:00')

    def algo(context):
    # 获取当前时间
    now = context.now
    print('sch',now)
    # 获取筛选时间:date1表示当前日期之前的100天,date2表示当前时间
    date1 = (context.now - timedelta(days=100)).strftime("%Y-%m-%d %H:%M:%S")
    date2 = context.now.strftime("%Y-%m-%d %H:%M:%S")
    # 通过get_instruments获取所有的上市股票代码
    all_stock = get_instruments(exchanges='SHSE, SZSE', sec_types=[1], fields='symbol, listed_date, delisted_date',
    df=True)
    # 剔除停牌和st股和上市不足100日的新股和退市股和B股
    code = all_stock[(all_stock['listed_date'] < date1) & (all_stock['delisted_date'] > date2) &
    (all_stock['symbol'].str[5] != '9') & (all_stock['symbol'].str[5] != '2')]
    # 获取所有股票市值
    fundamental = get_fundamentals_n('trading_derivative_indicator', code['symbol'].to_list(),
    context.now, fields='TOTMKTCAP', order_by='TOTMKTCAP', count=1, df=True)
    # 对市值进行排序(升序),并且获取前30个。 最后将这个series 转化成为一个list即为标的池
    trade_symbols = fundamental.reset_index(drop=True)['symbol'].to_list()
    tt=trade_symbols[:3]
    # print('=====',history_n(tt[0] ,'15s', 1, end_time=context.now, adjust=ADJUST_NONE))
    context.symbol=tt.copy()
    subscribe(context.symbol, '60s')
    # 计算每个个股应该在持仓中的权重

    def on_bar(context, bars):
    for stock in context.symbol:
    print('stock:',stock)
    print(history(symbol=stock, frequency='tick', start_time=(context.now-timedelta(minutes=5)),
    end_time=context.now, adjust=1, df=True))

    if name == 'main':
    '''
    strategy_id策略ID, 由系统生成
    filename文件名, 请与本文件名保持一致
    mode运行模式, 实时模式:MODE_LIVE回测模式:MODE_BACKTEST
    token绑定计算机的ID, 可在系统设置-密钥管理中生成
    backtest_start_time回测开始时间
    backtest_end_time回测结束时间
    backtest_adjust股票复权方式, 不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
    backtest_initial_cash回测初始资金
    backtest_commission_ratio回测佣金比例
    backtest_slippage_ratio回测滑点比例
    '''
    run(strategy_id='2680fe',
    filename='main.py',
    mode=MODE_BACKTEST,
    token='4306',
    backtest_start_time='2020-11-01 09:20:00',
    backtest_end_time='2020-11-10 09:31:00',
    backtest_adjust=ADJUST_PREV,
    backtest_initial_cash=10000000,
    backtest_commission_ratio=0.0001,
    backtest_slippage_ratio=0.0001)

    `

    输出:

    python sdk version: 3.0.134
    c_sdk version: b'3.2.12'

    sch 2020-11-02 09:29:00+08:00
    stock: SHSE.600000
    Empty DataFrame
    Columns: []
    Index: []
    stock: SHSE.600004
    Empty DataFrame
    Columns: []
    Index: []

    2021-04-27 23:09:36
  • @小丑皇 tick数据权限只有最近的三个月,请把回测区间改一下

    2021-04-28 09:15:33
  • @charkong 失误!我又修改了一下,频率改成60s,这个应该是2016年以来都可以的了。但是还是输出空的。

    ---------说明了subscribe不一定要在init中-----------

    coding=utf-8

    from future import print_function, absolute_import, unicode_literals
    from gm.api import *
    from datetime import timedelta
    """
    小市值策略
    本策略每个月触发一次,计算当前沪深市场上市值最小的前30只股票,并且等权重方式进行买入。
    对于不在前30的有持仓的股票直接平仓。
    回测时间为:2018-07-01 08:00:00 到 2020-10-01 16:00:00
    """
    def init(context):
    schedule(schedule_func=algo, date_rule='1d', time_rule='09:29:00')

    def algo(context):
    # 获取当前时间
    now = context.now
    # 获取筛选时间:date1表示当前日期之前的100天,date2表示当前时间
    date1 = (context.now - timedelta(days=100)).strftime("%Y-%m-%d %H:%M:%S")
    date2 = context.now.strftime("%Y-%m-%d %H:%M:%S")
    # 通过get_instruments获取所有的上市股票代码
    all_stock = get_instruments(exchanges='SHSE, SZSE', sec_types=[1], fields='symbol, listed_date, delisted_date',
    df=True)
    # 剔除停牌和st股和上市不足100日的新股和退市股和B股
    code = all_stock[(all_stock['listed_date'] < date1) & (all_stock['delisted_date'] > date2) &
    (all_stock['symbol'].str[5] != '9') & (all_stock['symbol'].str[5] != '2')]
    # 获取所有股票市值
    fundamental = get_fundamentals_n('trading_derivative_indicator', code['symbol'].to_list(),
    context.now, fields='TOTMKTCAP', order_by='TOTMKTCAP', count=1, df=True)
    # 对市值进行排序(升序),并且获取前30个。 最后将这个series 转化成为一个list即为标的池
    trade_symbols = fundamental.reset_index(drop=True)['symbol'].to_list()
    tt=trade_symbols[:3]
    for stock in tt:
    print('stock:',stock)
    print('time:',context.now)
    print('=====',history(symbol=stock, frequency='60s', start_time=(context.now-timedelta(minutes=10)), end_time=context.now, adjust=1, df=True))

    context.symbol=tt.copy()
    subscribe(context.symbol, '60s')
    # 计算每个个股应该在持仓中的权重

    def on_bar(context, bars):

        print()
    

    if name == 'main':
    '''
    strategy_id策略ID, 由系统生成
    filename文件名, 请与本文件名保持一致
    mode运行模式, 实时模式:MODE_LIVE回测模式:MODE_BACKTEST
    token绑定计算机的ID, 可在系统设置-密钥管理中生成
    backtest_start_time回测开始时间
    backtest_end_time回测结束时间
    backtest_adjust股票复权方式, 不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
    backtest_initial_cash回测初始资金
    backtest_commission_ratio回测佣金比例
    backtest_slippage_ratio回测滑点比例
    '''
    run(strategy_id='260fe',
    filename='main.py',
    mode=MODE_BACKTEST,
    token='f06',
    backtest_start_time='2020-11-01 09:20:00',
    backtest_end_time='2020-11-10 09:31:00',
    backtest_adjust=ADJUST_PREV,
    backtest_initial_cash=10000000,
    backtest_commission_ratio=0.0001,
    backtest_slippage_ratio=0.0001)

    输出

    stock: SHSE.600000
    time: 2020-11-02 09:29:00+08:00
    ===== Empty DataFrame
    Columns: []
    Index: []

    2021-04-28 22:43:56
  • @小丑皇 你的时间逻辑就有错误好吧,怎么可以获取9:29前十分钟的一分钟数据呢?都没有数据

    2021-04-29 09:32:53
  • @charkong 可以指定获取9.25分集合竞价结果的数据么? 代码如何表达?

    2021-04-29 10:22:25
  • @charkong 那所以就是集合竞价的数据是没有的?完全没有办法在9:30之前获得开盘价?

    2021-04-29 15:59:20
  • @charkong 但是你给的代码里面
    df = history(symbol='SZSE.000001', frequency='tick', start_time=datetime(2021, 4, 26, 9, 10), end_time=datetime(2021, 4, 26, 9, 30), adjust=1, df=True)

    是9点10分到9点30分的tick数据,所以意思是,9点30分之前,tick数据有,60s的数据没有?

    2021-04-29 16:01:30
  • @小丑皇 集合竞价数据有的,为tick数据,但没有一分钟的数据,一分钟的数据只有盘中才有

    2021-04-30 09:17:37
  • @保存的数据
    可以直接设置定时任务,在algo中执行获取tick数据,实时模式下,current获取便捷;回测模式下,可使用history获取或者history_n获取

    2021-04-30 09:20:21

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