回归分析
这里只是用SP500指数和VIX,指数波动率在隐含波动率的基础上计算得到一定程度上反映了,未来波动率的发展情况.
由于国内的波动率指数刚发布不到一年,tushrae现在不能获取它的数据,所以需要从雅虎财经获取标普500和标普波动率指数.
# 获取美国数据,需要倒入新的模块
import pandas_datareader.data as web
import fix_yahoo_finance as yf # 配合pandas_datareader 获取雅虎财经数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
yf.pdr_override()
# 标普500
df_spy = web.get_data_yahoo('SPY',start='2010-01-01')
df_vix = web.get_data_yahoo('^VIX',start='2010-01-01')
[*********************100%***********************] 1 of 1 downloaded
df_spy.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1899 entries, 2010-01-04 to 2017-07-19
Data columns (total 6 columns):
Open 1899 non-null float64
High 1899 non-null float64
Low 1899 non-null float64
Close 1899 non-null float64
Adj Close 1899 non-null float64
Volume 1899 non-null int64
dtypes: float64(5), int64(1)
memory usage: 103.9 KB
# 提取两个数据中的收盘价格,组成一个新的数据列表
data = pd.DataFrame({'SPY':df_spy['Close']})
data = data.join(pd.DataFrame({'VIX':df_vix['Close']}))
print data.tail()
SPY VIX
Date
2017-07-13 244.419998 9.90
2017-07-14 245.559998 9.51
2017-07-17 245.529999 9.82
2017-07-18 245.660004 9.89
2017-07-19 246.990005 9.79
%matplotlib inline
data.plot(subplots=True, figsize=(12,7), grid=True)
SPY和VIX
再次验证了杠杆效应,标普出现下跌的时候,波动率指数就会上升.
# 对两列时间序列计算对数收益率
d_res = np.log(data / data.shift(1))
print d_res.head()
SPY VIX
Date
2010-01-04 NaN NaN
2010-01-05 0.002644 -0.035038
2010-01-06 0.000704 -0.009868
2010-01-07 0.004212 -0.005233
2010-01-08 0.003322 -0.050024
%matplotlib inline
d_res.plot(subplots=True, grid=True, figsize=(12,7))
对数收益率
# 回归分析
# S&P500作为自变量,VIX作为因变量
x = d_res['SPY'][1:]
y = d_res['VIX'][1:]
# 用一次多项式去拟合数据
poly_1 = np.polyfit(x, y, 1)
print poly_1
[ -6.36571378e+00 2.23540666e-03]
斜率为-6.365,截距为2.235,表现出强烈的负相关(杠杆效应)
# 对数收益率的散点图和拟合直线
%matplotlib inline
plt.plot(x, y, '.')
ax = plt.axis() #x轴的取值范围
lx = np.linspace(ax[0], ax[1] + 0.01)
plt.plot(lx, np.polyval(poly_1, lx),'r', lw=2.0)
plt.grid(True)
plt.xlabel('SPY')
plt.ylabel('VIX')
# 标普指数和指数波动率之间的相关性
print d_res.corr()
SPY VIX
SPY 1.000000 -0.810071
VIX -0.810071 1.000000
也反映除了强烈的负相关,但是相关性会伴随时间周期发生变化
# 计算窗口期为一年的,滑动相关系数
# Series.rolling(window=252).corr(other=<Series>)
mov_corr = d_res['SPY'].rolling(window=252).corr(d_res['VIX'])
%matplotlib inline
mov_corr.plot(grid=True, figsize=(12,7))
尽管相关性随着时间变化,但是仍是呈现出强烈的负相关