美文网首页程序员
量化交易入门笔记-数据获取函数 一

量化交易入门笔记-数据获取函数 一

作者: 东南有大树 | 来源:发表于2018-10-09 14:21 被阅读6次

    history()函数

    history()获取历史数据,可查询多个标的单个数据字段,返回数据格式为 DataFrame 或 Dict(字典),其语法格式如下:

    history(count, 
            unit='1d', 
            field='avg', 
            security_list=None, 
            df=True, 
            skip_paused=False, 
            fq='pre')
    

    在获取天数据时,不包括当天的数据,即使是在收盘后

    关于停牌:因为获取多只股票的原因,为了保持数据格式的一致,默认没有跳过停牌的日期,停牌的数据使用停牌前的数据填充

    参数解析:

    • count : 表示返回结果集的行数

    • unit : 表示单位时间的长度,几天或者几分钟

      • Xd : 几天
      • Xm : 几分钟

      **当X>1时,fields只支持['open', 'close', 'high', 'low', 'volume', 'money']这几个标准字段 **

    • field : 表示获取的数据类型,支持 SecurityUnitData 里所有的基本属性,包括:

      • open : 开盘价
      • close : 收盘价
      • high : 最高价
      • low : 最低价
      • volume : 成交量
      • money : 成效额
      • factor : 前复权因子
      • high_limit : 涨停价
      • low_limit : 跌停价
      • avg : 平均价 (money/volume)
      • pre_close : 前一个单位时间的结束时的价格
      • paused : 布尔值。用来判断是否停牌
    • security_list : 用来获取数据的股票列表,其值如果为None,则默认从context.universe中选择股票

    • df : 如果是True,则返回 pandas.DataFrame,否则返回dict;默认为 True

    • skip_paused : 用来设置是否跳过不交易日期(包括停牌、未上市或者退市后的日期)。如果不跳过,停牌时会使用停牌前的数据填充。上市前或者退市后数据都为nan。需要注意的是,该参数的默认为False,即不跳过不交易日期

    • fq : 表示复权选项。值为"pre",表示前复权;值为 None ,表示不复权,返回实际价格;值设置为 ”pos",表示后复权

    示例:

    import pandas as pd
    
    # 显示中国平安 000009 最后5个交易日每天的收盘价信息
    df = history(5, 
                 unit='1d', 
                 field='close', 
                 security_list='000009.XSHE', 
                 df=True, 
                 skip_paused=False, 
                 fq='pre')
    df
    
    000009.XSHE
    2018-09-25 4.77
    2018-09-26 4.69
    2018-09-27 4.59
    2018-09-28 4.64
    2018-10-08 4.50
    import pandas as pd
    
    # 同时显示多只股票的第天的收盘价信息
    df = history(5, 
                 unit='1d', 
                 field='close', 
                 security_list=['000001.XSHE',
                               '000002.XSHE',
                               '000009.XSHE'], 
                 df=True, 
                 skip_paused=False, 
                 fq='pre')
    df
    
    000001.XSHE 000002.XSHE 000009.XSHE
    2018-09-25 10.55 24.64 4.77
    2018-09-26 10.71 24.67 4.69
    2018-09-27 10.74 24.45 4.59
    2018-09-28 11.05 24.30 4.64
    2018-10-08 10.45 22.05 4.50
    import pandas as pd
    
    df = history(3,
                unit='1d',
                field='open',
                security_list=['000001.XSHE',
                              '000002.XSHE',
                              '000009.XSHE'],
                df=True,
                skip_paused=False,
                fq='pre')
    
    print('显示平安银行过去3天的每天的开盘价')
    print(df['000001.XSHE'])
    print('显示昨天平安银行的开盘价')
    print(df['000001.XSHE'][-1])
    print('显示三只股票的昨日开盘价')
    print(df.iloc[-1])
    print('显示每只股票过去3天的平均价格')
    print(df.mean())
    

    显示平安银行过去3天的每天的开盘价
    2018-09-27    10.65
    2018-09-28    10.78
    2018-10-08    10.70
    Name: 000001.XSHE, dtype: float64
    显示昨天平安银行的开盘价
    10.7
    显示三只股票的昨日开盘价
    000001.XSHE    10.70
    000002.XSHE    22.95
    000009.XSHE     4.59
    Name: 2018-10-08 00:00:00, dtype: float64
    显示每只股票过去3天的平均价格
    000001.XSHE    10.710000
    000002.XSHE    24.026667
    000009.XSHE     4.630000
    dtype: float64
    

    再看如果输出的是dict类型的数据的情况:

    import pandas as pd
    
    df = history(3,
                unit='1d',
                field='high',
                security_list=['000001.XSHE',
                              '000009.XSHE'],
                df=False,
                skip_paused=False,
                fq='pre')
    
    print('两只股票近三日的最高价信息', df)
    print('显示平安银行近三日的最高价信息', df['000001.XSHE'])
    print('显示平安银行近三日的最高价的和', df['000001.XSHE'].sum())
    print('显示平安银行近三日的最高价的平均值', df['000001.XSHE'].mean())
    

    两只股票近三日的最高价信息 {'000009.XSHE': array([ 4.7 ,  4.65,  4.59]), '000001.XSHE': array([ 10.84,  11.27,  10.79])}
    显示平安银行近三日的最高价信息 [ 10.84  11.27  10.79]
    显示平安银行近三日的最高价的和 32.9
    显示平安银行近三日的最高价的平均值 10.9666666667
    

    attribute_history()函数

    attribute_history()获取历史数据,可查询单个标的多个数据字段,返回数据格式为 DataFrame 或 Dict(字典)

    语法如下:

    attribute_history(
        security,
        count,
        unit='id',
        fields=['open', 'close', 'high', 'low', 'volume', 'money'],
        skip_paused=True,
        df=True,
        fq='pre'
    )
    

    在获取天数据时,不包括当天的数据,即使是在收盘后。默认跳过了停牌日期

    示例:(这里采用显性的参数名赋值方法)

    import pandas as pd
    
    df = attribute_history(
        security='000009.XSHE',
        count=5,
        unit='1d',
        fields=['open', 'close', 'high', 'low', 'volume', 'money'],
        skip_paused=True,
        df=True,
        fq='pre')
    df
    
    open close high low volume money
    2018-09-25 4.68 4.77 4.77 4.64 12286364 57765550.48
    2018-09-26 4.71 4.69 4.75 4.63 15451984 72594583.00
    2018-09-27 4.70 4.59 4.70 4.58 9656945 44753925.93
    2018-09-28 4.60 4.64 4.65 4.59 7561961 34951199.58
    2018-10-08 4.59 4.50 4.59 4.48 9551775 43298882.77

    下面是返回数据的常用常法:

    # 适用于DataFrame和dict
    df['open']  # 过去5天的每天的开盘价
    df['close'][-1]  # 昨天的收盘价
    df['open'].mean()  # 过去5天的每天的开盘价的平均价
    
    # 只适用于DataFrame
    df['open']['2018-09-28']  # 行的索引可以是整数,也可以是日期形式
    df['open'][datetime.date(2018, 9, 28)]
    df['open'][datetime.datetime(2018, 9, 28)]
    df.iloc[-1]  # 按行取数据,指昨天的数据
    df.iloc[-1]['open']  # 昨天的开盘价
    df.loc['2018-09-28']['open']
    df = df[df['avg'] > 6]  # 显示均价大于6的数据
    df['close'] = df['open']/df['factor']  # 开盘价/复权因子=原始开盘价
    df['close'] = df['close']/df['facotr']  # 收盘价/复权因子=原始收盘价
    

    get_current_data()函数

    在回测时,有些数据在一个单位时间(天/分钟)是知道的,例如涨跌停价、是否停牌、当天的开盘价等,这些数据可以通过本函数获得

    语法如下:

    get_current_data(security_list=None)
    

    **如果security_list 是 None,代表使用 universe 中的股票 **

    该函数返回一个 dict 对象,key 是股票代码,value 数据具体如下:

    • high_limit : 涨停价
    • low_limit : 跌停价
    • paused : 是否停止 或者暂停交易,当停牌、未上市或退市 后返回 True
    • is_st : 是否包含 ST, *ST
    • day_open : 当天开盘价,分钟回测时可用,天回测时,由于是在集合竞价下单,并不知道开盘价,rnn8所以不能使用
    • name : 股票现在的名称
    • industry_code : 股票现在所属的行业代码

    **需要注意的是,为了回事,返回的 dict 里面的数据是按需获取的,dict 初始是空的。当使用 current_data[security]时,该 security 的数据才会被获取。另外,返回的结果只在当天有效,不能存起来到隔天使用

    实例代码:

    set_universe(['000001.XSHE'])
    
    def handle_data(context, data):
        current_data = get_current_data()
        print(current_data)
        print(current_data['000001.XSHE'])
        print(current_data['000001.XSHE'].paused)  # 查询股票当天是否停牌
        print(current_data['000001.XSHE'].high_limit)  # 获取当天的涨停价
    

    get_bars()函数

    获取历史数据(包含快照数据),可查询单个标的多个数据字段,返回数据格式为 numpy.ndarray

    即返回K(bar)线图的快照数据,语法如下:

    get_bars(security, 
             count,
             unit='1d',     
             fields=['date', 'open','high','low','close'],  
             include_now=False, 
             end_dt=None, 
             fq_ref_date=None)
    

    获取各种时间周期的 bar 数据, bar 的分割方式与主流股票软件相同, 而且支持返回当前时刻所在 bar 的数据

    参数

    • security: 股票代码
    • count: 大于0的整数,表示获取bar的个数。如果行情数据的bar不足count个,返回的长度则小于count个数。
    • unit: bar的时间单位, 支持如下周期:'1m', '5m', '15m', '30m', '60m', '120m', '1d', '1w', '1M'。'1w' 表示一周,‘1M' 表示一月。
    • fields: 获取数据的字段, 支持如下值:'date', 'open', 'close', 'high', 'low', 'volume', 'money'
    • include_now: 取值True 或者False。 表示是否包含当前bar, 比如策略时间是9:33,unit参数为5m, 如果 include_now=True,则返回9:30-9:33这个分钟 bar。
    • end_dt:查询的截止时间,支持的类型为datetime.datetime或None。为None在回测模拟环境下默认为context.current_dt,在研究环境下默认为datetime.now(),支持的格式为。
    • fq_ref_date:复权基准日期,为None时为不复权数据。注意在回测及模拟交易中,默认为None,即不复权数据;在研究环境中,默认复权基准日期为当天

    返回

    一个 numpy.ndarray 对象。可以通过 array['close'] 的方式直接访问列数据。

    示例

    array = get_bars('000001.XSHG', 5, unit='1d',fields=['open','close'],include_now=False)
    array['close']
    

    array([ 2724.8 ,  2724.42,  2723.26,  2722.92,  2724.05])
    

    其实,其他数据获取函数也可以做这一点,即获得K线的快照数据

    例如:

    array = get_bars('000001.XSHG', 
                     5, unit='1m',
                     fields=['date', 'open', 'close', 'high', 'low', 'volume', 'money'],
                     include_now=False)
    
    df = attribute_history(
        security='000001.XSHG',
        count=5,
        unit='1m',
        fields=['open', 'close', 'high', 'low', 'volume', 'money'],
        skip_paused=True,
        df=True,
        fq='pre')
    
    print(array)
    print(df)
    

    [ (datetime.datetime(2018, 10, 9, 13, 22), 2725.47, 2724.8, 2725.72, 2724.05, 25296600.0, 257562398.9)
     (datetime.datetime(2018, 10, 9, 13, 23), 2724.63, 2724.42, 2724.98, 2724.31, 25518400.0, 241811255.9)
     (datetime.datetime(2018, 10, 9, 13, 24), 2724.15, 2723.26, 2724.39, 2722.94, 27154900.0, 256055358.1)
     (datetime.datetime(2018, 10, 9, 13, 25), 2722.95, 2722.92, 2723.45, 2722.73, 29886300.0, 261758003.0)
     (datetime.datetime(2018, 10, 9, 13, 26), 2722.7, 2724.05, 2724.29, 2722.15, 32145400.0, 331564478.1)]
                            open    close     high      low    volume        money
    2018-10-09 13:22:00  2725.47  2724.80  2725.72  2724.05  25296600  257562398.9
    2018-10-09 13:23:00  2724.63  2724.42  2724.98  2724.31  25518400  241811255.9
    2018-10-09 13:24:00  2724.15  2723.26  2724.39  2722.94  27154900  256055358.1
    2018-10-09 13:25:00  2722.95  2722.92  2723.45  2722.73  29886300  261758003.0
    2018-10-09 13:26:00  2722.70  2724.05  2724.29  2722.15  32145400  331564478.1
    

    都返回了前五分钟的K线快照数据,只是返回的数据类型不一样罢了,在使用中可以灵活调用

    get_price()函数

    该函数在章节《Pandas库》中已经有过讲解,这里不再作详述

    现将这几个函数作一个对比

    • get_price 获取历史数据,可查询多个标的多个数据字段,返回数据格式为 DataFrame
    • history ♠ 获取历史数据,可查询多个标的单个数据字段,返回数据格式为 DataFrame 或 Dict(字典)
    • attribute_history ♠ 获取历史数据,可查询单个标的多个数据字段,返回数据格式为 DataFrame 或 Dict(字典)
    • get_current_data ♠ 获取当前时间数据
    • get_bars 获取历史数据(包含快照数据),可查询单个标的多个数据字段,返回数据格式为 numpy.ndarray

    注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!

    相关文章

      网友评论

        本文标题:量化交易入门笔记-数据获取函数 一

        本文链接:https://www.haomeiwen.com/subject/xiweaftx.html