
大数据分析实验二:金融中的时间序列数据处理
一、金融数据的获取与处理导入包,通过pandas_datareader模块来从yahoo获取金融数据信息,应该是网站的问题,显示超时,获取不到数据,所以本文数据可以直接从文末尾的百度网盘中提取。import datetimeimport pandas as pdimport pandas_datareader.data as webimport numpy as npimport mathfrom
一、金融数据的获取与处理
导入包,通过pandas_datareader模块来从yahoo获取金融数据信息,应该是网站的问题,显示超时,获取不到数据,所以本文数据可以直接从文末尾的百度网盘中提取。
import datetime
import pandas as pd
import pandas_datareader.data as web
import numpy as np
import math
from statsmodels.formula.api import ols
import matplotlib.pyplot as plt
# start_date=datetime.datetime(2000,1,1)
# end_date=datetime.datetime(2014,9,2s6)
# dax_data=web.DataReader('^GDAXI',data_source='yahoo',start=start_date,end=end_date)
# dax_data.to_csv('dax_data.csv',index=True)
接下来直接读取数据csv文件进行实验
# 导入数据
dax_data=pd.read_csv(r'C:\Users\hp\Desktop\数据\dax_data.csv')
# 查看数据的基本信息
print(dax_data.info())
# 绘制收盘价图形
dax_data=dax_data.set_index('Date',drop=True)
dax_data['Close'].plot(subplots=True,style='b',figsize=(10,5))
# 计算收益率
dax_data['Ret_Loop']=0.0
for i in range(1,len(dax_data)):
dax_data['Ret_Loop'][i]=np.log(dax_data['Close'][i]/dax_data['Close'][i-1])
dax_data#输出数据查看
# 使用向量化的方法,用shift来获得滞后一期的数据
dax_data['Return']=np.log(dax_data['Close']/dax_data['Close'].shift(1))
print(dax_data[['Close','Ret_Loop','Return']].head(10))
注:DataFrame.shift(periods=1, freq=None, axis=0);periods:类型为int,表示移动的幅度,可以是正数,也可以是负数,默认值是1,1就表示移动一次,注意这里移动的都是数据,而索引是不移动的,移动之后没有对应值的,就赋值为NaN。计算结果一致,但是效率提高
# 绘制图形
dax_data.drop('Ret_Loop',inplace=True,axis=1)
dax_data[['Close','Return']].plot(subplots=True,style='b',figsize=(10,5))
计算42天和252天移动平均收盘价;Pandas:DataFrame.rolling(window=3).mean()滑动窗口值设为多少就是将相邻的几个数做均值处理。
# 移动平均可以用rolling函数
dax_data['42d']=dax_data['Close'].rolling(42).mean().values
dax_data['252d']=dax_data['Close'].rolling(252).mean().values
print(dax_data[['42d','252d']].tail())
# 绘图
dax_data[['Close','42d','252d']].plot(figsize=(10,5))
接下来计算移动平均历史波动率并绘制图形
# 移动平均历史波动率
dax_data['MOV_vol']=dax_data['Return'].rolling(252).std()*math.sqrt(252)
dax_data[['Close','MOV_vol','Return']].plot(subplots=True,style='b',figsize=(10,5))
三个图分别为收盘价、移动平均率的收益率的波动率和收益率
二、回归分析
使用ts_data.xlsx数据集
EURO STOXX : 欧洲蓝筹股票历史日度收盘价
VSTOXX:VSTOXX波动率指数的历史日度收盘价
计算的基础是蓝筹指数的隐含波动率
# 回归分析
es=pd.read_excel(r'C:\Users\hp\Desktop\数据\ts_data.xlsx',sheet_name=0)
print(es.info())
# 将date作为索引
es=es.set_index('Date',drop=True)
# 读取另一个sheet
vs=pd.read_excel(r'C:\Users\hp\Desktop\数据\ts_data.xlsx',sheet_name=1)
print(vs.info())
# 将date作为行索引
vs=vs.set_index('Date',drop=True)
# 通过日期合并股票数据和波动率数据
data1=es[['SX5E']][(es.index>datetime.datetime(1999,1,1))&(es.index<datetime.datetime(2016,1,1))]
data2=vs[['V2TX']][(vs.index>datetime.datetime(1999,1,1))&(vs.index<datetime.datetime(2016,1,1))]
data=data1.join(data2)
data.columns=['EUROSTOXX','VSTOXX']
print(data.tail())
# 处理缺失值,使用前一个数字填充
data=data.fillna(method='ffill')
print(data.info())
print(data.tail())
# 绘图
data.plot(subplots=True,grid=True,style='b',figsize=(10,5)) # 取出对数收益率
rets=np.log(data/data.shift(1))
print(rets.head())
# 绘图
rets.plot(subplots=True,grid=True,style='b',figsize=(10,5))
# 查看两个指标的相关性
print(rets.corr())
从相关系数矩阵可以看到,股票指数和波动率指数具有非常高的负相关性
# 建立模型
myfit=ols('VSTOXX~EUROSTOXX',data=rets).fit()
print(myfit.summary())
调整后的R^2为0.54,有一定的准确率,模型表达式y=-2.8358x
# 绘制拟合图形
plt.figure()
plt.scatter(rets['EUROSTOXX'][1:],rets['VSTOXX'][1:],color='r')
plt.plot(rets['EUROSTOXX'][1:],myfit.fittedvalues,color='b')
plt.grid()
plt.show()
csv数据链接:https://pan.baidu.com/s/1PhVQtvHjnnVwprBjtAeQEQ
提取码:1234
更多推荐
所有评论(0)