日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python做事件研究法_35行代码搞定事件研究法(上)

發布時間:2024/1/8 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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行代码搞定事件研究法(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。