当前位置: 首页 > 科技观察

用Python分析资产收益的典型事实

时间:2023-03-20 18:55:40 科技观察

Python中文社区(ID:python-china)程式化事实(StylizedFacts)是在实际数据中发现的一些现象。“典型事实”在经济学中非常重要。无论是宏观经济学还是贸易、金融或产业经济学,它们都对理论的发展起着非常重要的作用。因此,如果能够找到一些“典型事实”,对经济学进行理论研究和随后的实证研究就显得非常重要。扫描本文底部二维码,获取所有完整源码和打包下载的JupyterNotebook文件。程式化事实是出现在许多资产回报(跨时间和市场)中的统计属性。了解它们很重要,因为当我们构建代表资产价格动态的模型时,模型必须能够捕获这些属性。下面我们用标普500指数从1985年到2018年的每日回报率来分析五个典型事实。我们从雅虎财经下载标准普尔500指数价格并计算回报。使用以下代码导入所有必需的库:importpandasasspdimportnumpyasnpiimportyfinanceeasyfimportseabornassnsimportscipy.statsasscsimportstatsmodels.apiassmimportstatsmodels.tsa.apiassmt在本节中,我们将使用Python来发现有关标准普尔500指数系列的五个典型事实。df=yf.download('^GSPC',start='1985-01-01',end='2018-12-31',progress=False)dfdf=df[['AdjClose']].rename(columns={'AdjClose':'adj_close'})df['log_rtn']=np.log(df.adj_close/df.adj_close.shift(1))dfdf=df[['adj_close','log_rtn']].dropna(how='any')1.资产收益的非高斯分布运行以下步骤,通过绘制收益直方图和Q-Q图来寻找第一个事实的存在性。1.使用观测收益的均值和标准差计算正态概率密度函数(PDF):r_range=np.linspace(min(df.log_rtn),max(df.log_rtn),num=1000)mu=df。log_rtn.mean()sigma=df.log_rtn.std()norm_pdf=scs.norm.pdf(r_range,loc=mu,scale=sigma)2.绘制直方图和Q-Q图:fig,ax=plt.subplots(1,2,figsize=(16,8))#histogramsns.distplot(df.log_rtn,kde=False,norm_hist=True,axax=ax[0])ax[0].set_title('DistributionofS&P500returns',fontsize=16)ax[0].plot(r_range,norm_pdf,'g',lw=2,label=f'N({mu:.2f},{sigma**2:.4f})')ax[0].legend(loc='upperleft');#Q-Qplotqq=sm.qqplot(df.log_rtn.values,line='s',axax=ax[1])ax[1].set_title('Q-Qplot',fontsize=16)#plt.tight_layout()#plt.savefig('images/ch1_im10.png')plt.show()执行上面的代码会产生下图:我们可以使用直方图(显示分布的形状)和Q-Q图来评估回报的正态性。此外,我们可以打印汇总统计数据:通过查看均值、标准差、偏度和峰度等指标,我们可以推断出它们偏离了我们在正常情况下的预期。此外,Jarque-Bera正态性??检验让我们有理由拒绝零假设,即分布在99%的置信水平下是正态的。2.波动集聚运行以下代码,通过绘制回报序列来发现第二个典型事实。1.可视化收益序列:df.log_rtn.plot(title='DailyS&P500returns',figsize=(10,6))执行代码会产生下图:我们可以观察到明显的波动聚类——正收益,波动大,周期大的负回报。3.回报没有自相关性。我们继续发现第三个典型事实。1.定义用于创建自相关图的参数:N_LAGS=50SIGNIFICANCE_LEVEL=0.052。运行以下代码以创建收益的自相关函数(ACF)图:acf=smt.graphics.plot_acf(df.log_rtn,lags=N_LAGS,alpha=SIGNIFICANCE_LEVEL)执行上述代码会产生以下图:只有几个值位于置信区间之外,可视为具有统计显着性。我们可以假设已经验证返回序列中不存在自相关。4.平方/绝对回报的自相关小且递减第四个程式化事实是通过创建平方回报和绝对回报的ACF图来研究的。1.创建ACF图:fig,ax=plt.subplots(2,1,figsize=(12,10))smt.graphics.plot_acf(df.log_rtn**2,lags=N_LAGS,alpha=SIGNIFICANCE_LEVEL,axax=ax[0])ax[0].set(title='AutocorrelationPlots',ylabel='SquaredReturns')smt.graphics.plot_acf(np.abs(df.log_rtn),lags=N_LAGS,alpha=SIGNIFICANCE_LEVEL,axax=ax[1])ax[1].set(ylabel='AbsoluteReturns',xlabel='Lag')执行上面的代码会产生下图:我们可以观察到平方收益和绝对收益的自相关值很小并且不断减小,这与第四个程式化事实是一致的。五、杠杆效应对于第五个事实,运行以下步骤考察是否存在杠杆效应。1.将波动率度量计算为滚动标准差:df['moving_std_252']=df[['log_rtn']].rolling(window=252).std()df['moving_std_21']=df[['log_rtn']].rolling(window=21).std()2.绘制所有系列进行比较:fig,ax=plt.subplots(3,1,figsize=(18,15),sharex=True)df.adj_close.plot(axax=ax[0])ax[0].set(title='S&P500timeseries',ylabel='Price($)')df.log_rtn.plot(axax=ax[1])ax[1]。设置(ylabel='Logreturns(%)')df.movi??ng_std_252.plot(axax=ax[2],color='r',label='MovingVolatility252d')df.movi??ng_std_21.plot(axax=ax[2],color='g',label='MovingVolatility21d')ax[2].set(ylabel='MovingVolatility',xlabel='Date')ax[2].legend()我们现在可以将价格序列与(滚动)波动性这一事实表明,大多数衡量资产波动性的指标与其回报呈负相关,我们确实可以观察到一种模式,即价格下跌时波动性增加,价格上涨时波动性减少。