import tushare as ts import pandas as pd import matplotlib.pyplot as plt import numpy as np import math from math import sqrt, exp, pi, log, pow二、利用tushare获取需要的指数历史数据
通过tushare可以较快的获取很长一段时间的指数历史数据(tushare详细使用方法可点击此处了解,我的tushareid为452803),这里我们获取的近似为5*250天也就是5年的历史数据,并将数据倒序后合并为了一个表格。
pro = ts.pro_api() SZ180 = list(pro.index_daily(ts_code='000010.SH',start_date='20160420')['close']) ZZ500 = list(pro.index_daily(ts_code='000905.SH',start_date='20160420')['close']) HS300 = list(pro.index_daily(ts_code='000300.SH',start_date='20160420')['close']) SZ50 = list(pro.index_daily(ts_code='000016.SH',start_date='20160420')['close']) SZCZ = list(pro.index_daily(ts_code='399001.SZ',start_date='20160420')['close']) date = list(pro.index_daily(ts_code='399001.SZ',start_date='20160420')['trade_date']) date.reverse() SZ180.reverse() ZZ500.reverse() HS300.reverse() SZ50.reverse() SZCZ.reverse() rawdata = pd.Dataframe(np.array([SZCZ, SZ180, ZZ500, HS300, SZ50]).T, columns = ['深圳成指', '上证180', '中证500', '沪深300', '上证50'], index = date)三、计算VaR序列和ES序列
在我们自己设定好几个股票指数各自的权重之后,利用tushare得到的历史数据我们可以计算历史收益率数据,然后就能轻松的计算得到VaR序列和ES序列了,采取的两种主要方法分别是历史模拟法和正态假设法,前者是利用历史数据寻找分位点,后者则是在正态假设下利用历史数据的均值和方差进行计算。
先根据VaR和ES的定义,我们定义两个简单函数来寻找一个历史数据列的VaR和ES:
def findVaR(loss):
loss.sort(reverse = True)
return loss[4]
def findES(loss):
loss.sort(reverse = True)
return (loss[0] + loss[1] + loss[2] + loss[3])/4
然后历史法代码如下:
def Historymethod(j, weight):
loss = []
condition = [[], [], [], [], []]
sumVaR = 0
sumES = 0
VaR = findVaR(porloss[j:j + 500])
ES = findES(porloss[j:j + 500])
for k in range(5):
sumVaR += findVaR(rawloss[k][j: j+500])
sumES += findES(rawloss[k][j: j+500])
VaRratio = (sumVaR - VaR)/sumVaR
ESratio = (sumES - ES)/sumES
return (VaR, ES, VaRratio, ESratio)
正态模型法代码如下:
#计算列表协方差
def cov(list1, list2):
l1 = pd.Series(list1)
l2 = pd.Series(list2)
return l1.cov(l2)
#获得收益率序列
def yieldrate(rawlist):
return np.diff(rawlist)/rawlist[:-1]
def Modelmethod(j, weight):
sigmasq = 0
usedata = [[], [], [], [], []]
usedata[0] = yieldrate(SZCZ[j:j + 501])
usedata[1] = yieldrate(SZ180[j:j + 501])
usedata[2] = yieldrate(ZZ500[j:j + 501])
usedata[3] = yieldrate(HS300[j:j + 501])
usedata[4] = yieldrate(SZ50[j:j + 501])
for i in range(5):
for k in range(5):
sigmasq += weight[k] * weight[i] * cov(usedata[k], usedata[i])
VaR = 2.326 * sqrt(sigmasq)
ES = sqrt(sigmasq) * exp( -2.326 * 2.326 / 2) * 100 /sqrt(2 * pi)
return (VaR, ES)
四、结果分析
1、序列结果图:
2、结论:
整体而言,无论是1DayVaR或者是10DayVaR,利用历史数据法以及极值分布方法得到的结果都是相对可靠的,而模型构建法(无论是否利用波动率修正)的表现并不是很好。这也说明利用指数的对数收益率并不符合正态分布,或者说正态分布难以拟合指数的收益率数据。
总的来说,整体方法的运用并不困难,一开始难住我的是数据来源的获取,tushare很好的帮我解决了这一问题!



