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
注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!
网友评论