利用聚寬JQFactor進行單因子分析的基本概念和分析結果詳解

JQFactor是聚寬提供的單因子分析Python包,限定在聚寬的研究環境中使用。另外聚寬還提供了一個可以在本地Python開發環境中使用的jqfactor_analyzer,在本地直接用pip安裝即可。二者大同小異。這裏以JQFactor爲例介紹其單因子分析的基本概念和分析結果的詳細說明。

這是本文用到的示範代碼:https://download.csdn.net/download/u010302494/12031300

一、因子和單因子分析的概念

一個非常有趣的現象就是講單因子的文章非常多,但什麼是因子似乎很難找到一個規範的定義。這裏給出我的理解:因子就是以投資對象(例如一隻股票)、和交易日期爲自變量的二元函數。即給定交易對象和交易日期,我們能通過一種因子算法得到唯一確定的一個實數,這個實數就叫做交易對象在這個交易日的因子值。例如,股票的每日收盤價、市盈率、漲幅、市盈率等等都可以看做股票在該日的不同因子。理論上因子的種類是無窮多的。聚寬網站提供了大量經典單因子的定義、歷史數據和歷史表現:https://www.joinquant.com/view/factorlib/list。開發者也可以自己定義因子的算法。

所謂單因子分析就是分析我們感興趣的因子的值是否對未來股價的走勢有較好的預測作用。如果你找到了這樣的因子,那麼恭喜你,挖到金礦了。

二、單因子分析

  1 因子數據準備:

    單因子分析的第一步是要計算好所有考察對象在所有考察日期的因子值,保存在一個通常取名爲factor的變量中。關於factor的格式說明如下:

pandas.DataFrame: 因子值, columns 爲股票代碼 (如 '000001.XSHE'), index 爲 日期的 DatetimeIndex

或者 pandas.Series: 因子值, index 爲日期和股票代碼組成的 MultiIndex

或者 Factor 的子類: 因子算法,即通過定義一個Factor的子類來計算因子的值

JQFactor提供了get_factor_values函數可以直接調用很多現成的單因子數據,聚寬網站上有這些單因子數據的詳細說明:https://www.joinquant.com/view/factorlib/list

此外,聚寬還提供了專門的本地數據獲取模塊JQData,可以從聚寬網站上下載量化分析需要用到的幾乎所有的數據,其中就包括了許多高質量的因子數據,點擊這個鏈接可以訪問

下圖是一個第一種格式factor的示例

2 單因子分析函數調用:

採用JQFactor進行單因子分析非常簡單,直接調用函數analyze_factor即可。這個函數參數的詳細說明這裏就不拷貝了,大家用help去看JQFactor.analyze_factor的幫助即可。對於初學者來說只需要輸入factor這一個參數,其它所有參數都有默認值。

analyze_factor調用後返回一個類型爲jqfactor.analyze.FactorAnalyzerResult的對象,通常用變量far表示。這個變量擁有非常複雜的結構和功能,包含了所有分析結果的數據和圖表,解讀這個變量纔是難點,也是本文的重點。

3 單因子分析結果詳解:

far.factor_data:因子值,內容等同於最初輸入的factor。這是一個pandas.Series類型的變量,其索引爲日期和股票代碼生成 MultiIndex。如下圖所示:

return(Code,T):代碼爲Code的股票T日的日收益率=T+1日收盤價/T日收盤價-1。這裏要注意,這個收益率的定義跟我們常用的日漲幅的定義不一致。我們常用的T日的日漲幅=T日收盤價/T-1日收盤價-1,而JQFactor中T日的日收益率相當於我們常用定義中的T+1日的日漲幅,它的含義是在T日買入股票,持股一個交易日後的收益率,以此來評估在T日買入股票的價值。

JQFactor並沒有暴露這個值供用戶訪問,但JQFactor是以這個值爲基礎演算出了後續所有分析結果,所以必須把這個概念講清楚才能理解後續的各種概念。

forward_return(Code,T,N):代碼爲Code的股票在T日調倉週期爲N期間內的return的總和=return(Code,T)+return(Code,T+1)+……+return(Code,T+N-1)。這個數字可以在far.clean_factor_data中看到。調倉週期長度N在調用analyze_factor時用參數periods給出, 默認值爲三種調倉週期 [1, 5, 10]。所謂調倉週期的含義就是買入股票持股N日後賣出。

period_wise_return(Code,T,N):代碼爲Code的股票在T日調倉週期爲N的期間平均日收益率=forward_return(Code,T,N)/N,即週期內每日收益率return的平均值。period_wise_return代表持股期間每日收益率的平均值——注意,不是持股期間的總收益率哦。

JQFactor基於每隻股票每日的return來計算每隻股票每日針對不同調倉週期的period_wise_return,JQFactor沒有提供對這個數據的直接訪問,但提供了很多基於這個數據的不同分類統計結果。JQFactor分析結果中的各種mena_return,其實就是對這個period_wise_return取的加權平均值。爲簡化起見,下文中將period_wise_return簡稱爲因子收益

far.clean_factor_data:經過清洗、整理、初步處理後的因子數據,包含了完備的信息,從這張表中可以推導出所有的單因子分析統計結果,如下圖所示。

period_1、period_5、period_10:分別代表調倉週期爲1、5、10個交易日的forward_return。例如下圖中第一行數字-0.045253,代表2018年1月2日這天,平安銀行的從1月2日到1月8日連續五個交易日的return之和爲-0.045253

factor:因子值

group:所屬行業名稱

factor_quantile:所屬分層的序號。單因子分析的基本操作之一就是在每個交易日根據因子值的大小把全部股票進行排序,然後平均分爲Q層(Q在調用analyze_factor時用參數 quantiles給出, 默認值爲 5),每層的股票數量相同,通過對比各層股票的收益率,就能看出因子值的大小與股票未來的收益是否有關係。factor_quantile代表每種股票在每天所屬分層的編號。

weight:計算每層的收益時,該股票所佔權重的計算方法,在調用analyze_factor時用參數weight_method給出,默認值爲"avg",即每種股票按等權重計算。下圖示例採用的是weight_method="mktcap",即按股票市值加權

far.mean_return_by_date:給出各調倉週期各分層在各交易日的所有股票的因子收益的加權平均值。下圖數字0.003646表示在2018-1-2這一天第一分層的所有股票針對調倉週期爲5的因子收益的加權平均值

far.mean_return_std_by_date:給出按分層、日期、調倉週期分組的因子收益的標準差

far.mean_return_by_quantile:給出各調倉週期各分層的因子收益的加權平均值

far.mean_return_std_by_quantile:給出各調倉週期各分層的因子收益的標準差

far.mean_return_by_group:給出各分層各行業的因子收益的加權平均值

far.mean_return_std_by_group:給出各分層各行業的因子收益的標準差

far.mean_return_spread_by_quantile:最高分層因子收益與最低分層因子收益之差,即用far.mean_return_by_date中最高分層的數據減去最低分層的數據即可,這個數據代表因子值的變化對收益變化的影響程度。

far.mean_return_spread_std_by_quantile:最高分層因子收益與最低分層因子收益之差的標準差。

 

未完待續

 

 

發佈了4 篇原創文章 · 獲贊 0 · 訪問量 4982
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章