👇 连享会 · 推文导航 | www.lianxh.cn
连享会课程 · 2024 Stata 寒假班
实证分析中,最伤神和耗时的事情莫过于研究设计和数据处理。在以往的授课中,有不少学员在听完了高级班后,又返回头来参加初级班。大家的感触是:若没有扎实的基础,以及对计量和 Stata 整体架构的认识,后续的学习进度总感觉力不从心,进展缓慢。在初级班中,连玉君老师力求将四天的课程设置成一个比较完整的体系,目的有二:
其一,希望大家经过四天的学习(尚需另外花费 1-2 个月演练吸收),能掌握基本的统计和计量分析方法,能理解多数期刊论文中使用的分析方法;
其二,希望诸位能建立起 Stata 的基本架构,熟知 Stata 能做什么、如何做?以便为后续学习打下宽厚扎实的基础。
翻阅 Top 期刊上的论文,文中的方法我们似乎都会。细细想来,原因在于这些论文的想法或视角通常都比较独特,并使用了恰当的方法来论证。这里的关键在于研究设计,而这在目前的计量教科书中却鲜有涉及。为此,本次研讨班突出两个特点:一方面,将基础知识讲解透彻 ,进度上不求快;另一方面,在每个专题中都会提供了 2-3 篇比较经典的论文 ,展示这些方法的合理应用。
作者 :陈卓然 (北京大学)邮箱 :chenzhr25@mail2.sysu.edu.cn
The mathematicians are the priests of the modern world. ——Bill Gaede
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」 。或直接长按/扫描如下二维码,直达原文:
目录
1. 缘起
2. 近似
3. 凸优化
3.1 全局最优化
3.2 局部最优化
3.3 受限约束
4. 符号运算
5. 小结
6. 相关推文
1. 缘起 本章中将会介绍一些金融中有用的数学工具,具体而言,我们将介绍如下的几部分:
2. 近似 首先让我们导入一些必要的包:
import numpy as npfrom pylab import plt, mpl plt.style.use('seaborn' ) mpl.rcParams['font.family' ] = 'serif' %matplotlib inline
在本推文中,我们将主要以如下的函数为例:
def f(x) : return np.sin(x)+0.5 *x
首先让我们看一下这个函数的大致形象,我们将这个函数绘制在
的区间上:
# plot the function over a fixed interval def create_plot(x, y, styles, labels, axlabels) : plt.figure(figsize=(10 ,6 )) for i in range(len(x)): plt.plot(x[i], y[i], styles[i], label=labels[i]) plt.xlabel(axlabels[0 ]) plt.ylabel(axlabels[1 ]) plt.legend(loc=0 )
x = np.linspace(-2 *np.pi, 2 *np.pi, 50 ) create_plot([x], [f(x)], ['b' ],['f(x)' ], ['x' , 'f(x)' ])
2.1 回归 回归时函数多项式逼近的一个非常有效的手段,它不仅适用于一维的函数,同时也适用于多维的函数。其背后的数学原理很简单:给定一系列基准函数 且
,我们根据如下的方程来寻找最优的 。
其中,
, 被称为自变量, 被称为因变量。最简单的一组基准函数便是将单项式作为基准函数,也就是:
在这种情形下,numpy
中存在一个内置函数 np.polyfit()
去决定最优参数,以及给定一组输入值的时候获得近似值的函数 np.polyval()
。
res = np.polyfit(x, f(x), deg=1 , full=True , cov=True )
(array([ 4.28841952e-01 , -1.33457859e-16 ]), array([21.03238686 ]),2 , array([1. , 1. ]),1.1102230246251565e-14 )
ry = np.polyval(res[0 ], x)
create_plot([x, x], [f(x), ry], ['b' , 'r.' ], ['f(x)' , 'regression' ], ['x' , 'f(x)' ])
我们也可以考虑更高阶的近似拟合,比如说五阶:
res5 = np.polyfit(x, f(x), deg=5 ) ry5 = np.polyval(res5, x) create_plot([x, x], [f(x), ry5], ['b' , 'r.' ], ['f(x)' , 'regression' ], ['x' , 'f(x)' ])
2.2 定制化基准函数 我们也可以采用自己定义的基准函数去拟合。首先我们先手动复现一下上一小节的内容,也就是采用多项式回归的方法去拟合我们的函数:
matrix = np.zeros((3 +1 , len(x))) matrix[0 ,:] = 1 matrix[1 ,:] = x matrix[2 ,:] = x ** 2 matrix[3 ,:] = x ** 3 reg = np.linalg.lstsq(matrix.T, f(x), rcond=None )[0 ] ry = np.dot(reg, matrix) create_plot([x, x], [f(x), ry], ['b' , 'r.' ], ['f(x)' , 'regression' ], ['x' , 'f(x)' ])
不难看出上述图形没有完全刻画出三角函数的特征,因此我们可以对基准函数做出如下的改变:
matrix[3 ,:] = np.sin(x) reg = np.linalg.lstsq(matrix.T, f(x), rcond=None )[0 ] ry = reg@matrix create_plot([x, x], [f(x), ry], ['b' , 'r.' ], ['f(x)' , 'regression' ], ['x' , 'f(x)' ])
另外一点值得注意的是,回归分析方法对于未排序的数也是非常友好的,比如我们可以先生成一组随机数, 记作
:
xu = np.random.rand(50 ) *4 *np.pi - 2 *np.pi yu = f(xu) reg = np.polyfit(xu, yu, deg=5 ) ry = np.polyval(reg, xu) create_plot([xu, xu], [yu, ry], ['b.' , 'ro' ],['f(x)' , 'regression' ], ['x' , 'f(x)' ])
3. 凸优化 在金融和经济学中,凸优化无疑扮演着重要的角色,比如说期权定价模型对于市场数据的校准或者一个代理人的效用最大化问题。为便于说明,我们定义如下的函数:
def fm(p) : x, y = p return (np.sin(x) + 0.05 *x**2 + np.sin(y)+0.05 *y**2 )
首先让我们直观地看一下这个函数:
x = np.linspace(-10 ,10 ,50 ) y = np.linspace(-10 ,10 ,50 ) X, Y = np.meshgrid(x, y) Z = fm((X, Y)) fig = plt.figure(figsize=(15 , 6 )) ax = fig.add_subplot(projection='3d' ) surf = ax.plot_surface(X, Y, Z, rstride=2 , cstride=2 , cmap='coolwarm' , linewidth=0.5 , antialiased=True ) ax.set_xlabel('x' ) ax.set_ylabel('y' ) ax.set_zlabel('f(x, y)' ) fig.colorbar(surf, shrink=0.5 , aspect=5 )
3.1 全局最优化 为了计算最优化,我们首先需要导入:
import scipy.optimize as sco
为了便于观察最优化的过程,我们将前文的 fm
函数做如下的一些改变:
def fo(p) : x, y = p z = np.sin(x) + .05 * x**2 + np.sin(y) +0.05 *y**2 if output == True : print(
f"{x} | {y} | {z} " ) return z
output = True sco.brute(fo, ((-10 , 10.1 , 5 ), (-10 , 10.1 , 5 )), finish=None )
这样返回的结果是 (0, 0)。不过注意到我们在上述优化的代码中,格点步长设置为了 5。如果将步长减小到 0.1,我们得到的结果就变成了 (-1.4, -1.4)。
output = True sco.brute(fo, ((-10 ,10.1 ,0.1 ),(-10 ,10.1 ,0.1 )), finish=None )
3.2 局部最优化 对于众多优化问题,一种常见的策略是首先进行全局最小化,然后再进行局部最小化。这样可以避免局部最小化得到的结果可能不是全局的最小化点。
output = True opt3 = sco.fmin(fo, opt2, maxiter=15 )
我们得到的结果是 [-1.42743423, -1.42786531]。但是如果初始值设定如下:
output = False sco.fmin(fo, (2.0 , 2.0 ), maxiter=250 )
这时候我们得到的结果是 [4.2710728, 4.27106945]。
3.3 受限约束 以上我们讨论的优化问题均是无约束的优化问题,但是在金融和经济学中更多的优化问题均是受约束的优化问题。
为了求解这样的问题,我们需要使用到 scipy.optimize.minimize()
的函数。
def EU(p) : s, b = p return -(0.5 *np.sqrt(s*15 + b*5 )+ 0.5 *np.sqrt(s*5 + b*12 )) cons = ({'type' :'ineq' , 'fun' : lambda p: 100 - p[0 ]*10 - p[1 ]*10 }) bnds = ((0 , 1000 ),(0 , 1000 )) result = sco.minimize(EU, [5 ,5 ], method="SLSQP" , bounds=bnds, constraints=cons)
message: Optimization terminated successfully success: True status: 0 fun: -9.700883611487832 x: [ 8.025e+00 1.975e+00 ] nit: 5 jac: [-4.851e-01 -4.849e-01 ] nfev: 16 njev: 5
4. 符号运算 符号运算在做理论文章的过程中是非常有用的,而在符号运算中 sympy
起到至关重要的作用。
sympy
中的一个基本类是 Symbol
:
x = sy.Symbol('x' ) y = sy.Symbol('y' ) f = x**2 +3 +0.5 *x**2 + 3 /2 sy.simplify(f)
上述命令输出 。sympy
的一个最大优势在于求解方程,比如说我们想要求解 ,或者
,又或者 。
sy.solve(x**2 -1 ) sy.solve(x**2-1-3 ) sy.solve(x**3 +0.5 *x**2 -1 )
4.1 积分 sympy
另外一个重要的优势在于其积分和微分的功能:
a,b = sy.symbols('a,b' )
sy.Integral(sy.sin(x) + 0.5 *x, (x, a,b)) sy.integrate(sy.sin(x) + 0.5 *x, x)
我们得到:
我们也可以进行数值计算:
sy.integrate(sy.sin(x) + 0.5 *x, (x, 0.5 , 9.5 ))
不难得到 27.3748.
4.2. 微分 为了计算微分,我们可以采用 sy.diff()
,仍然以我们前文积分的结果为例。
int_fun = -sy.cos(x)+0.25 *x**2 int_fun.diff()
当我们想要求解的一个优化问题的时候,我们往往习惯将其一阶条件令为 0,然后进行求解。例如:
# example of an equation with interactive x and y f = (sy.sin(x) + 0.5 *x*y - sy.cos(y) - 0.6 *y**2 )
我们首先求解这个函数对 和 的两个一阶条件:
del_x = sy.diff(f,x) del_y = sy.diff(f,y)
x0,y0 = sy.nsolve((del_x, del_y), (x,y), (-1 ,1 )) f.subs({x:x0, y:y0}).evalf()
由此得到 -1.46911645849389。
5. 小结 本推文介绍了 Python 中的一些重要的数学工具。不难看出,Python 在数学计算方面有很好的基础函数支持,比如说我们在求解最优化问题时可以用到的受约束优化,以及符号运算等方法。
6. 相关推文 Note:产生如下推文列表的 Stata 命令为: lianxh python
安装最新版 lianxh
命令: ssc install lianxh, replace
初虹, 2022, Python爬虫1:小白系列之requests和json , 连享会 No.887. 初虹, 2022, Python爬虫2:小白系列之requests和lxml , 连享会 No.888. 周豪波, 2020, Python 调用 API 爬取百度 POI 数据小贴士——坐标转换、数据清洗与 ArcGIS 可视化 , 连享会 No.20. 周豪波, 2020, Python 调用 API 进行逆地理编码 , 连享会 No.59. 孔亦泽, 2023, 分享:公开数据库 及 数据格式转换-R-Stata-Python , 连享会 No.1272. 孙斯嘉, 2020, Python 调用 API 爬取百度 POI 数据 , 连享会 No.60. 孙斯嘉, 2020, Python 调用 API 进行地理编码 , 连享会 No.62. 左从江, 2020, Python: 批量爬取下载中国知网(CNKI) PDF论文 , 连享会 No.54. 张春雷, 2022, Stata+Python:导入超大Excel文档的新思路-以国泰安为例 , 连享会 No.1021. 张洪洋, 2023, Python:文本数据增强 , 连享会 No.1240. 张翠燕, 2020, Python+Wind:用 Pyautogui 轻松下载 Wind 数据 , 连享会 No.257. 杨晓军, 2022, Stata-Python交互-10:Stata17 新特性之PyStata的配置与应用 , 连享会 No.996. 梁淑珍, 2022, Python:Jaccard 相似度和距离 , 连享会 No.1043. 梁淑珍, 2022, Python:文本分析必备—搜狗词库 , 连享会 No.1078. 王俊, 2020, Python+Stata:批量制作个性化结业证书 , 连享会 No.236. 王卓, 2022, Python文本分析:将词转换为向量-Word2Vec , 连享会 No.1134. 王卓, 2023, Python:从随机实验到双重机器学习 , 连享会 No.1204. 王卓, 2022, Python:绘制动态地图-pyecharts , 连享会 No.922. 王颖, 2022, Python爬取静态网站:以历史天气为例 , 连享会 No.921. 王颖, 2022, Python:多进程、多线程及其爬虫应用 , 连享会 No.935. 王颖, 2022, Python:爬取动态网站 , 连享会 No.932. 秦利宾, 2020, Python:爬取上市公司公告-Wind-CSMAR , 连享会 No.131. 秦利宾, 2021, Python:爬取巨潮网公告 , 连享会 No.646. 范思妤, 2023, Python:基于selenium爬取科创板审核问询 , 连享会 No.1172. 许梦洁, 2020, Python: 6 小时爬完上交所和深交所的年报问询函 , 连享会 No.104. 许梦洁, 2020, Python: 使用正则表达式从文本中定位并提取想要的内容 , 连享会 No.91. 许梦洁, 2020, Python: 如何优雅地管理微信数据库? , 连享会 No.90. 许梦洁, 2021, Python爬虫:从SEC-EDGAR爬取股东治理数据-Shareholder-Activism , 连享会 No.744. 许梦洁, 2021, Python爬虫:爬取华尔街日报的全部历史文章并翻译 , 连享会 No.743. 许梦洁, 2020, Python:拆分文件让百万级数据运行速度提高135倍 , 连享会 No.301. 连享会, 2021, 司继春:Python学习建议和资源 , 连享会 No.563. 郭李鹏, 2020, Stata交互:Python-与-Stata-对比 , 连享会 No.303. 秦利宾, 2020, Stata 与 Jupyter Notebook 关联的两种方法 , 连享会 No.136.
许梦洁, 2020, 使用 Jupyter Notebook 配置 Stata\Python\Julia\R , 连享会 No.84. 韩少真, 展金永, 2020, 珠联璧合 II:Jupyter Notebook 与 Matlab 之融合 , 连享会 No.116. 刘欣妍, 2022, Stata与Python等价命令 , 连享会 No.955. 连享会, 2021, Stata-Python交互-1:二者配合的基本设定 , 连享会 No.551. 连享会, 2021, Stata-Python交互-2:在Stata中调用Python的三种方式 , 连享会 No.552. 连享会, 2021, Stata-Python交互-3:如何安装Python宏包 , 连享会 No.553. 连享会, 2021, Stata-Python交互-4:如何调用Python宏包 , 连享会 No.554. 连享会, 2021, Stata-Python交互-5:边际效应三维立体图示 , 连享会 No.555. 连享会, 2021, Stata-Python交互-6:调用APIs和JSON数据 , 连享会 No.556. 连享会, 2021, Stata-Python交互-7:在Stata中实现机器学习-支持向量机 , 连享会 No.557. 连享会, 2021, Stata-Python交互-8:将Stata数据导入Python , 连享会 No.558. 连享会, 2021, Stata-Python交互-9:将python数据导入Stata , 连享会 No.559. 连玉君, 2020, Stata程序:是否有类似-Python-中的-zip()-函数 , 连享会 No.347. 田原, 2020, ES 期望损失: Stata 及 Python 实现 , 连享会 No.182. 秦利宾, 许梦洁, 2021, Python+Stata:如何获取中国气象历史数据 , 连享会 No.793.
课程推荐:Stata2R:针对 Stata 用户的 R 课程 主讲老师:游万海 (福州大学) 课程时间:2023 年 12 月 3/10/17 (三个周日) 🍓 课程主页 :https://www.lianxh.cn
New! Stata 搜索神器:lianxh
和 songbl
GIF 动图介绍 搜: 推文、数据分享、期刊论文、重现代码 …… 👉 安装: . ssc install lianxh
. ssc install songbl
👉 使用:
. lianxh DID 倍分法
. songbl all
🍏 关于我们 直通车: 👉【百度一下: 连享会 】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。