從零開始學量化(五):用Python做回歸

2021-02-20 量化小白上分記

回歸作為數據分析中非常重要的一種方法,在量化中的應用也很多,從最簡單的因子中性化到估計因子收益率,以及整個Barra框架,都是以回歸為基礎,本文總結各種回歸方法以及python實現的代碼。

回歸是研究多組自變量X1,X2,...,Xn與一個因變量Y關係的模型,首先從最簡單的OLS開始,變量假設如下

回歸模型可以表示為

同時線性回歸還必須滿足「BLUE」的假設,在這些假設下,回歸的目標是在已知X,Y的情況下估計回歸係數beta,OLS的思想是最小化殘差平方和,即

OLS估計量具有一致性、無偏性等優點。

接下用用python實現OLS,所用數據為特定日期全A股的PB、ROE、行業、市值數據,部分數據如下,數據和代碼獲取後臺回復「回歸」。

python中實現OLS的模塊很多,numpysklearnstatsmodels中都有,這裡給出numpy,statsmodel中的用法。

np.linalg.lstsq(a, b, rcond='warn')

lstsq的輸入包括三個參數,a為自變量X,b為因變量Y,rcond用來處理回歸中的異常值,一般不用。

lstsq的輸出包括四部分:回歸係數、殘差平方和、自變量X的秩、X的奇異值。一般只需要回歸係數就可以了。

這裡需要注意的一點是,必須自己在自變量中添加截距項,否則回歸結果是沒有截距項的,其他細節可以參考help。

這裡我們用一個行業股票的數據實現PB-ROE回歸,代碼如下

datas = pd.read_excel('data.xlsx',index_col = 0)
datas = datas.loc[(datas.pb_lf>0) &(datas.pb_lf<10) ]
datas = datas.loc[(datas.roe_ttm2>0) &(datas.roe_ttm2 < 10)]
datas1 = datas.loc[datas.classname == '醫藥生物']

x = datas1[['roe_ttm2']]
x['Intercept'] = 1

y = datas1['pb_lf']

beta,resid,ranks,s = np.linalg.lstsq(x,y)
y_fitted = beta[0]*datas1[['roe_ttm2']] + beta[1]

plt.figure(figsize = (8,6))
plt.plot(datas1.roe_ttm2, datas1.pb_lf,'ko', label='sample')
plt.plot(datas1.roe_ttm2, y_fitted, 'black',label='OLS',linewidth = 2)
plt.xlabel('ROE')
plt.ylabel('PB')

plt.legend()
plt.show()

關於PB-ROE

PB-ROE提供了一種投資的框架,這種框架是說,股票的PB和ROE之間存在近似的線性關係,ROE越高,PB越高,因此如果同時根據PB、ROE值來投資,很難選到同時滿足PB最小、ROE最大的股票。但可以根據他們的線性關係進行選擇,回歸直線上的點可以視為合理的PB、ROE組合水平,這樣位於回歸線下方的股票都是PB被低估的,未來有很大的上升修復空間,而位於回歸線上方的股票都是當前PB被高估的,未來會下降,因此投資可以選擇位於回歸線下方的股票。使用這種方法最重要的點是回歸必須是靠譜的,比如ROE應該是穩定的,確保未來可持續,比如應想辦法消除行業間的差異等等。

lstsq比較方便用在只需要回歸係數的情況下,如果需要對回歸結果做評估,比如算擬合值、算殘差、算R2,做t檢驗、F檢驗、算P值,就很麻煩了,而statsmodel恰好適合這種情況。

statsmodels.formula.api(sml)

statsmodels中做回歸有很多模塊都能實現,sml.ols的優點是可以寫成公式型的回歸,類似R中做回歸的過程,比如PB和ROE的回歸可以用公式表示為'pb~roe',多個自變量之間用加號連接。sml.ols一般包括formula和data兩個輸入,formula是回歸的公式,data為使用的數據。此外,還有missing這個參數,對於回歸數據包含缺失值時很好用,比如設置missing = 'drop'表示回歸時刪除包含缺失值的樣本。代碼如下

import statsmodels.formula.api as sml
model = sml.ols(formula='pb_lf~roe_ttm2',data = datas1)
result=model.fit()

result.params
result.rsquared
result.resid
result.fittedvalues

summary函數可以出比較美觀的結果。

sm.ols是statsmodels中另一個回歸的模塊,它的輸入類似lstsq,輸入變量y,x即可,這裡使用patsy中的dmatrics生成x,y,需要注意的是,dmatrices生生成的x是自帶截距項的,代碼如下,summary輸出結果同上。

import statsmodels.api as sm
from patsy import dmatrices
from scipy.linalg import toeplitz
import numpy.linalg as la
y,X=dmatrices('pb_lf~roe_ttm2',data=datas1,return_type='dataframe')
mod = sm.OLS(y,X)
res = mod.fit()
res.summary()

GLS是廣義最小二乘法的縮寫,剛才總結的OLS滿足很多假設,但實際數據往往沒有那麼好的性質,GLS用來解決異方差的問題,在數據有異方差的問題時,OLS的結果不再具有無偏性等性質,GLS的結果更好。它的主要思想是給解釋變量加上一個權重,從而使得加上權重後的回歸方程方差是相同的.因此在GLS方法下可以得到估計量的無偏和一致估計。

使用這種方法的前提時,你已經對誤差項的協方差陣有了較好的估計。statsmodel中實現GLS的模塊如下

常用的輸入包括因變量endog,自變量exog,殘差的協方差陣sigma,missing設定樣本中缺失值的處理方法,這裡exog也是不帶截距項的,需要自己加入,可以用sm.add_constant(),代碼如下

x = datas1[['roe_ttm2','mktcap']]
x['mktcap'] = np.log(x.mktcap)
sigma = x.T.var()
x = sm.add_constant(x)
y = datas1['pb_lf']

sm.GLS(y, x,sigma = sigma).fit().params

WLS是加權最小二乘法的簡稱,如果仔細看上一張圖GLS函數的說明,可以看到,當sigma是一個向量的時候,GLS等價於WLS,即WLS表示殘差的協方差陣是對角陣。可以用sm.WLS或者sm.GLS實現,代碼同上。

RLS表示帶約束的最小二乘法,這裡的約束只包括線性約束,可以表示為AX = B的形式,如果有其他類型的約束,需要用其他方法,數學上可以證明,線性約束下,最小二乘法仍有最優解。rls的實現可以使用statsmodels.sandbox.rls。函數說明如下

endog表示Y,exog表示X,constr線性約束的A,params表示線性約束的B,默認為0,sigma是權重,同GLS。大部分跟之前都是一樣的,唯一需要注意的是約束的輸入,根據約束條件寫出A,B然後輸入。

帶約束的最小二乘法在量化中非常常用,比如做行業中性化時,如果所有行業虛擬變量都保留,並且添加了截距項的情況下,會出現變量多重共線性,回歸結果無效,這時候一種方法是刪除一個虛擬變量,還有一種方法是添加一個約束。比如可以添加行業的市值佔比和係數乘積的和為0:

其中,w為各行業流通市值佔比,這種方法下,對pb因子做中性化的代碼如下

from statsmodels.sandbox.rls import *
weights = datas.mktcap.groupby(datas.classname).sum()/datas.mktcap.sum()


class_var = pd.get_dummies(datas['classname'],columns=['classname'],prefix='class',
prefix_sep="_", dummy_na=False, drop_first = False)

x = class_var
x = pd.concat([class_var,np.log(datas.mktcap)],axis = 1)
x = sm.add_constant(x)
y = datas['pb_lf']
con1= [0] + list(weights) + [0]

models = RLS(y, x,constr = con1).fit()

models.resid

Logistic回歸是一種用來做Y是類別變量的方法,可以用statsmodels.discrete.discrete_model.Logit實現,代碼輸入跟之前的差不多

本文總結了比較常用的一些方法,除此外,還有Lasso、Ridge等回歸方法,可以用sklearn實現,不再贅述,列出一些參考網站,如果有沒有寫清楚的地方,可以再看一看。


http://www.statsmodels.org/stable/index.html

https://patsy.readthedocs.io/en/latest/API-reference.html#patsy.DesignInfo.linear_constraint

https://tedboy.github.io/statsmodels_doc/_modules/statsmodels/sandbox/rls.html#RLS

從零開始學量化(四):用python寫一個擇時策略回測

相關焦點

  • 量化 | 從零開始學量化(五):用Python做回歸
    :量化小白上分記回歸作為數據分析中非常重要的一種方法,在量化中的應用也很多,從最簡單的因子中性化到估計因子收益率,以及整個Barra框架,都是以回歸為基礎,本文總結各種回歸方法以及python實現的代碼。
  • 從零開始學量化(二):python/matlab/r/sas/vba選哪個
    首先我的觀點是,沒有最好的軟體,只有最適用的領域,先明確自己想做的是什麼,再選擇最合適的軟體。這不是一篇廣告文,也不是百度複製粘貼的結果。我個人來說,最開始是大二做數學建模開始學matlab,不過現在來看其實建模用python也挺好,不明白為什麼當時所有的人都會推薦matlab,可能已經是一種傳統了吧。
  • 【Python金融量化】零基礎如何開始學?
    網上還流行一句話「Life is short, I use Python」(人生短暫,我用Python)。Python是一種非常高級的動態程式語言(其表達更接近自然語言),語法很簡潔,比如,完成同一個任務,C語言要寫1000行代碼,Java只需要寫100行,而Python可能只要20行。
  • 零基礎入門,Python量化交易課程
    抑或遇到問題無法得到及時的幫助,產生畏難情緒而遲遲沒有取得進展,第五期初級量化課程,帶你零編程基礎入門量化交易,這門課你一定不能錯過!本課程有用擁有豐富量化投資經驗的導師們將帶領學員掌握通過python獲取、分析交易數據,實現交易數據可視化,
  • 大學生金融小白自學Python做量化投資需要注意哪些?
    python做量化投資需要注意些什麼?顯而易見,對於金融學背景的同學來說,就需要另外學習計算機編程的知識,而計算機背景的同學則需要補充金融知識。由於是24K純金融學專業背景,所以金程AQF小編就跟大家分享一下,作為一個零編程基礎的金融小白,是如何入門量化金融的。一、量化工具1、程式語言Python工欲善其事,必先利其器。想要入門量化,學會一門程式語言是必不可少的。
  • 在職金融小白自學python做量化投資能行嘛?
    python做量化投資能行嘛?顯而易見,對於金融學背景的同學來說,就需要另外學習計算機編程的知識,而計算機背景的同學則需要補充金融知識。由於本人是24K純金融學專業背景,所以就跟大家分享一下,作為一個零編程基礎的金融小白,是如何入門量化金融的。一、量化工具01程式語言:Python工欲善其事,必先利其器。想要入門量化,學會一門程式語言是必不可少的。
  • 從零開始學Python【22】--線性回歸診斷(第一部分)
    往期回顧從零開始學Python【21】--線性回歸(實戰部分)從零開始學Python【20】--線性回歸(理論部分
  • 002從零開始學Python—Anaconda下載與安裝
    註:Jupyter Notebook也可以使用pip 安裝方法-這種方法不使用 Anaconda,但需先安裝python,並確保機器正在運行最新版本的 pip,之後再安裝Jupyter Notebook。相比之下,本人更喜歡前述的直接安裝Anaconda方法。
  • 從零開始學Python【12】--matplotlib(箱線圖)
    箱線圖一般用來展現數據的分布(如上下四分位值、中位數等),同時,也可以用箱線圖來反映數據的異常情況。文中相關的Python腳本和PDF版本已存放到百度雲盤,可以通過下面的連結獲取:連結: https://pan.baidu.com/s/1hr9Kddq 密碼: a5fr往期從零開始學Python系列:
  • Python 從零開始--入門篇
    從這篇文章開始我將分享 python 系列,從 ptyhon 的起始發展,到現在的方方面面, 從最基礎的語法開始,大家一起學習
  • 從零開始,用Python徒手寫線性回歸
    如果你剛剛邁入機器學習的大門,那麼使用 Python 從零開始對整個線性回歸算法進行編碼是一次很有意義的嘗試,讓我們來看看怎麼做吧。機器學習問題的第一步是獲取數據,沒有可以學習的數據就沒有機器學習。本文將使用非常常規的線性回歸數據集——房價預測數據集。這是一個包含俄勒岡州波特蘭市房價的簡單數據集。該數據集中第一列是房屋面積(以平方英尺為單位),第二列是臥室的數量,第三列是房屋價格。
  • 從零開始學Python【18】--matplotlib(熱力圖)
    往期回顧從零開始學Python【17】--matplotlib(面積圖)從零開始學
  • python、量化與「雅典娜」項目
    python、量化與「雅典娜」項目QQ群:124134140 (zwPython大數據,量化交易)今天,Q群裡面有朋友問道:【新人】yongle sunny(1535327967) 11:43:10   老大,我們老師說量化投資用python最好,但是現在網際網路上關於python搞量化並願意分享經驗的就您一家,而且還沒正式開始
  • 【推薦收藏】傾心整理的Python量化資源大合集
    搭建Python環境https://www.anaconda.com/一直使用其自帶的Jupyter Notebook來做策略分析和寫公眾號文章。https://www.jetbrains.com/pycharm/ 入門學習https://www.liaoxuefeng.com/wiki/1016959663602400https://www.runoob.com/python3/python3-basic-syntax.htmlhttps
  • 005從零開始學Python—字符串處理
    # 單引號構造字符串string1 = '"歡迎關注Excel知識管理微信公眾號,我是數據可視化愛好者李強"'# 雙引號構造字符串string2 = "'這是我的第五篇Python讀書筆記,希望能幫到大家更好地入門Python'"# 三引號構造字符串string3 = ''''Tips':"如果你覺得從零開始學Python系列很好, 請分享給你的朋友們
  • 從零開始學ps每天免費網上學習從零開始學ps
    從零開始學ps持續更新中。。。每天免費網上學習從零開始學ps,國內名師機構專業課程,O基礎快速學習,1小時快速入門,7天從零開始學ps學習 能力快速提升 優質作品隨手呈現課程亮點先導課-進入 ps 的神奇世界第 1 課-掌握 ps 的基礎功能,做出你的第一張PS海報第 2 課-學會這一招,讓你和明星輕鬆「合影第 3 課
  • 從零開始機器學習 - 邏輯回歸原理與實戰!
    但我們之前學習的線性回歸的輸出是連續的,如預測房價,肯定不能用 0 和 1 來表示房價。所以記住一點:分類問題輸出離散值,線性回歸問題輸出連續值。二、什麼是邏輯回歸?今天要學習的這個邏輯回歸是屬於分類問題,你可能對「邏輯回歸」有疑惑,既然是分類問題,為何要說成回歸問題?
  • python量化交易 期貨視頻課程
    微信小程序審核發布類目添加在線視頻課程社交直播實時播放流上線VNPY 期貨程序化交易 30天解鎖 python量化交易 期貨視頻課程蔡慧滎FX5UPLC程序控制指令步進梯形圖編程 電子視頻課程教程15講【樂創】scratch2.0精品100節課程課件教案程序視頻PPT入門到精通微信公眾號小程序零基礎自學運營視頻自媒體教程推廣開發商城課程微課堂小程序公眾號pc知識付費閱讀在線直播視頻教育課程培訓製作VNPY 社區程序化交易視頻 CTA策略編寫
  • 小白學數據之新年計劃 開始學Python吧!
    小白:額,做個數據科學家,要學這麼多語言,我看我還是放棄吧…答:別啊,其實不需要學這麼多…小白:所以?答:雖然掌握多種語言會非常有用,但只是在需要的時候這樣。Python具有簡單易學的語法,強大的數據處理能力以及可怕的開源資料庫,如Numpy、Pandas、 Scikit-learn和Statsmodels;所有的這些可以讓Python既能做探索性分析,又可以構建可擴展大數據管道和機器學習算法。只有針對一些非常規的模型,我們有時會結合Python和R來進行處理,用Python來做繁重的數據處理,用R做統計建模。小白:這麼好!
  • 【Python量化乾貨】如何用Python計算EMA(pandas與ta-lib對比)?
    歡迎關注與標星★公眾號喲~內容均為樂學偶得原創  樂學偶得版權所有  公眾號:樂學Fintech  主講人:William LX_LAB教研團隊提供技術支持 正版視頻:網易雲課堂  樂學偶得MACD是*關於unadj與adj的補充:在時間序列分析中,我們經常問遇到這樣一個關於調整的問題,這個問題看似不重要,但是在調取pandas等常用庫的時候會發現有一個很小的選項並且國內並無博客說明此問題,於是樂學偶得教研團隊幫大家在視頻中做了詳細說明並將要點筆記整理在此文章中