當前位置:股票大全官網 - 股票投資 - 如何用石英信號快速實現worldquant 101 alpha?

如何用石英信號快速實現worldquant 101 alpha?

友礦的500萬實盤正在緊鑼密鼓的進行中。我們已經看到壹些礦工使用經典的機器學習算法和新的Quartz信號模塊來探索友礦現有因子的利用,但對於大多數信號/因子研究人員來說,找到新的Alpha仍然是他們堅持的目標。

如何尋找新的α因子的靈感,成為定量研究者不可回避的問題。

我們註意到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信號來實現它們,並將其發送到社區進行討論。

石英信號模塊有什麽不滿意的地方也可以反饋給我們,幫助我們不斷改進。