多数金融研究针对的是资产收益率而不是资产价格。
使用收益率有两个主要理由:
然而,资产收益率有多种定义,设 Pt 是资产在 t 时刻的价格。下面给出常见的几个收益率定义.暂时假定资产不支付分红。
若从第 t−1 天到第 t 天(一个周期)持有某种资产,则简单毛收益率为:
1+Rt=PtPt−1 或 Pt=Pt−1(1+Rt)对应的单期简单收益率或称简单收益率为:
Rt=PtPt−1−1=Pt−Pt−1Pt−1资产的简单毛收益率的自然对数称为连续复合收益率 或 对数收益率:
rt=ln(1+Rt)=lnPtPt−1=pt−pt−1其中 pt=lnPt,与简单净收益率 Rt 相比,连续复合收益率 rt 有一些优点。首先,对多期收益率,我们有:
rt[k]=ln(1+Rt[k])=ln[(1+Rt)(1+Rt−1)⋯(1+Rt−k+1)]=ln(1+Rt)+ln(1+Rt−1)+⋯+ln(1+Rt−k+1)=rt+rt−1+⋯+rt−k+1这样,连续复合多期收益率就是它所包含的连续复合单期收益率之和。其次,对数收益率具有更容易处理的统计性质。
import pandas as pd
import numpy as np
stock = pd.read_excel('../数据/上证指数与沪深300.xlsx')
stock['sz收益率'] = 100*np.log(stock['sz']/stock['sz'].shift(1))
stock = stock.dropna() #删除缺失值
stock = stock.reset_index(drop=True)
stock.head()
日期 | hs300 | sz | sz收益率 | |
---|---|---|---|---|
0 | 2018-01-03 | 4111.3925 | 3369.1084 | 0.618765 |
1 | 2018-01-04 | 4128.8119 | 3385.7102 | 0.491555 |
2 | 2018-01-05 | 4138.7505 | 3391.7501 | 0.178235 |
3 | 2018-01-08 | 4160.1595 | 3409.4795 | 0.521360 |
4 | 2018-01-09 | 4189.2977 | 3413.8996 | 0.129558 |
平稳性是时间序列分析的基础。
时间序列 {rt} 称为严平稳的(strictly stationary),如果对所有的 t,任意正整数 k 和任意 k 个正整数(t1,⋯,tk),(rt1,⋯,rtk)的联合分布与(rt1+t,⋯,rtk+t)的联合分布是相同的.换言之,严平稳性要求(rt1,⋯,rtk)的联合分布在时间的平移变换下保持不变。这是一个很强的条件,难以用经验方法验证,经常假定的是平稳性的一一个较弱的形式。
时间序列 {rt} 称为弱平稳的(weakly stationary),如果 rt 的均值与 rt 和 rt−l 的协方差不随时间而改变,其中 l 是任意整数.更具体地说,{rt} 是弱平稳的,若:
在实际中,假定我们有 T 个数据观测点{rt|t=1,⋯,T},弱平稳性意味着数据的时间图显示出 T 个值在一个常数水平上下以相同幅度波动。在应用中,弱平稳性使我们可以对未来观测进行推断,即预测。
在弱平稳性的条件中,我们隐含地假定了 rt 的前两阶矩是有限的.由定义可见,若 rt 是严平稳的且它的前两阶矩是有限的,则 rt 也是弱平稳的.反之,一般是不成立的.但如果时间序列 rt 是正态分布的,则弱平稳性与严平稳性是等价的.本内容主要考虑弱平稳序列。
协方差 γl=Cov(rt,rt−l) 称为 rt 的间隔为 l 的自协方差、它具有两个重要性质:
第二个性质成立是因为Cov(rt,rt−(−l))=Cov(rt−(−l),rt)=Cov(rt+l,rt)=Cov(rt1,rt1−l),其中t1=t+l
在金融文献中,通常假定资产收益率序列是弱平稳的.只要有足够多的历史收益率数据,这个假定可以用实证方法验证,例如,我们可以把数据分成若干子样本,然后检验它们的一致性。
对于 AR(1),一般从理论上认为,不太可能出现 | β1|>1 的情形,否则任何对经济的扰动都将被无限放大。因此,经济学家通常只担心存在单位根的情形, 即 β1=1∘ 如果时间序列存在单位根,则为非平稳序列,可能带来以下问题:
import statsmodels.tsa.stattools as ts
ts.adfuller(stock['sz'])
(-2.3069400422968207, 0.16973943854299967, 7, 451, {'1%': -3.444932949082776, '5%': -2.867969899953726, '10%': -2.57019489663276}, 4390.386487977853)
from arch.unitroot import ADF
ADF(stock['sz'])
Test Statistic | -2.307 |
P-value | 0.170 |
Lags | 7 |
ts.kpss(stock['sz'], nlags='auto')
G:\anaconda\lib\site-packages\statsmodels\tsa\stattools.py:1685: InterpolationWarning: p-value is smaller than the indicated p-value warn("p-value is smaller than the indicated p-value", InterpolationWarning)
(0.8735590412113318, 0.01, 12, {'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})
from arch.unitroot import KPSS
KPSS(stock['sz'])
Test Statistic | 0.874 |
P-value | 0.005 |
Lags | 12 |
from arch.unitroot import DFGLS
DFGLS(stock['sz'])
Test Statistic | -0.563 |
P-value | 0.492 |
Lags | 7 |
from arch.unitroot import PhillipsPerron
PhillipsPerron(stock['sz'])
Test Statistic | -2.108 |
P-value | 0.241 |
Lags | 18 |
更多单位根检验请参考:Unit Root Testing