使用StatsModels中的api子模块,主要使用的函数有(注意大小写):
- OLS:普通最小二乘法
- GLS:广义最小二乘法
- WLS:加权最小二乘法
- GLM:广义线性模型
- mixed:混合效应模型
以OLS为例,函数格式为OLS(endog,exdog),参数分别表示因变量和自变量,其中自变量可以有多个,格式为X=data[[‘a’, ‘b’, ‘c’,…]]。以螺纹钢的期货和现货价格数据为样本,用简单OLS回归计算最优套保比率(期货收益率为x,现货收益率为y):
import statsmodels.api as sm
import pandas as pd
LWG=pd.read_excel('C:/Users/lenovo/Desktop/螺纹钢期货+现货数据.xlsx')
LWG.head()
Out[1]:
日期 期货价格 现货价格 期货价格收益率 现货价格收益率
0 2016/01/04 1777 1920 NaN NaN
1 2016/01/05 1789 1940 0.006730 0.010363
2 2016/01/06 1775 1940 -0.007856 0.000000
3 2016/01/07 1773 1930 -0.001127 -0.005168
4 2016/01/08 1759 1910 -0.007928 -0.010417
LWG=LWG.dropna()#删除缺失值
x=LWG.iloc[:,3]
y=LWG.iloc[:,4]
x_addc=sm.add_constant(x)#线性回归增加常数项y=kx+b
model=sm.OLS(y,x_addc).fit()
#OLS(y,x);fit函数从模型获得拟合数据
model.summary()#输出线性回归的结果
Out[2]:
<class 'statsmodels.iolib.summary.Summary'>
"""
OLS Regression Results
==============================================================================
Dep. Variable: 现货价格收益率 R-squared: 0.267
Model: OLS Adj. R-squared: 0.267
Method: Least Squares F-statistic: 343.5
Date: Wed, 22 Jan 2020 Prob (F-statistic): 1.31e-65
Time: 13:16:27 Log-Likelihood: 2902.4
No. Observations: 943 AIC: -5801.
Df Residuals: 941 BIC: -5791.
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0006 0.000 1.531 0.126 -0.000 0.001
期货价格收益率 0.3384 0.018 18.533 0.000 0.303 0.374
==============================================================================
Omnibus: 592.523 Durbin-Watson: 1.704
Prob(Omnibus): 0.000 Jarque-Bera (JB): 30065.285
Skew: 2.180 Prob(JB): 0.00
Kurtosis: 30.316 Cond. No. 50.3
==============================================================================
Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
"""
可以看到套保比率为0.3384。接下来对回归模型进行可视化:
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus']=False
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
plt.scatter(x,y,c='k',marker='o')
plt.plot(x,model.params[0]+model.params[1]*x,'r')#取出“model”中的两个参数
plt.xlabel('螺纹钢期货收益率')
plt.ylabel('螺纹钢现货收益率')
plt.title('螺纹钢期货与现货收益率的OLS回归')
plt.grid()
个人认为python在计量经济学模型的建立和处理上,操作比较繁琐,功能不够强大,使用eviews、stata等软件会更好一些。