hello,我是毛豆。本系列用最精簡的代碼和案例帶你快速入門量化,隻講最幹的幹貨,想要學習量化又不知道該如何上手的小夥伴趕緊看過來!
本期内容将介紹如何用python做回歸分析。回歸分析(regression analysis)指的是确定兩種或兩種以上變量間互相依賴的定量關系的一種統計分析方法。回歸分析按照涉及的變量的多少,分為一進制回歸和多元回歸;按照因變量的多少,可分為簡單回歸分析和多重回歸分析;按照自變量和因變量之間的關系類型,可分為線性回歸分析和非線性回歸分析。
下面我們來看看具體如何用python進行回歸分析。毛豆在每周末都會更新這個系列,建議大家收藏起來友善學習。
指數收益率回歸模型
首先導入相關的包,并認證Tushare Pro賬号。
import tushare as ts
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
import scipy.stats as stats
pro = ts.pro_api('your token')
擷取今年以來的上證指數資料,并計算收益率:
df1=ts.get_k_data('sh',start='2023-01-01',end='2023-06-02')#上證指數
df1['lagclose']=df1.close.shift(1)
df1['SHRet']=(df1['close']-df1['lagclose'])/df1['lagclose']
df1.tail()
傳回如下:
擷取今年以來的深圳成指資料,并計算收益率:
df2=ts.get_k_data('sz',start='2023-01-01',end='2023-06-02')#深證成指
df2['lagclose']=df2.close.shift(1)
df2['SZRet']=(df2['close']-df2['lagclose'])/df2['lagclose']
df2.tail()
傳回如下:
核查兩個變量是否存在缺失值、長度是否相等:
SHRet=df1.SHRet.dropna()
SZRet=df2.SZRet.dropna()
print(len(SHRet),len(SZRet))
我們使用python中的統計分析包statsmodels中的OLS類來完成回歸模型的建構。
使用fit()方法來拟合模型:
model=sm.OLS(SHRet,sm.add_constant(SZRet)).fit()
使用summary()方法來檢視模型結果:
#檢視回歸模型結果
print(model.summary())
列印如下:
截距項0.0004,斜率項0.6843,是以我們可以得到模型為:
SHRet=0.0004+0.6843*SZRet+ε
拟合度為66.6%,表明模型可以解釋上證指數66.6%的方差。
下面對表中度各項名額做一個說明。先來看第一個表:
Dep.Variable:因變量,在本模型中為上證指數收益率
Model:模型拟合方法,OLS為普通最小二乘法
Method:最優化方法,最小二乘法
No.Observations:觀測樣本量,本例中有99個(99天的資料)
DF Residuals:殘差自由度(97)=觀測樣本量(99)-變量數(2)
DF Model:參數數量
R-squared:拟合度
Adj.R-squared:調整後的R-squared
F-statistic:F統計量
Prob (F-statistic):F統計量p值
Log-likelihood:對數似然
AIC:赤池系數
BIC:貝葉斯系數
再看第二個表:
coef:系數,包括截距和斜率
std err:标準差
t:t檢驗值,不清楚的參考前面的文章
P > |t|:t檢驗p值
[0.025, 0.975]:97.5%的置信區間
繪制拟合值與殘差的散點圖:
#解決中文亂碼
plt.rcParams['font.sans-serif']=['Arial Unicode MS']#用于mac
#plt.rcParams['font.sans-serif']=['SimHei']#用于windows
plt.rcParams['axes.unicode_minus'] = False
# 繪制拟合值和殘差的散點圖
plt.scatter(model.fittedvalues,model.resid)
plt.xlabel('拟合值')
plt.ylabel('殘差')
plt.gca().set_aspect(1)
plt.savefig('fig1.png',dpi=400,bbox_inches='tight')
傳回如下:
殘差是因變量未被自變量解釋的部分,若滿足線性假設,殘差和拟合值直接應該不存在任何趨勢線的關系,散點沿y=0兩側分布。
繪制正态Q-Q圖:
sm.qqplot(model.resid_pearson,stats.norm,line='45')
plt.gca().set_aspect(1)
plt.savefig('fig2.png',dpi=400,bbox_inches='tight')
傳回如下:
Q-Q圖可以檢驗資料序列是否滿足某種機率分布,它将對應分布的機率分位數作為橫坐标,資料序列的分位數作為縱坐标作成散點圖,若該資料序列滿足該機率分布,則散點的趨勢應該與某條直線基本重合。正态Q-Q圖檢驗的是标準化殘差是否服從N(0,1)。
以上是今天的全部幹貨内容,毛豆會在每周末更新這個系列,也會在每個交易日繼續和大家分享旋風沖鋒量化政策的實盤情況,歡迎大家點贊關注。