如何尋找新的α因子的靈感,成為定量研究者不可回避的問題。
我們註意到Zura Kakushadze等人最近發表的論文101公式化Alpha (/sol3/papers.cfm?Abstra…)提到了很多基於價格數據的“阿爾法”因素,給我們提供了很多新的啟示。
本文將簡單介紹文中提到的阿爾法因子表達式的語法和含義,然後介紹如何用Quartz信號方便地實現這些阿爾法,最後提供文中出現的兩個效果較好的阿爾法因子供大家參考。
公式化阿爾法簡介
在研究了上面提到的論文後,我們發現論文中提到的公式化α是用壹個表達式來表示壹個α因子:
書面表達就是根據每個調倉日的表達來計算每只股票。
比如:1/收盤;對於宇宙中的每只股票,計算1/closePrice,然後將這個向量歸壹化,即除以它的值的和(所有值相加的結果是1)。這將為所有股票創建壹個基於“權重”的向量,每個權重代表投資組合中投資於該股票的資金比例。
支持的數據包括:開盤(開盤價)/收盤(收盤價)/高(最高價)/低(最低價)/vwap(日內成交量加權價)/回報(單日回報率)等等。
我們認為公式化α的這種表達形式具有以下特征:
表達簡潔,但是隱藏了太多細節,用戶看不到具體的位置調整信息。
受限於表達能力的不足,提供了豐富的內置功能,幫助用戶完成對橫斷面信息的處理。
內置函數
可分為橫截面函數和時間序列函數兩大類,其中時間序列函數名稱多以ts_
大多數函數的命名都很直觀。
ABS (x) log (x)分別表示x的絕對值和x的自然對數。
Rank (x)表示壹只股票的X值在橫截面上的升序排列數,排序歸入[0,1]的封閉區間。
Delay (x,d)表示d天之前x的值。
Delta (x,D)表示X的最新值減去D天前X的值。
Correlation (x,y,d)協方差(x,y,d)分別表示長度為d的時間窗內x和y的皮爾遜相關系數和協方差。
Ts _ min (x,d) ts _ max (x,d) ts _ argmax (x,d) ts _ argmin (x,d) ts _ rank (x) sum (x,d) stddev (x,d)等等可以通過函數名來理解。
更多功能解釋,請參考論文附錄。
石英信號模塊簡介
API幫助文檔中提到,信號模塊是友礦為方便因子/信號研究者提供的工具,將用戶從與信號研究無關的數據采集和排序邏輯中分離出來,用戶可以按照自己的思路專心開發新的信號。
使用Signal定制信號的壹般實現過程如下:
def foo(data,dependencies =[' PE 39;],max_window=4):
返回數據[' PE 39;].平均值()
# in initialize(帳戶)
a =信號(“信號_a”,foo)
帳戶.信號發生器=信號發生器(a)
# in handle_data(賬戶)
account . signal _ result[' signal _ a ']
我們可以將石英信號的使用過程分為四個步驟:
定義實現信號邏輯的函數(上例中的foo函數)。
在initialize函數中定義Signal,在實例化Signal類時將信號名稱和描述函數作為參數傳遞。
在initialize函數中,註冊要在account.signal_generator中使用的信號,可以註冊多個信號。
通過handle_data中的account.signal_result獲取計算出的信號值。
我們關註用戶需要完成的信號描述功能:
信號描述函數其實就是用戶對每個調倉日可用數據的處理邏輯。
信號描述函數的名稱可以根據Python函數命名規範任意定義,但其參數必須是壹個非關鍵字參數data和兩個關鍵字參數dependencies和max_window。
依賴關系的參數格式必須是str組成的列表,列表的元素是該函數要使用的因子的名稱。有關具體的支持因素列表,請參考幫助文檔。
max_window的參數格式為int,表示用戶希望使用過去max_window天數的因子數據。
數據是用戶根據依賴關系和max_window,Quartz信號模塊得到的數據。它的格式是壹個dict Pandas數據幀,關鍵字為因子名,值為max_window*universe_length。
信號描述函數的返回值必須是壹個熊貓序列,長度與數據中每個元素的列數相同。
如下圖所示:
上圖描述了數據的結構,其中數據只有壹個元素,它的鍵是“PE”,它的值是上表所示的Pandas DataFrame。具體來說,它的列是宇宙的secID,它的索引是%Y%m%d格式的日期字符串。
石英信號與公式α
從上面的描述中可以看出,公式化的α可以很容易地用石英信號模塊來實現,與公式化的α表達式相比,它具有以下優點:
更直觀:
o用戶在預先定義信號描述函數時,可以明確定義所需的因子數據和時間窗口。
o用戶可以在Quartz框架中靈活定義自己的調倉頻率和下單邏輯,可以直觀的看到每次調倉的股票列表。
更加靈活:
OFormulaic Alpha將表達式的計算結果限制為代表投資組合中相應股票的權重,而Quartz Signal則沒有。用戶可以在handle_data中根據自己的想法任意處理信號值。
描述O信號函數的數據以Pandas DataFrame的格式傳輸,使用戶可以同時看到函數中的橫截面數據和時間序列數據,為用戶提供了更多的可能性。
更強大:信號描述函數的數據以Pandas DataFrame的格式傳輸,Pandas豐富的內置函數可以幫助我們完成只有更復雜的公式化Alpha表達式才能完成的任務(見上例)。
更多數據:石英信號不僅支持開盤價/收盤價/高價/低價/成交量等等價信息,還支持PE、RSI等更豐富的因子。
接下來,我們使用石英信號模塊來實現文中提到的公式α:
用石英信號實現公式α
以WebSim論文中的alpha 53為例,其原始表述為:
(?1?△((((關?低)?(高?關閉)/(關閉?低))、9))
簡化得到,((收盤-盤低)-(收盤-盤高))/(收盤-盤低)前9位-當前值。
繼續簡化:(2?接近?低?高)/(接近?低)
我們深入研究了這壹因素,發現:
(2?接近?低?高)/(接近?低)=1?(高?關閉)/(關閉?低)
前面的常數1可以用delta消去,但實際上可以簡化為(高?關閉)/(關閉?低)-9天前的現值
和(高?關閉)/(關閉?低)本身就代表了收盤價在日內波動中的位置,可以看做是買入意向的反映。
我們強烈建議您在實施這些公式化的阿爾法因子之前,花壹些精力去理解它們的經濟意義,這不僅可以加深您對其原理的理解,還可以在某些情況下簡化它們的實施。
我們以論文中的Alpha 26為例,其原始表達式為:
1?ts _ max(correlation(ts _ rank(volume,5),ts_rank(high,5),5),3)
當然,我們可以按照它原來的表達方式,把過去五天的成交額和最高價逐級排序,然後取相關系數;但是熟悉熊貓DataFrame內置函數或者有豐富統計學知識的研究人員可以發現,correlation (TS _ rank (volume,5),TS _ rank (high,5),5)實際上是在計算Spearman秩相關系數,利用DataFrame內置的corr(method="spearman ")函數就可以完成計算,可以大大提高開發效率。
在我們模擬的過程中發現,如果按照原來的公式計算,無論是做多還是做空的結果都無法跑贏大盤,同時交易量與最高價相關性高的股票將是市場追捧的熱門股,應該配置更大的權重。
所以在上面的代碼中,我們去掉了原來公式化的Alpha前面的負號。
當然,可能很難理解文中出現的壹些因素的經濟意義。我們鼓勵您使用Quartz信號來實現它們,並將其發送到社區進行討論。
石英信號模塊有什麽不滿意的地方也可以反饋給我們,幫助我們不斷改進。