栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

利用tushare实现比较VaR方法和ES方法的优劣

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用tushare实现比较VaR方法和ES方法的优劣

一、导入需要的库
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很好的帮我解决了这一问题!        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/321670.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号