第七課 ALPHA 101(101個選股公式)-- 零基礎(chǔ)量化投資小課堂
上節(jié)課我們講了因子的定義和因子測試的方法。我明白這不是一節(jié)簡單的課,需要的知識儲備和經(jīng)驗積累非常的多,很高興在這節(jié)課還能繼續(xù)見到你。
下面我們講一講因子投資的圣經(jīng)之一,世坤投資(WorldQuant)前些年公開的論文《101 Formulaic Alphas》。意思就是101個構(gòu)造因子的公式,用現(xiàn)在的大師們的話說就是“教你101個選股公式”。
這些因子現(xiàn)在幾乎都已失效或者不可交易,要不然人家也不會公開給我們看了,而且是針對美股的研究,美股是常年牛市,所以對A股可能會有些許的水土不服,比如他們的動量因子基本都很強,但在A股就差點意思。
但這并不影響我們的學(xué)習(xí),我們可以從中感受一些因子構(gòu)造方法,自己搞一套適合A股的賺錢策略。
下面我們開始實操,對于想要深入代碼細(xì)節(jié)的朋友們來說,本節(jié)課對于python基礎(chǔ)的要求極高,如有不適可以先補一下基礎(chǔ)。
首先,我們的工程分為幾個部分:數(shù)據(jù)下載的datas.py, 因子定義的alphas101.py和因子計算的alphas.py。另外還有程序運行的入口課件和用來存放數(shù)據(jù)的目錄

數(shù)據(jù)的下載和因子的處理的工程部分就不多做贅述,直接調(diào)用即可,我們看一看alphas101里面的內(nèi)容

這里用python構(gòu)造了論文中的所有因子,并且把他們封裝成了一個類,用的時候只需實現(xiàn)這個類即可,非常方便,并且每個因子的計算公式都詳細(xì)的注釋到了后面。 我們挑一個簡單一點的因子進(jìn)行說明,比如alpha012,他代表著“最近一天成交量上漲,同時收盤價大降;或者成交量下降,同時收盤價大漲的股票對應(yīng)的因子值較大。”光看描述,我們知道這是描述價量分歧的因子。
其余的因子也可以自己分析或者去網(wǎng)上找現(xiàn)成的分析,我建議找現(xiàn)成的分析節(jié)約時間,挑有用的看。
下面我們開始下載數(shù)據(jù):
首先導(dǎo)入相印的包并且運行下載程序,這里的程序高度封裝,直接運行即可:

這一步會運行的非常之慢,不要懷疑你的電腦卡了,因為程序會下載90年代至今的所有股票的價量數(shù)據(jù),看看你的文件夾里是不是多出來了一大堆文件。
(寫到這里的時候我發(fā)現(xiàn)電腦確實卡了,似乎是因為jupyter對于多線程的支持不好,所以我們等一會看到文件夾里的文件不更新了,就可以手動點上面的方框終止程序,然后從下面的代碼開始運行。(或者直接用命令行運行datas.py,這個不會卡)
接下來我們計算所有的因子供后面回測使用,這里為了節(jié)約時間,我們只計算2022年滬深300成分股的所有因子
list_assets,df_asserts = get_hs300_stocks(f'2022-01-01')
download_index_data("sh000300")
Alphas101.generate_alphas(2022, list_assets,"sh000300")
不要緊張這里不會卡,這一步是真的慢,當(dāng)然你也可以把代碼改造成只計算你想測試的單個因子,那樣會快很多。
運行的過程中我們可以看jupyter notebook提供的窗口,他會顯示我們每個因子計算的耗時,等到全部寄算完之后,會出現(xiàn)一個Dataframe的顯示,并且notebook里也會顯示運行結(jié)束了。

都計算完成之后,接下來就沒有很慢的操作了,還記得我們上一節(jié)課講的因子測試嗎?我們這里就要用到因子測試的工具了。
這里的year指定我們的測試年份2022年,alpha_num指定我們想測試哪個因子,這里我們以第六個為例,所以指定他為6,這個可以隨便改。
運行之后我們即可得到關(guān)于alphas6這個因子的全部測試報告啦,感興趣的話你可以改一下代碼,測試一下全部的因子,看看目前a股還有哪個是最有效的?

源碼運行到最后可能會報錯,可以忽略,想解決的網(wǎng)上搜一下報錯,也挺好解決的。
寫到這里這一節(jié)的正式內(nèi)容就結(jié)束了,但是有沒有想過,這里的因子測試并沒有考慮費用等因素呢?我們?nèi)粘=灰资怯泻芏嘞拗频模热鐫q跌停買賣限制,手續(xù)費,印花稅等等,這個因子測試對于因子有效性的檢查是足夠了,但是要想成為一個策略,一定得經(jīng)過回測的檢驗。
那么就要復(fù)習(xí)我們前幾節(jié)課的內(nèi)容了,使用backtrader進(jìn)行回測。
這里代碼太長,就不放了,運行封裝的函數(shù)即可,結(jié)果圖如下:

我們發(fā)現(xiàn)這個回測結(jié)果和我們的因子測試結(jié)果有一定的出入,你知道是為什么嗎?
歡迎關(guān)注同名微信公眾號【量化的韭菜】或知識星球獲取更多內(nèi)容?