摘要:具體的數(shù)據(jù)預(yù)處理涉及重復(fù)值、異常值/缺失值/極端值、標(biāo)準(zhǔn)化和數(shù)據(jù)頻率的處理。duplicated(subset=[key1,key2,duplicated(subset=[key1,key2,對數(shù)據(jù)范圍內(nèi)的所有因子做出如下調(diào)整:該方法不足在于,量化領(lǐng)域常用的數(shù)據(jù)如股票價(jià)格、token價(jià)格常呈現(xiàn)尖峰厚尾分布,并不符合正態(tài)分布的假設(shè),在該情況下采用方法將有大量數(shù)據(jù)錯誤地被識別為異常值。...
前言
書接上回,我們發(fā)布了《用多因子策略構(gòu)建強(qiáng)大的加密資產(chǎn)投資組合》系列文章的第一篇 - 理論基礎(chǔ)篇,本篇是第二篇 - 數(shù)據(jù)預(yù)處理篇。
在計(jì)算因子數(shù)據(jù)前/后,以及測試單因子的有效性之前,都需要對相關(guān)數(shù)據(jù)進(jìn)行處理。具體的數(shù)據(jù)預(yù)處理涉及重復(fù)值、異常值/缺失值/極端值、標(biāo)準(zhǔn)化和數(shù)據(jù)頻率的處理。
一、重復(fù)值
數(shù)據(jù)相關(guān)定義:
- 鍵(Key):表示一個(gè)獨(dú)一無二的索引。eg. 對于一份有全部token所有日期的數(shù)據(jù),鍵是“token_id/contract_address - 日期”
- 值(Value):被鍵索引的對象就稱之為“值”。
診斷重復(fù)值的首先需要理解數(shù)據(jù)“應(yīng)當(dāng)”是什么樣子。通常數(shù)據(jù)的形式有:
- 時(shí)間序列數(shù)據(jù)(Time Series)。鍵是“時(shí)間”。eg.單個(gè)token5年的價(jià)格數(shù)據(jù)
- 橫截面數(shù)據(jù)(Cross Section)。鍵是“個(gè)體”。eg.2023.11.01當(dāng)日crypto市場所有token的價(jià)格數(shù)據(jù)
- 面板數(shù)據(jù)(Panel)。鍵是“個(gè)體-時(shí)間”的組合。eg.從2019.01.01-2023.11.01 四年所有token的價(jià)格數(shù)據(jù)。
原則:確定了數(shù)據(jù)的索引(鍵),就能知道數(shù)據(jù)應(yīng)該在什么層面沒有重復(fù)值。
檢查方式:
- pd.DataFrame.duplicated(subset=[key1, key2, ...])
- 檢查重復(fù)值的數(shù)量:pd.DataFrame.duplicated(subset=[key1, key2, ...]).sum
- 抽樣看重復(fù)的樣本:df[df.duplicated(subset=[...])].sample找到樣本后,再用df.loc選出該索引對應(yīng)的全部重復(fù)樣本
- pd.merge(df1, df2, on=[key1, key2, ...], indicator=True, validate='1:1')
- 在橫向合并的函數(shù)中,加入indicator參數(shù),會生成_merge字段,對其使用dfm['_merge'].value_counts可以檢查合并后不同來源的樣本數(shù)量
- 加入validate參數(shù),可以檢驗(yàn)合并的數(shù)據(jù)集中索引是否如預(yù)期一般(1 to 1、1 to many或many to many,其中最后一種情況其實(shí)等于不需要驗(yàn)證)。如果與預(yù)期不符,合并過程會報(bào)錯并中止執(zhí)行。
二、異常值/缺失值/極端值
產(chǎn)生異常值的常見原因:
- 極端情況。比如token價(jià)格0.000001$或市值僅50萬美元的token,隨便變動一點(diǎn),就會有數(shù)十倍的回報(bào)率。
- 數(shù)據(jù)特性。比如token價(jià)格數(shù)據(jù)從2020年1月1日開始下載,那么自然無法計(jì)算出2020年1月1日的回報(bào)率數(shù)據(jù),因?yàn)闆]有前一日的收盤價(jià)。
- 數(shù)據(jù)錯誤。數(shù)據(jù)提供商難免會犯錯,比如將12元每token記錄成1.2元每token。
針對異常值和缺失值處理原則:
- 刪除。對于無法合理更正或修正的異常值,可以考慮刪除。
- 替換。通常用于對極端值的處理,比如縮尾(Winsorizing)或取對數(shù)(不常用)。
- 填充。對于缺失值也可以考慮以合理的方式填充,常見的方式包括均值(或移動平均)、插值(Interpolation)、填0df.fillna(0)、向前df.fillna('ffill')/向后填充df.fillna('bfill')等,要考慮填充所依賴的假設(shè)是否合。
- 機(jī)器學(xué)習(xí)慎用向后填充,有 Look-ahead bias 的風(fēng)險(xiǎn)
針對極端值的處理方法:
1.百分位法。
通過將順序從小到大排列,將超過最小和最大比例的數(shù)據(jù)替換為臨界的數(shù)據(jù)。對于歷史數(shù)據(jù)較豐富的數(shù)據(jù),該方法相對粗略,不太適用,強(qiáng)行刪除固定比例的數(shù)據(jù)可能造成一定比例的損失。
2.3σ / 三倍標(biāo)準(zhǔn)差法
標(biāo)準(zhǔn)差 體現(xiàn)因子數(shù)據(jù)分布的離散程度,即波動性。利用 范圍識別并替換數(shù)據(jù)集中的異常值,約有99.73% 的數(shù)據(jù)落入該范圍。該方法適用前提:因子數(shù)據(jù)必須服從正態(tài)分布,即 。
其中,, ,因子值的合理范圍是。
對數(shù)據(jù)范圍內(nèi)的所有因子做出如下調(diào)整:

該方法不足在于,量化領(lǐng)域常用的數(shù)據(jù)如股票價(jià)格、token價(jià)格常呈現(xiàn)尖峰厚尾分布,并不符合正態(tài)分布的假設(shè),在該情況下采用方法將有大量數(shù)據(jù)錯誤地被識別為異常值。
3.絕對值差中位數(shù)法(Median Absolute Deviation, MAD)
該方法基于中位數(shù)和絕對偏差,使處理后的數(shù)據(jù)對極端值或異常值沒那么敏感。比基于均值和標(biāo)準(zhǔn)差的方法更穩(wěn)健。
絕對偏差值的中位數(shù)
因子值的合理范圍是。對數(shù)據(jù)范圍內(nèi)的所有因子做出如下調(diào)整:

三、標(biāo)準(zhǔn)化
1.Z-score標(biāo)準(zhǔn)化
- 前提:
- 由于使用了標(biāo)準(zhǔn)差,該方法對于數(shù)據(jù)中的異常值較為敏感
2.最大最小值差標(biāo)準(zhǔn)化(Min-Max Scaling)
將每個(gè)因子數(shù)據(jù)轉(zhuǎn)化為在 區(qū)間的數(shù)據(jù),以便比較不同規(guī)模或范圍的數(shù)據(jù),但它并不改變數(shù)據(jù)內(nèi)部的分布,也不會使總和變?yōu)?。
- 由于考慮極大極小值,對異常值敏感
- 統(tǒng)一量綱,利于比較不同維度的數(shù)據(jù)。
3.排序百分位(Rank Scaling)
將數(shù)據(jù)特征轉(zhuǎn)換為它們的排名,并將這些排名轉(zhuǎn)換為介于0和1之間的分?jǐn)?shù),通常是它們在數(shù)據(jù)集中的百分位數(shù)。*
- 由于排名不受異常值影響,該方法對異常值不敏感。
- 不保持?jǐn)?shù)據(jù)中各點(diǎn)之間的絕對距離,而是轉(zhuǎn)換為相對排名。
其中,, 為區(qū)間內(nèi)數(shù)據(jù)點(diǎn)的總個(gè)數(shù)。

四、數(shù)據(jù)頻率
有時(shí)獲得的數(shù)據(jù)并非我們分析所需要的頻率。比如分析的層次為月度,原始數(shù)據(jù)的頻率為日度,此時(shí)就需要用到“下采樣”,即聚合數(shù)據(jù)為月度。
下采樣
指的是將一個(gè)集合里的數(shù)據(jù)聚合為一行數(shù)據(jù),比如日度數(shù)據(jù)聚合為月度。此時(shí)需要考慮每個(gè)被聚合的指標(biāo)的特性,通常的操作有:
- 第一個(gè)值/最后一個(gè)值
- 均值/中位數(shù)
- 標(biāo)準(zhǔn)差
上采樣
指的是將一行數(shù)據(jù)的數(shù)據(jù)拆分為多行數(shù)據(jù),比如年度數(shù)據(jù)用在月度分析上。這種情況一般就是簡單重復(fù)即可,有時(shí)需要將年度數(shù)據(jù)按比例歸集于各個(gè)月份。