好,那接下來我們來更仔細地看一下這個回歸的這個部分,那回歸的這個部分呢 下面這些
code 就是跟前面的基本上是很類似的,只是說我們就特別截取這個 if else 的這一段出來。
所以呢,我們現在就是針對這個當你 發現說我們已經前一個
股票的資料已經全部都讀完了,我們已經讀到下一筆股票的 資料的時候,這時候該怎麼辦呢?我們就會去檢查一下說,這時候呢
我們累積的資料的長度夠不夠長,那如果累積的資料長度夠長的話, 我們就可以跑回歸了,對不對?所以我們就說我們要開始跑回歸啦,
那我們這時候跑的事實上是前一個股票的回歸,所以是 list_coid,然後呢我們就,這時候我們就可以把我們
這個的資料傳到一個函數,這個函數 叫做
compute_model,這個到時候我們會去定義說 compute_model 是什麼。
那但它基本上就是把我們累積的這個 這支股票的所有的日報酬,還有這些日報酬的日期
以及所有的這個 market return 全部都丟給這個 compute_model,然後這 compute_model 會幫我們做
一些這個市場報酬的 merge 啊,然後最後去跑回歸。
然後呢 這個結果會把它傳出來,傳到這個 out 這個變數。
那所以接下來我們就來看一下,這個中間呢這個 compute_model
在跑回歸之前呢,需要做一件事情就是說它必須要去做這個 market return 的合併。
那 market return 的合併要怎麼做呢?那我們有的資料事實上是這個
sdate, sdate 就是說呢這些這個 return 的日期是什麼。
那它的形式就是是一個字串的形式,比如說 20160118
的這個樣子,所以我們這邊是給了一個比較小的例子,比如說我們的 sdate 是長這個樣子。
然後呢我們這時候呢就是說呢我們希望把 用這些
sdate 呢去合併 market return
的資料,那大家如果還記得的話 market return 裡面的資料呢事實上呢
是所有的這個市場的日資料,就是包含 你會用到還有你不會用到的部分。
所以我們必須 要從這裡面去挑我們要的,所以我們要依照這些日期
一個一個的日期,依照這個日期的順序去把我們要的那個 market return 的資料拉出來。
所以我們就先建一個空的 xlist,然後呢我們就 開始
loop through 這個 sdate 裡面的所有的資料。
每一個 sdate 做什麼事情呢?把它的,把它當成是
key,然後呢丟給這個 market return,叫 market
return 吐出來那一天 的這個市場的報酬到底是多少,然後把它 append 到 xlist 裡面。
那你如果這樣做的話呢,這裡面的這個數字 剛好就會是你在
sdate 裡面的 這個每一天的 market
return,所以呢你如果 不放心的話,你可以 check 一下,比如說
market return 的這個 2016 年的 0119
那一天是 0.5595 嘛,那 0119 是出現在第二天,所以第二天
的確是 0.5595。
所以這個基本上 就是是我們怎麼樣去用這個 market return 來合併這個市場的報酬。
所以看完了那個部分之後呢,我們就可以去來定義 我們的這個
compute_model 這個函數,那函數的定義我想各位現在應該都蠻熟悉的。
我們的傳入一個是 ylist,就是我們的這個 stock 的 return,sdate
就是是相對應的那些 return 的日期,以及這個 market return 是那個 market return 的那個
dictionary,然後呢這邊有 稍微說明一下這些變數是什麼意思,那我們用個
triple quote 把它引起來,那這是當成是註解的意思。
那這個所以我們這個 xlist 這個部分呢就是說我們前面看到的那個
那一段程式碼,對不對?所以在這邊呢我們就可以去把 sdate
裡面的 每一個 date 對應的 market return
把它抓出來,然後呢把它擺到 xlist 裡面, 然後呢最後我們 check 一下
xlist 跟 ylist 長度有沒有一樣,因為它 suppose 要是一樣的,
如果不一樣的話,就表示你做錯了,所以不一樣的話,我們就會 raise 一個 exception,說
這個是有問題的,那如果是這樣子的話 它這個
function 會停下來,不然的話它就會繼續往下走。
然後呢,最後呢有了這個 x 跟 y 之後,我們就可以跑回歸了,所以我們就去
call 另外一個函數,叫做 simple regression,對不對?simple regression,然後把
x 傳進去,把 y 傳進去,然後把它的傳回值呢 當成是我們這個函數的傳回值。
所以這大概是到這邊之後差不多都完成。
那跟大家特別說明一下,raise exception 是會讓 python
是丟例外出來,所以程式會說有問題,有問題發生。
所以我們最後呢,剩一件事情,就是我們要定義這個 simple regression 這個函數。
那 simple regression 要怎麼樣算呢?它基本上是一個
單變數回歸,我想大部分的人如果有修過統計的話呢,應該會對單變數 回歸會相當地熟悉。
那單變數回歸是長這個樣子,對不對? 是 yi=α+βxi,再加上一個殘差
εi,對不對? 然後呢你如果去用最小平方法去解的話,你會
知道說 β 的估計值是長這個樣子,這是它的公式。
然後呢,α hat 的估計值是長這個樣子,其中這個 y
bar 就是所有的 y 的平均,x bar 是所有的 x 的平均,β hat
就是這邊算出來的,然後呢還有就是說這個是整個模型的 這個
standard deviation,它是用殘差的平方算出來的。
然後呢還有所謂的 R square,這個 R square 就是說這個模型的資料配適的程度好不好。
R square 會介於 0 跟 1 之間,對不對?如果它是 1 的話,表示模型是
100% 配適,如果是 0 的話,表示 模型是完全沒有解釋力的。
那所以我想各位呢 應該可以很容易地依照這個公式呢去把這個 simple regression 把它實做出來。
那所以你如果有興趣的話呢,你可以自己試試看,或者是看我們的 這個範例的程式碼。
那所以呢這個我們的 simple regression 做的事情基本上就是 take
xlist 跟 ylist 兩個變數,對不對?然後中間做的事情就是我們在前一頁
slide 講的 那個那些計算,那我們最後 return 什麼東西呢?我們最後
return α β s 跟 R square,return 這四個東西。
所以你如果 寫好之後呢,你可以自己測試一下,比如說我如果把 x 定成這樣、
y 定成這樣子的話, 你把它丟到 simple regression,它就會丟出四個
一個 list 裡面有四個 elements,第一個就是 α, 第二個是
β,第三個是 s, 第四個是這個 R square。
那有這些東西之後呢,我們基本上就是事情都已經完備了,
那事情完備之後呢,我們到時候會用一個迴圈的方式來跑回歸嘛,
那你要做這件事情的時候呢,我們回歸跑完之後我們還要把結果存起來,對不對?所以我們要- 定義一些
別的變數來存放這個回歸的結果,所以我們在這邊就定義這
一大堆的這個變數來存放回歸的結果。
其中第一個就是說 這個股票的代碼,股票的名字,
還有呢這支股票的這個 α 的結果、 β 的結果、 還有 s。
這就是這個 standard deviation 對比度?標準差,還有這個是 R
square 的結果,全部都是一個 list, 所以到時候就可以用 append 的方式把它 append 上去。
所以我們就是說 針對每隻股票,我們跑完了這個回歸之後呢,
接下來做的事情就把這個結果 out,這個結果呢, 把它呢,把它
append 到這些什麼 α β s 跟 xlist 跟 R square
list 裡面,對不對?然後呢 這個當然就是說呢
這支股票相對的這個股票代碼也要把它存起來,還有它的名字存起來。
這樣到時候我們 才知道說這個結果是誰的。
所以這些東西 suppose 它的長度都一樣,而且它是會
在這個某一個位置會對應到 某一支股票的結果,大概是這個樣子。
那 那在這邊有一個小小的
這個事情大家需要注意的就是說,我們前面的這個做法我們是 這個資料是這樣依序讀下來,那讀下來的時候如果說你看到這個
股票代碼跟前一筆資料不一樣的話,我們就跑回歸, 看它跟前面資料都不一樣,我們就跑回歸。
所以你如果這樣做的話,你最後一隻股票 的資料會沒有跑到回歸,因為就資料已經結束了嘛。
所以我們要在整個迴圈結束之後呢, 要特別去跑最後一隻股票的回歸,所以你要在
最後面呢去加上這些東西,基本上就是去 copy paste
你 曾經寫過的程式碼,把它加到迴圈的外面,
的後面,後面的外面,所以你要這樣才會跑到 最後一隻程式碼,最後一隻股票的回歸的部分。
所以呢你如果把這些東西全部組合起來,讓它跑的話呢,它的輸出大概就是這樣子。
它會先,先會去建構這個 market return 的部分,對不對?然後呢
去做資料檔的合併,對不對?然後接下來就開始跑回歸啊,就是從 1101
這支股票開始,1102,一路跑下來,跑下來,跑到這個最後一隻 股票的代碼是
9958,然後呢最後呢我們就算一下 平均的 R square 是多少,平均的
R square 這個是 2016 年,平均的 R square 是 0.13 多, 然後總共有 906 支股票,所以
2016 2016 年有 906 支的一般的股票。