首戰即銀牌!數科團隊出征 Kaggle 實錄
永豐金控數位科技處10 min read·Just now--
作者: 林佳霈
想必對 AI 有涉獵的大家,或多或少都聽過 Kaggle 這個資料庫與競賽平台。在 2024 年 10 月,永豐數科的 AI 團隊首次組隊參加 Kaggle 競賽,藉由實戰檢驗團隊在時間序列資料集建模的能力。雖然部分團隊成員有參與過機器學習類型比賽的經驗,但這次是我們第一次以公司內部組隊的方式,一起出征 Kaggle。對我們來說既新鮮又充滿挑戰,因此想在這邊跟大家分享我們團隊這次的新體驗跟收穫!
Kaggle 是什麼?資料競賽的實戰舞台
大多數 Kaggle 比賽流程是:主辦方提供訓練資料(X 與對應的 Y),參賽者利用這些資料訓練模型,再對測試資料(只提供 X,不公開 Y)進行預測。最後,參賽者將預測結果上傳排行榜,系統會把預測值和隱藏的真實答案比對,決定名次。
下圖是 Kaggle 比賽的排行榜畫面,每個參賽者的分數都會即時更新,名次也會隨著上傳的預測結果而變動。
前幾名的參賽者可以獲得 Kaggle 上的酷酷獎牌掛在自己的 profile 上,有些主辦單位甚至會發放獎金,吸引來自世界各地的獎金獵人前來挑戰。
類似的資料競賽平台不只 Kaggle,台灣也有 T-Brain 平台。T-Brain 是由趨勢科技提供的資料競賽平台,比賽題目可能由各類企業或組織提供,讓對 AI 或資料分析有興趣的人挑戰真實議題。永豐金控也曾於 2023、2025 年,於 T-Brain 舉辦 AIGO 競賽,以真實金融資料為題,邀請開發者探索 AI 在金融應用上的可能。
本次挑戰有多難?
這次,我們組隊參與 Jane Street Real-Time Market Data Forecasting。該競賽由全球頂尖量化交易公司 Jane Street 主辦,作為量化交易的重要參與者,Jane Street 2024 年全年淨交易收入約 205 億美元,約占北美股市交易量 10% 以上,規模已接近多家大型投行的全年營收(參考資料:GLOBALTRADING、FINANCIAL TIMES)。這次比賽是使用高頻金融市場時間序列資料進行建模任務,不僅資料規模龐大,更有別於多數 Kaggle 競賽僅針對離線測試進行評估,本次要求模型在賽後上線測試六個月,足以體現這場 Jane Street 的競賽追求的不只是模型在歷史資料中要表現得好,更要求在真實交易場景中持續檢驗模型的長期穩定性。最終,憑藉主辦方的市場地位,與高達 $50,000 USD 的冠軍獎金,吸引了來自世界各地超過 3,700 支隊伍參與,成為 Kaggle 上備受矚目的高階時間序列競賽之一(如下表)。
我們怎麼打這場仗?
在本次競賽中,我們進行了大量實驗。雖然嘗試方向多元,但回頭看來,最值得分享的環節可歸納為兩個面向:「匿名特徵下的非平穩訊號處理」與「應對長期市場驗證的預測策略」。
回歸資料本質:處理匿名特徵下的非平穩訊號
由於比賽提供的特徵皆已匿名化,參賽者無法依靠金融直覺或引入業務知識,只能回到資料本身。我們投入了許多時間探索資料中的潛在模式,嘗試各種特徵工程與轉換技巧,例如:box-cox 轉換、變數分解(target decomposition)、rolling features 等等。在分析過程中,我們觀察到資料具有非平穩(non-stationary)特性,也就是時間序列的平均、變異數和自相關會隨時間發生變化。
在這樣的背景下,我們同時從回應變數(Y)與輸入特徵(X)兩個面向展開探索。在回應變數(Y)方面,我們嘗試透過轉換與分解(decomposition)處理,分別透過轉換目標分佈以及時間序列結構的拆解,使模型在更穩定或具結構性的空間中進行學習,進而更容易捕捉潛在訊號。例如,我們使用 box-cox 轉換將目標值映射至較平穩的空間後再進行模型擬合,並將擬合後的預測值透過 inverse transform 還原至原始尺度;此外,也嘗試將目標序列分解為長期趨勢(trend)、週期性變化(seasonality) 與殘差(residual) 三個部分,將原本複雜的序列轉化為較具結構性的子問題,分別建模後再重建回原始目標。然而,上述方法在實驗中表現提升皆有限。
我們推測 box-cox 轉換效果有限,可能是因為資料處於高噪音且訊號較弱的情境下,雖然轉換有助於訓練時的分佈穩定性,但在 inverse transform 回到原始尺度時,誤差可能被放大,進而影響表現。目標變數分解方法則將單一問題拆解為多個子任務,使模型需同時對 trend、seasonality 與 residual 進行建模,各部分誤差在重建過程中逐步累積,最終抵銷分解帶來的潛在優勢。
在輸入特徵(X)方面,我們嘗試透過 rolling mean、rolling std 等方法,在局部時間窗口內捕捉趨勢與波動結構。在視覺化分析中,我們發現 rolling features 能平滑短期噪音,並反映時間序列的局部趨勢。然而,在實際建模與預測中,我們發現這些特徵對最終表現提升有限,部分實驗甚至出現效果下降。我們推測原因在於 rolling features 具有滯後(lag)效應,當市場快速變動時,基於歷史窗口計算的特徵可能無法即時反映當下訊號,影響模型對未來的判斷。
綜合以上來說,特徵工程還是難以有效應對這次比賽中非平穩且高噪音的資料特性,不過團隊在此方向上仍投入了大量時間進行探索與調整,想說把試過的技巧跟推測的原因分享出來,可能對大家有點幫助(至少幫忙踩雷?)。也基於上述的實驗結果,後續我們將重心轉向模型層面的設計。
Online 學習與 ensemble 模型:應對長期市場驗證的預測策略
由於比賽結束後,提交的模型仍會持續六個月接受市場資料的檢驗,我們需要確保模型在長時間運作下維持穩定表現。為了應對這樣的評估機制,我們選擇建立 online model ,因為 online model 會隨每日新資料進行增量學習,每天將前一日資料與部分歷史資料合併更新訓練,使模型能動態適應不同金融標的在未知趨勢上的微妙變化。另一方面,單一模型難以兼顧長時間尺度下的市場變化,團隊成員各自開發多種模型(tree based models / deep learning models),透過 ensemble 整合各模型預測。
在實驗結果中,我們觀察到 online tree based models 表現本身即不理想,納入 ensemble 後可能對整體表現產生負面影響。我們推測這與資料的 non-stationary 特性以及模型更新方式有關。Tree based model 透過切分特徵空間來擬合歷史資料,這些規則實際上反映的是過去某段時間的資料分佈結構,因此在資料分佈隨時間偏移時容易失效。在 online 設定下,雖然 tree based model 與 deep learning model 均會隨新資料進行更新,但兩者對資料更新的敏感度不同:
- Tree baesd model 的更新依賴於分裂點調整與局部結構重建,在資料量有限時更容易受到短期噪音影響而產生劇烈波動
- Deep learning model 的參數更新為連續的梯度調整,即使在相同資料條件下,其變動仍相對平滑,因此對噪音具有較強的抑制能力
最終,我們捨棄了 online tree based models,提交的 ensemble 模型是由多個不同架構與超參數的 online deep learning models 所組成。在後來長達六個月的市場驗證期間中,我們的模型表現一直很穩定,也說明了這樣的架構某種程度可以應付真實環境中的市場變動。
如果重來一次,我們會怎麼做?
時間壓力下的組織
比賽進入後期時,我們開始將各自的模型成果整合,討論哪些模型和特徵值得放入最終 ensemble。在多人同時調參與訓練模型時,由於時間緊迫,我們沒有足夠時間規劃統一程式碼架構,而是選擇直接合併程式碼,最終程式碼高達 2,000 行,雖然勉強可用,但閱讀上有些混亂。因此,我們也在賽後反思:是否能在追求實驗速度的同時,建立更有秩序的協作方式。
回頭看比賽初期,我們採取了讓每位成員各自平行探索資料與模型的策略,覺得這種先發散再收斂的架構,可以幫助我們快速掃過有價值的解方,同時帶來 ensemble 的效果。但實務上造成的流程混亂與效率損失,是遠大過上述的好處。賽後復盤時,我們認為,若在初期設置類似專案中資深工程師(SE)的角色,負責規劃 codebase 架構與實驗流程,讓大家在統一的框架下實作並明確分工,團隊協作將會順暢許多。
整合與高效溝通
回顧經驗,我們發現使用多樣化的模型 ensemble 對效果提升非常有效。如果比賽一開始可以在統一的程式碼框架下建立更多元的特徵和模型基底,效果會更好;而我們做得較成功的部分,是在整合階段透過 scrum 高速迭代。比賽前兩個月,我們利用 side project 的時間進行定期協作與實驗探索,到了最後一週,隊員暫時放下日常工作,每天全力衝刺,快速協調不同意見,希望能在最後階段把所有想做的實驗集中完成。這種策略,也是團隊能在最後穩定提升預測表現的關鍵。
競賽不只是分數:我們真正的收穫
在歷時三個月的比賽及六個月的上線測試後,我們最終拿下第 39 名(Top 2%)銀牌。對第一次以公司身份組隊參賽的我們來說,應該算是一個值得驕傲的成就,這段過程讓我們體驗到大規模競賽的節奏與強度,也驗證了團隊在模型開發與實戰應用上的實力。
比賽進行時,排行榜和討論區成為我們的精神時光屋。有隊員時時盯榜,追蹤前幾名隊伍的動態,討論區也成了靈感寶庫,讓我們觀察其他隊伍的解法、快速吸收新點子。雖然有時候因為關鍵參數沒公開,會遇到「別人的模型看起來很強,我們卻重現不出來」的尷尬,但在這個幫別人 debug 的過程中,我們能夠學習到他人的思路,並在其上發展出自己的變體。
比賽結束後,除了共同完成一個任務的成就感,我們還有一些預料之外的感受:在參賽體驗上,由於時間緊湊,多數決策以分數導向為優先,往往無法第一時間深入研究自己感興趣的議題。例如,我們曾在特徵工程上嘗試傅立葉轉換,雖然在比賽中效果不佳,但探索過程和背後的想法仍十分有價值,只是受限於時間無法進一步深入鑽研。對第一次參賽的我們來說,暫停手邊熟悉的日常業務、投入競賽,也伴隨著一些壓力。我們心中難免會有「如果最後成績不如預期該怎麼辦?」的顧慮。但也正是這份放不下團隊榮譽的責任心,推動我們在最後的衝刺週毫無保留地投入,最終以 Top 2% 的銀牌證明了這段時間的價值。
跟平時的工作內容相比,比賽的節奏跟體驗與組內一般專案完全不同。做專案通常以「業務需求」為核心,領域專家訪談、特徵設計、可能會有工程或 benchmark 以外的考量,以業務單位需求為主;而競賽時是以「分數最大化」為唯一目標。無論是模型架構設計、實驗流程安排,還是討論區資訊的運用,都會被參賽者想盡辦法推進到極致。這種高強度、結果導向的競賽體驗,不僅讓我們學會在有限時間內做出有效決策,也鍛鍊了快速試錯、策略調整與團隊協作的能力。回頭看,雖然競賽的流程與平日專案完全不同,但所累積的技術和思維方式,對我們日常金融 AI 專案開發工作帶來實質幫助,也為下一次挑戰收穫了寶貴的經驗。