數(shù)據(jù)清理中存在的問(wèn)題及對(duì)策
本文轉(zhuǎn)載自微信公眾號(hào)「數(shù)倉(cāng)寶貝庫(kù)」,作者趙志強(qiáng) 等。轉(zhuǎn)載本文請(qǐng)聯(lián)系數(shù)倉(cāng)寶貝庫(kù)公眾號(hào)。
現(xiàn)實(shí)世界中的數(shù)據(jù)量越來(lái)越大,也越來(lái)越容易受到噪聲、缺失值和不一致數(shù)據(jù)等的影響。數(shù)據(jù)庫(kù)太大,如若有不同的來(lái)源,那么臟數(shù)據(jù)問(wèn)題一定會(huì)存在,這是不可避免的。為了使數(shù)據(jù)中的各種問(wèn)題對(duì)我們的建模影響最小化,需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。
在實(shí)際操作中,數(shù)據(jù)預(yù)處理通常分為兩大步,一是數(shù)據(jù)清洗,二是數(shù)據(jù)的基本分析。這兩步并不一定是按先后順序進(jìn)行的,通常也會(huì)相互影響。比如,有的錯(cuò)誤數(shù)據(jù)(不可能出現(xiàn)的極值),必須通過(guò)基本的統(tǒng)計(jì)分析才能發(fā)現(xiàn)。
有一種說(shuō)法,數(shù)據(jù)的預(yù)處理會(huì)占據(jù)絕大部分的工作量,有的甚至?xí)_(dá)到所有工作量的80%,建模和算法真正的工作量其實(shí)只有20%。這個(gè)結(jié)論在互聯(lián)網(wǎng)或者傳統(tǒng)IT領(lǐng)域,特別是面對(duì)大量的非結(jié)構(gòu)化數(shù)據(jù)時(shí),確實(shí)是事實(shí)。
所以第一步,也是非常關(guān)鍵的一步,就是數(shù)據(jù)清理。為了清理數(shù)據(jù),我們必須要知道可能存在的問(wèn)題,才能針對(duì)相應(yīng)的問(wèn)題設(shè)計(jì)相應(yīng)的方法。
原始數(shù)據(jù)可能存在如下三種問(wèn)題。
- 數(shù)據(jù)缺失:數(shù)據(jù)缺失的問(wèn)題在高頻數(shù)據(jù)里面特別常見(jiàn)。而且由于很多投資者是自己實(shí)時(shí)下載的數(shù)據(jù),因此即使之后發(fā)現(xiàn)也很難彌補(bǔ)。
- 噪聲或者離群點(diǎn):由于系統(tǒng)或者人為的失誤,導(dǎo)致數(shù)據(jù)出現(xiàn)明顯的錯(cuò)誤,比如某支股票的價(jià)格本應(yīng)在12元左右,結(jié)果突然出現(xiàn)了100元的價(jià)格數(shù)據(jù)。
- 數(shù)據(jù)不一致:很多投資者,為了確保數(shù)據(jù)正確性,會(huì)使用多個(gè)數(shù)據(jù)源進(jìn)行交叉驗(yàn)證,這時(shí)往往會(huì)出現(xiàn)數(shù)據(jù)不一致的問(wèn)題。即使是同一個(gè)數(shù)據(jù)源,有時(shí)候也會(huì)出現(xiàn)數(shù)據(jù)不一致的問(wèn)題。比如期貨行情數(shù)據(jù),Wind、文華、MC的數(shù)據(jù)都有可能出現(xiàn)不一致的問(wèn)題,數(shù)據(jù)頻率越高,不一致的可能性就越大。
01缺失值
針對(duì)缺失值,實(shí)際操作中,需要兩套程序:一套程序是檢查缺失值,一套程序是填補(bǔ)缺失值。一般流程是,先檢查缺失值,研究缺失值,選擇填補(bǔ)方法,進(jìn)行填補(bǔ),然后再次檢查。這樣迭代循環(huán),直到將數(shù)據(jù)缺失控制在可接受范圍內(nèi)。
缺失值,也有多種類(lèi)型,一種是“正常缺失”,比如股票在某一天停牌,那么這一天的交易數(shù)據(jù)就是沒(méi)有的。一種是“非正常缺失”,比如明明有交易,但就是沒(méi)有交易數(shù)據(jù)。
舉個(gè)例子,在下載5分鐘數(shù)據(jù)的時(shí)候,發(fā)現(xiàn)20160104的數(shù)據(jù)都有缺失,但Wind上的數(shù)據(jù)又顯示當(dāng)天的交易情況為“交易”。實(shí)際情況是當(dāng)天發(fā)生了“熔斷”,因?yàn)槭切碌臋C(jī)制,所以Wind還沒(méi)來(lái)得及準(zhǔn)備一個(gè)字段用于表示當(dāng)天的交易狀態(tài)。這種情況就屬于數(shù)據(jù)的“正常缺失”,只是交易狀態(tài)與數(shù)據(jù)不一致而已。Wind的交易狀態(tài)字段如下圖所示。
在檢查缺失值時(shí),這兩種缺失需要分辨清楚,因?yàn)椴煌娜笔е担幚矸椒ㄒ膊灰粯印z查好缺失值之后,就需要進(jìn)行處理了。先處理“非正常缺失”,一般流程具體如下。
1)檢查提取數(shù)據(jù)是否出錯(cuò)。有時(shí)候,數(shù)據(jù)源本身是完整的,然而自己在提取數(shù)據(jù)的時(shí)候出現(xiàn)了問(wèn)題。比如,筆者在使用市場(chǎng)上某家的金融高頻數(shù)據(jù)的時(shí)候,下載5分鐘數(shù)據(jù)計(jì)算高頻波動(dòng)率,發(fā)現(xiàn)存在很多缺失的數(shù)據(jù)。經(jīng)該公司后臺(tái)查詢(xún)后發(fā)現(xiàn),他們的數(shù)據(jù)庫(kù)其實(shí)是有這個(gè)數(shù)據(jù)的,這說(shuō)明是在下載數(shù)據(jù)的過(guò)程中出現(xiàn)了問(wèn)題。
2)從其他數(shù)據(jù)源提取。有的數(shù)據(jù)源本身就缺失了數(shù)據(jù),對(duì)于這種情況可以再尋找另外一個(gè)數(shù)據(jù)源進(jìn)行補(bǔ)充。
算法填充。有的時(shí)候,我們沒(méi)有辦法使用多數(shù)據(jù)源進(jìn)行補(bǔ)充,而且有的數(shù)據(jù)本身就有空缺,無(wú)法補(bǔ)充。這個(gè)時(shí)候,可以退而求其次,使用算法填充。
常用算法有向前填充和向后填充兩種。所謂向前填充是指使用之前最近的一個(gè)數(shù)據(jù)對(duì)空值進(jìn)行填充。向后填充是指使用之后最近的一個(gè)數(shù)據(jù)對(duì)空值進(jìn)行填充。
Pandas提供了一個(gè)函數(shù)用于數(shù)據(jù)填充。示例代碼如下:
- df = pd.DataFrame([[np.nan, 2, np.nan, 0],
- ... [3, 4, np.nan, 1],
- ... [np.nan, np.nan, np.nan, 5],
- ... [np.nan, 3, np.nan, 4]],
- ... columns=list('ABCD'))
- df
- A B C D
- 0 NaN 2.0 NaN 0
- 1 3.0 4.0 NaN 1
- 2 NaN NaN NaN 5
向前填充的示例代碼如下:
- df.fillna(method='ffill')
- A B C D
- 0 NaN 2.0 NaN 0
- 1 3.0 4.0 NaN 1
- 2 3.0 4.0 NaN 5
- 3 3.0 3.0 NaN 4
除了向前填充,該函數(shù)也支持向后填充,不過(guò),要使用特定的值進(jìn)行填充。
有的數(shù)據(jù)發(fā)生了缺失,無(wú)法使用簡(jiǎn)單的向前填充或向后填充來(lái)處理。比如,使用Wind下載a股復(fù)權(quán)數(shù)據(jù),會(huì)發(fā)現(xiàn)交易狀態(tài)trade_status在1999年之前都是空值,雖然實(shí)際上是有交易的,但如果直接按照trade_status=‘交易’這個(gè)條件來(lái)篩選,將會(huì)把1999年之前的所有數(shù)據(jù)都去掉。這個(gè)時(shí)候就需要根據(jù)邏輯設(shè)計(jì)一個(gè)算法來(lái)進(jìn)行填充,比如將成交量volume>0的都填充為“交易”。
02 噪聲或者離群點(diǎn)
噪聲或離群點(diǎn)的問(wèn)題一般有兩種情況,一種是數(shù)據(jù)錯(cuò)誤導(dǎo)致的,比如本來(lái)應(yīng)該是10.0的數(shù)據(jù),錯(cuò)誤顯示為10000;另一種則是其本身是真實(shí)數(shù)據(jù),但就是離群點(diǎn),比如金融危機(jī)中的收益率或者波動(dòng)率,可能就非常極端,成為離群點(diǎn)。
一般的處理步驟具體如下。
1)通過(guò)一定的算法識(shí)別出離群點(diǎn)。一般是使用該數(shù)據(jù)標(biāo)準(zhǔn)差的多少倍來(lái)判斷。比如正太分布中,正負(fù)標(biāo)準(zhǔn)差3倍以上的概率是99.7%,可以將其認(rèn)定為可疑離群點(diǎn)。
2)人工判斷離群點(diǎn)是屬于錯(cuò)誤數(shù)據(jù)導(dǎo)致的,還是正常的離群點(diǎn)。
3)對(duì)離群點(diǎn)進(jìn)行處理。一般來(lái)說(shuō),錯(cuò)誤的離群點(diǎn)需要更正或者刪除。正常的離群點(diǎn)則需要另外建模進(jìn)行分析。
03數(shù)據(jù)不一致
為了確保數(shù)據(jù)的準(zhǔn)確性,有時(shí)候需要使用多種數(shù)據(jù)源進(jìn)行交叉驗(yàn)證。比如,在研究港股的時(shí)候,對(duì)比了Wind和Bloomberg的后復(fù)權(quán)數(shù)據(jù)之后,發(fā)現(xiàn)兩者存在很大的差別,這就是數(shù)據(jù)不一致的問(wèn)題,但我們并不能確定哪一個(gè)才是正確的,于是又加入了同花順和CSMAR的數(shù)據(jù)進(jìn)行對(duì)比,發(fā)現(xiàn)后者與Wind的數(shù)據(jù)是一致的。所以可以確認(rèn)是Bloomberg的問(wèn)題,因而采用Wind的數(shù)據(jù)。
當(dāng)然,在實(shí)際工作中,數(shù)據(jù)清理的問(wèn)題要遠(yuǎn)遠(yuǎn)多于這里介紹的幾種,需要系統(tǒng)性地、仔細(xì)地去處理。
本書(shū)摘編自《Python量化投資:技術(shù)、模型與策略》,經(jīng)出版方授權(quán)發(fā)布。