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

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

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

你可能感兴趣的:(量化交易入门笔记)