金融經(jīng)濟(jì)數(shù)據(jù)方面應(yīng)用Python非常廣泛,也可以算是用Python進(jìn)行數(shù)據(jù)分析的一個(gè)實(shí)際應(yīng)用。
時(shí)間序列與截面對(duì)齊
在處理金融數(shù)據(jù)時(shí),最費(fèi)神的一個(gè)問題就是所謂的“數(shù)據(jù)對(duì)齊” (data alignment)問題。兩個(gè)相關(guān)的時(shí)間序列的索引可能沒有很好的對(duì)齊,或兩個(gè)DataFrame對(duì)象可能含有不匹配的列或行。
Pandas可以在算術(shù)運(yùn)算中自動(dòng)對(duì)齊數(shù)據(jù)。在實(shí)際工作中,這不僅能為你帶來極大自由度,而且還能提升工作效率。如下,看這個(gè)兩個(gè)DataFrame分別含有股票價(jià)格和成交量的時(shí)間序列:
假設(shè)你想要用所有有效數(shù)據(jù)計(jì)算一個(gè)成交量加權(quán)平均價(jià)格(為了簡(jiǎn)單起見,假設(shè)成交量數(shù)據(jù)是價(jià)格數(shù)據(jù)的子集)。由于pandas會(huì)在算術(shù)運(yùn)算過程中自動(dòng)將數(shù)據(jù)對(duì)齊,并在sum這樣的函數(shù)中排除缺失數(shù)據(jù),所以我們只需編寫下面這條簡(jiǎn)潔的表達(dá)式即可:
由于SPX在volume中找不到,所以你隨時(shí)可以顯式地將其丟棄。如果希望手工進(jìn)行對(duì)齊,可以使用DataFrame的align方法,它返回的是一個(gè)元組,含有兩個(gè)對(duì)象的重索引版本:
另一個(gè)不可或缺的功能是,通過一組索引可能不同的Series構(gòu)建一個(gè)DataFrame。
跟前面一樣,這里也可以顯式定義結(jié)果的索引(丟棄其余的數(shù)據(jù)):
假設(shè)你有一個(gè)很長(zhǎng)的盤中市場(chǎng)數(shù)據(jù)時(shí)間序列,現(xiàn)在希望抽取其中每天特定時(shí)間的價(jià)格數(shù)據(jù)。如果數(shù)據(jù)不規(guī)整(觀測(cè)值沒有精確地落在期望的時(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í)間序列以及類似的DataFrame對(duì)象都有):
還有一個(gè)between_time方法,它用于選取兩個(gè)Time對(duì)象之間的值:
正如之前提到的那樣,可能剛好就沒有任何數(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:
在金融或經(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è)類似的方法update,它可以實(shí)現(xiàn)就地更新。如果只想填充空洞,則必須傳入overwrite=False才行:
在金融領(lǐng)域中,收益(return)通常指的是某資產(chǎn)價(jià)格的百分比變化。一般計(jì)算兩個(gè)時(shí)間點(diǎn)之間的累計(jì)百分比回報(bào)只需計(jì)算價(jià)格的百分比變化即可:對(duì)于其他那些派發(fā)股息的股票,要計(jì)算你在某只股票上賺了多少錢就比較復(fù)雜了。不過,這里所使用的已調(diào)整收盤價(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)單的例子而言(沒有股息也沒有其他需要考慮的調(diào)整),上面的結(jié)果也能通過重采樣聚合(這里聚合為時(shí)期)從日百分比變化中計(jì)算得出:
如果知道了股息的派發(fā)日和支付率,就可以將它們計(jì)入到每日總收益中,如下所示:
聯(lián)系客服