1. 程式人生 > >量化交易入門筆記-資料獲取函式 二

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

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

注:本文章為個人學習筆記,參考了一些書籍與官方教程,不作任何商業用途!