get_price

56
0
0
2023-12-20
get_price

get_price

get_price 获取历史数据,可查询多个标的多个数据字段,返回数据格式为 DataFrame

get_price(security, start_date=None, end_date=None, frequency='daily', fields=None, skip_paused=False, fq='pre', count=None, panel=True, fill_paused=True)

获取一支或者多只股票的行情数据, 按天或者按分钟,这里在使用时注意 end_date 的设置, 传入的值不要大于context.current_dt,否则会引入未来函数。

关于停牌: 因为此API可以获取多只股票的数据, 可能有的股票停牌有的没有, 为了保持时间轴的一致,

我们默认没有跳过停牌的日期, 停牌时使用停牌前的数据填充(请看 SecurityUnitData 的 paused 属性). 如想跳过, 请使用 skip_paused=True 参数, 注意当 panel=True 且获取多标的时不支持(panel结构需要索引对齐)

参数

  • security: 一支股票代码或者一个股票代码的list

  • count: 与 start_date 二选一,不可同时使用. 数量, 返回的结果集的行数, 即表示获取 end_date 之前几个 frequency 的数据

  • start_date: 与 count 二选一,不可同时使用. 字符串或者 datetime.datetime/datetime.date 对象, 开始时间.

    • 如果 count 和 start_date 参数都没有, 则 start_date 生效, 值是 '2015-01-01'. 注意:

    • 当取分钟数据时, 时间可以精确到分钟, 比如: 传入datetime.datetime(2015, 1, 1, 10, 0, 0)或者'2015-01-01 10:00:00'.

    • 当取分钟数据时, 如果只传入日期, 则日内时间是当日的 00:00:00.

    • 当取天数据时, 传入的日内时间会被忽略

  • end_date: 格式同上, 结束时间, 默认是'2015-12-31', 包含此日期. 注意: 当取分钟数据时, 如果 end_date 只有日期, 则日内时间等同于 00:00:00, 所以返回的数据是不包括 end_date 这一天的.

  • frequency: 单位时间长度, 几天或者几分钟, 现在支持'Xd','Xm', 'daily'(等同于'1d'), 'minute'(等同于'1m'), X是一个正整数, 分别表示X天和X分钟(不论是按天还是按分钟回测都能拿到这两种单位的数据), 注意, 当X > 1时, fields只支持['open', 'close', 'high', 'low', 'volume', 'money']这几个标准字段,合成数据的逻辑见下文. 默认值是daily

  • fields: 字符串list, 选择要获取的行情数据字段, 默认是None(表示['open', 'close', 'high', 'low', 'volume', 'money']这几个标准字段), 支持SecurityUnitData里面的所有基本属性,,包含:['open', 'close', 'low', 'high', 'volume', 'money', 'factor', 'high_limit','low_limit', 'avg', 'pre_close', 'paused','open_interest'],其中paused为1表示停牌。

  • skip_paused: 是否跳过不交易日期(包括停牌, 未上市或者退市后的日期). 如果不跳过, 停牌时会使用停牌前的数据填充(具体请看SecurityUnitData的paused属性), 上市前或者退市后数据都为 nan, 但要注意:

    • 默认为 False

    • 当 skip_paused 是 True 时, 获取多个标的时需要将panel参数设置为False(panel结构需要索引对齐)

  • fq: 复权选项(对股票/基金的价格字段、成交量字段及factor字段生效) :

    • 'pre', 前复权(根据'use_real_price'选项不同含义会有所不同, 参见[set_option]), 默认是前复权

    • None,不复权, 返回实际价格

    • 'post',后复权

  • panel:在pandas 0.25版后,panel被彻底移除。获取多标的数据时建议设置panel为False,返回等效的dataframe

  • fill_paused:对于停牌股票的价格处理,默认为True;True表示用pre_close价格填充;False 表示使用NAN填充停牌的数据。

合成数据的逻辑

当frequency为X天和X分钟时,代表使用以X为长度的滑动窗口进行合并数据。举例:

  • 9:33:00调用get_price获取1个单位的数据,frequency='5min',表示使用上一交易日14:58、14:59、15:00、本交易日9:31、9:32这5根1分钟K线来合成数据;

  • 9:37:00调用get_price获取1个单位的数据,frequency='5min',表示使用本交易日9:32、9:33、9:34、9:35、9:36这5根1分钟K线来合成数据;

返回

  • 请注意, 为了方便比较一只股票的多个属性, 同时也满足对比多只股票的一个属性的需求, 我们在security参数是一只股票和多只股票时返回的结构完全不一样(默认panel=False时)

  • 如果是一支股票, 则返回[pandas.DataFrame]对象, 行索引是[datetime.datetime]对象, 列索引是行情字段名字, 比如'open'/'close'. 比如:get_price('000300.XSHG')[:2]返回:

---

open

close

high

low

volume

money

2015-01-05

3566.09

3641.54

3669.04

3551.51

451198098.0

519849817448.0

2015-01-06

3608.43

3641.06

3683.23

3587.23

420962185.0

498529588258.0

  • 如果是多支股票, 则返回[pandas.Panel]对象, 里面是很多[pandas.DataFrame]对象, 索引是行情字段(open/close/…), 每个[pandas.DataFrame]的行索引是[datetime.datetime]对象, 列索引是股票代号. 比如get_price(['000300.XSHG', '000001.XSHE'])['open'][:2]返回:

---

000300.XSHG

000001.XSHE

2015-01-05

3566.09

13.21

2015-01-06

3608.43

13.09


示例

# 获取一支股票
df = get_price('000001.XSHE') # 获取000001.XSHE的2015年的按天数据
df = get_price('000001.XSHE', start_date='2015-01-01', end_date='2015-01-31 23:00:00', frequency='1m', fields=['open', 'close']) # 获得000001.XSHG的2015年01月的分钟数据, 只获取open+close字段
df = get_price('000001.XSHE', count = 2, end_date='2015-01-31', frequency='daily', fields=['open', 'close']) # 获取获得000001.XSHG在2015年01月31日前2个交易日的数据
df = get_price('000001.XSHE', start_date='2015-12-01 14:00:00', end_date='2015-12-02 12:00:00', frequency='1m') # 获得000001.XSHG的2015年12月1号14:00-2015年12月2日12:00的分钟数据

# 获取多只股票
panel =  get_price(get_index_stocks('000903.XSHG')) # 获取中证100的所有成分股的2015年的天数据, 返回一个[pandas.Panel]
df_open = panel['open']  # 获取开盘价的[pandas.DataFrame],  行索引是[datetime.datetime]对象, 列索引是股票代号
df_volume = panel['volume']  # 获取交易量的[pandas.DataFrame]

df_open['000001.XSHE'] # 获取平安银行的2015年每天的开盘价数据