量化投資單因子回測神器 — Alphalens
量化投資往期推薦
還記得我們在前面采用的回測工具Backtrader嗎?Backtrader是一款非常靈活的回測工具,基于它你能回測任何你想要測試的idea.
但是針對單因子回測,Backtrader 開發(fā)回測代碼以及生成報告上并不算很方便,我們需要自己編寫買賣邏輯,在生成的報告上也沒有IC、IR、回撤等的數(shù)據(jù)分析,而實際上,從單因子回測的技術(shù)實現(xiàn)角度上來說,這些都是可以自動化生成的。
Alphalens就是一個專門實現(xiàn)單因子自動回測的神器,我們只要給它輸入因子值的列,還有每支股票收盤價的數(shù)據(jù),它就能自動生成數(shù)據(jù)分析及報告,并帶有十幾張可視化的報告數(shù)據(jù)統(tǒng)計圖:

下面就帶大家入門使用一下Alphalens,如果對你有幫助的話,記得點一下贊/在看哦。
1.準(zhǔn)備
開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細(xì)Python安裝指南?進(jìn)行安裝。
(可選1)?如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.
(可選2)?此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點:Python 編程的最好搭檔—VSCode 詳細(xì)指南。
請選擇以下任一種方式輸入命令安裝依賴:
1. Windows 環(huán)境 打開 Cmd (開始-運行-CMD)。
2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。
3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install alphalens
pip install tushare
pip install pandas2.數(shù)據(jù)預(yù)處理
正如前面所說,我們只需要把因子值和收盤價放入Alphalens中,就能自動生成回測和報告結(jié)果。
所以,我們90%的工作都會在數(shù)據(jù)處理這一部分,回測和分析都是抽象封裝好的,并不需要太多地去擔(dān)心它。
為了測試,我們導(dǎo)入tushare的數(shù)據(jù)進(jìn)行測試:
import?pandas as?pd
import?tushare as?ts
from?alphalens.utils import?get_clean_factor_and_forward_returns
from?alphalens.tears import?create_full_tear_sheet
pro = ts.pro_api()
# 此接口獲取的數(shù)據(jù)為未復(fù)權(quán)數(shù)據(jù),回測建議使用復(fù)權(quán)數(shù)據(jù),這里為批量獲取股票數(shù)據(jù)做了簡化
df = pro.daily(ts_code='000001.SZ,600982.SH', start_date='20200101', end_date='20211122')
df.index = pd.to_datetime(df['trade_date'])
df.index.name = None
df.sort_index(inplace=True)這里獲取了000001.SZ,600982.SH兩只股票在2020-01-01到2021-11-22的日線數(shù)據(jù),將交易日期設(shè)為了索引并排序。效果如下:

然后需要設(shè)置多索引的因子列 assets,第一個索引為日期,第二個索引為股票代碼:
# 多索引的因子列,第一個索引為日期,第二個索引為股票代碼
assets = df.set_index([df.index, df['ts_code']], drop=True)效果如下,仔細(xì)觀察的話能發(fā)現(xiàn)其與導(dǎo)入的數(shù)據(jù)只有索引的不同:

然后,設(shè)置收盤價的Dataframe,這個與因子數(shù)據(jù)的格式不同,索引是時間,每一列是每只股票對應(yīng)的收盤價:
# column為股票代碼,index為日期,值為收盤價
close = df.pivot_table(index='trade_date', columns='ts_code', values='close')
close.index = pd.to_datetime(close.index)
到這一步,我們的初始化工作就完成了,下面就放到 Alphalens 進(jìn)行測試。
3.Alphalens回測及報告
使用Alphalens進(jìn)行回測,是非常輕松而寫意的,只需要導(dǎo)入包,給它傳遞因子數(shù)據(jù)和收盤價數(shù)據(jù)即可:
from?alphalens.utils import?get_clean_factor_and_forward_returns
from?alphalens.tears import?create_full_tear_sheet
# 我們是使用pct_chg因子數(shù)據(jù)預(yù)測收盤價,因此需要偏移1天,但是這里有2只股票,所以是shift(2)
ret = get_clean_factor_and_forward_returns(assets[['pct_chg']].shift(2), close)
create_full_tear_sheet(ret, long_short=False)get_clean_factor_and_forward_returns 接受的第一個參數(shù)就是因子的列,我們只需要從前面預(yù)處理好的 assets 中任取一列作為因子進(jìn)行回測即可,第二列是收盤價。
值得注意的是,因子數(shù)據(jù)在回測的時候,注意不要使用到未來數(shù)據(jù),因為我們是用前一天的數(shù)據(jù)預(yù)測下一天的收盤價,所以要對因子列進(jìn)行移位處理,這點一定要注意。
運行程序,就能生成如下的報告:

還有一點需要提醒大家的是,開源Alphalens的Quantopian公司已經(jīng)倒閉,所以項目暫時沒人維護(hù)了,部分代碼沒有適配最新的依賴可能會有問題,比如下面的這個代碼:

原本是通過 .get_values() 獲得 input_periods, 但是 get_values 在 pandas 0.25.0 中已經(jīng)被棄用,最新的pandas版本這里需要改成 .to_numpy() 才能生效。
除了這個小缺點,Alphalens整體上是非常符合大家單因子測試的需求的。
它的分析報告可能沒有那么齊全,我們也可以考慮在Alphalens的基礎(chǔ)上增加其他的分析內(nèi)容,如果能開源出來則更好了。
考慮到后續(xù)Alphalens沒人維護(hù),我fork了Alphalens,并增加了自己的改動,希望有余力的同學(xué)也能來一起貢獻(xiàn)代碼:
https://github.com/Ckend/alphalens
我們的文章到此就結(jié)束啦,如果你喜歡今天的Python 實戰(zhàn)教程,請持續(xù)關(guān)注Python實用寶典。
有任何問題,可以在公眾號后臺回復(fù):加群,回答相應(yīng)紅字驗證信息,進(jìn)入互助群詢問。
原創(chuàng)不易,希望你能在下面點個贊和在看支持我繼續(xù)創(chuàng)作,謝謝!
點擊下方閱讀原文可獲得更好的閱讀體驗
Python實用寶典?(pythondict.com)
不只是一個寶典
歡迎關(guān)注公眾號:Python實用寶典
