gt_fundamentals() 函数
该函数可查询一只股票或多只股票的财务数据,其语法如下:
get_fundamentals(query_object, date=None, statDate=None)
参数解析:
query_object : 这是一个 sqlalchemy.orm.query.Query 对象,可以通过全局的 query 函数获取 Query 对象
-
date : 表示查询日期,可以是一个字符串或者datetime.date/datetime.datetime对象。可以是None,使用默认日期,这个默认日期在回测和研究模块上有点差别:
- 回测模块:默认值会随着回测日期变化而变化,等于 context.current_dt 的前一天(实际生活中我们只能看到前一天的财报和市值数据,所以要用前一天)
- 研究模块:使用平台财务数据的最新日期,一般是昨天
需要注意的是,如果传入的date不是交易日,则使用这个日期之前的最近的一个交易日
-
statDate : 是一个字符串,表示财报统计的季度或者年份,有两种格式,具体如下:
- 季度:格式是年+“q”+季度序号,例如:“2018q1”,“2017q4“
- 年份:格式就是年份的数字,如”2017“,”2018“
date 和 statDate 参数只能传入一个。传入date时,查询指定日期 date 收盘后所能看到最近的数据;传入 statDate 时,查询 statDate 指定的季度或者年份的财务数据。当两个参数都没有传入成功时,相当于使用 date 参数,即使用默认日期
为了防止返回数据量过大,每次最多返回10000行。另外,当相关股票上市前、退市后,财务数据返回各字段为空
实例代码:
import pandas as pd
# query表示查询
# filter表示条件筛选
# valuation是内置市值数据对象(这里表示查询valuation下所有的属性)
# 最终返回一个Query对象
myq = query(valuation).filter(valuation.code=='000001.XSHE')
df = get_fundamentals(myq,'2018-4-12')
df
id | code | pe_ratio | turnover_ratio | pb_ratio | ps_ratio | pcf_ratio | capitalization | market_cap | circulating_cap | circulating_market_cap | day | pe_ratio_lyr | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 16898314 | 000001.XSHE | 8.53 | 0.6934 | 0.9787 | 1.8698 | -2.0521 | 1717041.125 | 1978.0314 | 1691798.375 | 1948.9517 | 2018-04-12 | 8.53 |
valuation市值数据对象中的字段有:
- id: 每行数据的索引,不重复
- code: 股票代码
- pr_ratio: 是股票的市盈率(PE,TTM),即动态市盈率。
- turnover_ratio: 是股票的换手率。
- pb_ratio: 是股票的市 净率(PB)
- ps_ratio: 是股票的市现率
- capitalization: 是股票的总股本(万股)
- market_cap: 是股票的流通股本(万股)
- circulating_market_cap: 是股票的流通市值(亿元)
- day: 是指查询股票账务数据的具体日期
- pe_ratio_lyr: 是股票的市盈率(PE)。以上一年度每股盈利计算的静态市盈率
示例:输出指定字段
import pandas as pd
# query表示查询
# filter表示条件筛选
# valuation是内置市值数据对象(这里表示查询valuation下所有的属性)
# 最终返回一个Query对象
myq = query(valuation).filter(valuation.code=='000001.XSHE')
df = get_fundamentals(myq,'2018-4-12')
print("当日动态市盈率是:", df['pe_ratio'])
print('当日换手率是:', df['turnover_ratio'])
print('当日市销率是:', df['ps_ratio'])
当日动态市盈率是: 0 8.53
Name: pe_ratio, dtype: float64
当日换手率是: 0 0.6934
Name: turnover_ratio, dtype: float64
当日市销率是: 0 1.8698
Name: ps_ratio, dtype: float64
示例:显示多只股票的财务数据
import pandas as pd
# query表示查询
# filter表示条件筛选
# valuation是内置市值数据对象( 这里表示查询valuation下所有的属性)
# 最终返回一个Query对象
myq = query(valuation).filter(valuation.code.in_(['000001.XSHE', '600000.XSHG', '000009.XSHE']))
df = get_fundamentals(myq,'2018-4-12')
df
id | code | pe_ratio | turnover_ratio | pb_ratio | ps_ratio | pcf_ratio | capitalization | market_cap | circulating_cap | circulating_market_cap | day | pe_ratio_lyr | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 16898314 | 000001.XSHE | 8.5300 | 0.6934 | 0.9787 | 1.8698 | -2.0521 | 1717041.125 | 1978.0314 | 1691798.3750 | 1948.9517 | 2018-04-12 | 8.530 |
1 | 16898321 | 000009.XSHE | 66.1183 | 0.8175 | 2.8934 | 1.8857 | 7.0958 | 214934.500 | 134.5490 | 212008.9062 | 132.7176 | 2018-04-12 | 57.651 |
2 | 16900412 | 600000.XSHG | 6.3748 | 0.0670 | 0.8743 | 2.0506 | -1.8573 | 2935208.000 | 3457.6750 | 2810376.5000 | 3310.6233 | 2018-04-12 | 6.375 |
示例:更多不同的财务数据条件筛选
import pandas as pd
df = get_fundamentals(query(
valuation
).filter(
valuation.market_cap > 1000, # 筛选市值大于1000的
valuation.pe_ratio < 10, # 筛选市盈率小于10的
).order_by(
valuation.market_cap.desc() # 按照市值倒序排列
).limit(
5 # 最多只显示5条数据
), date='2018-4-12')
df
id | code | pe_ratio | turnover_ratio | pb_ratio | ps_ratio | pcf_ratio | capitalization | market_cap | circulating_cap | circulating_market_cap | day | pe_ratio_lyr | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 16901309 | 601398.XSHG | 7.5755 | 0.0770 | 1.0615 | 2.9827 | 6.5474 | 35640624.0 | 21144.6426 | 26961222.00 | 16392.4219 | 2018-04-12 | 7.575 |
1 | 16901380 | 601939.XSHG | 7.9565 | 1.4751 | 1.1338 | 3.1007 | -69.3750 | 25001098.0 | 16366.5508 | 959365.75 | 739.6710 | 2018-04-12 | 7.957 |
2 | 16901293 | 601288.XSHG | 6.5645 | 0.1031 | 0.9407 | 2.3587 | 7.2988 | 32479412.0 | 12577.8789 | 29405530.00 | 11468.1562 | 2018-04-12 | 6.564 |
3 | 16901389 | 601988.XSHG | 6.6764 | 0.0825 | 0.8244 | 2.3818 | -19.0273 | 29438780.0 | 11065.7139 | 21076552.00 | 8240.9316 | 2018-04-12 | 6.676 |
4 | 16901297 | 601328.XSHG | 6.5778 | 0.1831 | 0.7557 | 2.3566 | -5.2804 | 7426272.5 | 4207.0605 | 3925086.50 | 2441.4038 | 2018-04-12 | 6.578 |
示例:显示某股票2016年第四季度的季报,并放到列表中显示
# query这里指定了要查询显示的字段
q = query(
# income为利润数据对象
income.statDate, # 统计日期
income.code, # 股票代码
income.basic_eps, # 基本每股收益
# balance为负债数据对象
balance.cash_equivalents, # 货币资金
# cash_flow为现金流数据对象
cash_flow.goods_sale_and_service_render_cash # 销售商品、提供劳务获得的现金
).filter(
income.code == '000001.XSHE'
)
rets = [get_fundamentals(q, statDate='2016q'+str(i)) for i in range(1, 5)]
rets
[ statDate code basic_eps cash_equivalents \
0 2016-03-31 000001.XSHE 0.43 2.961440e+11
goods_sale_and_service_render_cash
0 NaN ,
statDate code basic_eps cash_equivalents \
0 2016-06-30 000001.XSHE 0.29 2.781780e+11
goods_sale_and_service_render_cash
0 NaN ,
statDate code basic_eps cash_equivalents \
0 2016-09-30 000001.XSHE 0.37 3.039360e+11
goods_sale_and_service_render_cash
0 NaN ,
statDate code basic_eps cash_equivalents \
0 2016-12-31 000001.XSHE 0.23 3.112580e+11
goods_sale_and_service_render_cash
0 NaN ]
各财务数据的意义:
- statDate: 财报统计的季度的最后一天,例如 2016-03-31
- code: 股票代码
- basic_eps: 基本每股收益
- cash_equivalents: 货币资金
- good_sale_ane_service_render_cash: 销售商品、提供劳务收到的现金
get_fundamentals_continuously() 函数
get_fundamentals()
函数只能查询某一交易日的股票财务数信息,如果要查询多个交易日的股票财务数据信息,就要使用本函数;其语法如下:
get_fundamentls_continuously(query_object, end_date=None, count=None)
参数意义:
- query_object : 这是一个 sqlalchemy.orm.query.Query 对象,可以通过全局的 query 函数获取 Query 对象
- end_date: 查询日期
- count: 获取end_date之前 count 个日期的数据
本函数返回值是一个pandas.Panel
出于性能考虑,返回总条数不超过10000条的限制
示例:查询平安银行和浦发银行的财务信息
import pandas as pd
q = query(
valuation
).filter(
valuation.code.in_(
['000001.XSHE', '600000.XSHG']))
panel = get_fundamentals_continuously(q, end_date='2018-01-01', count=5)
panel.minor_xs('600000.XSHG')
id | code.1 | pe_ratio | turnover_ratio | pb_ratio | ps_ratio | pcf_ratio | capitalization | market_cap | circulating_cap | circulating_market_cap | day.1 | pe_ratio_lyr | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
day | |||||||||||||
2017-12-25 | 15990853 | 600000.XSHG | 6.8044 | 0.0687 | 0.9538 | 2.2447 | -1.9850 | 2935208 | 3695.4270 | 2810376.5 | 3538.2639 | 2017-12-25 | 6.9595 |
2017-12-26 | 16006159 | 600000.XSHG | 6.8315 | 0.0542 | 0.9576 | 2.2536 | -1.9929 | 2935208 | 3710.1030 | 2810376.5 | 3552.3159 | 2017-12-26 | 6.9871 |
2017-12-27 | 16018676 | 600000.XSHG | 6.8207 | 0.1165 | 0.9561 | 2.2500 | -1.9897 | 2935208 | 3704.2324 | 2810376.5 | 3546.6951 | 2017-12-27 | 6.9761 |
2017-12-28 | 16031214 | 600000.XSHG | 6.7774 | 0.0849 | 0.9500 | 2.2357 | -1.9771 | 2935208 | 3680.7510 | 2810376.5 | 3524.2119 | 2017-12-28 | 6.9319 |
2017-12-29 | 16043748 | 600000.XSHG | 6.8044 | 0.0582 | 0.9538 | 2.2447 | -1.9850 | 2935208 | 3695.4270 | 2810376.5 | 3538.2639 | 2017-12-29 | 6.9595 |
get_index_stocks() 函数
该函数可以获取一个指数给定日期的平台可交易的成分股列表;其语法如下:
get_index_stocks(index_symbol, date=None)
参数解析:
- date: 是一个时间字符串或者一个时间对象。None会采用默认值。如果是默认值,在回测模块中,会动态采用回测日期,相当于context.current_dt;如果是在研究模块中,默认时间会采用当前时间
- index_symbol: 是指指数代码;代码可以在看盘软件上查询或者在相关行情网站查询,例如:000001.XSHG 上证指数、 000002.XSHG A股指数、 000003.XSHG B股指数
代码实例:获得沪深300指数的所有股票代码
stocks = get_index_stocks('000300.XSHG')
stocks
['000001.XSHE',
'000002.XSHE',
'000060.XSHE',
'000063.XSHE',
......,
'603833.XSHG',
'603858.XSHG',
'603993.XSHG']
get_industry_stocks()函数
该函数可以获取在给定日期一个行业的所有股票代码;其语法如下:
get_industry_stocks(industry_code, date=None)
参数解析:
- date: 同上
- industry_code: 行业代码;例如:A01 农业、A02 林业、 C27 医药制造业
代码示例:获得汽车制造业指数的所有股票代码
stocks = get_industry_stocks('C36')
stocks
['000030.XSHE',
'000338.XSHE',
'000549.XSHE',
'000550.XSHE',
......,
'603809.XSHG',
'603922.XSHG',
'603926.XSHG',
'603997.XSHG']
get_concept_stocks() 函数
该函数可以获取在给定日期一个概念板块的所有股票;其语法如下:
get_concept_stocks(conpect_code, date=None)
参数解析:
- date: 同上
- conpect_code: 概念板块代码;例如:GN028 智能电网、 GN030 物联网
代码示例:获得一带一中概念板块的所有股票代码:
stocks = get_concept_stocks('GN181')
stocks
['000018.XSHE',
'000022.XSHE',
'000063.XSHE',
'000065.XSHE',
......,
'601857.XSHG',
'601872.XSHG',
'601880.XSHG',
'601919.XSHG',
'601989.XSHG',
'603169.XSHG']
get_all_secruities()函数
本函数可以获取平台支持的所有股票、基金、指数、期货信息;其语法如下:
get_all_securities(types=[], date=None)
参数解析:
-
types: 表示列表类型,用来过滤 securities 的类型,列表元素及意义如下:
- stock: 表示股票类型,即显示所有股票信息
- fund: 表示基金类型,即显示所有基金信息
- index: 表示指数类型,即显示所有指数信息
- futures: 表示期货类型,即显示所有期货合约信息
- eft: 表示 ETF基金,即显示所有 ETF 基金信息
- lof: 表示 lof 基金,即显示所有 lof 基金信息
- fja: 表示分级A,即显示所有分级基金A的信息
- fjb: 表示分级B,即显示所有分级基金B的信息
- open_fund: 表示开放式基金,即显示所有开放式基金的信息
- bond_fund: 表示股票型基金,即显示所有股票型基金的信息
- QDII_fund: 表示 QDII 基金,即显示所有 QDII 基金的信息
- money_market_fund: 表示货币基金,即显示所有货币基金的信息
- mixture_fund: 表示混合型基金,即显示所有混合型基金的信息
需要注意的是,types为空时返回所有股票信息,不包括基金、指数和期货信息
date:是一个时间字符串或一个时间对象,用于获取某日期还在上市的股票信息,默认值是None,表示获取所有日期的股票信息
本函数返回的类型是 pandas.DataFrame 类型
代码实例:获取所有的股票信息
# 下面两行代码显示的结果是一样的
df = get_all_securities(['stock'])
stocks = get_all_securities()
stocks
display_name | name | start_date | end_date | type | ||
---|---|---|---|---|---|---|
000001.XSHE | 平安银行 | PAYH | 1991-04-03 | 2200-01-01 | stock | |
000002.XSHE | 万科A | WKA | 1991-01-29 | 2200-01-01 | stock | |
000004.XSHE | 国农科技 | GNKJ | 1990-12-01 | 2200-01-01 | stock | |
... | ... | ... | ... | ... | ... | |
603996.XSHG | 中新科技 | ZXKJ | 2015-12-22 | 2200-01-01 | stock | |
603997.XSHG | 继峰股份 | JFGF | 2015-03-02 | 2200-01-01 | stock | |
603998.XSHG | 方盛制药 | FSZY | 2014-12-05 | 2200-01-01 | stock | |
603999.XSHG | 读者传媒 | DZCM | 2015-12-10 | 2200-01-01 | stock |
3551 rows × 5 columns
列名字段解析:
- display_name : 上市公司的股票的名称
- name: 上市公司股票名称的缩写简称
- start_date: 上市公司的上市日期
- end_date: 上市公司的退市日期
- type: 类型
代码示例:显示所有分级A与分级B的信息
df = get_all_securities(['stock'])
stocks = get_all_securities()
stocks
display_name | name | start_date | end_date | type | |
---|---|---|---|---|---|
150008.XSHE | 瑞和小康 | RHXK | 2009-11-19 | 2200-01-01 | fja |
150009.XSHE | 瑞和远见 | RHYJ | 2009-11-19 | 2200-01-01 | fjb |
150012.XSHE | 中证100A | ZZ100A | 2010-06-18 | 2200-01-01 | fja |
150013.XSHE | 中证100B | ZZ100B | 2010-06-18 | 2200-01-01 | fjb |
150016.XSHE | 合润A | HRA | 2010-05-31 | 2200-01-01 | fja |
... | ... | ... | ... | ... | ... |
502054.XSHG | 券商A | QSA | 2015-08-24 | 2200-01-01 | fja |
502055.XSHG | 券商B | QSB | 2015-08-24 | 2200-01-01 | fjb |
502057.XSHG | 医疗A | YLA | 2015-07-31 | 2200-01-01 | fja |
502058.XSHG | 医疗B | YLB | 2015-07-31 | 2200-01-01 | fjb |
254 rows × 5 columns
示例代码:显示2017-10-10日还在上市的eft和lof基金信息
df = get_all_securities(['etf', 'lof'], '2017-10-10')
df
display_name | name | start_date | end_date | type | |
---|---|---|---|---|---|
159901.XSHE | 深100ETF | S100ETF | 2006-04-24 | 2200-01-01 | etf |
159902.XSHE | 中小板 | ZXB | 2006-09-05 | 2200-01-01 | etf |
159903.XSHE | 深成ETF | SCETF | 2010-02-02 | 2200-01-01 | etf |
159905.XSHE | 深红利 | SHL | 2011-01-11 | 2200-01-01 | etf |
159906.XSHE | 深成长 | SCZ | 2011-02-23 | 2200-01-01 | etf |
159907.XSHE | 中小300 | ZX300 | 2011-08-10 | 2200-01-01 | etf |
159929.XSHE | 医药ETF | YYETF | 2013-09-16 | 2200-01-01 | etf |
159930.XSHE | 能源ETF | NYETF | 2013-09-16 | 2200-01-01 | etf |
159931.XSHE | 金融ETF | JRETF | 2013-09-16 | 2200-01-01 | etf |
159932.XSHE | 500深ETF | 500SETF | 2013-10-21 | 2200-01-01 | etf |
159933.XSHE | 金地ETF | JDETF | 2013-10-16 | 2200-01-01 | etf |
... | ... | ... | ... | ... | ... |
513100.XSHG | 纳指ETF | NZETF | 2013-05-15 | 2200-01-01 | etf |
513500.XSHG | 标普500 | BP500 | 2014-01-16 | 2200-01-01 | etf |
513600.XSHG | 恒指ETF | HZETF | 2015-01-26 | 2200-01-01 | etf |
513660.XSHG | 恒生通 | HST | 2015-01-26 | 2200-01-01 | etf |
518800.XSHG | 黄金基金 | GTHJ | 2013-07-29 | 2200-01-01 | etf |
518880.XSHG | 黄金ETF | HJETF | 2013-07-29 | 2200-01-01 | etf |
396 rows × 5 columns
get_security_info()函数
本函数可以获取一只股票(基金或指数)的信息,其语法如下:
get_security_info(code)
参数解析:
- code: 是指证券代码。返回值是 pandas.DataFrame 类型,返回值的属性与
get_all_securities()
函数基本上是一样的;但返回值中多一个parent属性,是指分级基金的线基金的代码
代码示例:
print('代码502050的证券名:', get_security_info('502050.XSHG').display_name)
print('代码502050的证券缩写简称:', get_security_info('502050.XSHG').name)
print('代码502050的证券上市日期:', get_security_info('502050.XSHG').start_date)
print('代码502050的证券退市日期:', get_security_info('502050.XSHG').end_date)
print('代码502050的证券类型:', get_security_info('502050.XSHG').type)
print('代码502050的证券分级基金的母基金:', get_security_info('502050.XSHG').parent)
代码502050的证券名: 上证50B
代码502050的证券缩写简称: SZ50B
代码502050的证券上市日期: 2015-04-27
代码502050的证券退市日期: 2200-01-01
代码502050的证券类型: fjb
代码502050的证券分级基金的母基金: 502048.XSHG
get_billboard_list()函数
本函数可以获取指定日期区间内的龙虎榜数据,语法如下:
get_billboard_list(stock_list, start_date, end_date, count)
参数解析:
- stock_list: 一个股票代码的list,当值为None时,返回指定日期的所有股票
- start_date: 开始日期
- end_date: 结束日期
- count: 交易日数量,可以与end_date同时使用,表示获取 end_date 前 count 个交易日的数据
返回类型: pandas.DataFrame
代码示例:
df = get_billboard_list(stock_list=None, end_date='2018-04-09', count=1)
df
code | day | direction | rank | abnormal_code | abnormal_name | sales_depart_name | buy_value | buy_rate | sell_value | sell_rate | total_value | net_value | amount | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 603648.XSHG | 2018-04-09 | SELL | 1 | 106006 | 连续三个交易日内收盘价格涨幅偏离值累计达到20%的证券 | 东方证券股份有限公司桂林中山中路证券营业部 | NaN | NaN | 2.235940e+07 | 1.2155 | 2.235940e+07 | -2.235940e+07 | 1839596193 |
1 | 603648.XSHG | 2018-04-09 | ALL | 0 | 106006 | 连续三个交易日内收盘价格涨幅偏离值累计达到20%的证券 | None | 9.009827e+07 | 4.8977 | 8.433712e+07 | 4.5845 | 1.744354e+08 | 5.761157e+06 | 1839596193 |
2 | 603648.XSHG | 2018-04-09 | BUY | 5 | 106006 | 连续三个交易日内收盘价格涨幅偏离值累计达到20%的证券 | 华鑫证券有限责任公司南昌红谷中大道证券营业部 | 1.502713e+07 | 0.8169 | NaN | NaN | 1.502713e+07 | 1.502713e+07 | 1839596193 |
3 | 603648.XSHG | 2018-04-09 | BUY | 4 | 106006 | 连续三个交易日内收盘价格涨幅偏离值累计达到20%的证券 | 招商证券股份有限公司深圳后海证券营业部 | 1.626907e+07 | 0.8844 | NaN | NaN | 1.626907e+07 | 1.626907e+07 | 1839596193 |
869 rows × 14 columns
各字段含义如下:
- code: 股票代码
- day: 日期
- direction: All 表示 ”汇总“,Sell表示”卖“,Buy表示”买“
- abnormal_code: 异常波动类型
- abnormal_name: 异常波动名称
- sales_depart_name: 营业部名称
- rank: 0表示汇总, 1~5表示买一到买五,6~10表示卖一到卖五
- buy_value: 买入金额
- buy_rate: 买入金额占比(买入金额/市场总成交额度)
- sell_value: 卖出金额
- sell_rate: 卖出金额占比(卖出金额/市场总成交额)
- net_value: 净额(买入金额-卖出金额)
- amount: 市场总成交额
get_locked_shares()函数
本函数可以获取指定日期区间内的限售解禁数据,其语法如下:
get_locked_shares(stock_list, start_date, end_date, forward_count)
参数解析:各项参数与get_billbord_list
差不多
这里只说一下返回信息中字段的意义
- day: 解禁日期
- code: 股票代码
- num: 解禁股数
- rate1: 解禁股数/总股本
- rate2: 解禁股数/总流通股本
代码示例:
df = get_locked_shares(stock_list=['000001.XSHE','000002.XSHG','000009.XSHE'], start_date='2016-4-16',forward_count=1200)
df
day | code | num | rate1 | rate2 | |
---|---|---|---|---|---|
0 | 2016-05-23 | 000001.XSHE | 388595743 | 0.0272 | 0.0329 |
1 | 2016-07-08 | 000009.XSHE | 15716892 | 0.0096 | 0.0098 |
2 | 2017-01-09 | 000001.XSHE | 2286809264 | 0.1332 | 0.1563 |
3 | 2018-05-21 | 000001.XSHE | 252247983 | 0.0147 | 0.0149 |
注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!