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

2021-03-02 ALPHA ZONE

轉自微信公眾號:量化小白上分記

回歸作為數據分析中非常重要的一種方法,在量化中的應用也很多,從最簡單的因子中性化到估計因子收益率,以及整個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 # R方
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實現,代碼輸入跟之前的差不多

【相關文章】

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

量化 | 從零開始學量化(三):數據獲取途徑

量化 | 從零開始學量化(二):python/matlab/r/sas/vba選哪個

量化 | 從零開始學量化(一):量化如何入門

相關焦點

  • 從零開始學量化(五):用Python做回歸
    接下用用python實現OLS,所用數據為特定日期全A股的PB、ROE、行業、市值數據,部分數據如下,數據和代碼獲取後臺回復「回歸」。lstsq比較方便用在只需要回歸係數的情況下,如果需要對回歸結果做評估,比如算擬合值、算殘差、算R2,做t檢驗、F檢驗、算P值,就很麻煩了,而statsmodel恰好適合這種情況。
  • 從零開始學量化(二):python/matlab/r/sas/vba選哪個
    首先我的觀點是,沒有最好的軟體,只有最適用的領域,先明確自己想做的是什麼,再選擇最合適的軟體。這不是一篇廣告文,也不是百度複製粘貼的結果。我個人來說,最開始是大二做數學建模開始學matlab,不過現在來看其實建模用python也挺好,不明白為什麼當時所有的人都會推薦matlab,可能已經是一種傳統了吧。
  • 【Python金融量化】零基礎如何開始學?
    網上還流行一句話「Life is short, I use Python」(人生短暫,我用Python)。Python是一種非常高級的動態程式語言(其表達更接近自然語言),語法很簡潔,比如,完成同一個任務,C語言要寫1000行代碼,Java只需要寫100行,而Python可能只要20行。
  • 零基礎入門,Python量化交易課程
    ,註定是金融界裡一場技術的革新,在這裡你要學會編程,懂數理統計,甚至AI,交易升級,你不學豈不是OUT!抑或遇到問題無法得到及時的幫助,產生畏難情緒而遲遲沒有取得進展,第五期初級量化課程,帶你零編程基礎入門量化交易,這門課你一定不能錯過!
  • 大學生金融小白自學Python做量化投資需要注意哪些?
    python做量化投資需要注意些什麼?顯而易見,對於金融學背景的同學來說,就需要另外學習計算機編程的知識,而計算機背景的同學則需要補充金融知識。由於是24K純金融學專業背景,所以金程AQF小編就跟大家分享一下,作為一個零編程基礎的金融小白,是如何入門量化金融的。一、量化工具1、程式語言Python工欲善其事,必先利其器。想要入門量化,學會一門程式語言是必不可少的。
  • 在職金融小白自學python做量化投資能行嘛?
    python做量化投資能行嘛?顯而易見,對於金融學背景的同學來說,就需要另外學習計算機編程的知識,而計算機背景的同學則需要補充金融知識。由於本人是24K純金融學專業背景,所以就跟大家分享一下,作為一個零編程基礎的金融小白,是如何入門量化金融的。一、量化工具01程式語言:Python工欲善其事,必先利其器。想要入門量化,學會一門程式語言是必不可少的。
  • 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
  • 【python量化】常用python量化分析與應用庫介紹
    alphalensalphalens是一個Python量化分析庫,它是全球最大量化網站quantopian開發維護的量化三件套之一,用於股票因子(alpha)的性能分析。alphalens與zipline以及pyfolio常常一同使用,其中,pyfolio提供財務組合的性能和風險分析,zipline用於量化策略回測。
  • python量化交易 期貨視頻課程
    微信小程序審核發布類目添加在線視頻課程社交直播實時播放流上線VNPY 期貨程序化交易 30天解鎖 python量化交易 期貨視頻課程蔡慧滎FX5UPLC程序控制指令步進梯形圖編程 電子視頻課程教程15講【樂創】scratch2.0精品100節課程課件教案程序視頻PPT入門到精通微信公眾號小程序零基礎自學運營視頻自媒體教程推廣開發商城課程微課堂小程序公眾號pc知識付費閱讀在線直播視頻教育課程培訓製作VNPY 社區程序化交易視頻 CTA策略編寫 python量化期貨實戰課程微課堂知識付費小程序公眾號pc系統在線直播上課視頻教育課程培訓
  • 摩根紐約總部量化女神教你學Python機器學習
    在如今的量化投資領域,已經有了無數模型系統軟體,在強大的Python語言和資料庫的支持下,量化投資早已不再是一個神秘的領域。量化交易在各大投資銀行和對衝基金公司中成為交易系統的主流,而機器學習也在量化交易中扮演著舉足輕重的角色。
  • 摩根紐約總部量化女神手把手教你學Python,玩轉機器學習與量化交易、衍生品定價
    在如今的量化投資領域,已經有了無數模型系統軟體,在強大的Python語言和資料庫的支持下,量化投資早已不再是一個神秘的領域。量化交易在各大投資銀行和對衝基金公司中成為交易系統的主流,而機器學習也在量化交易中扮演著舉足輕重的角色。
  • 主流的比較流行的Python量化開源框架
    talibtalib的簡稱是Technical Analysis Library,主要功能是計算行情數據的技術分析指標numpy介紹:一個用pythonQuantPy介紹:python量化金融框架。目前還是一個alpha版本,可以從雅虎網站獲取每日收益的投資組合類。計算夏普比率和有效邊界,並實現投資組合優化。Finance-Python介紹:純python實現的金融計算庫,目標是提供進行量化交易必要的工具,包括但不限於:定價分析工具、技術分析指標。其中部分實現參考了quantlib。
  • 【Python量化乾貨】如何用Python計算EMA(pandas與ta-lib對比)?
    歡迎關注與標星★公眾號喲~內容均為樂學偶得原創  樂學偶得版權所有  公眾號:樂學Fintech  主講人:William LX_LAB教研團隊提供技術支持 正版視頻:網易雲課堂  樂學偶得MACD是我們試圖用Python中的各類技術工具對此指標進行構建與剖析:首先我們import基本工具:
  • 【量化小講堂】windows下如何安裝Python、pandas
    具體回復【量化小講堂】查看。文前話說完。鑑於大家可能上了官網都不知道下載哪個版本(我自己一開始就是),我已經將安裝文件上傳到百度雲,下載地址在微信後臺回復【python下載】查看。安裝文件下載好之後,就像一般的軟體一樣,一直點擊next就能安裝。Pycharm是一個ide,說簡單點就是一個用來編寫Python程序的軟體,也是個神器,可以讓我們更加方便的編寫Python程序。我們後面安裝pandas就需要用到它。
  • 【乾貨書】《零基礎搭建量化投資系統:以Python為工具》541PDF+代碼運行
    窗口布局設計等,目的是能夠獨立搭建自己的金融投資分析量化平臺。何戰軍《零基礎搭建量化投資系統:以Python為工具》PDF+代碼運行《零基礎搭建量化投資系統以Python為工具》PDF,541頁,有目錄,文字可複製;配套原始碼。作者: 何戰軍/ 楊茂龍/何天琦通過學習,能在Windows 平臺上搭建一個很酷的窗口,也能真正運行Python 3 量化投資分析平臺。
  • 【總0133-量化實驗038】如何用Python抓新浪股票實時信息(2)?
    小結一下,變量npage此時已轉成utf-8格式了,應該可以顯示中文了(這在後面會很快看到)。我們繼續,繼續往下看程序。    紅色的部分可以看出來變量stock_info確實是string list形式,然後其中所有的股票信息都在stock_info[1]裡面,注意一下Python和C/C++語言類似,一個list的第一個元素的index是從0開始
  • 綜述:PyTorch的量化
    PyTorch 1.1的時候開始添加torch.qint8 dtype、torch.quantize_linear轉換函數來開始對量化提供有限的實驗性支持。scale體現了映射中的比例關係,而zero_point則是零基準,也就是fp32中的零在量化tensor中的值。
  • 【好文推薦】主流的比較流行的Python量化開源框架
    Pythontalibtalib的簡稱是Technical Analysis Library,主要功能是計算行情數據的技術分析指標numpy介紹:一個用python實現的科學計算包。QuantPy介紹:python量化金融框架。目前還是一個alpha版本,可以從雅虎網站獲取每日收益的投資組合類。計算夏普比率和有效邊界,並實現投資組合優化。Finance-Python介紹:純python實現的金融計算庫,目標是提供進行量化交易必要的工具,包括但不限於:定價分析工具、技術分析指標。其中部分實現參考了quantlib。
  • 【Python量化乾貨】技術分析必備庫1:TA-Lib與Python接口(1)
    標星★我們,每天get一點高質量編程、金融、量化、人工智慧、前沿FinTech知識吧!當然,作為一個好的工具,TA-Lib給我們提供的接口也非常多,有C/C++,JAVA,Python,.NET等,因為WindQuant上等在線策略研究類平臺目前只能用Python,可能是為了迎合現在「全民量化」的趨勢,所以選用了熱門的「腳本語言」,所以我們暫時只用Python接口做快速的策略構建和回測,在交易執行階段或者需要本地運行,性能要求等再通過C/C++本地重構即可。