如何評價Two Sigma在Kaggle舉辦Financial Modeling Challenge?

這簡直就是眾籌版的quantitative research啊。這幾天體驗一下,然後完善這個問題


= =失業了就來搞搞這個玩

感覺坑很多啊。

1. 給了一堆feature和類似return的y目標值,一個面板數據的形式,但是還是隱藏了很多信息,看起來就是衍生指標,基本面,技術指標做feature。

2. 貌似不能直接使用y的歷史值(不知道能不能用reward推倒回來?),導致其實最簡單最顯著的時間序列模型都不能用。

3. 基本公開的kernel都使用multi-fator的模型,也就是面板數據搞截面回歸了,由於對運行時間有限制,貌似沒看到太多用deep learning的,而且效果也不好(感覺量化行業內本身也懷疑金融時間序列的數據是否適用深度學習的方法。

4. 感覺kaggle參與者有金融經驗的不多,上來所有填充nan的方法就是fillna(mean_vals),也太粗糙了點,不過我測試用剔除nan或者根據id填充前值效果也不明顯,而且測試集中有在訓練集中未出現的instrument,不填充nan,直接丟棄因子應該是不可取的,不知道是不是要根據某些feature先做一下分類,然後再嘗試填充。

5. 比較奇怪這個比賽的意義,感覺和trading脫離的比較遠,類似於還是在做特徵工程,找有解釋效力的因子上。感覺kaggle上大多數人挺懵逼,所以還是覺得噱頭大於實際內容了。


瀉藥,只是去網站看了下,沒詳細研究。

有時業內人士容易被一些行業常識蒙蔽眼光,所以需要些外部者的觀點尋找突破點吧。


2017.3.1 比賽結束,再來更新一下

這次我在public LB上111, private LB上148,勉強混了個前10%。基本模型的思路就是stacking,因為比賽對程序的運行時間有1小時的限制,所以沒有辦法做特別複雜的ensemble,只用了線性回歸、ExtraTrees回歸、基因編程。基因編程的公式可以在提交之前自己訓練好,比較省時間。

個人感覺最有用的特徵工程之一是同一個id在之前的timestamp上的各項指標(fundamental, derived, technical)。利用這一系列特徵的方法很多,可以求數值差,也可以不加額外處理直接加入訓練數據中。此外,一些特定數據列上的NA值可能包含了一些有用的信息,用隨機森林得出特徵的重要性之後,可以有取捨地加入數據集。

最後說一下教訓。這次比賽是code competition,所有的演算法都在雲端跑,容易忽略local cross validation的重要性。在private LB上(相比public LB),不少人的名次增加了幾百名,也有人直接掉了幾百名。這種情況嚴重到public LB上前三名的參賽者沒有一個進private LB前10%的。(總感覺過擬合有點嚴重)

======================================================

0. 多逛論壇,留心那些點贊很多的script,可以參考許多大神的代碼思路。

1. 這次比賽是Kaggle首次進行code competition,和以前下載訓練集和測試集的csv再上傳預測結果的csv不一樣。以前的比賽允許每天提交5次結果,現在每天最多能提交(submit)兩次成功運行的代碼或者五次運行失敗的代碼。用Kaggle Kernel進行普通的run次數不限。submit時有16GB的RAM和1小時的時間限制,run的時候有8GB的RAM和20分鐘的時間限制。這些限制導致我們無法使用一些過於複雜的模型,比如神經網路。稍微複雜一點的Random Forest跑起來都很吃力,容易超時。

2. 比賽的代碼運行依賴於Kaggle開發的Kagglygym API,其結構在論壇上已經有了不少詳細的介紹,還有一個大神做了一個本地的Kagglegym模擬(Two Sigma Financial Modeling Challenge)。不過本人學生黨,自己電腦的運行速度遠遠沒有Kaggle Kernel快,所以就沒有認真研究。

3. 訓練集的特徵列有幾類:id,timestamp,derived,fundamental,technical。其中technical的特徵列普遍有更強的預測力。

4. 完整的訓練集有1800多個timestamp。在run的時候,根據timestamp,完整的訓練集被分為一個小訓練集(timestamp 0~900多)和一個validation set(timestamp 900~1800),kagglegym默認列印出的「public score」其實是這個模型在validation set上的表現。這也就導致了真正的LB score和validation score可能相差很大。同時,由於submit時的訓練集比run時的訓練集大一倍,模型的complexity可能會受到一些未知的影響。

5. 比賽的metric是R score。我們可以用scikit-learn的r2_score自定義一個r_score,在cross validation的時候可以作參考:

import numpy as np
from sklearn.metrics import r2_score
def r_score(y_true, y_pred):
r2 = r2_score(y_true=y_true, y_pred=y_pred)
return np.sign(r2) * np.sqrt(np.abs(r2))

然而,在具體的演算法優化過程中,我個人不推薦使用r2 score的gradient和hessian,反而傾向於傳統的mse或者rmse。

6. 如何利用timestamp和id

有贊再更:)

7. 一些已經發現的trick

1) 一定要做model stacking,幾個相對不是特別卓越的模型(LB ≈ 0.01)stack到一起之後可以有很好的表現

2) 填充NA值的時候最好使用median而不是mean,因為很多特徵列里有動輒幾百萬或者負幾百萬的極端值,很容易把mean帶偏

3) 如果把完整訓練集中y的histogram作出來,可以發現一個看起來像是正態分布bell curve兩極有大量數值相同outlier。我個人猜測,Two Sigma在提供數據的時候把極端的y值clip掉了,所以產生了這種不自然的數據分布。許多優秀的代碼都考慮到了這一點,在訓練之前就徹底剔除了這些outlier。

8. 神經網路相關

如果用scikit learn自帶的神經網路,run和submit都會超時。論壇上也有一些人用tensorflow做LSTM,不過也沒有特別驚人的LB成績。也許很難預測金融數據的原因是noise太大而不是complex nonlinear relationship,像神經網路這樣的複雜模型適合後者。如果有人用LSTM做出了很好的效果,歡迎交流。

9. symbolic regression with genetic programming (gplearn)

有奇效

10. (歪樓)看起來已經有人吐槽Two Sigma壓榨data scientist勞動力了

本來想求組隊的,不過比賽再過幾天就要結束了。。。

=====================原答案===================

這個比賽里特徵工程的成分多一些。technical 20這一個特徵就有很強的預測能力,其他的特徵加太多到線性回歸模型里反而容易過擬合。xgboost和神經網路的效果不是特別理想。相比之下,基於genetic programming的symbolic regression有很多可以發掘的地方。


與之前一個Allstate預測insurance claim的好像,就是給的features很多但完全沒有解釋是啥。不過這次好歹給了Fundamental, Derived和Technical三類,可能有一些金融背景的可以知道代表什麼意思。目前覺得最好玩的還是貓狗分類的那個數據集。


只對沒經驗的學生有吸引力,這也可能是比賽初衷:挖最優秀的畢業生。

業內人士沒人有閑心搞這個,pay太低了。。


我就說kaggle上應該有這個model的題,我去,怎麼沒有?果然來了。但是效果怎麼樣,大家做好後願意公開源碼嗎?還是說,高手都不會參加,只是給新手拿來練練手的罷了。

然後都有在線編輯平台了,看起來方便了很多,離自動化編程,搶程序猿飯碗,差不了太遠了 。

這幾天體驗一下。再說。


推薦閱讀:

高頻交易的業內人士是如何看待謝爾蓋.阿列尼科夫被捕這一事件的?
Google 這樣的公司為什麼不涉足量化對沖或高頻交易領域?
高頻交易系統怎樣在多線程和埠通訊之間取捨?
quant是否是一個江河日下的職業?
用 Trading System Lab 自動生成的交易策略,怎麼保證它不是遺傳演算法過度優化的產物?

TAG:寬客Quant | 機器學習 | Kaggle | TwoSigmaInvestments |