量化交易入門筆記-資料獲取函式 二

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'])
當日動態市盈率是: 08.53 Name: pe_ratio, dtype: float64 當日換手率是: 00.6934 Name: turnover_ratio, dtype: float64 當日市銷率是: 01.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
[statDatecodebasic_epscash_equivalents\ 02016-03-31000001.XSHE0.432.961440e+11 goods_sale_and_service_render_cash 0NaN, statDatecodebasic_epscash_equivalents\ 02016-06-30000001.XSHE0.292.781780e+11 goods_sale_and_service_render_cash 0NaN, statDatecodebasic_epscash_equivalents\ 02016-09-30000001.XSHE0.373.039360e+11 goods_sale_and_service_render_cash 0NaN, statDatecodebasic_epscash_equivalents\ 02016-12-31000001.XSHE0.233.112580e+11 goods_sale_and_service_render_cash 0NaN]
各財務資料的意義:
- 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 |
注:本文章為個人學習筆記,參考了一些書籍與官方教程,不作任何商業用途!