python做事件研究法_35行代码搞定事件研究法(上)
作者簡介:
祝小宇,個人公眾號:大貓的R語言課堂
這期大貓課堂將會教大家如何用35行R代碼寫出最有效率的事件研究法。
注意,本代碼主要使用data.table完成,關于data.table包的相應知識會在涉及的時候進行講解。在以后的課堂中,我們會重點介紹data.table這個包。
1 事件研究法的基本過程
首先,我們先來回顧一下事件研究法的基本過程:
根據上圖,T日是事件日,事件研究法的目的是計算事件日前后若干日超額收益(CAR)之和,而超額收益的定義為該股當日收益減去模型收益之差。如果我們用C1與C2標記CAR窗口期,用M1與M2標記模型的估計期(C1、C2、M1、M2都為正數,定義見上圖),則上圖的含義為:
在?[T - M1, T - M2]?的區間內估計市場模型,并在?[T - C1, T + C2]?的區間內計算超額收益率。
在這里,我們姑且用最簡單的市場模型來估計收益,即:
r = alpha + beta * (r - rm)
其中,r?表示個股每日的收益率,rm?表示對應日期市場指數的收益率。
2 樣例數據集
一切沒有栗子的講解都是耍流氓,現在我們就假設需要對如下數據集運用事件研究法:
其中,stk.id表示股票代碼,date是日期,r表示個股收益率,rm表示市場收益率,event.flg是事件日標識。如果當天不是事件日,event.flg為0,否則為1。(似乎莫名其妙立了flag……)由上圖可知,只有在第30行發生了事件(用紅框框出)。
不妨進一步假設C1 = C2 = 1, M1 = 10, M2 = 5。也即我們的CAR窗口期為[T - 1, T + 1],模型的估計期為[T - 10, T?- 5]。當然那么短的模型估計期(5天)是非常不現實的,這里僅為了舉例方便這樣設定。
3 舉一個詳細的栗子
OK,既然栗子也有了,我們就要正式開工啦。本著從特殊到一般的原則,在這一講中,我們首先假設現在只有一個事件日。針對這一個事件日,大貓會給出一個叫做?do_car()?的自定義函數計算其對應的超額收益。當以后出現多個事件日時,我們只要對每個事件日都調用一次 do_car() 函數就可以了。
這種“先把任務分解為任務單元,為每個任務單元寫一個函數,然后再批量調用函數”的方法,希望大家好好掌握哦!
既然我們的目標是寫一個函數 do_car(),那么其肯定有參數。為了計算超額收益,我們需要以下四個輸入變量:1)個股收益向量 r, 2)市場收益向量 rm,3)日期向量,4)事件日發生的序號 n。因此這個 do_car() 大致會長這個樣子:
do_car
}
那么如何把函數的主體填充進去,從而計算單個事件日對應的超額收益呢?大貓給出以下三個步驟:
Step I. 先定位事件日,然后根據給定的參數分別截取出模型估計期 [T - 10, T?- 5] 以及CAR窗口期 [T - 1, T + 1] 的收益率 r、rm
Step II. 根據模型估計期的 r 與 rm 數據估計收益率模型的參數 alpha,beta,并計算超額收益率
Step III. 輸出最終結果
Step I:截取收益率向量
我們用n來標記事件日的序號。例如在我們的例子中,第30天發生了事件,因而n=30。需要注意的是在我們的例子中 n 是一個標量,下節課中我們會把n拓展為向量,也即引入多個事件日。
確定了事件日序號之后,我們就可以用他來截取收益率向量了。模型估計期的個股收益向量為?r[n - m2, n - m1],(n - m2表示截取起點,n - m1表示截取的終點),我們將其命名為 r.model。同理,模型估計期對應的市場收益率的向量為?rm[n - m2, n - m1],我們將其命名為 rm.model。類似的,我們可以分別截取出CAR窗口期的收益率向量。代碼如下:
i1
i2
i3
i4
r.model
rm.model
r.car
rm.car
其中,r 表示個股收益,rm 表示市場收益,后綴model表示模型估計期,后綴car表示CAR窗口期。
Step II:估計模型,計算超額收益率
得到了r.model, rm.model 這兩個變量,我們就可以進行收益模型的估計了。我們使用R內置的多元線性回歸函數:
> model coef
> ars
先來看第一行。其中,lm是回歸函數,“~”符號左邊的是因變量r.model,右邊的是自變量?I(r.model - rm.model),最后得到的回歸模型命名為“model”。R默認回歸中有常數項,因而在公式中不需要顯式表示。另外,函數I()表示要把r.model - rm.model的結果作為一個變量來看待。
再來看第二行。要知道在R中,線性回歸的結果是一個類名為“lm”的對象,這個對象包含了回歸結果的系數、p值、殘差等等元素。而coef()函數的作用就是提取回歸結果的系數。
最后看第三行。這一行的作用是用估計得到的模型預測CAR窗口期股票的收益率。predict()函數用來預測模型。第一個參數model指出了預測所依據的模型(就是我們上面估計得到的model),第二個參數指定了自變量,其中“r.model = r.car”表示把model中的r.model變量用r.car變量代替,類似的,"rm.model = rm.car"表示把model中的rm.model變量替換成rm.car。最后,我們用股票的實際收益率(r.car)減去由模型計算得到的收益率(predict()函數計算的結果),就能得到股票的超額收益(ars, abnormal returns)。需要注意的是,剛才提到的ars, r.car, r.model等變量都是向量,而不是標量。
Step III:輸出最終結果
得到了超額收益率向量ars,我們需要確定最終輸出的結果應該是什么樣子。一般來說,對于每一個事件日(非事件日我們不輸出結果),我們需要保留股票代碼stk.id、事件日date、該事件日對應的收益率模型系數coef,以及該事件日窗口期間的超額收益。因此最終輸出結果應該大致長下面這個樣子:
關于上面這個輸出結果,有以下三點需要注意:
1. 圖中每一行都對應一個事件日,非事件日不輸出結果。上圖中說明6月17日發生了一個事件。
2. ars是超額收益率向量,因為我們的例子中把超額收益率區間定為 T 日前后各一天,因此 ars 共有三個元素。注意,我們這里沒有直接輸出加總后的CAR,而是輸出超額收益向量ars。這是因為輸出超額收益向量便于我們后期進行各種復雜的計算。
3. coef、ars都是向量
這一步對應的代碼是:
list(date = date[n], coef = list(coef), ars = list(ars))
這一行代碼指定了我們需要輸出的三個變量:事件日、收益率模型系數以及超額收益。其中,coef = list(coef)的含義是把向量coef打包成一個list類型的變量,并命名為coef。date = date[n]的含義是選取date變量的第n個元素(也就是事件日),并命名為date。最外面的list()則把其中的三個元素打包成一個大的list。值得一提的是,我們在這里運用了把向量打包成list的這個小技巧,這一技巧在進行回歸計算時非常有用,其作用以及應用場景將會在以后詳細講述。現在只要知道它用來輸出結果就可以了。
將step I ~ III 歸納為函數
把 step I?至 step III 歸納成函數的話就是:已知個股收益率向量r、市場收益率向量rm、日期向量date,以及事件日的序號n(標量),我們就可以用以下函數計算對應事件日的超額收益率向量ars——
do_car m2)? ? if (n - m1 < 0) {? ? ? ? cat("n =", n, "is too small \n")? ? } else if (n + c2 > length(r)) {? ? ? ? cat("n =", n, "is too large \n")? ? } else {? ? ? ? i1
其中,(n - m1 < 0)以及(n + c2 > length(r)) 這兩條語句的作用是:如果事件日出現在收益率向量的太前面或者太后面,以至于向前向后追溯無法滿足估計模型或者CAR窗口期的要求,那么該事件日將被剔除。
下期預告
至此,我們已經學會如何針對單一事件日計算超額收益了。然而現實生活中我們往往要計算多個股票多個事件日的超額收益,這時應該怎么做?小伙伴們不用擔心,其實只需要添加幾行代碼就可以了。具體做法,就請期待下一次的大貓課堂——35行代碼搞定事件研究法(下)
公眾號后臺回復關鍵字即可學習回復爬蟲爬蟲三大案例實戰
回復Python1小時破冰入門
回復數據挖掘R語言入門及數據挖掘
回復人工智能三個月入門人工智能
回復數據分析師數據分析師成長之路
回復機器學習機器學習的商業應用
回復數據科學數據科學實戰
回復常用算法常用數據挖掘算法
總結
以上是生活随笔為你收集整理的python做事件研究法_35行代码搞定事件研究法(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http服务(nginx、apache)
- 下一篇: python爬取微博热搜显示到折线图_P