IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Codes for VaR-Copula -> 正文阅读

[人工智能]Codes for VaR-Copula

Codes (Latex Environment)

\chapter{附件}

\section{Python代码}

编程软件:Python3.8\ jupyter\ notebook

电脑系统:Window\ 10\ 家庭中文版

电脑型号:ASUS\ TUF\ Gaming\ FA506IU

处理器:AMD\ Ryzen\ 7\ 4800H\ with\ Radeon\ Graphics\ 2.90GHz

电脑内存(RAM):16.0GB

\subsection{收益率边缘分布}

\begin{lstlisting}[language=Python]

import numpy as np

import pandas as pd

import scipy.stats as st

from scipy.stats import t

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

sh = pd.read_csv('上证指数历史数据(2).csv')

sz = pd.read_csv('深证成份指数历史数据(2).csv')

hs = pd.read_csv('香港恒生指数历史数据.csv')

def get_pct(data):

??? data.index = data['日期']

??? data_pct = data ['涨跌幅']

??? return data_pct

sh_pct = get_pct(sh)

sz_pct = get_pct(sz)

hs_pct = get_pct(hs)

#边缘密度

def show_edge(data,choose):

??? mu = data.mean()#.values

??? sigma = data.std()#.values

??? num_bins = 100

??? x = mu + sigma * np.random.randn(1000000)

??? # 正态分布的数据

??? data.hist(bins=300,figsize=(16,8),density = True,range=(-0.1,0.1)

???????????????? ,color='b',alpha=0.6,label='密度函数')

??? n, bins, patches = plt.hist(x, num_bins, density = True,alpha=0)

??? # 拟合曲线

??? y = st.norm.pdf(bins, mu, sigma)

??? plt.plot(bins, y,'r', alpha = 0.8,linewidth=2.5,label='正态分布')

??? #data.plot(kind = 'kde', color = 'g',linewidth=1.5,alpha=1,

???????????????? ?label = '核密度图')

??? t_dimen = 10

??? z = np.linspace(t.ppf(0.01, t_dimen,loc=mu,scale=sigma),t.ppf(0.99

???????????????? ,t_dimen,loc=mu,scale=sigma), 1000)

??? plt.plot(z, t.pdf(z, t_dimen,loc=mu,scale=sigma), alpha=1.0

???????????????? ,linewidth=2.5, c='gray',label='t-分布')

??? scipy_kde=st.gaussian_kde(data)#高斯核密度估计

??? X_plot=np.linspace(-0.1,0.1,1000)

??? dens=scipy_kde.evaluate(X_plot)

??? plt.plot(X_plot,dens,c='g',linewidth=2.5,label='核密度图')

??? font = {'size': 15}#设置横纵坐标的名称以及对应字体格式、大小

??? plt.xlabel('Expectation',font)

??? plt.ylabel('Probability',font)

??? plt.title('histogram of normal distribution: $\mu =$' +

???????????????? str(mu)[:6] + ', $\sigma =$'+ str(sigma)[:6],font)

??? axes = plt.gca()

??? axes.set_xlim([-0.075,0.075])

??? #显示题注

??? plt.legend(loc=0)

??? plt.legend(fontsize=15)#显示图例,设置图例字体大小

??? plt.grid(True)

??? plt.savefig(str(choose)+'.png')

??? plt.show()

show_edge(sh_pct,choose='sh')

show_edge(sz_pct,choose='sz')

show_edge(hs_pct,choose='hs')

time_preiod = ['2015年12月9日','2016年12月9日','2017年12月8日'

??????? ,'2018年12月7日','2019年12月9日','2020年12月9日']

def get_period_pct(time_preiod):

??? n = len(time_preiod)

??? S=[]

?? ?for i in range(n-1):

??????? sh_mean,sh_std = sh_pct[time_preiod[i]:time_preiod[i+1]]

???????????????? .mean(),sh_pct[time_preiod[i]:time_preiod[i+1]].std()

??????? sz_mean,sz_std = sz_pct[time_preiod[i]:time_preiod[i+1]]

???????????????? .mean(),sz_pct[time_preiod[i]:time_preiod[i+1]].std()

??????? hs_mean,hs_std = hs_pct[time_preiod[i]:time_preiod[i+1]]

???????????????? .mean(),hs_pct[time_preiod[i]:time_preiod[i+1]].std()

??????? S.append([sh_mean,sh_std,sz_mean,sz_std,hs_mean,hs_std])

??? return pd.DataFrame(S)

get_period_pct(time_preiod)

\end{lstlisting}

\subsection{相关系数及等高线}

\begin{lstlisting}[language=Python]

def merge(datalist):

??? n=len(datalist)

??? result = pd.DataFrame(datalist[0]).copy()

??? result.columns=[0]

??? for i in range(1,n):

??????? result[i]=datalist[i]

??? result = result.dropna()

??? return result

a= [sh_pct,sz_pct,hs_pct]

data = merge(a)

data.corr(method='pearson', min_periods=1)

data.corr(method='kendall', min_periods=1)

data.corr(method='spearman', min_periods=1)

#分布图

def show_mult(data,a,b,choose):

??? plt.figure(figsize=(16,8))

??? font = {'size': 15}#设置横纵坐标的名称以及对应字体格式、大小

??? plt.scatter(data.values[:,a],data.values[:,b],marker = '+')

??? plt.xlabel('深证指数',font)

??? plt.ylabel('恒生指数',font)

??? plt.title('scatter figure',font)

??? plt.grid(True)

??? plt.savefig(str(choose)+'.png')

??? plt.show()

#这里修改参数即可得到不同数据集之间散点图,下同

show_mult(data,1,2,choose='scatter3')

#等高线

def norm_d(x1,x2,mu,Sigma):

??? mu1 = mu[0]

??? mu2 = mu[1]

??? s1,s2 = Sigma[0,0]**0.5,Sigma[1,1]**0.5

??? rho = Sigma[0,1]/s1/s2

??? num=((1)/(2*np.pi*s1*s2*np.sqrt(1-rho**2)))

??? A=((x1-mu1)**2)/(s1**2)

??? B=2*rho*(((x1-mu1)*(x2-mu2))/(s1*s2))

??? C=((x2-mu2)**2)/(s2**2)

??? D=-1/(2*(1-rho**2))*(A-B+C)

??? pdf=num*np.exp(D)

??? return pdf

def show_contour(data,a,b,choose):

??? data1 = data[[a,b]]

??? plt.style.use('seaborn-whitegrid')

??? x1=np.arange(-0.1,0.1,0.001)

??? y1=np.arange(-0.1,0.1,0.001)

??? x1,y1 = np.meshgrid(x1,y1)

??? plt.figure(figsize=(16,8))

??? mu = data1.mean().values

??? Sigma = np.sqrt(data1.cov().values)

??? z = norm_d(x1,y1,mu,Sigma)

??? plt.contourf(x1, y1, z, 10)

??? plt.scatter(data.values[:,a],data.values[:,b],marker = 'x')

??? plt.grid(True)

??? font = {'size': 15}#设置横纵坐标的名称以及对应字体格式、大小

??? plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

?? ?plt.xlabel('上证指数',font)

??? plt.ylabel('深证指数',font)

??? plt.title('contour figure',font)

??? plt.savefig(str(choose)+'.png')

??? plt.show()

show_contour(data,0,1,choose='contour1')

\end{lstlisting}

\subsection{VaR计算}

\begin{lstlisting}[language=Python]

import scipy.stats as st

def get_VaR(data,choose):

??? if choose == 0:

??????? return np.ptp(data),st.skew(data),st.kurtosis(data)

???????????????????????? ,np.percentile(data,[5,10,90,95])

??? if choose ==1:

??????? mu = data.mean()

??????? sigma = data.std()

??????? num_bins = 100

??????? x = mu + sigma * np.random.randn(1000000)

??????? return np.percentile(x,[5,10,90,95])

??? if choose ==2:

??????? mu = data.mean()

??????? sigma = data.std()

??????? X = st.t(df=10,loc=mu, scale=sigma)

??????? return X.ppf(0.05),X.ppf(0.1),X.ppf(0.9),X.ppf(0.95)

for i in range(3):

??????? get_VaR(sh_pct,i)

??????? get_VaR(sz_pct,i)

??????? get_VaR(hs_pct,i)

def MCMC_kde(data,choose):

??? scipy_kde=st.gaussian_kde(data)

??? X_plot=np.linspace(-0.12,0.12,1201)

??? dens=scipy_kde.evaluate(X_plot)

?? ?X=[]

??? x=0

??? for i in range(100000):

??????? z1 = np.random.randint(-100,100)/5000

??????? y=x+z1

??????? pro = dens[int((y+0.12)*5000)]/dens[int((x+0.12)*5000)]

??????? z2 = np.random.uniform()

??????? if pro >z2:

??????????? X.append(y)

??????????? x=y

??????? else:

??????????? X.append(x)

??? data_MCMC = pd.DataFrame(X[50000:100000])

??? data_MCMC.hist(bins=300,figsize=(16,8),density = True

???????????????? ,range=(-0.1,0.1),color='b',alpha=0.6,label='MCMC抽样')

??? plt.plot(X_plot,dens,c='r',linewidth=2.5,label='核密度值')

??? font = {'size': 15}#设置横纵坐标的名称以及对应字体格式、大小

??? plt.xlabel('Expectation',font)

??? plt.ylabel('Probability',font)

??? plt.title('MCMC取样',font)

??? axes = plt.gca()

??? axes.set_xlim([-0.075,0.075])

??? #显示题注

??? plt.legend(loc=0)

??? plt.legend(fontsize=15)#显示图例,设置图例字体大小

??? plt.grid(True)

??? plt.savefig(str(choose)+'MCMC.png')

??? plt.show()

??? print(np.percentile(data_MCMC,[5,10,90,95]))

MCMC_kde(sh_pct,choose='sh_pct')

MCMC_kde(sz_pct,choose='sz_pct')

MCMC_kde(hs_pct,choose='hs_pct')

\end{lstlisting}

\subsection{相依性计算}

\begin{lstlisting}[language=Python]

def rank(df):

??? df = df.rank(method='min',axis=0)

??? df=df.T

??? return (df)

def pct_to_rank(data0):

??? data=data0.copy()

??? col = data.columns

??? n = len(col)

??? for i in range(n):

??????? data[col[i]]=rank(data[col[i]])

??? return data

data_rank = pct_to_rank(data)

def depends(data,a,precent,b):

??? df = data[[a,b]].copy()

??? n = len(df.index)

??? k=0

??? for i in range(n):

??????? if df[a][i]>=n*precent and df[b][i]>=n*precent and precent>=0.5:

??????????? k = k+1

??????? if df[a][i]<=n*precent and df[b][i]<=n*precent and precent<0.5:

??????????? k = k+1

??? return k/(n*precent)

def show_depends(data,a,b,start,end,n):

??? l = []

??? step = (end-start)/n

??? for i in range(n+1):

??????? precent = start+i*step

??????? l.append(depends(data,a,precent,b))

??? plt.figure(figsize=(16,8))

??? plt.plot(l)

??? plt.grid(True)

??? plt.show()

show_depends(data_rank,0,1,0.9,1,10)

#注意到a不能取0

show_depends(data_rank,0,1,0.01,0.11,10)

\end{lstlisting}

\subsection{MCMC模拟}

\begin{lstlisting}[language=Python]

import scipy

import sympy

from sympy import diff, symbols

import numpy as np

import pandas as pd

import math

from math import *

import matplotlib.pyplot as plt

x = symbols('x', real=True)

y = symbols('y', real=True)

z = symbols('z', real=True)

e = sympy.exp(1)

t = symbols('t', real=True)

def fun_diff3(function,x,y,z):

function1 = diff(function, x, 1)

function2 = diff(function1, y, 1)

function3 = diff(function2, z, 1)

return (function3)

def pdf(sth_pdf,x0,y0,z0,t0):

if 0<x0<1 and 0<y0<1 and 0<z0<1:

return float(sth_pdf.subs({x:x0,y:y0,z:z0,t:t0,e:math.e}))

else:

return 0

def get_MCMC_values(func_pdf,t0,itn):

L=[]

l=np.array([0.5,0.5,0.5])

for i in range(itn):

z1 = (np.random.random()-0.5)/5

z2 = (np.random.random()-0.5)/5

z3 = (np.random.random()-0.5)/5

u = np.random.random()

z4 = pdf(func_pdf,l[0],l[1],l[2],t0)

l_new = l+np.array([z1,z2,z3])

z5 = pdf(func_pdf,l_new[0],l_new[1],l_new[2],t0)

if (z5/z4)>u:

L.append(l_new)

l=l_new

else:

L.append(l)

return (pd.DataFrame(L))

def get_VaR(L,precent):

S=[]

n=len(L)

for i in range(n):

S.append(L.iloc[i].sum())

S=np.array(S)

return np.percentile(S,precent)

gumble_cdf = e**(-((-sympy.log(x))**t+(-sympy.log(y))**t+(-sympy.log(z))**t)**(1/t))

gumble_pdf = fun_diff3(gumble_cdf,x,y,z)

gumble_values = get_MCMC_values(gumble_pdf,t0=1.788,itn=2000)

print(get_VaR(gumble_values,[5,10,90,95]))

clayton_cdf = (x**(-t)+y**(-t)+z**(-t)-2)**(-1/t)

clayton_pdf = fun_diff3(clayton_cdf,x,y,z)

clayton_values = get_MCMC_values(clayton_pdf,t0=1.136,itn=2000)

print(get_VaR(clayton_values,[5,10,90,95]))

\end{lstlisting}

\section{R代码}

\subsection{copula拟合}

\begin{lstlisting}[]

library(parallel)

library(zoo)

library(rugarch)

library(xts)

library(ADGofTest)

library(qqtest)

library(copula)

library(qrmdata)

library(qrmtools)

library(dplyr)

datax<-read.csv(file="1.csv",sep=",",header=TRUE)

x<-datax$SZI

y<-datax$SH

o<-datax$HSI

plot(x,y)

plot(x,o)

plot(y,o)

data<-data.frame(x,y,o)

S<-data

### 2 Fitting marginal ARMA(1,1)-GARCH(1,1) models with

??????? ?standardized t residuals

## Build negative log-returns

X <- -returns(S) # -log-returns

Y <- returns(S)

## Basic plot

plot.zoo(X, main = "Negative log-returns")

plot.zoo(Y, main = "log-returns")

## Fit marginal time series

uspec <- rep(list(ugarchspec(distribution.model = "std")), ncol(X))

fit.ARMA.GARCH <- fit_ARMA_GARCH(X, ugarchspec.list = uspec)

stopifnot(sapply(fit.ARMA.GARCH$error, is.null)) # NULL = no error

if(FALSE)

? fit.ARMA.GARCH$warning

## => Warning comes from finding initial values and can

??????? ?be ignored here

fits <- fit.ARMA.GARCH$fit # fitted models

Z <- as.matrix(do.call(merge, lapply(fits, residuals, standardize

??????? = TRUE))) # grab out standardized residuals

colnames(Z) <- colnames(S)

(nu.mar <- vapply(fits, function(x) x@fit$coef[["shape"]],

??????? NA_real_)) # vector of estimated df

n <- nrow(X) # sample size

d <- ncol(X) # dimension

### Fitting copulas ##########################################

## Compute pseudo-observations from the standardized t residuals

U <- pobs(Z)

pairs2(U, cex = 0.4, col = adjustcolor("black", alpha.f = 0.5))

## Compare various bivariate copulas

fit.nc <- fitCopula(normalCopula(dim= d),? data = U)

fit.tc <- fitCopula(tCopula(dim= d),?????? data = U) # df of

??????? freedom are estimated, too

fit.cl <- fitCopula(claytonCopula(dim= d), data = U)

fit.gc <- fitCopula(gumbelCopula(dim=d),? data = U)

## Comparing the likelihoods

sort(c(nc = fit.nc@loglik, tc = fit.tc@loglik, cl = fit.cl@loglik

??????? , gc = fit.gc@loglik),

???? decreasing = TRUE)

### 3 Fitting copulas #########################################

## Fitting a Gumbel copula

fit.gc <- fitCopula(gumbelCopula(dim = d),

??????????????????? data = U, method = "mpl")

fit.gc@estimate # estimated copula parameter

gc <- fit.gc@copula # fitted copula

## Compute matrices of pairwise Kendall's tau and upper

??????? tail-dependence coefficients

p2P(tau(gc), d = d)

p2P(lambda(gc)["upper"], d = d)

## Fitting a Clayton copula

fit.cl <- fitCopula(claytonCopula(dim = d),

??????????????????? data = U)

fit.cl@estimate # estimated copula parameter

cl <- fit.cl@copula # fitted copula

## Compute matrices of pairwise Kendall's tau and lower

??????? tail-dependence coefficients

p2P(tau(cl), d = d)

p2P(lambda(cl)["lower"], d = d)

## Fitting a Normal copula

fit.nc <- fitCopula(normalCopula(dim = d),

??????????????????? data = U)

fit.nc@estimate # estimated copula parameter

nc <- fit.nc@copula # fitted copula

## Compute matrices of pairwise Kendall's tau and lower

??????? tail-dependence coefficients

p2P(tau(nc), d = d)

p2P(lambda(nc), d = d)

## Fitting a t copula

fit.tc <- fitCopula(tCopula(dim = d, dispstr = "un"),

??????????????????? data = U, method = "itau.mpl")

(nu <- tail(fit.tc@estimate, n = 1))

# estimated degrees of freedom nu

(P <- p2P(head(fit.tc@estimate, n = -1)))

# estimated correlation matrix

tc <- fit.tc@copula # fitted copula

## Compute matrices of pairwise Kendall's tau and upper

??????? tail-dependence coefficients

p2P(tau(tc))

p2P(lambda(tc)[(choose(d,2)+1):(d*(d-1))])

### 4 Goodness-of-fit ##########################################

## We use the parametric bootstrap here, based on the

??????? maximum pseudo-likelihood

## estimator.

N <- 200

## Check the Gumbel copula

gof.gc <- gofCopula(gc, x = U, N = N) # warning also because

??????? the copula doesn't fit well here

stopifnot(gof.gc$p.value < 0.05) # if occur=> rejection

## Check the Clayton copula

gof.cl <- gofCopula(cl, x = U, N = N) # warning also because

??????? the copula doesn't fit well here

stopifnot(gof.cl$p.value < 0.05) # if occur=> rejection

## Check the normal copula

gof.nc <- gofCopula(nc, x = U, N = N) # warning also because

??????? the copula doesn't fit well here

stopifnot(gof.nc$p.value < 0.05) # if occur=> rejection

## Check the t copula is different from the three above since

??????? t copula contains two integers.

U.Rsnbl_tc <- cCopula(U, copula = tc)

pairs2(U.Rsnbl_tc, cex = 0.4, col = adjustcolor("black",

??????? alpha.f = 0.5),main ="t copula") # looks ok

## normal copula also checked

U.Rsnbl_nc <- cCopula(U, copula = nc)

pairs2(U.Rsnbl_nc, cex = 0.4, col = adjustcolor("black",

??????? alpha.f = 0.5),main ="normal copula") # looks not good

## clayton copula also checked

U.Rsnbl_cl <- cCopula(U, copula = cl)

pairs2(U.Rsnbl_cl, cex = 0.4, col = adjustcolor("black",

??????? alpha.f = 0.5),main="clayton copula") # looks not good

## Gumbel copula also checked

U.Rsnbl_gc <- cCopula(U, copula = gc)

pairs2(U.Rsnbl_gc, cex = 0.4, col = adjustcolor("black",

??????? alpha.f = 0.5),main ="gumbel copula") # looks ok

## Map it to a K_d distribution ("kay") and do a Q-Q plot

U.Rsnbl.K <- sqrt(rowMeans(qnorm(U.Rsnbl_tc)^2))

# map to a kay distribution

pK <- function(q, d) pchisq(d*q*q, df = d)

# df of a K_d distribution

AD <- ad.test(U.Rsnbl.K, distr.fun = pK, d = d)

# compute an AD test for t copula

stopifnot(AD$p.value >= 0.05)# contrary to the above test

## A (sophisticated) Q-Q plot, Attetion: we have to clear the

??????? chart space since we defined above.

qqtest(U.Rsnbl.K, dist = "kay", df = d, nreps = 1000, pch = 1,

?????? col = adjustcolor("black", alpha.f = 0.5), main = "good",

?????? xlab = substitute(K[dof]~"quantiles", list(dof = d)))

# => looks ok

\end{lstlisting}

\subsection{t\ copula的蒙特卡罗}

\begin{lstlisting}

## t copula montecarlo

library(mvtnorm)

tcsample<-rmvt(2000,sigma=Sigma,df=v,type=c("shifted","Kshirsagar")[2])

tcsample[,2]<-

(tcsample[,2]-min(tcsample[,2]))/(max(tcsample[,2])-min(tcsample[,2]))

tcsample[,3]<-

(tcsample[,3]-min(tcsample[,3]))/(max(tcsample[,3])-min(tcsample[,3]))

tcsample[,1]<-

(tcsample[,1]-min(tcsample[,1]))/(max(tcsample[,1])-min(tcsample[,1]))

tcsample1<-(apply(tcsample,1,sum))

quantile(tcsample1, probs = seq(0,1, 0.01), type = 7)

\end{lstlisting}

% vim:ts=4:sw=4

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-02-01 20:36:39  更:2022-02-01 20:39:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 20:37:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码