Python量化投资:技术、模型与策略
上QQ阅读APP看书,第一时间看更新

3.4 StatsModels

StatsModels是Python的统计建模和计量经济学工具包,包括一些描述统计、统计模型估计和推断。一般来讲,StatsModels能够很好地满足各类研究人员的统计计算需求。

事实上,Scipy中提供了一个子模块stats用于统计计算。但是stats模块是围绕随机变量提供数值方法的,比如随机变量的分位数、cdf等,还有一些检验方法,t检验、正太性检验等。stats模块缺少了回归方法,这一点完全是由StatsModels提供的,也就是围绕着回归模型提供操作方法,如数据访问、拟合、绘图等。所以在进行统计建模的时候,一般会使用StatsModels。

官网中介绍,StatsModels中的模型都会与现在已有的统计包进行对比测试,以确保所有的模型实现都是正确的。

为了照顾习惯使用R分析的人士,StatsModels提供了R风格的编程接口,同时也保留了原始风格的编程接口。

下面是官网上提供的两个例子,分别使用的是R风格和原始风格的编程方法。

R风格代码如下:


import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf

# Load data
dat = sm.datasets.get_rdataset("Guerry", "HistData").data

# Fit regression model (using the natural log of one of the regressors)
results = smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit()

# Inspect the results
print(results.summary())

原始风格代码如下:


import numpy as np
import statsmodels.api as sm

# Generate artificial data (2 regressors + constant)
nobs = 100
X = np.random.random((nobs, 2))
X = sm.add_constant(X)
beta = [1, .1, .5]
e = np.random.random(nobs)
y = np.dot(X, beta) + e

# Fit regression model
results = sm.OLS(y, X).fit()

# Inspect the results
print(results.summary())

然后导入statsmodels,代码如下:


import statsmodels
print(dir(statsmodels.formula.api))
print(dir(statsmodels.api))

在实际使用过程中,大家可以根据自己的习惯挑选使用。不过需要注意的是,statsmodels.formula.api并没有包含statsmodels.api中的所有函数。比如时间序列分析包tsa就没有包含在statsmodels.formula.api中。我们可以通过如下代码查看这两个api中所包含的函数:


import statsmodels
print(len(dir(statsmodels.formula.api)))
print(len(dir(statsmodels.api)))
print(dir(statsmodels.formula.api))
print(dir(statsmodels.api))

输出结果如下:


['GEE', 'GLM', 'GLS', 'GLSAR', 'Logit', 'MNLogit', 'MixedLM', 'NegativeBinomial', 
'NominalGEE', 'OLS', 'OrdinalGEE', 'PHReg', 'Poisson', 'Probit', 'QuantReg', 'RLM', 'WLS', 
'__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', 
'__spec__', 'gee', 'glm', 'gls', 'glsar', 'logit', 'mixedlm', 'mnlogit', 'negative-
binomial', 'nominal_gee', 'ols', 'ordinal_gee', 'phreg', 'poisson', 'probit', 'quantreg', 'rlm', 'wls']
['GEE', 'GLM', 'GLS', 'GLSAR', 'Logit', 'MNLogit', 'MixedLM', 'NegativeBinomial', 
'NominalGEE', 'OLS', 'OrdinalGEE', 'PHReg', 'Poisson', 'ProbPlot', 'Probit', 'QuantReg', 
'RLM', 'WLS', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', 
'__package__', '__spec__', 'add_constant', 'categorical', 'cov_struct', 'datasets', 'distributions', 'emplike', 'families', 'formula', 'genmod', 'graphics', 'iolib', 'load', 'nonparametric', 'qqline', 'qqplot', 'qqplot_2samples', 'regression', 'robust', 'show_versions', 'stats', 'test', 'tools', 'tsa', 'version', 'webdoc']

可以看到,这两个api中包含的函数并不是一一对应的。在后面的章节中也会引用StatsModels,届时会做进一步说明,所以这里不再多作介绍。