本文是量化交易零基礎入門教程中的一篇,點擊藍字鏈接可查看該系列詳情。
摘要
- 聚寬數據
- 獲取指數成分股
- 獲取股票行情數據
- 獲取股票財務數據
- 自測與自學
聚寬數據
- 在聚寬數據這個頁面可以看到聚寬平臺集成好的各大類數據,如下圖,點擊可以查看詳情與用法。
- 但實際上可能有些數據要在 API 文檔裏才比較容易能找到,比如龍虎榜數據等。這時用 ctrl+f 進行網頁搜索可以快速搜索需要的數據。
- 接下來會介紹幾種常用數據的取用方法,這些取用方法比較典型,掌握後能覆蓋基本的數據需求以及較容易的學會使用其他數據。
獲取指數成分股
- 以免有人不知道指數成分股是什麼,簡單說明下。爲了衡量股市中某一大類股票整體的漲跌情況,通常會用這一類的股票加權平均編制出一個指數,而這些股票則叫做該指數的成分股,一般指數的成分股選取會變動。比如上證指數是用所有上交所的股票編制而成,可以衡量上交所股票整體的漲跌情況,有的股票退市了也就會被剔除成分股。比較常見的指數有上證指數、深證綜指、創業板指、滬深 300 指數、中證 500 指數、上證 50 指數等。可以在數據 - 指數數據 - 指數列表中找到聚寬支持的指數及其指數代碼。同樣要善用 ctrl+f 進行搜索。
- 獲取指數成分股需要用到的 API 爲 get_index_stocks
-
之前講過怎麼看 API 文檔以及函數參數的含義,現在應該能直接看說明使用了。補充一個更詳細點的例子應該就會用了。
# 獲取20180301時,上證50指數(000016.XSHG)成分股 t=get_index_stocks("000016.XSHG","2018-03-01") print(t[0]) print(t) # 打印日誌如下。股票代碼在list中被打印出來前面會帶有的u代表是對字符串進行unicode編碼(略複雜,不懂沒關係),只是顯示效果,單獨打印t[0]時就沒有u。 # 600000.XSHG # [u'600000.XSHG', u'600016.XSHG', u'600019.XSHG', u'600028.XSHG', u'600029.XSHG', u'600030.XSHG', u'600036.XSHG', u'600048.XSHG', u'600050.XSHG', u'600104.XSHG', u'600111.XSHG', u'600309.XSHG', u'600340.XSHG', u'600518.XSHG', u'600519.XSHG', u'600547.XSHG', u'600606.XSHG', u'600837.XSHG', u'600887.XSHG', u'600919.XSHG', u'600958.XSHG', u'600999.XSHG', u'601006.XSHG', u'601088.XSHG', u'601166.XSHG', u'601169.XSHG', u'601186.XSHG', u'601211.XSHG', u'601229.XSHG', u'601288.XSHG', u'601318.XSHG', u'601328.XSHG', u'601336.XSHG', u'601390.XSHG', u'601398.XSHG', u'601601.XSHG', u'601628.XSHG', u'601668.XSHG', u'601669.XSHG', u'601688.XSHG', u'601766.XSHG', u'601800.XSHG', u'601818.XSHG', u'601857.XSHG', u'601878.XSHG', u'601881.XSHG', u'601985.XSHG', u'601988.XSHG', u'601989.XSHG', u'603993.XSHG']
獲取股票行情數據
- 此處的股票行情數據指 SecurityUnitData 裏面的所有基本屬性,以下列舉類常用字段,詳情請看文檔。
- open: 時間段開始時價格
- close: 時間段結束時價格
- low: 最低價
- high: 最高價
- volume: 成交的股票數量
- money: 成交的金額
- factor: 前復權因子
- avg: 這段時間的平均價
- pre_close: 前一個單位時間結束時的價格
- paused: 這隻股票是否停牌,是則爲 1,否則爲 0
-
history
- API 文檔:history
- 可以同時獲得多個股票的數據,但只能獲得相同的一個數據字段。如獲得 平安銀行,建設銀行,農業銀行這 3 只股票,前 3 天的交易額。
- 默認不跳過不交易日期,由 skip_paused 參數控制。
- df 參數控制返回結果的數據類型,默認是 True 代表 dataframe 類型,稍後我們會講到,當 df 爲 False 時就爲之前講過的 dict 類型。
- fq 參數控制復權方式,往往可以不管它直接用默認的前復權即可。復權的含義不難,解釋略麻煩,建議自行搜索學習下。
-
接下來介紹的 API 還會有 skip_paused、df、fq 參數,就不再提了。這三個參數新手可以以後慢慢了解,現在不管也沒關係,如果不想用 dataframe,會把 df 參數調成 False (或 0) 就行。
# 例子 df=True,返回dataframe類型 w=history(count=3, field='money', security_list=['000001.XSHE','000002.XSHE']) print(w) # 結果如下: # 000001.XSHE 000002.XSHE # 2016-08-29 5.322954e+08 1.796321e+09 # 2016-08-30 5.618541e+08 2.072873e+09 # 2016-08-31 4.638758e+08 5.748581e+09 # 例子 df=False,返回dict類型 w=history(count=3, field='money', security_list=['000001.XSHE','000002.XSHE'],df=False) print(w) # 結果如下: # {'000001.XSHE': array([ 5.32295362e+08, 5.61854066e+08, 4.63875763e+08]), '000002.XSHE': array([ 1.79632055e+09, 2.07287325e+09, 5.74858107e+09])}
- API 文檔:history
-
attribute_history
- API 文檔:attribute_history
- 只能獲取單獨一個股票的數據,但可以同時獲得多個字段的數據。如獲得 平安銀行這一隻股票,前 3 天的交易額,交易量,最高價,最低價等。
-
默認跳過不交易日期,由 skip_paused 參數控制。
# 例子 w=attribute_history(security='000001.XSHE',count=3, fields=['money','high']) print(w) # 結果如下: # money high # 2016-08-29 5.322954e+08 9.31 # 2016-08-30 5.618541e+08 9.33 # 2016-08-31 4.638758e+08 9.36
- API 文檔:attribute_history
-
Pandas.DataFrame
-
返回的財務數據是 DataFrame 類型,這是一種二維表結構的功能強大的數據類型,常用於數據處理與分析。我們以剛剛的例子介紹下 dataframe 最常用的獲取數據的方法。
# 一個dataframe類型的例子 w=attribute_history(security='000001.XSHE',count=3, fields=['money','high','open']) print(w) # 結果如下: # money high open # 2016-08-30 5.618541e+08 9.33 9.29 # 2016-08-31 4.638758e+08 9.36 9.32 # 2016-09-01 4.548486e+08 9.38 9.35
-
dataframe 是一個二維表,包括 index(行標籤、索引)、columns(列標籤)、values(值)三個部分。取用方法如下,注意三個部分的數據類型不是固定的,因此功能很靈活但也更難使用。
# 獲取index print(w.index) # 結果如下,是datatimeindex類型,很特殊,不常用,建議新手迴避。 # DatetimeIndex(['2016-08-30', '2016-08-31', '2016-09-01'], dtype='datetime64[ns]', freq=None, tz=None) # 獲取columns print(w.columns) # 結果如下,是index類型 # Index([u'money', u'high', u'open'], dtype='object') # 可以用list()將其轉成list print(list(w.columns)) # 結果如下 # ['money', 'high', 'open'] # 獲取values print(w.values) # 結果如下,是一個嵌套的list # [[ 5.61854066e+08 9.33000000e+00 9.29000000e+00] # [ 4.63875763e+08 9.36000000e+00 9.32000000e+00] # [ 4.54848634e+08 9.38000000e+00 9.35000000e+00]]
-
選擇 dataframe 某幾列
# 按標籤獲取某幾列.loc[:,[列標籤名,...]] print(w.loc[:,['open','high']]) # 結果如下 # open high # 2016-08-29 9.28 9.31 # 2016-08-30 9.29 9.33 # 2016-08-31 9.32 9.36 # 按位置獲取某幾列.iloc[:,[位置,...]],位置的含義是第幾個,從0開始。下文同。 print(w.iloc[:,[0,2]]) # 結果如下 # money open # 2016-08-29 5.322954e+08 9.28 # 2016-08-30 5.618541e+08 9.29 # 2016-08-31 4.638758e+08 9.32 # : 即冒號,可以代表全部,iloc或loc都可以。 print(w.iloc[:,:]) # 結果如下 # money high open # 2016-08-29 5.322954e+08 9.31 9.28 # 2016-08-30 5.618541e+08 9.33 9.29 # 2016-08-31 4.638758e+08 9.36 9.32 # 選擇後的數據依然是dataframe類型,用.values可以獲取數據。對後文的行情況也成立。 print(w.iloc[:,[0,2]].values) # 結果如下,是個list # [[ 5.61854066e+08 9.29000000e+00] # [ 4.63875763e+08 9.32000000e+00] # [ 4.54848634e+08 9.35000000e+00]]
-
選擇 dataframe 某幾行
# 按標籤獲取某幾行.loc[[行標籤名,...],:] print(w.loc[['2016-08-29','2016-08-31'],:]) # 此處這樣寫會報錯,原因是當前的行標籤類型是DatetimeIndex,不是字符串,所以使用標籤名時要注意數據類型。而時間類型的數據處理往往非常麻煩,因此行或列標籤名是日期情況下建議新手迴避,改使用位置獲取。 # 按位置獲取某幾行.iloc[[位置,...],:] print(w.iloc[[0,2],:]) # 結果如下 # money high open # 2016-08-29 5.322954e+08 9.31 9.28 # 2016-08-31 4.638758e+08 9.36 9.32 # : 即冒號,行情況下依然可以代表全部 print(w.loc[:,:]) # 結果如下 # money high open # 2016-08-29 5.322954e+08 9.31 9.28 # 2016-08-30 5.618541e+08 9.33 9.29 # 2016-08-31 4.638758e+08 9.36 9.32
-
dataframe 行列轉置
# 行列轉置的意思就是按對角線行列反轉,方法是.T print(w.T) # 結果如下 # 2016-08-29 2016-08-30 2016-08-31 # money 5.322954e+08 5.618541e+08 4.638758e+08 # high 9.310000e+00 9.330000e+00 9.360000e+00 # open 9.280000e+00 9.290000e+00 9.320000e+00
- 回過頭來解釋下 pandas 的含義,pandas 是一個模塊或者叫庫,可以讓我們直接利用其中包含的已經設計好的函數或數據類型,加快我們的工作效率。pandas 主要功能是數據處理與分析,其中 dataframe 就是屬於 pandas 的,是原生的 python 語言沒有的。隨着深入的學習,你會遇到其他的功能模塊,一般來說要使用一個模塊是要用一行代碼加載導入的,但 pandas 聚寬系統已經自動加載了,不必額外寫代碼導入了。
-
獲取股票財務數據
-
股票財務數據這裏是指發股票的公司發佈的財務報表中的數據。可以在聚寬數據 - 股票財務數據查看數據詳情。
-
財務報表簡稱財報,是用來向股東彙報企業經營情況的,上市公司必須按季度公佈財報,一年有四季所以財報依發佈次序一季報、半年報(也稱中報)、三季報、年報,而具體的發佈日期在一定期限內即可並非固定,年報要求年度結束四個月內披露,半年報是上半年結束後兩個月內,一季報與三季報是季度結束後一個月內。特別的是像總市值、市盈率這種跟股價掛鉤的市值數據是每天更新的。
- 獲取股票財務數據需要用到的 API 爲 get_fundamentals。這個語句的用法較爲複雜,下文對文檔進行補充說明,文檔還是要看的。
- 未來函數是什麼?
- 我們做回測去驗證策略時,其實是用歷史數據去模擬當時的市場從而得知策略在歷史上表現如何,但是如果策略利用了歷史當時無法得到的信息,往往就會造成回測結果極大失真,這時我們會說這個策略有未來函數。
- 舉一個典型的有未來函數的策略:每天買明天漲停的股票。 事實上你是不能知道明天哪個股票漲停的,所以現實中是不能實現的,但是我們做回測是用的歷史數據,所以我們其實是能實現用 2012 年的數據對這個買明日漲停股的策略做回測的,畢竟現在已經過了 2012 年,2012 年每天哪個股票會漲都是已經知道的了。這樣的有未來函數的回測結果肯定是沒價值的,因爲現實中不能實現,儘管回測結果有時特別喜人。
- date 與 statDate 的問題
- 傳入 date 時,查詢指定日期 date 所能看到的最近的數據。 回測時不填則默認值會爲回測日期的前一天(模擬現實,避免未來函數)。date 參數的要求爲格式類似 '2015-01-15' 的字符串,datetime 類型的時間數據也是可以的,不過略複雜不展開。
- 傳入 statDate 時,查詢 statDate 指定的季度(例如 '2015q1'、 '2013q4' 的字符串)或者年份(如 '2015'、'2013' 的字符串)的財務數據。這種用法需要注意的地方比較多,請注意文檔中提到的問題。
- date 和 statDate 參數只能同時傳入其中一個。當 date 和 statDate 都不傳入時,相當於使用 date 參數,date 的默認值會爲回測日期的前一天。文檔中提到的回測模塊就是指我們編寫策略的功能模塊,研究模塊我們之後會介紹。因此,爲方便在回測中使用,date 和 statDate 都不傳入。
- 單季度與報告期。
- 之前講過,財務數據按季度發佈,一般財經網站上提供的財務數據是默認按報告期提供的,即每季度統計的週期跨度分別爲第一季度、前兩個季度、前三個季度、前四個季度(全年)。
- 而聚寬考慮到量化分析,提供的財務數據全是單季度的,即每季度統計的週期跨度分別爲第一季度、第二季度、第三季度、第四季度。
- 因此,當你發現聚寬財務數據比財經網站的財務數據差的很多時,很可能是單季度與報告期的差別造成的。
-
query_object 參數以及快速上手模板
-
query_object 參數是要求傳入一個 Query 對象用於描述所需的數據,這個東西展開講相當於一門小的編程語言,麻煩而不必要,這裏提供一個快速上手的模板用來產生 query_object 參數,多數情況下往裏套就可以了,例子如下,建議對比文檔裏的例子看看。
# 快速上手模板 # query(表.字段).filter(篩選條件).order_by(排序方法).limit(數量上限) #比較長的話可以分行寫
-
表和字段可以在財務數據文檔查看,如下。表和字段可以寫多個用逗號隔開,只寫表名不寫字段代表選擇該表的所有字段。注意看含義與單位。
-
篩選條件跟講 if 判斷時用的條件是一樣的,多個條件用逗號隔開代表與(and)的關係。特別的是要用複雜的與或非的邏輯關係時,在此處 and、or、not 是不能用的,要對應的改用 &(與)、|(或)、~(非)。
- 排序的寫法比較簡單,就是要作爲排序標準的字段後面加.desc () 即由大到小,或.asc () 即由小到大。
-
數量上限可以自己設置,代表最多返回的數據條數。不過系統強制限制每次最多返回 10000 條,就算你自己在此處限制比 10000 多也沒用。
# 例子 # 獲取 市值表.股票代碼,資產負債表.未分配利潤 q=query(valuation.code,balance.retained_profit # 篩選 市值大於100 並且 市盈率小於10 ).filter(valuation.market_cap>100,valuation.pe_ratio < 10 # 排序 按市值從大到小排 ).order_by(valuation.market_cap.desc() # 數量 上限10條數據 ).limit(10) w=get_fundamentals(q) print(w) # 結果如下: # code retained_profit # 0 601398.XSHG 8.566400e+11 # 1 601939.XSHG 7.400340e+11 # 2 601288.XSHG 4.644490e+11 # 3 601988.XSHG 5.267460e+11 # 4 600036.XSHG 1.816520e+11 # 5 601328.XSHG 9.208500e+10 # 6 600000.XSHG 1.037620e+11 # 7 600016.XSHG 1.277570e+11 # 8 601166.XSHG 1.573490e+11 # 9 601998.XSHG 1.298680e+11
-
自學與自測
- 實踐下文中例子。
- 瀏覽聚寬數據中包括的數據,試着取用下。
- 建議大致瀏覽下 pandas.dataframe 專題使用指南,學有餘力可以細緻學習下。
- 獲取任一股票最近 5 個交易日最高價的平均價。
- 生成一個 list,list 中爲上證指數成分股中流通市值最大的 5 個股票的股票代碼。