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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_38486884/article/details/82981783