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

      Python中文社区(ID:python-china)

创新互联长期为成百上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为宜章企业提供专业的成都网站设计、成都网站建设,宜章网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。

典型化事实(Stylized Facts)是在实际数据中发现的一些现象。“典型化事实”在经济学中非常重要,无论是宏观经济学还是贸易、金融还是产业经济学,在理论的发展中都扮演着非常重要的角色,因而如果能发现一些“典型化事实”,对经济学的理论研究和之后的实证研究是非常重要的。扫描本文最下方二维码获取全部完整源码和Jupyter Notebook 文件打包下载。

典型化事实(Stylized Facts)是出现在许多资产回报(跨时间和市场)中的统计属性。了解它们很重要,因为当我们构建代表资产价格动态的模型时,模型必须能够捕获这些属性。

下面我们使用从 1985 年到 2018 年标普 500 指数的每日回报收益来分析五个典型化事实。

我们从雅虎财经下载标准普尔 500 指数价格并计算收益。使用以下代码导入所有需要的库: 

 
 
 
 
  1. import pandas as pd   
  2. import numpy as np  
  3. import yfinance as yf  
  4. import seaborn as sns   
  5. import scipy.stats as scs  
  6. import statsmodels.api as sm  
  7. import statsmodels.tsa.api as smt 

在本节中,我们将用 Python去发现标准普尔 500 指数系列中的五个典型化事实。 

 
 
 
 
  1. df = yf.download('^GSPC',   
  2.                  start='1985-01-01', 
  3.                  end='2018-12-31',  
  4.                  progress=False)  
  5. dfdf = df[['Adj Close']].rename(columns={'Adj Close': 'adj_close'})  
  6. df['log_rtn'] = np.log(df.adj_close/df.adj_close.shift(1))  
  7. dfdf = df[['adj_close', 'log_rtn']].dropna(how = 'any') 

一、资产收益的非高斯分布

运行以下步骤,通过绘制收益直方图和 Q-Q 图来发现第一个事实的存在。

1、使用观察到的收益的均值和标准差计算正态概率密度函数 (PDF): 

 
 
 
 
  1. r_range = np.linspace(min(df.log_rtn), max(df.log_rtn), num=1000)  
  2. mu = df.log_rtn.mean()  
  3. sigma = df.log_rtn.std()  
  4. norm_pdf = scs.norm.pdf(r_range, loc=mu, scale=sigma) 

2、绘制直方图和 Q-Q 图: 

 
 
 
 
  1. fig, ax = plt.subplots(1, 2, figsize=(16, 8))  
  2. # histogram  
  3. sns.distplot(df.log_rtn, kde=False, norm_hist=True, axax=ax[0])                                  
  4. ax[0].set_title('Distribution of S&P 500 returns', fontsize=16)                                                     
  5. ax[0].plot(r_range, norm_pdf, 'g', lw=2,  
  6.            label=f'N({mu:.2f}, {sigma**2:.4f})')  
  7. ax[0].legend(loc='upper left');  
  8. # Q-Q plot  
  9. qq = sm.qqplot(df.log_rtn.values, line='s', axax=ax[1])  
  10. ax[1].set_title('Q-Q plot', fontsize = 16)  
  11. # plt.tight_layout() 
  12. # plt.savefig('images/ch1_im10.png')  
  13. plt.show() 

执行上面的代码会产生下图:

我们可以使用直方图(显示分布的形状)和 Q-Q 图来评估收益的正态性。此外,我们可以打印汇总统计信息:

通过查看均值、标准差、偏度和峰度等指标,我们可以推断它们偏离我们在正态下的预期。此外,Jarque-Bera 正态性检验让我们有理由拒绝原假设,即在 99% 置信水平下分布是正态的。

二、波动集聚性

运行以下代码,通过绘制收益序列来发现第二个典型化事实。

1、可视化收益序列: 

 
 
 
 
  1. df.log_rtn.plot(title='Daily S&P 500 returns', figsize=(10, 6)) 

执行代码会产生下图:

我们可以观察到明显的波动集聚性——波动较大的正收益和负收益时期。

三、收益不存在自相关性

我们继续去发现第三个典型化事实。

1、定义用于创建自相关图的参数: 

 
 
 
 
  1. N_LAGS = 50  
  2. SIGNIFICANCE_LEVEL = 0.05 

2、运行以下代码以创建收益的自相关函数 (ACF) 图: 

 
 
 
 
  1. acf = smt.graphics.plot_acf(df.log_rtn,   
  2.                             lags=N_LAGS,   
  3.                             alpha=SIGNIFICANCE_LEVEL) 

执行上面的代码会产生下图:

只有少数值位于置信区间之外并且可以被认为具有统计显著性。我们可以假设已经验证了收益序列中没有自相关性。

四、平方/绝对收益的自相关性小且递减

通过创建平方和绝对收益的 ACF 图来研究第四个典型化事实。

1、创建 ACF 图: 

 
 
 
 
  1. fig, ax = plt.subplots(2, 1, figsize=(12, 10))  
  2. smt.graphics.plot_acf(df.log_rtn ** 2, lags=N_LAGS,   
  3.                       alpha=SIGNIFICANCE_LEVEL, axax = ax[0])  
  4. ax[0].set(title='Autocorrelation Plots',  
  5.           ylabel='Squared Returns')  
  6. smt.graphics.plot_acf(np.abs(df.log_rtn), lags=N_LAGS,  
  7.                       alpha=SIGNIFICANCE_LEVEL, axax = ax[1])  
  8. ax[1].set(ylabel='Absolute Returns',  
  9.           xlabel='Lag') 

执行上面的代码会产生以下图:

我们可以观察到平方回报和绝对回报的自相关值很小且不断减小,这与第四种典型化事实一致。

五、杠杆效应

对于第五个事实,运行以下步骤来调查杠杆效应的存在。

1、将波动性度量计算为滚动标准偏差: 

 
 
 
 
  1. df['moving_std_252'] = df[['log_rtn']].rolling(window=252).std()  
  2. df['moving_std_21'] = df[['log_rtn']].rolling(window=21).std() 

2、绘制所有系列以进行比较: 

 
 
 
 
  1. fig, ax = plt.subplots(3, 1, figsize=(18, 15),   
  2.                        sharex=True)  
  3. df.adj_close.plot(axax=ax[0])  
  4. ax[0].set(title='S&P 500 time series',  
  5.           ylabel='Price ($)')  
  6. df.log_rtn.plot(axax=ax[1])  
  7. ax[1].set(ylabel='Log returns (%)')  
  8. df.moving_std_252.plot(axax=ax[2], color='r', 
  9.                        label='Moving Volatility 252d')  
  10. df.moving_std_21.plot(axax=ax[2], color='g',   
  11.                       label='Moving Volatility 21d')  
  12. ax[2].set(ylabel='Moving Volatility',  
  13.           xlabel='Date')  
  14. ax[2].legend() 

我们现在可以通过将价格序列与(滚动)波动率指标进行可视化比较来研究杠杆效应:

这一事实表明,资产波动性的大多数衡量标准与其回报呈负相关,我们确实可以观察到价格下跌时波动性增加而价格上涨时波动性减少的模式。 

当前标题:用Python分析资产收益的典型化事实
文章分享:http://www.gawzjz.com/qtweb/news37/197687.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联