基于Python的実証経済学(じっしょうけいざいがく)応用

基于Python的実証経済学(じっしょうけいざいがく)応用

庞立智
2024-01-11 / 0 评论 / 146 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年01月16日,已超过372天没有更新,若内容或图片失效,请留言反馈。

一、引言
对于大学生而言,本科或研究生生涯的最后一项挑战往往是学位论文,而由于前期筹备升学、实习求职、休闲娱乐等其他事务耗费了大量时间,因此如何速成一篇合格的学位论文便成了最后一个学期的主要矛盾:大部分人求学的最终目标是获取证书,论文不合格可能导致无法实现该目标,而近年来教育部对学位论文的审查态度明显趋严。

就经管领域的学位论文而言,其论证方法大致包括以下三种:一、是基于经济金融理论的文字分析,二、是基于数理模型的逻辑论证,三、是基于历史数据或数值模拟的数据论证。通常而言,纯文字的案例分析类论文难以体现工作量且往往 重复率较高 ,复杂的数理模型推导不能一蹴而就,此时计量实证类论文便成了大多数同学最具性价比的选择。

当前,主流的计量分析工具包括各类统计软件(如Stata、Eviews、SPSS等)与少量脚本语言(R、Python等)。其中,统计软件的优点在于简单易操作,脚本语言的优点则在于灵活性强且代码可复用。对于没有代码基础且只是希望快速完成学位论文的同学而言,统计软件的性价比优于脚本语言。 对于长期使用脚本语言编程的同学而言,使用R或Python能够带来论文写作效率的提升。 在此前撰写论文的过程中,本人发现当前统计领域R语言的开发和学习生态明显优于Python,网上关于使用Python进行计量分析的学习资料较少。而由于近年来Python的使用者明显增加,不少同学有该方面的学习需求,因此本文后续将以Python作为计量分析工具,对相关内容进行说明。

二、论文结构与写作步骤
2.1 计量实证类学位论文的基本结构
通常而言,一个完整的计量实证类论文包括引言、文献综述、研究设计、实证分析、结论与展望等章节:

引言部分一般包括研究背景、研究意义、研究创新、论文结构等内容;
如果文章探究A对B的影响,则文献综述可依次论述A对B的影响机制、A、B、文献评述等内容;
在文献分析与理论分析基础上,研究设计可依次论述研究假说、变量说明、模型设计等内容;
实证分析章节可依次论述描述性统计、实证回归、经济学解释、异质性分析、稳健性检验等内容;结论与展望可依次论述研究结论、政策建议、不足与展望等内容。在上述文章框架的基础上进行写作,一篇字数在3万以上、篇幅达四五十页的学位论文便基本成型,能够满足大多数高校对于硕士学位论文篇幅的要求。

2.2 论文写作的大致步骤
论文的实际写作过程并非按照论文结构顺序依次进行。一般来说,只有当论文的核心成果做出来之后,我们才开始总体论文的写作。具体而言,学位论文的写作大致包含以下步骤:

确定大致的研究方向(通常选取自己熟悉且感兴趣的研究领域);
查阅文献及相关资料(知网、学校图书馆资源、谷歌学术等);
做计量,得出核心结论,确定论文题目;
补充论文其他部分;
根据老师意见与查重结果,反复修改直至提交。

三、文献的搜索与阅读
3.1 常见的文献搜寻渠道
就电子期刊而言,中国知网、谷歌学术、万方、超星等常用的文献服务平台能够解决90%以上的期刊文献搜索需求,SCI-HUB亦可作为备用的期刊下载渠道。

就普通图书、学位论文等资源而言,各高校图书馆是重要的文献搜寻渠道。

3.2 重点参考文献
在熟练掌握文献搜索方法后,如果论文的研究领域并非前无古人,那么我们往往会搜索到大量相关文献,此时选择性的阅读与参考关乎论文写作效率。

首先,文献阅读时应重点考虑有影响力的期刊论文,主要包括高引论文、重点期刊论文两类。其中,高引论文的查找可在文献搜索时根据引用量降序排列,重点期刊主要以影响因子为标准。很多时候,评审老师会重点关注学位论文的参考文献,多引用些重点期刊论文往往是评价的加分项。

在我国,存在七个核心期刊筛选体系,包括北京大学图书馆“中文核心期刊”、南京大学“CSSCI来源期刊”、中国科学院文献情报中心“中国科学引文数据库(CSCD)来源期刊”等。就经管领域而言,影响较大的重点期刊包括《中国社会科学》、《经济研究》、《金融研究》、《世界经济》、《中国工业经济》、《经济学季刊》、《管理世界》、《南开管理评论》、《管理科学学报》、《系统工程理论与实践》、《管理评论》等。国际上影响较大的经济金融类期刊包括American Economic Review, Econometrica, Journal of Political Economy, Quarterly Journal of Economics, Review of Economic Studies, Journal of Finance, Journal of Financial Economics等。

《经济研究》是我国经管领域重点期刊之一
其次,阅读本校往届学位论文有助于了解学校往年的学位论文写作规范。其中,时间越接近当前的学位论文,其参考价值越大。

最后,在文献阅读初期优先看中文文献,不要一开始就花大量时间看英文文献,对于大多数人而言看外文文献的效率并不高。

3.3 文献阅读方法
首先,如果要了解相关研究总貌,应当阅读综述性论文(题目中包含“文献综述”或“literature review”)或经典论文的文献综述。

其次,如果要了解相关领域的最新研究进展,可以考虑在经典论文的引证文献中找近几年的重点期刊论文。

最后,在单篇文献的阅读过程中,不需要一开始便通篇详细阅读,阅读优先级可以考虑:
题目——>摘要——>结论——>模型——>其他部分。

四、计量模型分析
4.1 计量分析的基本套路
不同的研究问题往往对应于不同特征的数据,而不同特征的数据往往对应于不同的计量分析方法。

从数据维度来看,典型的数据类型主要包括截面数据、时间序列数据、面板数据(静态面板或动态面板、平衡面板或非平衡面板)三种。不过就计量分析而言,研究更关注往往在于变量是否存在共线性、异方差、自相关、平稳遍历、协整等特征,各种复杂的计量方法本质上是为了克服经济数据的缺陷。事实上,如果能够确保数据符合经典假设,普通的OLS估计量便具备BLUE性质,此时也没必要采取更为复杂的计量方法。

以宏观金融类研究问题为例,该类问题往往对应于时间序列数据,且数据可能存在自相关、非平稳等特征。基于此,时间序列数据的常见计量分析范式主要有以下两种:一是在各变量“平稳且遍历”或“同阶单整且协整”的基础上进行OLS回归,二是考虑构建VAR系列模型(如VAR、VECM、FAVAR、TVP-VAR、TVP-SV-FVAR等)。此外,单变量的时间序列分析还可考虑ARIMA模型,但由于实证类论文往往涉及多个变量的关系,因此单变量分析可能过于简单了。就时间序列分析而言,典型的论文写作套路包括平稳性检验、协整检验、格兰杰因果检验、脉冲响应分析、方差分解等部分。

与计量作业不同,学位论文往往对研究创新和文章篇幅有一定要求,因此本文简单介绍一些增加创新点与扩充篇幅的基本套路。

首先,考虑在计量模型中增加一些特定变量,如门槛变量、平方项、交叉项、控制变量等。其中,加入门槛变量能够说明解释变量对被解释变量影响机制的门槛效应;平方项刻画了U形或倒U形的曲线形态,解释变量的边际效应与其自身大小相关;交叉项刻画了其他变量对解释变量影响机制的作用;合理的控制变量能够缓解计量模型的内生性问题。

其次,根据数据特征进行合适的假设检验,如时间序列的平稳性检验、面板数据的豪斯曼检验、以及说明各变量是否存在共线性的VIF检验等。

再次,采用不同的算法对模型参数进行估计,如最小二乘法估计(OLS)、最大似然估计(MLE)、矩估计(MM)等。如果各算法所得结论相同,则论证模型的稳健性;如果不同参数估计的结论有所差异,则在不同参数估计方法间进行选择。

最后,在基准回归模型结果的基础上,对模型进行异质性分析和稳健性检验(如样本数据划分、更改模型变量的计量方法等)。

4.2 基于Python的计量分析实际操作
首先,计量分析从找数据开始。常用的数据库包括Wind、国泰安、锐思等,免费的数据获取渠道包括统计局、统计年鉴等。通过观察参考文献如何获取数据也有助于定位相关数据的获取渠道。

其次,本文介绍一些常用的Python数据分析与统计包。就 数据分析与处理 而言,pandas、numpy、sklearn较为常用;就 计量分析而言 , statsmodels是Python中少数功能较全的包。总而言之,在代码撰写过程中,主要面向百度与说明文档编程。

#导入所需要的 ライブラリ
import numpy as np
import pandas as pd
import statsmodels.api as sm
from sklearn import preprocessing
import matplotlib.pyplot as plt

再次,使用上述包可以很方便地进行数据读取、描述性统计、相关性矩阵、预处理、OLS回归等操作,示例代码如下:

## 读取数据,pandas可较为方便地读取Excel、CSV、pickle等类型的数据
path = './时间序列数据.xlsx' #正解放入パース重要、じゃないと読み込めません。
df = pd.read_excel(path,sheet_name='汇总',index_col=0)
df = df.dropna()
df.index = pd.to_datetime(df.index)

vars = ['被解释变数','变数1','变数2','变数3','变数4','变数5','变数6']
df_model0 = df[vars]

## 描述性统计
df_des = df_model0.describe()
df_des.to_excel('./描述性统计.xlsx')

## 相关性矩阵
df_cor = df_model0.corr(method='pearson')
df_cor.to_excel('./相关性矩阵.xlsx')

## 数据预处理
scaler = preprocessing.StandardScaler()  ##Z-score标准化,提高了数据可比性, 削弱了数据解释性。
df_preprocessing = scaler.fit_transform(df_model0)

## OLS回归
X0 = sm.add_constant(df_model0.iloc[:, 1:])
y0 = df_model0.iloc[:, 0]
results0 = sm.OLS(y0, X0).fit()
print(results0.summary())
print(results0.pvalues)
print(results0.params)

最后,本文在时间序列数据的基础上,给出平稳性检验、协整检验、格兰杰因果检验、VAR、脉冲响应分析、方差分解等常用分析的代码示例:

## 时间序列分析

#平稳性检验
adf_test = sm.tsa.stattools.adfuller
alpha = 0.05
ts0 = df_model0['被解释变数']# 変数変量より理解しやすい
adf = adf_test(ts0 ,regression='ct', autolag='AIC', regresults=True)
pvalue_adf = adf[1]  #重点关注ADF检验P值

# ADF检验需要依次检验三类方程结果,为了更好地判定时间序列的单整阶数,将该步骤整合封装为函数
def orderDistinguish(ts):
    '''
    :param ts: array_like, 1d, The data series to test.
    :return: int, 单整阶数
    '''
    order = 0
    while True:
        if order > 100:
            break
        elif adf_test(ts ,regression='ct', autolag='AIC', regresults=True)[1] < alpha or \
                adf_test(ts, regression='c', autolag='AIC', regresults=True)[1] < alpha or \
                adf_test(ts, regression='nc', autolag='AIC', regresults=True)[1] < alpha:
            break
        else:
            order += 1
            ts = pd.Series(ts).diff().dropna().values
    return order

order0 = orderDistinguish(df_model0['被解释变数'])
print(order0)

## 查看模型中各变量的单整阶数
for var in df.columns.values.tolist():
    order = orderDistinguish(df[var])
    print(var,"的单整阶数为:",order)

## 协整检验
coint = sm.tsa.stattools.coint   ## Engle-Granger两步法协整检验
res_coint0 = coint(y0, df_model0.iloc[:, 1:6], trend='c', method='aeg',autolag='aic')  #该函数的协整检验最多只能检验6个变量,变量较多时建议使用Johansen协整检验
pvalue_coint = res_coint0[1]  #重点关注协整检验P值

coint1 = sm.tsa.var.vecm.coint_johansen  ## Johansen协整检验
res_coint1 = coint1(df_model0,det_order=1,k_ar_diff=2)

## 格兰杰因果检验
from statsmodels.tsa.stattools import grangercausalitytests
maxLag = 5
gc_data = df_model0[['被解释变数','变数1']]  # whether the time series in the second column Granger causes the time series in the first column.
gc_res = grangercausalitytests(gc_data, maxLag)

## VAR模型
from statsmodels.tsa.api import VAR
df_model1 = df[['被解释变数','变数1','变数2']]
model_var = VAR(df_model1.diff().dropna())    #做差分的目的在于使数据变为平稳时间序列,此时模型的可解释性有所下降
res_var = model_var.fit(maxlags=5, ic='aic')
print(res_var.summary())   #由于VAR模型估计的参数过多,因此其系数正负并不像OLS那样具有明确的经济意义,此时分析往往更关注脉冲响应和方差分解
lag_order = res_var.k_ar
print('模型选择的滞后阶数为:\t',lag_order)

## 脉冲响应分析
irf = res_var.irf(12)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
irf.plot(impulse = '变数1', response='被解释变数')
plt.show()

## 方差分解
fevd = res_var.fevd(12)
print(fevd.summary())
# fevd.plot(figsize=(12, 16))
fevd.plot()
plt.show()

最近看到的特别好的一篇文章,分享给我的学生们,也希望其能够对其他朋友的论文写作提供一定参考。

3

评论 (0)

取消