关闭

您正在使用的浏览器版本较低,无法支持聚宽的某些特性。

为了获得更好的体验,推荐使用: Google Chrome 或者 Mozilla Firefox 或者 IE9以上



股票数据

股票概况

包含股票的上市时间、退市时间、代码、名称、是否是ST等。

更多API的可参考官方API文档

获取单支股票数据

获取单支股票的信息.

调用方法

get_security_info(code)

参数

  • code: 证券代码

返回值

  • 一个对象, 有如下属性:
    • display_name # 中文名称
  • name # 缩写简称
    • start_date # 上市日期, [datetime.date] 类型
    • end_date # 退市日期, [datetime.date] 类型, 如果没有退市则为2200-01-01
    • type # 类型,stock(股票),index(指数),etf(ETF基金),fja(分级A),fjb(分级B)
    • parent # 分级基金的母基金代码

示例

# 输出平安银行信息
log.info(get_security_info('000001.XSHE'))

获取所有股票数据

获取平台支持的所有股票数据

调用方法

get_all_securities(types=['stock'])

这里请在使用时注意防止未来函数,types默认为stock。

返回

  • display_name # 中文名称
  • name # 缩写简称
  • start_date # 上市日期
  • end_date # 退市日期,如果没有退市则为2200-01-01
  • type # 类型,stock(股票)

[pandas.DataFrame], 比如:get_all_securities()[:2]返回:

display_name name start_date end_date type
000001.XSHE 平安银行 PAYH 1991-04-03 9999-01-01 stock
000002.XSHE 万 科A WKA 1991-01-29 9999-01-01 stock

示例

def initialize(context):
    #获得所有股票列表
    log.info(get_all_securities())
    log.info(get_all_securities(['stock']))

    #将所有股票列表转换成数组
    stocks = list(get_all_securities(['stock']).index)
    set_universe(stocks)

判断股票是否是ST

得到多只股票在一段时间是否是ST

调用方法

get_extras(info, security_list, start_date='2015-01-01', end_date='2015-12-31', df=True)

参数

  • info: ‘is_st’
  • security_list: 股票列表
  • start_date/end_date: 开始结束日期, 同[get_price]
  • df: 返回[pandas.DataFrame]对象还是一个dict

返回值

  • df=True:
    [pandas.DataFrame]对象, 列索引是股票代号, 行索引是[datetime.datetime], 比如

    get_extras('is_st', ['000001.XSHE', '000018.XSHE'], start_date='2013-12-01', end_date='2013-12-03')返回:

000001.XSHE 000018.XSHE
2013-12-02 00:00:00 False True
2013-12-03 00:00:00 False True

- df=False
一个dict, key是股票代号, value是[numpy.ndarray], 比如get_extras('is_st', ['510300.XSHG', '510050.XSHG'], start_date='2015-12-01', end_date='2015-12-03', df=False) 返回:

python
{
u'000001.XSHE': array([False, False, False], dtype=bool),
u'000018.XSHE': array([False, False, False], dtype=bool)
}

获取股票的融资融券信息

获取一只或者多只股票在一个时间段内的融资融券信息

调用方法

get_mtss(security_list, start_date, end_date, fields=None)

参数

  • security_list: 一只股票代码或者一个股票代码的 list
  • start_date: 开始日期, 一个字符串或者 datetime.datetime/datetime.date 对象
  • end_date: 结束日期, 一个字符串或者 datetime.date/datetime.datetime对象
  • fields: 字段名或者 list, 可选. 默认为 None, 表示取全部字段, 各字段含义如下:
字段名 含义
date 日期
sec_code 股票代码
fin_value 融资余额
fin_buy_value 融资买入额
fin_refund_value 融资偿还额
sec_value 融券余额
sec_sell_value 融资卖出额
sec_refund_value 融资偿还额
fin_sec_value 融资融券余额

返回值
返回一个 pandas.DataFrame 对象,默认的列索引为取得的全部字段. 如果给定了 fields 参数, 则列索引与给定的 fields 对应.

示例

# 获取一只股票的融资融券信息
get_mtss('000001.XSHE', '2016-01-01', '2016-04-01')
get_mtss('000001.XSHE', '2016-01-01', '2016-04-01', fields=["date", "sec_code", "fin_value", "fin_buy_value"])
get_mtss('000001.XSHE', '2016-01-01', '2016-04-01', fields="sec_sell_value")

# 获取多只股票的融资融券信息
get_mtss(['000001.XSHE', '000002.XSHE', '000099.XSHE'], '2015-03-25', '2016-01-25')
get_mtss(['000001.XSHE', '000002.XSHE', '000099.XSHE'], '2015-03-25', '2016-01-25', fields=["date", "sec_code", "sec_value", "fin_buy_value", "sec_sell_value"])

股票分类信息

获取指数成份股,或者行业成份股。

获取指数成份股

获取一个指数给定日期在平台可交易的成分股列表,我们支持近600种股票指数数据,包括指数的行情数据以及成分股数据。为了避免未来函数,我们支持获取历史任意时刻的指数成分股信息。请点击指数列表查看指数信息.

调用方法

get_index_stocks(index_symbol, date=None)

参数

  • index_symbol, 指数代码
  • date: 查询日期, 一个字符串(格式类似’2015-10-15’)或者[datetime.date]/[datetime.datetime]对象, 可以是None, 使用默认日期. 这个默认日期在回测和研究模块上有点差别:

    1. 回测模块: 默认值会随着回测日期变化而变化, 等于context.current_dt
    2. 研究模块: 默认是今天

返回

  • 返回股票代码的list

示例

# 获取所有沪深300的股票, 设为股票池
stocks = get_index_stocks('000300.XSHG')
set_universe(stocks)

获取行业、概念成份股

获取在给定日期一个行业或概念板块的所有股票,行业分类、概念分类列表见数据页面-行业概念数据

调用方法

# 获取行业板块成分股
get_industry_stocks(industry_code, date=None)

# 获取概念板块成分股
get_concept_stocks(concept_code, date=None)

参数

  • industry_code: 行业编码
  • date: 查询日期, 一个字符串(格式类似’2015-10-15’)或者[datetime.date]/[datetime.datetime]对象, 可以是None, 使用默认日期. 这个默认日期在回测和研究模块上有点差别:
    1. 回测模块: 默认值会随着回测日期变化而变化, 等于context.current_dt
    2. 研究模块: 默认是今天

返回

  • 返回股票代码的list

示例

# 获取计算机/互联网行业的成分股
stocks = get_industry_stocks('I64')

# 获取风力发电概念板块的成分股
stocks = get_concept_stocks('GN036')

行情数据

交易类数据提供股票的交易行情数据,通过API接口调用即可获取相应的数据。主要包括以下类别:

历史行情数据

获取股票历史交易数据,可以通过参数设置获取日k线、分钟k线数据。获取数据的基本属性如下:

  • open 时间段开始时价格
  • close 时间段结束时价格
  • low 最低价
  • high 最高价
  • volume 成交的股票数量
  • money 成交的金额
  • factor 前复权因子, 我们提供的价格都是前复权后的, 但是利用这个值可以算出原始价格, 方法是价格除以factor, 比如: close/factor
  • high_limit 涨停价
  • low_limit 跌停价
  • avg 这段时间的平均价, 等于money/volume
  • pre_close 前一个单位时间结束时的价格, 按天则是前一天的收盘价, 按分钟这是前一分钟的结束价格
  • paused 布尔值, 这只股票是否停牌, 停牌时open/close/low/high/pre_close依然有值,都等于停牌前的收盘价, volume=money=0

获取数据的方法有多种,类型如下:

获取多支股票的单一属性

查看多支股票的单个属性历史数据。

调用方法

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

注:设定不同的unit参数,获取日K线或分钟k线,详情见参数。

关于停牌: 因为获取了多只股票的数据, 可能有的股票停牌有的没有, 为了保持时间轴的一致, 我们没有跳过停牌的日期, 停牌时使用停牌前的数据填充(请看[SecurityUnitData]的paused属性). 如想跳过, 请使用[attribute_history]
当取日K线数据时, 不包括当天的, 即使是在收盘后

参数

  • count: 数量, 返回的结果集的行数
  • unit: 单位时间长度, 几天或者几分钟, 现在支持’Xd’,’Xm’, X是一个正整数, 分别表示X天和X分钟(不论是按天还是按分钟回测都能拿到这两种单位的数据),如),如‘1d’,’2m’. 注意, 当X > 1时, field只支持[‘open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘money’]这几个标准字段.
  • field: 要获取的数据类型, 支持属性里面的所有基本属性.
  • security_list: 要获取数据的股票列表, None表示universe中选中的所有股票
  • df: 若是True, 返回[pandas.DataFrame], 否则返回一个dict, 具体请看下面的返回值介绍. 默认是True.(们之所以增加df参数, 是因为[pandas.DataFrame]创建和操作速度太慢, 很多情况并不需要使用它. 为了保持向上兼容, df默认是True, 但是如果你的回测速度很慢, 请考虑把df设成False.)
  • skip_paused: 是否跳过停牌的时间, 如果不跳过, 停牌时会使用停牌前的数据填充(具体请看[SecurityUnitData]的paused属性), 但要注意:
    • 默认为 False
    • 如果跳过, 则行索引不再是日期, 因为不同股票的实际交易日期可能不一样
  • fq: 复权选项:
    • 'pre': 前复权(根据’use_real_price’选项不同含义会有所不同, 参见set_option), 默认是前复权
    • None: 不复权, 返回实际价格
    • 'post': 后复权

返回

  • df=True:
    [pandas.DataFrame]对象, 行索引是[datetime.datetime]对象, 列索引是股票代号. 比如: 如果当前时间是2015-01-07, universe是[‘000300.XSHG’, ‘000001.XSHE’], history(2, '1d', 'open')将返回:
000300.XSHG 000001.XSHE
2015-01-05 00:00:00 3566.09 13.21
2015-01-06 00:00:00 3608.43 13.09

关于numpy和pandas, 请看第三方库介绍

  • df=False:
    dict, key是股票代码, 值是一个numpy数组[numpy.ndarray], 对应上面的DataFrame的每一列, 例如history(2, '1d', 'open', df=False)将返回:

    {
        '000300.XSHG': array([ 3566.09,  3608.43]),
        '000001.XSHE': array([ 13.21,  13.09])
    }

示例

h = history(5, '1d', 'volume', df=False) # 获取universe中股票的过去一天(不包含当天)的交易额
h = history(5, '1m', 'price', ['000001.XSHE'], df=False) # 获取平安银行的过去5分钟(不包含当前分钟)的每分钟的平均价
h.mean() # 取得每一列的平均值
获取单支股票的多个属性

查看某一支股票的历史数据, 可以选这只股票的多个属性.

调用方法

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

注:设定不同的unit参数,获取日K线或分钟k线,详情见参数。

关于停牌: 默认跳过停牌日期
当取日K线数据时, 不包括当天的, 即使是在收盘后

参数

  • security: 股票代码
  • count: 数量, 返回的结果集的行数
  • unit: 单位时间长度, 几天或者几分钟, 现在支持’Xd’,’Xm’, X是一个正整数, 分别表示X天和X分钟(不论是按天还是按分钟回测都能拿到这两种单位的数据),如‘1d’,’2m’. 注意, 当X > 1时, field只支持[‘open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘money’]这几个标准字段.
  • fields: 股票属性的list, 支持属性里面的所有基本属性.
  • skip_paused: 是否跳过停牌的时间, 如果不跳过, 停牌时会使用停牌前的数据填充(具体请看[SecurityUnitData]的paused属性), 默认是True
  • df: 若是True, 返回[pandas.DataFrame], 否则返回一个dict, 具体请看下面的返回值介绍. 默认是True. (们之所以增加df参数, 是因为[pandas.DataFrame]创建和操作速度太慢, 很多情况并不需要使用它. 为了保持向上兼容, df默认是True, 但是如果你的回测速度很慢, 请考虑把df设成False.)
  • fq: 复权选项:
    • 'pre': 前复权(根据’use_real_price’选项不同含义会有所不同, 参见set_option), 默认是前复权
    • None: 不复权, 返回实际价格
    • 'post': 后复权

返回

  • df=True
    [pandas.DataFrame]对象, 行索引是[datetime.datetime]对象, 列索引是属性名字. 比如: 如果当前时间是2015-01-07, attribute_history('000300.XSHG', 2)将返回:
open close high low volume money
2015-01-05 00:00:00 3566.09 3641.54 3669.04 3551.51 451198098.0 519849817448.0
2015-01-06 00:00:00 3608.43 3641.06 3683.23 3587.23 420962185.0 498529588258.0

- df=False:
dict, key是股票代码, 值是一个numpy数组[numpy.ndarray], 对应上面的DataFrame的每一列, 例如attribute_history('000300.XSHG', 2, df=False)将返回:

python
{
'volume': array([ 4.51198098e+08, 4.20962185e+08]),
'money': array([ 5.19849817e+11, 4.98529588e+11]),
'high': array([ 3669.04, 3683.23]),
'low': array([ 3551.51, 3587.23]),
'close': array([ 3641.54, 3641.06]),
'open': array([ 3566.09, 3608.43])
}

示例

stock = '000001.XSHE'
h = attribute_history(stock, 5, '1d', ('open','close', 'volume', 'factor')) # 取得000001(平安银行)过去5天的每天的开盘价, 收盘价, 交易量, 复权因子
# 不管df等于True还是False, 下列用法都是可以的
h['open'] #过去5天的每天的开盘价, 一个pd.Series对象, index是datatime
h['close'][-1] #昨天的收盘价
h['open'].mean()

# 下面的pandas.DataFrame的特性, df=False时将不可用
# 行的索引可以是整数, 也可以是日期的各种形式:
h['open']['2015-01-05']
h['open'][datetime.date(2015, 1, 5)]
h['open'][datetime.datetime(2015, 1, 5)]

# 按行取数据
h.iloc[-1] #昨天的开盘价和收盘价, 一个pd.Series对象, index是字符串:'open'/'close'
h.iloc[-1]['open'] #昨天的开盘价
h.loc['2015-01-05']['open']

# 高级运算
h = h[h['volume'] > 1000000] # 只保留交易量>1000000股的行
h['open'] = h['open']/h['factor'] #让open列都跟factor列相除, 把价格都转化成原始价格
h['close'] = h['close']/h['factor']
获取多支股票的多个属性

获取一支或者多只股票的多个属性的行情数据, 按天或者按分钟.

调用方法

get_price(security, start_date='2015-01-01', end_date='2015-12-31', frequency='daily', fields=None, skip_paused=False, fq='pre')

注:设定不同的unit参数,获取日K线或分钟k线,详情见参数。 这里请在使用时注意防止未来函数.

用户可以在 after_trading_end中调用get_price函数获取当日的开盘价、收盘价、成交额、成交量、最高价以及最低价等。

关于停牌: 因为此API可以获取多只股票的数据, 可能有的股票停牌有的没有, 为了保持时间轴的一致, 我们默认没有跳过停牌的日期, 停牌时使用停牌前的数据填充(请看[SecurityUnitData]的paused属性). 如想跳过, 请使用 skip_paused=True 参数, 同时只取一只股票的信息

参数

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

  • start_date: 字符串或者[datetime.datetime]/[datetime.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时, field只支持[‘open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘money’]这几个标准字段. 默认值是daily

  • fields: 字符串list, 选择要获取的行情数据字段, 默认是None(表示[‘open’, ‘close’, ‘high’, ‘low’, ‘volume’, ‘money’]这几个标准字段), 支持属性里面的所有基本属性.

  • skip_paused: 是否跳过停牌的时间, 如果不跳过, 停牌时会使用停牌前的数据填充(具体请看[SecurityUnitData]的paused属性), 但要注意:
    • 默认为 False
    • 当 skip_paused 是 True 时, 只能取一只股票的信息
  • fq: 复权选项:
    • 'pre': 前复权(根据’use_real_price’选项不同含义会有所不同, 参见set_option), 默认是前复权
    • None: 不复权, 返回实际价格
    • 'post': 后复权

返回

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

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

open close high low volume money
2015-01-05 00:00:00 3566.09 3641.54 3669.04 3551.51 451198098.0 519849817448.0
2015-01-06 00:00:00 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 00:00:00 3566.09 13.21
2015-01-06 00:00:00 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-02-01', frequency='daily', fields=['open', 'close']) # 获得000001.XSHG的2015年01月的日线数据, 只获取open+close字段
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年每天的开盘价数据
获取股票的资金流向数据

获取一只或者多只股票在一个时间段内的资金流向数据

调用方法

get_money_flow(security_list, start_date, end_date, fields=None)

参数

  • security_list: 一只股票代码或者一个股票代码的 list

  • start_date: 开始日期, 一个字符串或者 [datetime.datetime]/[datetime.date] 对象

  • end_date: 结束日期, 一个字符串或者 [datetime.date]/[datetime.datetime] 对象

  • fields: 字段名或者 list, 可选. 默认为 None, 表示取全部字段, 各字段含义如下:

字段名 含义 备注
date 日期
sec_code 股票代码
change_pct 涨跌幅(%)
net_amount_main 主力净额(万) 主力净额 = 超大单净额 + 大单净额
net_pct_main 主力净占比(%) 主力净占比 = 主力净额 / 成交额
net_amount_xl 超大单净额(万) 超大单:大于等于50万股或者100万元的成交单
net_pct_xl 超大单净占比(%) 超大单净占比 = 超大单净额 / 成交额
net_amount_l 大单净额(万) 大单:大于等于10万股或则20万元且小于50万股或者100万元的成交单
net_pct_l 大单净占比(%) 大单净占比 = 大单净额 / 成交额
net_amount_m 中单净额(万) 中单:大于等于2万股或者4万元且小于10万股或则20万元的成交单
net_pct_m 中单净占比(%) 中单净占比 = 中单净额 / 成交额
net_amount_s 小单净额(万) 小单:小于2万股或者4万元的成交单
net_pct_s 小单净占比(%) 小单净占比 = 小单净额 / 成交额

返回

返回一个 [pandas.DataFrame] 对象,默认的列索引为取得的全部字段. 如果给定了 fields 参数, 则列索引与给定的 fields 对应.

示例

# 获取一只股票在一个时间段内的资金流量数据
get_money_flow('000001.XSHE', '2016-02-01', '2016-02-04')
get_money_flow('000001.XSHE', '2015-10-01', '2015-12-30', field="change_pct")
get_money_flow(['000001.XSHE'], '2010-01-01', '2010-01-30', ["date", "sec_code", "change_pct", "net_amount_main", "net_pct_l", "net_amount_m"])

# 获取多只股票在一个时间段内的资金流向数据
get_money_flow(['000001.XSHE', '000040.XSHE', '000099.XSHE'], '2010-01-01', '2010-01-30')
# 获取多只股票在某一天的资金流向数据
get_money_flow(['000001.XSHE', '000040.XSHE', '000099.XSHE'], '2016-04-01', '2016-04-01')

当前单位时间的行情数据

获取当前时刻股票的如下属性:

  • high_limit # 涨停价
  • low_limit # 跌停价
  • paused # 是否停止或者暂停了交易, 当停牌, 未上市或者退市后返回 True
  • is_st # 是否是ST(包括ST, *ST)
  • day_open # 当天开盘价, 分钟回测时可用, 天回测时, 由于我们是在集合竞价下单, 并不知道开盘价, 请不要使用.
  • name # 股票现在的名称, 可以用这个来判断股票当天是否是ST, *ST, 是否快要退市
  • industry_code # 股票现在所属行业代码, 参见 get_industry_stocks

调用方法

get_current_data(security_list=None)

回测时, 通过API获取的是一个单位时间(天/分钟)的数据, 而有些数据, 我们在这个单位时间是知道的, 比如涨跌停价,是否停牌,当天的开盘价(分钟回测时). 所以可以使用这个API用来获取这些数据.

参数

  • security_list: 股票代码列表, 默认是None, 代表当前universe中的股票.

返回值
一个dict, key是股票代码, value是拥有如下属性的对象

  • high_limit # 涨停价
  • low_limit # 跌停价
  • paused # 是否停止或者暂停了交易, 当停牌, 未上市或者退市后返回 True
  • is_st # 是否是ST(包括ST, *ST)
  • day_open # 当天开盘价, 分钟回测时可用, 天回测时, 由于我们是在集合竞价下单, 并不知道开盘价, 请不要使用.
  • name # 股票现在的名称, 可以用这个来判断股票当天是否是ST, *ST, 是否快要退市
  • industry_code # 股票现在所属行业代码, 参见 get_industry_stocks

注意

  • 为了加速, 返回的 dict 里面的数据是按需获取的, dict 初始是空的, 当你使用 current_data[security] 时(假设 current_data 是返回的 dict), 该 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_fundamentals(query_object, date=None, statDate=None)

date和statDate参数只能传入一个:

  • 传入date时, 查询指定日期date所能看到的最近(对市值表来说, 最近一天, 对其他表来说, 最近一个季度)的数据, 我们会查找上市公司在这个日期之前(包括此日期)发布的数据, 不会有未来函数.
  • 传入statDate时, 查询statDate指定的季度或者年份的财务数据. 注意:

    1. 由于公司发布财报不及时, 一般是看不到当季度或年份的财务报表的, 回测中使用这个数据可能会有未来函数, 请注意规避.
    2. 由于估值表每天更新, 当按季度或者年份查询时, 返回季度或者年份最后一天的数据
    3. 对于年报数据, 我们目前只有现金流表和利润表, 当查询其他表时, 会返回该年份最后一个季报的数据

当date和statDate都不传入时, 相当于使用date参数, date的默认值下面会描述.

参数

  • query_object: 一个sqlalchemy.orm.query.Query对象(http://docs.sqlalchemy.org/en/rel_1_0/orm/query.html), 可以通过全局的query函数获取Query对象
  • date: 查询日期, 一个字符串(格式类似’2015-10-15’)或者[datetime.date]/[datetime.datetime]对象, 可以是None, 使用默认日期. 这个默认日期在回测和研究模块上有点差别:

    1. 回测模块: 默认值会随着回测日期变化而变化, 等于context.current_dt的前一天(实际生活中我们只能看到前一天的财报和市值数据, 所以要用前一天)
    2. 研究模块: 使用平台财务数据的最新日期, 一般是昨天.
      如果传入的date不是交易日, 则使用这个日期之前的最近的一个交易日
  • statDate: 财报统计的季度或者年份, 一个字符串, 有两种格式:

    1. 季度: 格式是: 年 + ‘q’ + 季度序号, 例如: ‘2015q1’, ‘2013q4’.
    2. 年份: 格式就是年份的数字, 例如: ‘2015’, ‘2016’.

返回
返回一个[pandas.DataFrame], 每一行对应数据库返回的每一行(可能是几个表的联合查询结果的一行), 列索引是你查询的所有字段
注意:

  1. 为了防止返回数据量过大, 我们每次最多返回10000行
  2. 当相关股票上市前、退市后,财务数据返回各字段为空

示例

# 查询'000001.XSHE'的所有市值数据, 时间是2015-10-15
q = query(
    valuation
).filter(
    valuation.code == '000001.XSHE'
)
df = get_fundamentals(q, '2015-10-15')
# 打印出总市值
log.info(df['market_cap'][0])
# 获取多只股票在某一日期的市值, 利润
df = get_fundamentals(query(
        valuation, income
    ).filter(
        # 这里不能使用 in 操作, 要使用in_()函数
        valuation.code.in_(['000001.XSHE', '600000.XSHG'])
    ), date='2015-10-15')
# 选出所有的总市值大于1000亿元, 市盈率小于10, 营业总收入大于200亿元的股票
df = get_fundamentals(query(
        valuation.code, valuation.market_cap, valuation.pe_ratio, income.total_operating_revenue
    ).filter(
        valuation.market_cap > 1000,
        valuation.pe_ratio < 10,
        income.total_operating_revenue > 2e10
    ).order_by(
        # 按市值降序排列
        valuation.market_cap.desc()
    ).limit(
        # 最多返回100个
        100
    ), date='2015-10-15')
# 使用 or_ 函数: 查询总市值大于1000亿元 **或者** 市盈率小于10的股票
from sqlalchemy.sql.expression import or_
get_fundamentals(query(
        valuation.code
    ).filter(
        or_(
            valuation.market_cap < 1000,
            valuation.pe_ratio > 10
        )
    ))
# 查询平安银行2014年四个季度的季报, 放到数组中
q = query(
        income.statDate,
        income.code,
        income.basic_eps,
        balance.cash_equivalents,
        cash_flow.goods_sale_and_service_render_cash
    ).filter(
        income.code == '000001.XSHE',
    )

rets = [get_fundamentals(q, statDate='2014q'+str(i)) for i in range(1, 5)]
# 查询平安银行2014年的年报
q = query(
        income.statDate,
        income.code,
        income.basic_eps,
        cash_flow.goods_sale_and_service_render_cash
    ).filter(
        income.code == '000001.XSHE',
    )

ret = get_fundamentals(q, statDate='2014')

账户及持仓信息

获取账户当前的资金及持有的股票的信息.

账户当前的资金, 股票信息(Portfolio)

  • cash 当前持有的现金
  • positions 当前持有的股票(包含不可卖出的股票), 一个dict, key是股票代码, value是Position对象
  • starting_cash 初始资金
  • portfolio_value 当前持有的股票和现金的总价值
  • positions_value 当前持有的股票的总价值
  • capital_used 已使用的现金
  • returns 当前的收益比例, 相对于初始资金

持有的某个股票的信息(Position)

  • total_amount 总持有股票数量, 包含可卖出和不可卖出部分
  • sellable_amount 可卖出数量
  • price 当前价格
  • avg_cost 每只股票的持仓成本, 买入股票的加权平均价, 计算方法是:
    (buy_volume1 * buy_price1 + buy_volume2 * buy_price2 + …) / (buy_volume1 + buy_volume2 + …)
    每次买入后会调整avg_cost, 卖出时avg_cost不变. 这个值也会被用来计算浮动盈亏.
  • security 股票代码

调用方法

context.portfolio.cash #获取账户现有可用的资金
context.portfolio.position #获取持有的可卖出的股票
context.portfolio.position[stock].avg_cost #获取stock的持仓成本成本