Pandas(IV)—DataFrame (下) 金融資料應用:合併與累計報酬

今天,我們來聊聊如何計算不同股票的累計報酬,最終以折線圖呈現。過程中,我們會認識Pandas裡面很好用的一個功能—合併(merge),以及累計報酬的計算方式。本單元以Google及微軟的股票為例,資料及程式檔案置於文末,提供有需要的朋友下載練習。

資料合併

在做金融資料分析時,我們時常會從不同的資料源得到各種資料。在Excel中,我們會透過複製貼上後再去做整合。在Python中,我們要怎麼將這些零散的資料整合在一起呢? 答案是—merge!

(一) 引入模組

在做分析之前,我們先引入一些今天會用到的模組。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

(二) 讀取資料

首先,我們透過pd.read_csv(‘檔案名稱’)將我們的csv檔讀取到python裡面,如果是excel檔,則是pd.read_excel(‘檔案名稱’),以此類推。在此,我們分別讀入google與微軟的交易日資料。

這麼一來,兩檔股票的交易資料都已經匯入了。順帶一提,細心的讀者會發現到,雖然整個格式很類似,但這兩檔股票資料的起始日期是不一樣的。

(三) 合併資料

接下來,我們要透過merge,來把兩張大表結合在一起。在merge裡面,我們可以藉由on來決定要以什麼欄位當作合併的依據,並且用how來決定要取交集、聯集或是其他方式。
merge(資料1,資料2,on=’欄位依據’,how=’合併方法’)

在這裡,我們依據欄位”Date”當作合併資料的基底,將相同日期的資料整合在一起。在採用how=’left’時,代表我們以左邊的資料(GOOG)日期為基礎,因此當右邊的資料(MSFT)沒有值的時候會自動補上”NaN”。而當我們採用how=’inner’時,則會顯示兩者資料皆有日期的部分才會顯示,就是取交集的意思。

(本身表格比較大,此為截圖,右端還有MSFT的其他欄位)

資料合併後,我們也會發現到,當資料欄位名稱一樣時,最終DataFrame會幫我們自動加上x,y以作為辨別。

到了這邊,我們已經學會如何將資料讀進並且彙整在一起了!

(四)有效率的資料整合

但說實在的,這個DataFrame其實有點亂,並不好用。因此,接下來,我們要結合上個單元所學,先整理好資料格式,並把我們想要的資料擷取出來。

前置作業分幾個步驟:

1. 讀取資料
2. 將index設定為日期
3. 取出我們想到的欄位,比方說在這裡我們取調整後收盤價及成交量
4. 將欄位重新命名

透過上面這四個步驟,我們的DataFrame將變得簡潔,只留下我們所需的資料。

合併資料

接下來,我們要將兩個資料表依據日期合併在一起。值得注意的是,在這裡我們已經沒有”Date”這個欄位了,取而代之的是index。因此,我們可以透過將兩邊的index打開,進行合併的動作,程式碼如下:
df=pd.merge(GOOG,MSFT,left_index=True,right_index=True,how='inner')

在這裡我們可以看到,透過前製作業的整理及重新命名,我們最終的DataFrame變得更為清晰。

繪圖

現在,我們可以透過繪圖的方式來看到這兩支股票的走勢。

圖是畫出來了。但很明顯,我們遇到一個問題,兩者的股價差異太大了,因此我們幾乎看不出微軟股價變動的差異。

累計報酬計算

為了解決這樣的問題,我們可以採用計算累計報酬的方式,將漲幅以百分比的形式表示,則兩者的漲幅將可進行比較。

(一)累計報酬的計算

在上個單元我們介紹過log return,並提到他在數學上有一些良好的性質,會使我們在計算上更為方便。現在,讓我們一起來看一下。

首先,我們知道總報酬為

$$\frac{P_T-P_0}{P_0}=\frac{P_T}{P_0}-1$$

我們看到前面的部分,將$\frac{P_T}{P_0}$取log後依據log性質處理可以變成什麼樣

$$\log \frac{P_T}{P_0}=\log P_T- \log P_0$$

$$= \log P_T – \log P_{T-1} + \log P_{T-1}- \log P_{T-2} + \log P_{T-2} – \log P_{T-3}…+\log P_1 – \log P_0 $$

$$=\log \frac{P_T}{P_{T-1}} + \log \frac{P_{T-1}}{P_{T-2}} +… +\log \frac{P_1}{P_0} $$

這不就是每天股價變化百分比取log的加總嗎?

因此,第一步,我們可以先把股價取log相減,算出每天的log return

接下來,我們透過cumsum函數把每日的log return加總,並取指數(exp)還原回去,最後再減1,每天的累計報酬就算出來了! 然後,我們再次以折線圖來視覺化。

轉換成累計報酬的表示法後,我們可以輕鬆得比較,發現在這段期間,其實整體而言微軟的表現是勝過google的。

今天,我們學會了如何合併資料以及累計報酬的計算。拿起你手邊的資料,一起來試試吧!

延伸閱讀

1. numpy(II)—實用函數介紹

2.Pandas(III)—DataFrame (中) 金融資料應用

程式與資料檔案,歡迎於此下載

Share

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *