金融經(jīng)濟(jì)數(shù)據(jù)方面應(yīng)用Python非常廣泛,,也可以算是用Python進(jìn)行數(shù)據(jù)分析的一個(gè)實(shí)際應(yīng)用。
數(shù)據(jù)規(guī)整化方面的應(yīng)用
時(shí)間序列與截面對(duì)齊
在處理金融數(shù)據(jù)時(shí),,最費(fèi)神的一個(gè)問(wèn)題就是所謂的“數(shù)據(jù)對(duì)齊” (data alignment)問(wèn)題,。兩個(gè)相關(guān)的時(shí)間序列的索引可能沒(méi)有很好的對(duì)齊,或兩個(gè)DataFrame對(duì)象可能含有不匹配的列或行,。
Pandas可以在算術(shù)運(yùn)算中自動(dòng)對(duì)齊數(shù)據(jù),。在實(shí)際工作中,這不僅能為你帶來(lái)極大自由度,,而且還能提升工作效率,。如下,看這個(gè)兩個(gè)DataFrame分別含有股票價(jià)格和成交量的時(shí)間序列:
假設(shè)你想要用所有有效數(shù)據(jù)計(jì)算一個(gè)成交量加權(quán)平均價(jià)格(為了簡(jiǎn)單起見(jiàn),,假設(shè)成交量數(shù)據(jù)是價(jià)格數(shù)據(jù)的子集),。由于pandas會(huì)在算術(shù)運(yùn)算過(guò)程中自動(dòng)將數(shù)據(jù)對(duì)齊,并在sum這樣的函數(shù)中排除缺失數(shù)據(jù),,所以我們只需編寫(xiě)下面這條簡(jiǎn)潔的表達(dá)式即可:
由于SPX在volume中找不到,,所以你隨時(shí)可以顯式地將其丟棄。如果希望手工進(jìn)行對(duì)齊,,可以使用DataFrame的align方法,,它返回的是一個(gè)元組,含有兩個(gè)對(duì)象的重索引版本:
另一個(gè)不可或缺的功能是,,通過(guò)一組索引可能不同的Series構(gòu)建一個(gè)DataFrame,。
跟前面一樣,這里也可以顯式定義結(jié)果的索引(丟棄其余的數(shù)據(jù)):
時(shí)間和“最當(dāng)前”數(shù)據(jù)選取
假設(shè)你有一個(gè)很長(zhǎng)的盤(pán)中市場(chǎng)數(shù)據(jù)時(shí)間序列,,現(xiàn)在希望抽取其中每天特定時(shí)間的價(jià)格數(shù)據(jù),。如果數(shù)據(jù)不規(guī)整(觀測(cè)值沒(méi)有精確地落在期望的時(shí)間點(diǎn)上),該怎么辦,?在實(shí)際工作當(dāng)中,,如果不夠小心仔細(xì)的話,很容易導(dǎo)致錯(cuò)誤的數(shù)據(jù)規(guī)整化,??纯聪旅孢@個(gè)例子:
利用Python的datetime.time對(duì)象進(jìn)行索引即可抽取出這些時(shí)間點(diǎn)上的值:
實(shí)際上,該操作用到了實(shí)例方法at_time(各時(shí)間序列以及類(lèi)似的DataFrame對(duì)象都有):
還有一個(gè)between_time方法,,它用于選取兩個(gè)Time對(duì)象之間的值:
正如之前提到的那樣,,可能剛好就沒(méi)有任何數(shù)據(jù)落在某個(gè)具體的時(shí)間上(比如上午10點(diǎn))。這時(shí),,你可能會(huì)希望得到上午10點(diǎn)之前最后出現(xiàn)的那個(gè)值:
如果將一組Timestamp傳入asof方法,,就能得到這些時(shí)間點(diǎn)處(或其之前最近)的有效值(非NA),。例如,我們構(gòu)造一個(gè)日期范圍(每天上午10點(diǎn)),,然后將其傳入asof:
拼接多個(gè)數(shù)據(jù)源
在金融或經(jīng)濟(jì)領(lǐng)域中,,還有幾個(gè)經(jīng)常出現(xiàn)的合并兩個(gè)相關(guān)數(shù)據(jù)集的情況:
·在一個(gè)特定的時(shí)間點(diǎn)上,從一個(gè)數(shù)據(jù)源切換到另一個(gè)數(shù)據(jù)源,。
·用另一個(gè)時(shí)間序列對(duì)當(dāng)前時(shí)間序列中的缺失值“打補(bǔ)丁”,。
·將數(shù)據(jù)中的符號(hào)(國(guó)家、資產(chǎn)代碼等)替換為實(shí)際數(shù)據(jù),。
第一種情況:其實(shí)就是用pandas.concat將兩個(gè)TimeSeries或DataFrame對(duì)象合并到一起:
其他:假設(shè)data1缺失了data2中存在的某個(gè)時(shí)間序列:
combine_first可以引入合并點(diǎn)之前的數(shù)據(jù),,這樣也就擴(kuò)展了‘d’項(xiàng)的歷史:
DataFrame也有一個(gè)類(lèi)似的方法update,它可以實(shí)現(xiàn)就地更新,。如果只想填充空洞,,則必須傳入overwrite=False才行:
上面所講的這些技術(shù)都可實(shí)現(xiàn)將數(shù)據(jù)中的符號(hào)替換為實(shí)際數(shù)據(jù),但有時(shí)利用DataFrame的索引機(jī)制直接對(duì)列進(jìn)行設(shè)置會(huì)更簡(jiǎn)單一些:
收益指數(shù)和累計(jì)收益
在金融領(lǐng)域中,,收益(return)通常指的是某資產(chǎn)價(jià)格的百分比變化,。一般計(jì)算兩個(gè)時(shí)間點(diǎn)之間的累計(jì)百分比回報(bào)只需計(jì)算價(jià)格的百分比變化即可:對(duì)于其他那些派發(fā)股息的股票,要計(jì)算你在某只股票上賺了多少錢(qián)就比較復(fù)雜了,。不過(guò),,這里所使用的已調(diào)整收盤(pán)價(jià)已經(jīng)對(duì)拆分和股息做出了調(diào)整。不管什么樣的情況,,通常都會(huì)先算出一個(gè)收益指數(shù),,它是一個(gè)表示單位投資(比如1美元)收益的時(shí)間序列。
從收益指數(shù)中可以得出許多假設(shè),。例如,,人們可以決定是否進(jìn)行利潤(rùn)再投資。我們可以利用cumprod計(jì)算出一個(gè)簡(jiǎn)單的收益指數(shù):
得到收益指數(shù)之后,,計(jì)算指定時(shí)期內(nèi)的累計(jì)收益就很簡(jiǎn)單了:
當(dāng)然了,,就這個(gè)簡(jiǎn)單的例子而言(沒(méi)有股息也沒(méi)有其他需要考慮的調(diào)整),上面的結(jié)果也能通過(guò)重采樣聚合(這里聚合為時(shí)期)從日百分比變化中計(jì)算得出:
如果知道了股息的派發(fā)日和支付率,,就可以將它們計(jì)入到每日總收益中,,如下所示:
|