用 Python 分析資產(chǎn)收益的典型化事實(shí)
Python中文社區(qū)(ID:python-china)
典型化事實(shí)(Stylized Facts)是在實(shí)際數(shù)據(jù)中發(fā)現(xiàn)的一些現(xiàn)象。“典型化事實(shí)”在經(jīng)濟(jì)學(xué)中非常重要,無論是宏觀經(jīng)濟(jì)學(xué)還是貿(mào)易、金融還是產(chǎn)業(yè)經(jīng)濟(jì)學(xué),在理論的發(fā)展中都扮演著非常重要的角色,因而如果能發(fā)現(xiàn)一些“典型化事實(shí)”,對經(jīng)濟(jì)學(xué)的理論研究和之后的實(shí)證研究是非常重要的。掃描本文最下方二維碼獲取全部完整源碼和Jupyter Notebook 文件打包下載。
典型化事實(shí)(Stylized Facts)是出現(xiàn)在許多資產(chǎn)回報(bào)(跨時(shí)間和市場)中的統(tǒng)計(jì)屬性。了解它們很重要,因?yàn)楫?dāng)我們構(gòu)建代表資產(chǎn)價(jià)格動態(tài)的模型時(shí),模型必須能夠捕獲這些屬性。
下面我們使用從 1985 年到 2018 年標(biāo)普 500 指數(shù)的每日回報(bào)收益來分析五個(gè)典型化事實(shí)。
我們從雅虎財(cái)經(jīng)下載標(biāo)準(zhǔn)普爾 500 指數(shù)價(jià)格并計(jì)算收益。使用以下代碼導(dǎo)入所有需要的庫:
- import pandas as pd
- import numpy as np
- import yfinance as yf
- import seaborn as sns
- import scipy.stats as scs
- import statsmodels.api as sm
- import statsmodels.tsa.api as smt
在本節(jié)中,我們將用 Python去發(fā)現(xiàn)標(biāo)準(zhǔn)普爾 500 指數(shù)系列中的五個(gè)典型化事實(shí)。
- df = yf.download('^GSPC',
- start='1985-01-01',
- end='2018-12-31',
- progress=False)
- dfdf = df[['Adj Close']].rename(columns={'Adj Close': 'adj_close'})
- df['log_rtn'] = np.log(df.adj_close/df.adj_close.shift(1))
- dfdf = df[['adj_close', 'log_rtn']].dropna(how = 'any')
一、資產(chǎn)收益的非高斯分布
運(yùn)行以下步驟,通過繪制收益直方圖和 Q-Q 圖來發(fā)現(xiàn)第一個(gè)事實(shí)的存在。
1、使用觀察到的收益的均值和標(biāo)準(zhǔn)差計(jì)算正態(tài)概率密度函數(shù) (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))
- # histogram
- sns.distplot(df.log_rtn, kde=False, norm_hist=True, axax=ax[0])
- ax[0].set_title('Distribution of S&P 500 returns', fontsize=16)
- ax[0].plot(r_range, norm_pdf, 'g', lw=2,
- label=f'N({mu:.2f}, {sigma**2:.4f})')
- ax[0].legend(loc='upper left');
- # Q-Q plot
- qq = sm.qqplot(df.log_rtn.values, line='s', axax=ax[1])
- ax[1].set_title('Q-Q plot', fontsize = 16)
- # plt.tight_layout()
- # plt.savefig('images/ch1_im10.png')
- plt.show()
執(zhí)行上面的代碼會產(chǎn)生下圖:
我們可以使用直方圖(顯示分布的形狀)和 Q-Q 圖來評估收益的正態(tài)性。此外,我們可以打印匯總統(tǒng)計(jì)信息:
通過查看均值、標(biāo)準(zhǔn)差、偏度和峰度等指標(biāo),我們可以推斷它們偏離我們在正態(tài)下的預(yù)期。此外,Jarque-Bera 正態(tài)性檢驗(yàn)讓我們有理由拒絕原假設(shè),即在 99% 置信水平下分布是正態(tài)的。
二、波動集聚性
運(yùn)行以下代碼,通過繪制收益序列來發(fā)現(xiàn)第二個(gè)典型化事實(shí)。
1、可視化收益序列:
- df.log_rtn.plot(title='Daily S&P 500 returns', figsize=(10, 6))
執(zhí)行代碼會產(chǎn)生下圖:
我們可以觀察到明顯的波動集聚性——波動較大的正收益和負(fù)收益時(shí)期。
三、收益不存在自相關(guān)性
我們繼續(xù)去發(fā)現(xiàn)第三個(gè)典型化事實(shí)。
1、定義用于創(chuàng)建自相關(guān)圖的參數(shù):
- N_LAGS = 50
- SIGNIFICANCE_LEVEL = 0.05
2、運(yùn)行以下代碼以創(chuàng)建收益的自相關(guān)函數(shù) (ACF) 圖:
- acf = smt.graphics.plot_acf(df.log_rtn,
- lags=N_LAGS,
- alpha=SIGNIFICANCE_LEVEL)
執(zhí)行上面的代碼會產(chǎn)生下圖:
只有少數(shù)值位于置信區(qū)間之外并且可以被認(rèn)為具有統(tǒng)計(jì)顯著性。我們可以假設(shè)已經(jīng)驗(yàn)證了收益序列中沒有自相關(guān)性。
四、平方/絕對收益的自相關(guān)性小且遞減
通過創(chuàng)建平方和絕對收益的 ACF 圖來研究第四個(gè)典型化事實(shí)。
1、創(chuàng)建 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='Autocorrelation Plots',
- ylabel='Squared Returns')
- smt.graphics.plot_acf(np.abs(df.log_rtn), lags=N_LAGS,
- alpha=SIGNIFICANCE_LEVEL, axax = ax[1])
- ax[1].set(ylabel='Absolute Returns',
- xlabel='Lag')
執(zhí)行上面的代碼會產(chǎn)生以下圖:
我們可以觀察到平方回報(bào)和絕對回報(bào)的自相關(guān)值很小且不斷減小,這與第四種典型化事實(shí)一致。
五、杠桿效應(yīng)
對于第五個(gè)事實(shí),運(yùn)行以下步驟來調(diào)查杠桿效應(yīng)的存在。
1、將波動性度量計(jì)算為滾動標(biāo)準(zhǔn)偏差:
- df['moving_std_252'] = df[['log_rtn']].rolling(window=252).std()
- df['moving_std_21'] = df[['log_rtn']].rolling(window=21).std()
2、繪制所有系列以進(jìn)行比較:
- fig, ax = plt.subplots(3, 1, figsize=(18, 15),
- sharex=True)
- df.adj_close.plot(axax=ax[0])
- ax[0].set(title='S&P 500 time series',
- ylabel='Price ($)')
- df.log_rtn.plot(axax=ax[1])
- ax[1].set(ylabel='Log returns (%)')
- df.moving_std_252.plot(axax=ax[2], color='r',
- label='Moving Volatility 252d')
- df.moving_std_21.plot(axax=ax[2], color='g',
- label='Moving Volatility 21d')
- ax[2].set(ylabel='Moving Volatility',
- xlabel='Date')
- ax[2].legend()
我們現(xiàn)在可以通過將價(jià)格序列與(滾動)波動率指標(biāo)進(jìn)行可視化比較來研究杠桿效應(yīng):
這一事實(shí)表明,資產(chǎn)波動性的大多數(shù)衡量標(biāo)準(zhǔn)與其回報(bào)呈負(fù)相關(guān),我們確實(shí)可以觀察到價(jià)格下跌時(shí)波動性增加而價(jià)格上漲時(shí)波動性減少的模式。