cvar/0000755000176200001440000000000014330710446011207 5ustar liggesuserscvar/NAMESPACE0000644000176200001440000000055514330676704012443 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(ES,default) S3method(ES,numeric) S3method(VaR,default) S3method(VaR,numeric) S3method(predict,garch1c1) export(ES) export(GarchModel) export(VaR) export(VaR_cdf) export(VaR_qf) export(sim_garch1c1) importFrom(Rdpack,reprompt) importFrom(gbutils,cdf2quantile) importFrom(stats,quantile) importFrom(stats,runif) cvar/README.md0000644000176200001440000000617114210660660012472 0ustar liggesusers # cvar [![CRANStatusBadge](https://www.r-pkg.org/badges/version/cvar)](https://cran.r-project.org/package=cvar) [![R-CMD-check](https://github.com/GeoBosh/cvar/workflows/R-CMD-check/badge.svg)](https://github.com/GeoBosh/cvar/actions) [![codecov](https://codecov.io/gh/GeoBosh/cvar/branch/master/graph/badge.svg?token=2SW9HKG71Y)](https://app.codecov.io/gh/GeoBosh/cvar) ## Overview Compute expected shortfall (ES) and Value at Risk (VaR) from a quantile function, distribution function, random number generator or probability density function. ES is also known as Conditional Value at Risk (CVaR). Virtually any continuous distribution can be specified. The functions are vectorised over the arguments. The computations are done directly from the definitions, see e.g. Acerbi and Tasche (2002). Some support for GARCH models is provided, as well. ## Installing cvar The [latest stable version](https://cran.r-project.org/package=cvar) is on CRAN. install.packages("cvar") The vignette [Guide_cvar]( https://CRAN.R-project.org/package=cvar/vignettes/Guide_cvar.pdf) shipping with the package gives illustrative examples (can also be opened from R with `vignette("Guide_cvar", package = "cvar")`). You can install the [development version](https://github.com/GeoBosh/cvar) of `cvar` from Github: library(devtools) install_github("GeoBosh/cvar") ## Overview Package `cvar` is a small `R` package with, essentially two functions — `ES` for computing the expected shortfall and `VaR` for Value at Risk. The user specifies the distribution by supplying one of the functions that define a continuous distribution—currently this can be a quantile function (qf), cumulative distribution function (cdf) or probability density function (pdf). Virtually any continuous distribution can be specified. The functions are vectorised over the parameters of the distributions, making bulk computations more convenient, for example for forecasting or model evaluation. The name of this package, "cvar", comes from *Conditional Value at Risk* (CVaR), which is an alternative term for expected shortfall. We chose to use the standard names `ES` and `VaR`, despite the possibility for name clashes with same named functions in other packages, rather than invent possibly difficult to remember alternatives. Just call the functions as `cvar::ES` and `cvar::VaR` if necessary. Locations-scale transformations can be specified separately from the other distribution parameters. This is useful when such parameters are not provided directly by the distribution at hand. The use of these parameters often leads to more efficient computations and better numerical accuracy even if the distribution has its own parameters for this purpose. Some of the examples for `VaR` and `ES` illustrate this for the Gaussian distribution. Since VaR is a quantile, functions computing it for a given distribution are convenience functions. `VaR` exported by `cvar` could be attractive in certain workflows because of its vectorised distribution parameters, the location-scale transformation and the possibility to compute it from cdf's when quantile functions are not available. cvar/man/0000755000176200001440000000000013501140665011761 5ustar liggesuserscvar/man/GarchModel.Rd0000644000176200001440000000317014330275321014255 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/garch.R \name{GarchModel} \alias{GarchModel} \title{Specify a GARCH model} \usage{ GarchModel(model = list(), ..., model.class = NULL) } \arguments{ \item{model}{a GARCH model or a list.} \item{...}{named arguments specifying the GARCH model.} \item{model.class}{a class for the result. By default \code{GarchModel()} decides the class of the result.} } \value{ an object from suitable GARCH-type class } \description{ Specify a GARCH model. } \details{ Argument \code{model} can be the result of a previous call to \code{GarchModel}. Arguments in \code{"..."} overwrite current components of \code{model}. \code{GarchModel} guarantees that code using it will continue to work transparently for the user even if the internal represedtation of GARCH models in this package is changed or additional functionality is added. } \examples{ ## GARCH(1,1) with Gaussian innovations mo1a <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5) mo1b <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5, cond.dist = "norm") ## equivalently, the parameters can be given as a list p1 <- list(omega = 1, alpha = 0.3, beta = 0.5) mo1a_alt <- GarchModel(p1) mo1b_alt <- GarchModel(p1, cond.dist = "norm") stopifnot(identical(mo1a, mo1a_alt), identical(mo1b, mo1b_alt)) ## additional arguments modify values already in 'model' mo_alt <- GarchModel(p1, beta = 0.4) ## set also initial values mo2 <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5, esp0 = - 1.5, h0 = 4.96) ## GARCH(1,1) with standardised-t_5 mot <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5, cond.dist = list("std", nu = 5)) } cvar/man/ES.Rd0000644000176200001440000001307314330676704012574 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/VaR.R \name{ES} \alias{ES} \alias{ES.default} \alias{ES.numeric} \title{Compute expected shortfall (ES) of distributions} \usage{ ES(dist, p_loss = 0.05, ...) \method{ES}{default}( dist, p_loss = 0.05, dist.type = "qf", qf, ..., intercept = 0, slope = 1, control = list(), x ) \method{ES}{numeric}( dist, p_loss = 0.05, dist.type = "qf", qf, ..., intercept = 0, slope = 1, control = list(), x ) } \arguments{ \item{dist}{specifies the distribution whose ES is computed, usually a function or a name of a function computing quantiles, cdf, pdf, or a random number generator, see Details.} \item{p_loss}{level, default is 0.05.} \item{...}{passed on to \code{dist}.} \item{dist.type}{a character string specifying what is computed by \code{dist}, such as "qf" or "cdf".} \item{qf}{quantile function, only used if \code{dist.type = "pdf"}.} \item{intercept, slope}{compute ES for the linear transformation \code{intercept + slope*X}, where \code{X} has distribution specified by \code{dist}, see Details.} \item{control}{additional control parameters for the numerical integration routine.} \item{x}{deprecated and will soon be removed. \code{x} was renamed to \code{p_loss}, please use the latter.} } \value{ a numeric vector } \description{ Compute the expected shortfall for a distribution. } \details{ \code{ES} computes the expected shortfall for distributions specified by the arguments. \code{dist} is typically a function (or the name of one). What \code{dist} computes is determined by \code{dist.type}, whose default setting is \code{"qf"} (the quantile function). Other possible settings of \code{dist.type} include \code{"cdf"} and \code{"pdf"}. Additional arguments for \code{dist} can be given with the \code{"..."} arguments. Argument \code{dist} can also be a numeric vector. In that case the ES is computed, effectively, for the empirical cumulative distribution function (ecdf) of the vector. The ecdf is not created explicitly and the \code{\link[stats]{quantile}} function is used instead for the computation of VaR. Arguments in \code{"..."} are passed eventually to \code{quantile()} and can be used, for example, to select a non-defult method for the computation of quantiles. Except for the exceptions discussed below, a function computing VaR for the specified distribution is constructed and the expected shortfall is computed by numerically integrating it. The numerical integration can be fine-tuned with argument \code{control}, which should be a named list, see \code{\link{integrate}} for the available options. If \code{dist.type} is \code{"pdf"}, VaR is not computed, Instead, the partial expectation of the lower tail is computed by numerical integration of \code{x * pdf(x)}. Currently the quantile function is required anyway, via argument \code{qf}, to compute the upper limit of the integral. So, this case is mainly for testing and comparison purposes. A bunch of expected shortfalls is computed if argument \code{x} or any of the arguments in \code{"..."} are of length greater than one. They are recycled to equal length, if necessary, using the normal \R recycling rules. \code{intercept} and \code{slope} can be used to compute the expected shortfall for the location-scale transformation \code{Y = intercept + slope * X}, where the distribution of \code{X} is as specified by the other parameters and \code{Y} is the variable of interest. The expected shortfall of \code{X} is calculated and then transformed to that of \code{Y}. Note that the distribution of \code{X} doesn't need to be standardised, although it typically will. The \code{intercept} and the \code{slope} can be vectors. Using them may be particularly useful for cheap calculations in, for example, forecasting, where the predictive distributions are often from the same family, but with different location and scale parameters. Conceptually, the described treatment of \code{intercept} and \code{slope} is equivalent to recycling them along with the other arguments, but more efficiently. The names, \code{intercept} and \code{slope}, for the location and scale parameters were chosen for their expressiveness and to minimise the possibility for a clash with parameters of \code{dist} (e.g., the Gamma distribution has parameter \code{scale}). } \examples{ ES(qnorm) ## Gaussian ES(qnorm, dist.type = "qf") ES(pnorm, dist.type = "cdf") ## t-dist ES(qt, dist.type = "qf", df = 4) ES(pt, dist.type = "cdf", df = 4) ES(pnorm, 0.95, dist.type = "cdf") ES(qnorm, 0.95, dist.type = "qf") ## - VaRES::esnormal(0.95, 0, 1) ## - PerformanceAnalytics::ETL(p=0.05, method = "gaussian", mu = 0, ## sigma = 1, weights = 1) # same cvar::ES(pnorm, dist.type = "cdf") cvar::ES(qnorm, dist.type = "qf") cvar::ES(pnorm, 0.05, dist.type = "cdf") cvar::ES(qnorm, 0.05, dist.type = "qf") ## this uses "pdf" cvar::ES(dnorm, 0.05, dist.type = "pdf", qf = qnorm) ## this gives warning (it does more than simply computing ES): ## PerformanceAnalytics::ETL(p=0.95, method = "gaussian", mu = 0, sigma = 1, weights = 1) ## run this if VaRRES is present \dontrun{ x <- seq(0.01, 0.99, length = 100) y <- sapply(x, function(p) cvar::ES(qnorm, p, dist.type = "qf")) yS <- sapply(x, function(p) - VaRES::esnormal(p)) plot(x, y) lines(x, yS, col = "blue") } } \seealso{ \code{\link{VaR}} for VaR, \code{\link[=predict.garch1c1]{predict}} for examples with fitted models } cvar/man/VaR.Rd0000644000176200001440000001532014330675543012752 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/VaR.R \name{VaR} \alias{VaR} \alias{VaR_qf} \alias{VaR_cdf} \alias{VaR.default} \alias{VaR.numeric} \title{Compute Value-at-Risk (VaR)} \usage{ VaR(dist, p_loss = 0.05, ...) VaR_qf( dist, p_loss = 0.05, ..., intercept = 0, slope = 1, tol = .Machine$double.eps^0.5, x ) VaR_cdf( dist, p_loss = 0.05, ..., intercept = 0, slope = 1, tol = .Machine$double.eps^0.5, x ) \method{VaR}{default}( dist, p_loss = 0.05, dist.type = "qf", ..., intercept = 0, slope = 1, tol = .Machine$double.eps^0.5, x ) \method{VaR}{numeric}(dist, p_loss = 0.05, ..., intercept = 0, slope = 1, x) } \arguments{ \item{dist}{specifies the distribution whose ES is computed, usually a function or a name of a function computing quantiles, cdf, pdf, or a random number generator, see Details.} \item{p_loss}{level, default is 0.05.} \item{...}{passed on to \code{dist}.} \item{intercept, slope}{compute VaR for the linear transformation \code{intercept + slope*X}, where \code{X} has distribution specified by \code{dist}, see Details.} \item{tol}{tollerance} \item{x}{deprecated and will soon be removed. \code{x} was renamed to \code{p_loss}, please use the latter.} \item{dist.type}{a character string specifying what is computed by \code{dist}, such as "qf" or "cdf".} } \description{ \code{VaR} computes the Value-at-Risk of the distribution specified by the arguments. The meaning of the parameters is the same as in \code{\link{ES}}, including the recycling rules. } \details{ \code{VaR} is S3 generic. The meaning of the parameters for its default method is the same as in \code{\link{ES}}, including the recycling rules. \code{VaR_qf} and \code{VaR_cdf} are streamlined, non-generic, variants for the common case when the \code{"..."} parameters are scalar. The parameters \code{x}, \code{intercept}, and \code{slope} can be vectors, as for \code{VaR}. Argument \code{dist} can also be a numeric vector. In that case the ES is computed, effectively, for the empirical cumulative distribution function (ecdf) of the vector. The ecdf is not created explicitly and the \code{\link[stats]{quantile}} function is used instead for the computation of VaR. Arguments in \code{"..."} are passed eventually to \code{quantile()} and can be used, for example, to select a non-defult method for the computation of quantiles. In practice, we may need to compute VaR associated with data. The distribution comes from fitting a model. In the simplest case, we fit a distribution to the data, assuming that the sample is i.i.d. For example, a normal distribution \eqn{N(\mu, \sigma^2)} can be fitted using the sample mean and sample variance as estimates of the unknown parameters \eqn{\mu} and \eqn{\sigma^2}, see section \sQuote{Examples}. For other common distributions there are specialised functions to fit their parameters and if not, general optimisation routines can be used. More soffisticated models may be used, even time series models such as GARCH and mixture autoregressive models. } \note{ We use the traditional definition of VaR as the negated lower quantile. For example, if \eqn{X} are returns on an asset, VAR\eqn{{}_\alpha}{_a} = \eqn{-q_\alpha}{-q_a}, where \eqn{q_\alpha}{-q_a} is the lower \eqn{\alpha}{a} quantile of \eqn{X}. Equivalently, VAR\eqn{{}_\alpha}{_a} is equal to the lower \eqn{1-\alpha}{1-a} quantile of \eqn{-X}. } \examples{ cvar::VaR(qnorm, c(0.01, 0.05), dist.type = "qf") ## the following examples use these values, obtained by fitting a normal distribution to ## some data: muA <- 0.006408553 sigma2A <- 0.0004018977 ## with quantile function, giving the parameters directly in the call: res1 <- cvar::VaR(qnorm, 0.05, mean = muA, sd = sqrt(sigma2A)) res2 <- cvar::VaR(qnorm, 0.05, intercept = muA, slope = sqrt(sigma2A)) abs((res2 - res1)) # 0, intercept/slope equivalent to mean/sd ## with quantile function, which already knows the parameters: my_qnorm <- function(p) qnorm(p, mean = muA, sd = sqrt(sigma2A)) res1_alt <- cvar::VaR(my_qnorm, 0.05) abs((res1_alt - res1)) ## with cdf the precision depends on solving an equation res1a <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A)) res2a <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A)) abs((res1a - res2)) # 3.287939e-09 abs((res2a - res2)) # 5.331195e-11, intercept/slope better numerically ## as above, but increase the precision, this is probably excessive res1b <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A), tol = .Machine$double.eps^0.75) res2b <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A), tol = .Machine$double.eps^0.75) abs((res1b - res2)) # 6.938894e-18 # both within machine precision abs((res2b - res2)) # 1.040834e-16 ## relative precision is also good abs((res1b - res2)/res2) # 2.6119e-16 # both within machine precision abs((res2b - res2)/res2) # 3.91785e-15 ## an extended example with vector args, if "PerformanceAnalytics" is present if (requireNamespace("PerformanceAnalytics", quietly = TRUE)) withAutoprint({ data(edhec, package = "PerformanceAnalytics") mu <- apply(edhec, 2, mean) sigma2 <- apply(edhec, 2, var) musigma2 <- cbind(mu, sigma2) ## compute in 2 ways with cvar::VaR vAz1 <- cvar::VaR(qnorm, 0.05, mean = mu, sd = sqrt(sigma2)) vAz2 <- cvar::VaR(qnorm, 0.05, intercept = mu, slope = sqrt(sigma2)) vAz1a <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2)) vAz2a <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2)) vAz1b <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2), tol = .Machine$double.eps^0.75) vAz2b <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2), tol = .Machine$double.eps^0.75) ## analogous calc. with PerformanceAnalytics::VaR vPA <- apply(musigma2, 1, function(x) PerformanceAnalytics::VaR(p = .95, method = "gaussian", invert = FALSE, mu = x[1], sigma = x[2], weights = 1)) ## the results are numerically the same max(abs((vPA - vAz1))) # 5.551115e-17 max(abs((vPA - vAz2))) # "" max(abs((vPA - vAz1a))) # 3.287941e-09 max(abs((vPA - vAz2a))) # 1.465251e-10, intercept/slope better max(abs((vPA - vAz1b))) # 4.374869e-13 max(abs((vPA - vAz2b))) # 3.330669e-16 }) } \seealso{ \code{\link{ES}} for ES, \code{\link[=predict.garch1c1]{predict}} for examples with fitted models } cvar/man/cvar-package.Rd0000644000176200001440000001036014327473625014610 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cvar-package.R \docType{package} \name{cvar-package} \alias{cvar-package} \alias{cvar} \title{Compute Conditional Value-at-Risk and Value-at-Risk} \description{ Compute expected shortfall (ES) and Value at Risk (VaR) from a quantile function, distribution function, random number generator or probability density function. ES is also known as Conditional Value at Risk (CVaR). Virtually any continuous distribution can be specified. The functions are vectorised over the arguments. Some support for GARCH models is provided, as well. } \details{ There is a huge number of functions for computations with distributions in core \R and in contributed packages. Pdf's, cdf's, quantile functions and random number generators are covered comprehensively. The coverage of expected shortfall is more patchy but a large collection of distributions, including functions for expected shortfall, is provided by \insertCite{VaRES2013;textual}{cvar}. \insertCite{PerformanceAnalytics2018;textual}{cvar} and \insertCite{actuarJSS2008;textual}{cvar} provide packages covering comprehensively various aspects of risk measurement, including some functions for expected shortfall. Package \pkg{cvar} is a small package with, essentially, two main functions --- \code{ES} for computing the expected shortfall and \code{VaR} for Value at Risk. The user specifies the distribution by supplying one of the functions that define a continuous distribution---currently this can be a quantile function (qf), cumulative distribution function (cdf) or probability density function (pdf). Virtually any continuous distribution can be specified. The functions are vectorised over the parameters of the distributions, making bulk computations more convenient, for example for forecasting or model evaluation. The name of this package, "cvar", comes from \emph{Conditional Value at Risk} (CVaR), which is an alternative term for expected shortfall. We chose to use the standard names \code{ES} and \code{VaR}, despite the possibility for name clashes with same named functions in other packages, rather than invent possibly difficult to remember alternatives. Just call the functions as \code{cvar::ES} and \code{cvar::VaR} if necessary. Locations-scale transformations can be specified separately from the other distribution parameters. This is useful when such parameters are not provided directly by the distribution at hand. The use of these parameters often leads to more efficient computations and better numerical accuracy even if the distribution has its own parameters for this purpose. Some of the examples for \code{VaR} and \code{ES} illustrate this for the Gaussian distribution. Since VaR is a quantile, functions computing it for a given distribution are convenience functions. \code{VaR} exported by \pkg{cvar} could be attractive in certain workflows because of its vectorised distribution parameters, the location-scale transformation, and the possibility to compute it from cdf's when quantile functions are not available. Some support for GARCH models is provided, as well. It is currently under development, see \code{\link{predict.garch1c1}} for current functionality. In practice, we may need to compute VaR associated with data. The distribution comes from fitting a model. In the simplest case, we fit a distribution to the data, assuming that the sample is i.i.d. For example, a normal distribution \eqn{N(\mu, \sigma^2)} can be fitted using the sample mean and sample variance as estimates of the unknown parameters \eqn{\mu} and \eqn{\sigma^2}, see section \sQuote{Examples}. For other common distributions there are specialised functions to fit their parameters and if not, general optimisation routines can be used. More soffisticated models may be used, even time series models such as GARCH and mixture autoregressive models. } \examples{ ## see the examples for ES(), VaR(), predict.garch1c1() } \references{ \insertAllCited{} } \seealso{ \code{\link{ES}}, \code{\link{VaR}} } \author{ Georgi N. Boshnakov } cvar/man/predict.garch1c1.Rd0000644000176200001440000001124414210645012015266 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/garch.R \name{predict.garch1c1} \alias{predict.garch1c1} \title{Prediction for GARCH(1,1) time series} \usage{ \method{predict}{garch1c1}(object, n.ahead = 1, Nsim = 1000, eps, sigmasq, seed = NULL, ...) } \arguments{ \item{object}{an object from class \code{"garch1c1"}.} \item{n.ahead}{maximum horizon (lead time) for prediction.} \item{Nsim}{number of Monte Carlo simulations for simulation based quantities.} \item{eps}{the time series to predict, only the last value is used.} \item{sigmasq}{the (squared) volatilities, only the last value is used.} \item{seed}{an integer, seed for the random number generator.} \item{...}{currently not used.} } \value{ an object from S3 class \code{"predict_garch1c1"} containing the following components: \item{eps}{point predictions (conditional expectations) of the time series (equal to zero for pure GARCH).} \item{h}{point predictions (conditional expectations)of the squared volatilities.} \item{model}{the model.} \item{call}{the call.} \item{pi_plugin}{Prediction intervals for the time series, based on plug-in distributions, see Details.} \item{pi_sim}{Simulation based prediction intervals for the time series, see Details.} \item{dist_sim}{simulation samples from the predictive distributions of the time series and the volatilties. } } \description{ Predict GARCH(1,1) time series. } \details{ Plug-in prediction intervals and predictive distributions are obtained by inserting the predicted volatility in the conditional densities. For predictions more than one lag ahead these are not the real predictive distributions but the prediction intervals are usually adequate. For simulation prediction intervals we generate a (large) number of continuations of the given time series. Prediction intervals can be based on sample quantiles. The generated samples are stored in the returned object and can be used for further exploration of the predictive distributions. \code{dist_sim$eps} contains the simulated future values of the time series and \code{dist_sim$h} the corresponding (squared) volatilities. Both are matrices whose \code{i}-th rows contain the predicted quantities for horizon \code{i}. The random seed at the start of the simulations is saved in the returned object. A speficific seed can be requested with argument \code{seed}. In that case the simulations are done with the specified seed and the old state of the random number generator is restored before the function returns. This setup is similar to \code{\link{sim_garch1c1}}. } \note{ This function is under development and may be changed. } \examples{ op <- options(digits = 4) ## set up a model and simulate a time series mo <- GarchModel(omega = 0.4, alpha = 0.3, beta = 0.5) a1 <- sim_garch1c1(mo, n = 1000, n.start = 100, seed = 20220305) ## predictions for T+1,...,T+5 (T = time of last value) ## Nsim is small to reduce the load on CRAN, usually Nsim is larger. a.pred <- predict(mo, n.ahead = 5, Nsim = 1000, eps = a1$eps, sigmasq = a1$h, seed = 1234) ## preditions for the time series a.pred$eps ## PI's for eps - plug-in and simulated a.pred$pi_plugin a.pred$pi_sim ## a DIY calculation of PI's using the simulated sample paths t(apply(a.pred$dist_sim$eps, 1, function(x) quantile(x, c(0.025, 0.975)))) ## further investigate the predictive distributions t(apply(a.pred$dist_sim$eps, 1, function(x) summary(x))) ## compare predictive densities for horizons 2 and 5: h2 <- a.pred$dist_sim$eps[2, ] h5 <- a.pred$dist_sim$eps[5, ] main <- "Predictive densities: horizons 2 (blue) and 5 (black)" plot(density(h5), main = main) lines(density(h2), col = "blue") ## predictions of sigma_t^2 a.pred$h ## plug-in predictions of sigma_t sqrt(a.pred$h) ## simulation predictive densities (PD's) of sigma_t for horizons 2 and 5: h2 <- sqrt(a.pred$dist_sim$h[2, ]) h5 <- sqrt(a.pred$dist_sim$h[5, ]) main <- "PD's of sigma_t for horizons 2 (blue) and 5 (black)" plot(density(h2), col = "blue", main = main) lines(density(h5)) ## VaR and ES for different horizons cbind(h = 1:5, VaR = apply(a.pred$dist_sim$eps, 1, function(x) VaR(x, c(0.05))), ES = apply(a.pred$dist_sim$eps, 1, function(x) ES(x, c(0.05))) ) ## fit a GARCH(1,1) model to exchange rate data and predict gmo1 <- fGarch::garchFit(formula = ~garch(1, 1), data = fGarch::dem2gbp, include.mean = FALSE, cond.dist = "norm", trace = FALSE) mocoef <- gmo1@fit$par mofitted <- GarchModel(omega = mocoef["omega"], alpha = mocoef["alpha1"], beta = mocoef["beta1"]) gmo1.pred <- predict(mofitted, n.ahead = 5, Nsim = 1000, eps = gmo1@data, sigmasq = gmo1@h.t, seed = 1234) gmo1.pred$pi_plugin gmo1.pred$pi_sim op <- options(op) # restore options(digits) } cvar/man/sim_garch1c1.Rd0000644000176200001440000000257113501140665014516 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/garch.R \name{sim_garch1c1} \alias{sim_garch1c1} \title{Simulate GARCH(1,1) time series} \usage{ sim_garch1c1(model, n, n.start = 0, seed = NULL) } \arguments{ \item{model}{a GARCH(1,1) model, an object obtained from \code{GarchModel}.} \item{n}{the length of the generated time series.} \item{n.start}{number of warm-up values, which are then dropped.} \item{seed}{an integer to use for setting the random number generator.} } \value{ a list with components: \item{eps}{the time series,} \item{h}{the (squared) volatilities,} \item{eta}{the standardised innovations,} \item{model}{the GARCH(1,1) model,} \item{.sim}{a list containing the parameters of the simulation,} \item{call}{the call.} } \description{ Simulate GARCH(1,1) time series. } \details{ The simulated time series is in component \code{eps} of the returned value. For exploration of algorithms and eestimation procedures, the volatilities and the standardised innovations are also returned. The random seed at the start of the simulations is saved in the returned object. A speficific seed can be requested with argument \code{seed}. In that case the simulations are done with the specified seed and the old state of the random number generator is restored before the function returns. } \note{ This function is under development and may be changed. } cvar/DESCRIPTION0000644000176200001440000000255514330710446012724 0ustar liggesusersPackage: cvar Type: Package Title: Compute Expected Shortfall and Value at Risk for Continuous Distributions Version: 0.5 Authors@R: person(given = c("Georgi", "N."), family = "Boshnakov", role = c("aut", "cre"), email = "georgi.boshnakov@manchester.ac.uk") Description: Compute expected shortfall (ES) and Value at Risk (VaR) from a quantile function, distribution function, random number generator or probability density function. ES is also known as Conditional Value at Risk (CVaR). Virtually any continuous distribution can be specified. The functions are vectorized over the arguments. The computations are done directly from the definitions, see e.g. Acerbi and Tasche (2002) . Some support for GARCH models is provided, as well. URL: https://geobosh.github.io/cvar/ (doc), https://github.com/GeoBosh/cvar (devel) BugReports: https://github.com/GeoBosh/cvar/issues Imports: gbutils, Rdpack (>= 0.8) RdMacros: Rdpack License: GPL (>= 2) Collate: VaR.R cvar-package.R garch.R RoxygenNote: 7.2.0 Suggests: testthat, fGarch, PerformanceAnalytics NeedsCompilation: no Packaged: 2022-11-03 09:30:19 UTC; georgi Author: Georgi N. Boshnakov [aut, cre] Maintainer: Georgi N. Boshnakov Repository: CRAN Date/Publication: 2022-11-03 10:00:06 UTC cvar/build/0000755000176200001440000000000014330705053012304 5ustar liggesuserscvar/build/vignette.rds0000644000176200001440000000041214330705053014640 0ustar liggesusers}PN0 MniCh;# T↬B[ 7ᰆA"~~~1qsr!%YD[%%߁I WFa!#l%2QC5 WU- ;9mD?>&9&IlP6l5҅A{E)2yѝ@oQF5hH8Ï2^C3+/VeL{MNnOtpqc P ]#cvar/build/partial.rdb0000644000176200001440000001575514330705052014445 0ustar liggesusers=MsǕE(-v&#AӢ$)Ā"ǰ1`RX}O٪\R9jwO[Crܪoy fH·H:{^~_1Ϗ `pa0g ^F9,]",0;2_w֙17OTC9Aj08 }HU}uɿ8ѣkƶX8y$u_ |k錣CM/Jkڍ0C1U[uj>,WP!E6ds:S`ˠ-"gڕ*sU}6+պUUR/f봢lRҢ@T٠\ w>#poLt:}PkkQoҔi %3j3OUSq[p R 7蠾@Vd; +hI (“LCTd#5>k6SQOK_91Yw({\AXaOEYdC5Ev{!p?+A|qFxTHc=,$i`w$f|1`@|~@u\i@./0d?sLu.tU7I$d` <99z1%_A7$7 +Tj^Y4-AuWzJDCZTRGqE_L"r4\CP"f;VwE{<nάE.!Ⱥi-N뚮92P&dyh6m 2r2̜NlROy@{f9.WWQL>tk{23qhB RgDkhLC M>LK,27q=e>pZ.28LVmT' mK?"-Se ŵoSSZzE2sx9c5يA1zGv!҅ld% 2JeO`H]ghXِ("\ ҜfRtT$ )“݆brwix @?@̲$ɇ6LϸYQإ$~p|"lGܭ0IRhp\0_,NYx!>LMKA5ǀF0҂9Ԧ:> ĸWʦ.2N\!f$LR$%]$įd&}HOH{;@┒j\h7]ݱ,d;\D7Z{.N*Z퉩)zܘ&*3c8fr^*Þz: %4W&S_.~v;QWff/2tuhq$FCJZʄ-XfXA>Ԣ?MdˤLNP)478”OeҜÉrxҐfqآyq4u=9t k_K3-v6V,;+!ys=¯K \O@uC@Uҩ#rtSg&r⥽/g$X|LDOKO!~MaNLםnpOk˓(>96ZڮŠ8+wwbCi9_v|*L@+r}T̶xpdS-IFZkozỈydf݂,͇(bm>5feՌԾًtRj VNZ5CPu#x"[t5T%3GT u~T."6!pBj.#ia'U!d)SmqJB(ӈJ%BU6\ry]A*ETt7,;b5J0 QtkN󦲆?I uá\Wp\8VD8]. ֩223 ;R|՘)ru3z1E H6QIoyIU&w^sNJPv|B iSD KR>F@<{%:n FpTpdXl|5ma"b E@ JXH*Yg^kƳö_O=a-K0Jd.(#\:%$S$?NX>I ]GxS @8PH3mY݌v{᧸DIA΍x g r hH੢dBx=S.H8"&#z."TB9xGDk)̶Im1S!}kGh7]OyW"mna> ת͠smoÅȟf{)Pm`&Aqix;D <=k3bPaUmPK5$`eg:0up`94>gUעJ0p{ \ջ%xP`24)k%O z)N%e $`~AV#=R',X9+J."޾#@|bb a'ke)#2L"ܵI'43p<}TJIsALZB;N[ ndJbsIR{M4'%]]{ar'LPLk[6oP/-HL@8%ij+Q &, cI]7%DH.;dKAO@,N&eCJUrL[*g}1!Ti]g)ϫ(@_A8)KW8#;P3klfw/#yMK,8ٶ)NyZJsVMAESMA׌nK ,T>FxvSx&._ɸ8]F'ZPg^DJ%G5w"fPxJHv$?ԶMER:ԫ3wX®Y5_gfo[nhΨgܡ<%oA8׶ 3W_CQmpǍ_e=q4ۅq Mfރu 7(pdJ}d}>'!‹^z; N2U*7Kg ?#Gf7)3s|23 /=9Ee㳌W)z'$?qM'*B "^C)hpqh96K>F~xvH;<} E"bK^ƥv\UL[̆} $8~9MΑQaV 1hdL)tp?R<!ĩ#P9 A|4wKN 1 +*^ojq ,p{r,Uݺ\R6"h\fBwkYΦk>̦CYyZ&Q*w.Q]TёJzzp46瘝q*iQ$kz/^Դh67 Jj3Q1h 5;ggdvcϼ۬ɢAݻl-xxDV_/cB\5.ObfMׂY"e6-=FvjDX ]9`Q7uuφcxHO}sLSKhR5"\ػpv<{kvysfJY֕ef0ҕ 8مsEnp kX") '"&ŧկIq|Mk6gLm'!߯p5r?Pfsfu M\W}6tf[@\/E׈Oұ tKntfhUu l W=O0ɉ¥T=aKТIU',PLn@K0D| >pMr;?IVEul}FE: ;|(V.beJ9_q_?O'`ElwQYC9#1q_̌DhiJpYs^{3.Fg3c +95@+Tg<2cMnI)B9ipNӴbD_EyԊ{lҰZ/;X`]Wjp͡cACnMk<ڜ }.o6 5:&,pǴn,Í=Xkh3\kh.l*6;t]n1'E_t50Ć_V,.7:>EX@Q֪*fҷ5V:KfHkj'"Fr'2Ԫ;(hf[Td '!{7 a,!<^k)OipŸQHMHƣZM2CRɈY=wC\^cVc. \NOq5c?kc&14$Q& ],}FZ._#Wxb# 2-M\|WKt-e{ O-MHL\KdٚZ߇S45 Sy"oF;n[RjwGkQMVhim3{\#5}{3"\M5æ)|\0(]or;5цmi~vZH͡uWX)ě#>whv@헔`uG mKoQ6{AצrMp-;DQ.&|o~3gjsW $s-hţW5RkcEX7zٜe{C}kaכM+OVUbՊ;Vmtbi+UmVBWUJNӊwY0k1kҿݲ?\R%>E?R-NFû#~k^B;F dox=|wo<$9 t }Nύ+y\i-VYk]a:!;ǤIeDXt@d7&C\wjѝz~KE.@0)S:o6 +<4C!#A20P6e)OxJ9:יHU/] @SsU5I?6sfSSA((o9GQأyYPE7Xn1徫(DO-~-TB>MZ塌viP"`#5)Rwuy:$kf{Ύ9]&s#C (nnԛ,%6Ia=v/ X2.cvar/tests/0000755000176200001440000000000013630522362012351 5ustar liggesuserscvar/tests/testthat/0000755000176200001440000000000014330710446014211 5ustar liggesuserscvar/tests/testthat/test-garch.R0000644000176200001440000000511614330267721016403 0ustar liggesuserslibrary(cvar) context("garch") test_that("GarchModel works ok", { mo1a <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5) expect_equal(class(mo1a), "garch1c1") mo1b <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5, cond.dist = "norm") identical(GarchModel(mo1a, omega = 0.4), GarchModel( omega = 0.4, alpha = 0.3, beta = 0.5) ) ## GARCH(1,1) with standardised-t_5 mo_t <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5, cond.dist = list("std", nu = 5)) expect_identical(mo_t, GarchModel(mo1a, cond.dist = list("std", nu = 5))) }) test_that("garch1c1 related functions work ok", { ## try to deal with the misterious error on TravisCI and devtools::test() ## set.seed(123) a_mo <- GarchModel(omega = 0.4, alpha = 0.3, beta = 0.5) a <- sim_garch1c1(a_mo, n = 100, n.start = 100, seed = 1234) a_pred <- predict(a_mo, n.ahead = 5, Nsim = 100, eps = a$eps, sigmasq = a$h, seed = 1235) ## 2019-03-13 deal with change in RNG in R-devel (for 3.6.0), see email from Kurt Hornik in Org/ ## I couldn't make his suggestion work. ## TODO: maybe it would be better to just load 'a' from a saved version. if(getRversion() < "3.6.0"){ a_saved <- "a_before_6.0.RDS" a_pred_saved <- "a_pred_before_6.0.RDS" }else{ a_saved <- "a.RDS" a_pred_saved <- "a_pred.RDS" } expect_equal_to_reference(a, a_saved) expect_equal_to_reference(a_pred, a_pred_saved) ## as above but without 'seed' sim_garch1c1(a_mo, n = 100, n.start = 100) predict(a_mo, n.ahead = 5, Nsim = 100, eps = a$eps, sigmasq = a$h) expect_equal(.get_dist_elem(NULL, "r"), .dist$norm$r) ## for now expect_error(.get_dist_elem("unknowndist", "r")) expect_error(.get_dist_elem(list("unknowndist"), "r")) expect_error(.get_dist_elem(5, "r")) .get_dist_elem(list("norm"), "r") .get_dist_elem(list("norm", mean = 5, sd = 3), "r") .get_dist_elem(list("norm", mean = 5, sd = 3, n = 10), "r") .get_dist_elem("std", "r") .get_dist_elem(list("std", df = 5), "r") .get_dist_elem(list("std", df = 5, n = 10), "r") .get_dist_elem(list("ged"), "r") expect_equal(.get_dist_elem(NULL, "p"), .dist$norm[["p"]]) .get_dist_elem("norm", "d") .get_dist_elem("norm", "p") .get_dist_elem("norm", "q") .get_dist_elem("norm", "r") .get_dist_elem(list("norm"), "p") .get_dist_elem(list("norm", mean = 4, sd = 2), "p") ## for now expect_error(.get_dist_elem("unknowndist")) expect_error(.get_dist_elem(list("unknowndist"))) expect_error(.get_dist_elem(5)) }) cvar/tests/testthat/test-VaR.R0000644000176200001440000001107214330671763016012 0ustar liggesuserslibrary(cvar) context("VaR") test_that("VaR works ok", { muA <- 0.006408553 sigma2A <- 0.0004018977 ## with quantile function res1 <- cvar::VaR(qnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A)) res2 <- cvar::VaR(qnorm, p_loss = 0.05, intercept = muA, slope = sqrt(sigma2A)) abs((res2 - res1)) # 0, intercept/slope equivalent to mean/sd expect_error(cvar::VaR(dnorm, dist.type = "pdf", p_loss = 0.05, intercept = muA, slope = sqrt(sigma2A)), "Not ready") cvar::VaR_qf(qnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A)) ## with cdf the precision depends on solving an equation res1a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A)) res2a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A)) abs((res1a - res2)) # 3.287939e-09 abs((res2a - res2)) # 5.331195e-11, intercept/slope better numerically expect_equal(res1, VaR_qf(qnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A))) expect_equal(res2a, VaR_cdf(pnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A))) set.seed(1236) a.num <- rnorm(100) VaR(a.num) ## test the fix for issue #2 expect_true(ES(a.num) == ES(a.num, p_loss = 0.05)) expect_true(ES(a.num) != ES(a.num, p_loss = 0.01)) ## as above, but increase the precision, this is probably excessive res1b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A), tol = .Machine$double.eps^0.75) res2b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A), tol = .Machine$double.eps^0.75) expect_lt( abs((res1b - res2)), 1e-12) # 6.938894e-18 # both within machine precision expect_lt( abs((res2b - res2)), 1e-12) # 1.040834e-16 ## relative precision is also good abs((res1b - res2)/res2) # 2.6119e-16 # both within machine precision abs((res2b - res2)/res2) # 3.91785e-15 ## an extended example with vector args, if "PerformanceAnalytics" is present if(require("PerformanceAnalytics")){ data(edhec, package = "PerformanceAnalytics") mu <- apply(edhec, 2, mean) sigma2 <- apply(edhec, 2, var) musigma2 <- cbind(mu, sigma2) ## compute in 2 ways with cvar::VaR vAz1 <- cvar::VaR(qnorm, p_loss = 0.05, mean = mu, sd = sqrt(sigma2)) vAz2 <- cvar::VaR(qnorm, p_loss = 0.05, intercept = mu, slope = sqrt(sigma2)) vAz1a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2)) vAz2a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2)) vAz1b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2), tol = .Machine$double.eps^0.75) vAz2b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2), tol = .Machine$double.eps^0.75) ## analogous calc. with PerformanceAnalytics::VaR vPA <- apply(musigma2, 1, function(x) PerformanceAnalytics::VaR(p = .95, method = "gaussian", invert = FALSE, mu = x[1], sigma = x[2], weights = 1)) ## the results are numerically the same max(abs((vPA - vAz1))) # 5.551115e-17 max(abs((vPA - vAz2))) # "" max(abs((vPA - vAz1a))) # 3.287941e-09 max(abs((vPA - vAz2a))) # 1.465251e-10, intercept/slope better max(abs((vPA - vAz1b))) # 4.374869e-13 max(abs((vPA - vAz2b))) # 3.330669e-16 } }) test_that("ES works ok", { expect_equal(ES(qnorm, dist.type = "qf"), ES(qnorm) ) ## Gaussian expect_equal(ES(qnorm, dist.type = "qf"), ES(pnorm, dist.type = "cdf") ) ## t-dist expect_equal(ES(qt, dist.type = "qf", df = 4), ES(pt, dist.type = "cdf", df = 4) ) expect_equal(ES(pnorm, p_loss = 0.95, dist.type = "cdf"), ES(qnorm, p_loss = 0.95, dist.type = "qf") ) ## - VaRES::esnormal(0.95, 0, 1) ## - PerformanceAnalytics::ETL(p=0.05, method = "gaussian", mu = 0, ## sigma = 1, weights = 1) # same ## this uses "pdf" expect_equal(ES(dnorm, p_loss = 0.05, dist.type = "pdf", qf = qnorm), ES(pnorm, p_loss = 0.05, dist.type = "cdf") ) ## several in one call ES(pnorm, p_loss = c(0.1, 0.05, 0.01), dist.type = "cdf") ES(dnorm, p_loss = c(0.1, 0.05, 0.01), dist.type = "pdf", qf = qnorm) ES(dnorm, p_loss = 0.05, dist.type = "pdf", qf = qnorm) ES(dnorm, p_loss = c(0.1, 0.05, 0.01), dist.type = "pdf", qf = qnorm) ES(dnorm, p_loss = c(0.1, 0.05, 0.01), dist.type = "pdf", qf = list(qnorm, qnorm, qnorm)) ES(dnorm, p_loss = c(0.1, 0.05, 0.01), dist.type = "pdf", qf = c(qnorm, qnorm, qnorm)) }) cvar/tests/testthat/a_pred_before_6.0.RDS0000644000176200001440000001717613501140665017735 0ustar liggesusersZ 8۟.{*CsTlPQ*!B Y+i(˾ی11}+^}u=ν}!n p~^ñp-l7rm{Yr,~T>Z ƫ.ҶYo'Ja5 c5%->vݵ*C0\wusZh)7;N;;GŶ6I߄]m~=yI^c=pL[ASv.lmN fh[m(*v{9-b,#߿dĮ9?er>fu'.O(74\#Kȝ%\& Lh"r.%h<2D.|k O?q'oϒ_s{-87W_3PNCiTjG6]8Mz8p}"&=cY %@fSrQgJ<M{g) jW[ u~ OXEO牭*Iv#PX91:*6]U[{EBLYKX,RxiXV<G;$R6ٳ4[(|Ogvζn,yO&K/TqWεo$c#EVA!+Ãwh*h 59CfZӕOC^Ր_!:5:T#:G'w߰sۜ؈Se2_jMZ8:rs]3lZP0*q*pth196`x1- ݺ nht3?BM}uȓ( @#oʧ!j\_P{RMl,4reD4}A5Х0+?xnGÀ<oϡ;.=37 .^s8zdϱo*=;, P'URw~ԓWuj' FC9ODC\s {4~WuQ{ ຽvتꚂ͓7v$_c"VrնVa"Uϓ}.T2]543m/"W 0q|u+I.#]y}rׄB ]=h>P0 0i&b-Į 2Th-/CcߧWP'*̣:҄DZb P|hk?=b8/ZnzZ?`Qm3/48d@| h{-`:Bms0|n5(mҮPWI^[A)tSDycuC+:DߴCb*PY~ǰ Q9 A w !~ּ2.MlAEwoϽݣ^ie5hZwyȓDG+1?QGl[O΍1ULL!D3Ȱ~ƂL_1OĆ y G7<@IzXMOŖ|E-~&^,AB:rƩ!G0zҩLTr̲|/7XUFI=].{ ^ ʒ{bQ'/š rt<)ۄ77YyiP(QZw!ީxڞHb,D+|2QчBJ&0(Cda$jJ`(Hձ}k̊bfh& ;ٹt@K׽U.טή1~`KJ"ĬB~(}rvǎ5`tj X#k@WMI9l0%ܼE <u]\|ax5Cxn#ui# xy[H@˺&q#u$!2hsgĊi48PuPnWԵNĕ5WgT÷وBO MH.hhDtnn%bK̼r1Ȼ~E=<^[5i1978T/Nc9g\]{0SKΌ 'YΣ55PMJC%W#tr1-[PU}. '8U~yT+zltdmM&1o$q2G<^a""=^@@ҩ9h.;bi"w\0eGıu.a~ǾFLuC6hQwEõ~7CE蠁D[A1>e0밷ׂKMb{&hp s 4դIoLOzxx3vgT*Д2\%A>Zj_q \^] :xXq9>iTZlE=Tm!?;DoM w}̼vM=@[UI(yEk`v 4? FiFЧoS_ @C>EAߗ `^j4K~-`aI8 d'`c}Nj$hQXxTf}ˎy+v(ZቑIN6RNuR+ɑ0~i80靅GZucԬ&mf'֢:/ےLh}pPAtm^G rᗉASB l.79@.ru`mfxF}HEMحwc];(v@F~x0׀6Ã_ 8S`vF"d6(89D4kҲO)͆l ;RXEUҮ[wqFq[g:%9X"zu#'R R kL%KxɄ@8Sz 3Oޞ>|z_ - uyu{TRmVm>j!u U"[uOgQч"DRjX*ܴ. &-V"Jf3^` g¹:8wY/" #?ަf:ɛ1bg{]Wgk+W[7 F "k64iC䲹tR$^: UO;Ah&l=ۘU03^F؇ |z7$%I@k`Qvr>dGm2 csX]Ȧ*8+1fHGqBMv͡]Dq bE<|vTLsE &N+^d2ӒC+XҮ.ⰲk\YG}yE@- / ?&5BRW2~3Kz4OchOC~o_B6vak̜Led 8z/>Yɋ8G#PuwY(!\T~*"Eb72ZzL53=xk1/dEhꂛI[}NB|nҀwb Xx8+ĚE'˅ ol{Ty(r'1d a/_}9j2t"S[o ;=[,W`v8`"-]5 c?W7}C,Ձ.[0#h/ &[y]>[dM8k}wY̓L,vg?g ({fY|ƅ/+A\L}`ab8n%`?vyo^X{ub Ꮅmv׶߱rɨ Hfw-G*ΞE/흏etG5fijE$P~h-d:9R@NU'!u?^wn׬ isFL-l!ܶcEf0|Mڬ&),ܩ).:`ŭ 5O!օ+h}`²\!YL[ >Z n_y87`,|ڗ!8yHпJZԪquBPë (t5U? _N 9mqln7$+^,qau|s5'12k7;_aA@0mg:̭$ChP+k Szs#,&4,;] Øf%C.71GL/gV~>+]ܿ qmS gQW~K!F^+%_۞X0>0|觐MPmZ.[\d # eigCί>-⸄>B2d-C'Iz gۋ8΄D)޾R02t})F&rW vjJtV"9G>sw4*튀j"*5F= / |"bF CҲ{mH8}f5*@o}+c?kÒoۦ "?N4.++z2-lShvHZև%Lx}|J8u$`M$U#vt_zh;,9qf @$+&䛱,Rzbp^NVp,۶%wE`ŭxXOsczn]OQzb / ;d@P6FdrҖ'5aur4xpL;]$4i|OS+Yz6:-JM*t&[Kr"=4 (:tSrι-;>qw aFDrׯX%2'H9JTݏ-Foα}g9"\`z8@i+*q_7OTPe53h6eC01ӺY03V@E |y7"p7c:?֭mIHn0B˖/`Rq(4+OZ e4_({*|H2ݳg$C'[O1n *A1A,;O .4Llu9|).p}t!wX8:0/{Fdt ˻i̊)vJ}0s!1<|0Bd_j{aq i>!& 捿//EjK@z }@}"l Kξ b{Q!0kj|z{Pj>.ߊE,`fK5E̪$sD BX nӍsi SI6:XSG0]3UO//2yv-⤄9A!G}9,Al FK p$o> f;:Am\~f:-=h0,ubUi ^n6. ktV#l͸f_Դ̝^8 _9h?̀C~?7[PiuY|=443*w<^[ie I8"g*~$?6ƴW@jxJ:oCNC?nډ& םҗCMoV-'-_%REg0nV/'oW~r'ꕭ [H}NaַDMr9")aT2%Y %_K\~ wwD% L3 P0WwJ;W<>Tk0l-ɲs]0r6(Yof5Uey F&Y^`?9t8y5PxHO,~XqR"*jVLtvw֝rrtwwT\&> SR ,g=bƯ۽m<2픃om]:$cvar/tests/testthat/a_before_6.0.RDS0000644000176200001440000000522613501140665016714 0ustar liggesusers}V 8cR\WEةdmWAer-ZR[,QtKtHf,3hdWy}{=<8p8N@#|6?B}twfWJ{xֺPZoWc@S+7\]iKbg&wGҋluMFh8A~n尊١r#}!t-qd\_.>hA"rA6 9hdmu tϼ8ِLG'dQJNH`Qb9\.1Ts1܅6iw Sv4:L`τAM>MIuД ;nǟ_C- 0)y= hx3k)|W[4Pơ:ND.UR7J$GF⸻˓M?x;ddZ'+ BR6heܐ/X Ш7@[mVCqbHJ]щCMh ?U@2 Wſ|4 ꆧe> Rhn֖E`zw ^ }15 s$)߯wi+1ME 4JE#zCCDiv&s?޿?Qsm"2nUXT vd=0K>] vLfB? P^VP _w-{]&;WzSEj镝R*DݘU)&k\q]h)0ds;TkdTufXuD ^6Fn[;U" &zt}1I!M.84v,@a+1;Pʖ"bF1łsͫR{ ~ߡC[6_tm_--C[W]#"py-e&J|*7A/瓟=e' ֳI o0ؼCmٮpJo3:> ݅ _6Q\uZAO$%;uk/Tw>͂IzfFl^LC|dÉ߹uƌm΅^*"F65;%I =$.ta "ݼ K?4[U0;9 X7zi_.Bp^]#T@r;ƣ- aJ">p=p]GɞAD& ֹ[>>U FW:ӧ oPwv Y C'_O&x <Zv/0Dg|1L=S p ƶ4\:sP.G8V]j5"K+c\$A>lX]7CCghoK}CߝMM󚖸ᭉEzx-8y-sKk59m_|쫍O$|q>{iCKA/*ō<=:D'߬-D9=վv R}՝էm8%Y BxzPc{:8;_"B\ 9t,mوˬN ɍO_ aOo&η::SBVّD a`_Z+4L3ܤiq38r cvar/tests/testthat/a_pred.RDS0000644000176200001440000001721113627700444016024 0ustar liggesusersZ 8۟.{*CsTlPQ*!B Y+i(˾ی11}+^}u=w~y>č`p<;/ ? 7͆_!׶!GŐmʬ )mk=|ү_㰠1+n^k>X".)bt뮵EW1:BAofO9]up]!9z/=qN&ljFN >OGg{o5Oٹ8{Bq;/ooF춈~oWg'FD?pc ^,%"wp6<2u]4N `𭙮6"g2k?qnĵŸ8ҿw>K~po2g<<[ŝ)4Վl"'&q05$q"EL+r{ƞJmYʹ8(74Ϭ=y7$)?K/R4֯c'Jy(ß[U詻/fG±l3rctTlf< ;a*Y*Dwӂ̭y$Z&%vHFmD=Vg i &Pz'#/mEXV*M4y돀s {eayy:kk ^Mg1Fc^qnFJnq7@o@qe]aҽ("SE3R4}^$⮌kH$TFBV2T~`ksNAU+U+X9٫!Btjtn1&) 3٧e,p":qtz[fQkEٴ`UTP+blK#rlbkb7[ug~') w >QjX:GޔOC$F5 z]wlX'*ۃiZ :ˈhkK[37a0V<&ݎy0W@ICUw\z g o\ p c1TzZ?wxYNO9#^'B>$Ohr.d8 :, 0-,hh 9u{U5C7'ox h}I(k1fDmDϫ'~-]2Ao3dk })igx!_o=DFһa(V6\Fໂii!P/> @{<}*`t'8aMZx\.xD[@䩣26O:7iQ ?`d,5oGWb.lmAh:0_rWs!IEᶇ,/Dp6{2^,]9Ƌ N{(ʮ`NAMH} LT$Tig*l_n@F9csh^:. us qJegA_YM}]iiA<d6[^ֿOOTG-u''ҥ {µ v.~1={,q0^,.0<5O)&У0$w#,/g ^h5qȌJ|+ev[ta0ܦkQ۶ۥ]սSl>W0udϝǽiKTDybCmm/7PJPd,_a"zDy+T"1zμH:q3;:~ %_5&5\pA{0}v<y3MɟBG~ƠѨeTƝvhor`tZ~[) *jVff/mxC{ |i eۼҏjM DmC; fEQ.۸@Oe&ⳊwǠj䄦6"1*YD+o*'ir,Ԧi} gsv_4JSxԺr;){ vQ"q TE-( tfOn9jƒ<ӕrkAk8V:9D!F-&hPY/TvU`z?JЫ@᥯Foَ `dZ <$qkW*MG@WY [l[ee1 r*bW%51n@ `PU@qG oM*s=Qʣ-~z=qf#I0M" 9Ƽ:}6asDl#Bn>PQye]T 0؂ߞ{YG]1F ʒk\)T'%*Wb~4%b$==P11Cfa-LJ'b @BEo_#S+ =y\rNd--5܋[3LlXVFuSC*6o;aSṙ-e_n >Jz0쯻\41=ýb"9%fN^CA(xR on/BӆQ$0u#¾{i{"A7z1F=GB)W.ɓt)" VB|"3+"拙@4+ gjzE*-y^Ts\c:JPO-) MIk;B`{Щ]&` 䏴6~x:^E4%AÔțs}3?u%sO@f?y&]1@ץY$lm]#6-čLK%?N[8s~ϝ+fP"CAΧ!^Q6nh:W_Q f#z =5`6!a 5)AAo.q0SA"xmiפAvƄbSE;t]DsvAՂb"^Le.y;3.fd9@94zpg* Yr]2oi[&^ /6q烢uv$OHϥ:G<3DfW"D&Ѯ}0^>a i `Z؝Q@Sse |k=D|ŝOG,փ4syw%`hcuVtQ-jYPke@h`N;Pp5%hpN1 >xE7mI2WM&][P+$+wCMUv^c{W~&LEU}_F4ћv{Q,",%ာA; foF!b RE-;zNڡfj'F&9 K9QK$GD\ glw3jɏQQ#ڟD?[ToK^3} _cuaAEѷy1q_&M -7(SrۻP˳Ձ!3#35bn`߉Z^:vcӗX~  e;?\l~5 :DL΃=PPѬK˂B$>IH4-Ha UJ>oEu;[,o%o9xccMПJ3|J1T/qի'ycL-0W̄>U`nz{h~%Ԫ'48Q9HYz4j1BWel򄬚 0{WXtj>jQ?hx}%ƔvK> iG]rܤ]GghpCbEMT#ShM}==e.EE6IyapӺ`&ȶgbX(*'<@Wz*D PVtdP`be@"7x9&ozlYf.nQw] \m݀gVg'ZФ>J ^I{IH&T=jz͛:?ۢlc6WA̔c za{6,<& =Gݻ3ůo, aw!İ}#UIX 5%7fBvR1 dR1q7䳛8 {m NKzozbIʪrf5e,,/ I],M;ֶ"N]۾j!'6 :{w>uVꚥ:yCS KH"9yWuUxŲ߹]>$v(ϩ*~rdZ3 ^p֎e'7ƛkOp.L<[?A ~Fsfm0m*ph $}܀T?9k]Nx:P!M@*iPƝCE ɏC &uWl(:q'sޓZıuސҮ`{`o f㛛X~<Я\YKuFމ0|pKe i;өgdn%HbF3ְpeN_YCLr/՛eA09׈`ٙb4+?u9b v8;MY͔^nӞZ8e[ 1J"^)ǂ)[?E?Eo2orْX~j$&'ȦP0/K;r~`l%Er!kY5DPS9z V L]oWTQIlc)4(-/m|mc3ڔwc[hC6Wz ]Y;o|6XAv¥q]_ Ȟ=hfFe<@Ҳ>D(egZu ~S‘ kr&q@)g ȉ3ۤr Y1!ߌf)rKdٶ-+ /ngzƟC#w zWe@YY$Z6 ? ȭ Ydăc $ᇍM~]ңi90uTjR)6/,.g,{JLӬCn08!ےCwGmD$wZ_U"sbO J5h)D,ğx9 nȶl}0⇤[f]r>BTu݈h!R!sDgFIsv0Pioܤ'B/Z3[\ͤ}I+NWKa/}NzEf*=w:V +'@<B 8ˡG!v\vi)|o\9^ؐ6-C`Gr)jUV;j5NzvCћslYLyf.0nwLT8i䯛'*~s4懲!i,@ϙWXi Jmi,OYc\f=#i24sf ;cpȾzL\K~Q!/Fڀ0o8{4mc_X|ŗ"5x%PL>>%Kgn~(}5 >=]c=(q5|oOT0^"fU}gcY BX nӍsi SI6:XSG0]3UO//2yv-⤄9A!G}9,Al FK p$o> f;:Am\~f:-=h0,ubUi ^n6. ktV#l͸f_Դ̝^8 _9h?̀C~?7[PiuY|=443*w<^[ie I8"g*~$?6ƴW@jxJ:oCNC?nډ& םҗCMoV-'-_%REg0nV/'oW~r'ꕭ [H}NaDMr9"S xdK4K :;z!JZ7Ng*,`r9w$T pޫupZ ovF4s,zs}nm1ey a1Bޥld|LuJ[8.~ (i`&Jhޒe]/4aov*`zh$<}y6ͯ؜{-`h`z`~ɘ9Y v}c;V&z1`X"]']XZHMuܝ\r ~Xe$; 98[I0 r*RÒ/|p.jґX8o1D*U3̘8O~Nv9zz9;uvW?;,J:+G(+9bv/o[o0㿌cs;[%{[e.g3',4IJwo^8-+ ?$cvar/tests/testthat/a.RDS0000644000176200001440000000522613627700444015015 0ustar liggesusers}V 8cR\WEةdmWAer-ZR[,QtKtHf,3hdWy}{=<8p8N@#|6?B}twfWJ{xֺPZoWc@S+7\]iKbg&wGҋluMFh8A~n尊١r#}!t-qd\_.>hA"rA6 9hdmu tϼ8ِLG'dQJNH`Qb9\.1Ts1܅6iw Sv4:L`τAM>MIuД ;nǟ_C- 0)y= hx3k)|W[4Pơ:ND.UR7J$GF⸻˓M?x;ddZ'+ BR6heܐ/X Ш7@[mVCqbHJ]щCMh ?U@2 Wſ|4 ꆧe> Rhn֖E`zw ^ }15 s$)߯wi+1ME 4JE#zCCDiv&s?޿?Qsm"2nUXT vd=0K>] vLfB? P^VP _w-{]&;WzSEj镝R*DݘU)&k\q]h)0ds;TkdTufXuD ^6Fn[;U" &zt}1I!M.84v,@a+1;Pʖ"bF1łsͫR{ ~ߡC[6_tm_--C[W]#"py-e&J|*7A/瓟=e' ֳI o0ؼCmٮpJo3:> ݅ _6Q\uZAO$%;uk/Tw>͂IzfFl^LC|dÉ߹uƌm΅^*"F65;%I =$.ta "ݼ K?4[U0;9 X7zi_.Bp^]#T@r;ƣ- aJ">p=p]GɞAD& ֹ[>>U FW:ӧ oPwv Y C'_O&x <Zv/0Dg|1L=S p ƶ4\:sP.G8V]j5"K+c\$A>lX]7CCghoK}CߝMM󚖸ᭉEzx-8y-sKk59m_|쫍O$|q>{iCKA/*ō<=:D'߬-D9=վv R}՝էm8%Y BxzPc{:8;_"B\ 9t,mوˬN ɍO_ aOo&η::SBVّD a`_Z+4L3ܤiq3Vr cvar/tests/testthat.R0000644000176200001440000000006413630522362014334 0ustar liggesuserslibrary(testthat) library(cvar) test_check("cvar") cvar/vignettes/0000755000176200001440000000000014330705053013215 5ustar liggesuserscvar/vignettes/Guide_cvar.Rnw0000644000176200001440000003272614330671606015775 0ustar liggesusers% preamble taken from the vignette in package strucchange % \documentclass[nojss,article]{jss} \usepackage[T1]{fontenc} %\usepackage{a4wide} \usepackage[left=2cm,right=2cm,bottom=15mm]{geometry} \usepackage{graphicx,color,alltt} \usepackage[authoryear,round,longnamesfirst]{natbib} \usepackage{hyperref} \usepackage{amsmath, amsfonts} % \usepackage{Sweave} %\definecolor{Red}{rgb}{0.7,0,0} %\definecolor{Blue}{rgb}{0,0,0.8} %\definecolor{hellgrau}{rgb}{0.55,0.55,0.55} %\newcommand{\E}{\mbox{$\mathsf{E}$}} %\newcommand{\VAR}{\mbox{$\mathsf{VAR}$}} %\newcommand{\COV}{\mbox{$\mathsf{COV}$}} %\newcommand{\p}{\mbox{$\mathsf{P}$}} %\newcommand{\email}[1]{\href{mailto:#1}{\normalfont\texttt{#1}}} %\newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} %\setlength{\parskip}{0.5ex plus0.1ex minus0.1ex} %\setlength{\parindent}{0em} % %\bibpunct{(}{)}{;}{a}{}{,} % %\newcommand{\ui}{\underline{i}} %\newcommand{\oi}{\overline{\imath}} %\RequirePackage{color} %\definecolor{Red}{rgb}{0.5,0,0} %\definecolor{Blue}{rgb}{0,0,0.5} %\definecolor{hellgrau}{rgb}{0.55,0.55,0.55} % %\hypersetup{% %hyperindex,% %colorlinks,% %linktocpage,% %plainpages=false,% %linkcolor=Blue,% %citecolor=Blue,% %urlcolor=Red,% %pdfstartview=Fit,% %pdfview={XYZ null null null}% %} % SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{Brief guide to R package cvar} %\VignetteDepends{cvar} %\VignetteKeywords{expected shortfall, ES, CVaR, VaR, value at risk} %\VignettePackage{cvar} <>= library(cvar) pd <- packageDescription("cvar") @ \newcommand{\VaR}[2][\alpha]{\text{VaR}_{#1}(#2)} \newcommand{\ES}[2][\alpha]{\text{ES}_{#1}(#2)} \title{Brief guide to R package \pkg{cvar}} \author{Georgi N. Boshnakov \\ University of Manchester } \Plainauthor{Georgi N. Boshnakov} \Address{ Georgi N. Boshnakov\\ School of Mathematics\\ The University of Manchester\\ Oxford Road, Manchester M13 9PL, UK\\ URL: \url{http://www.maths.manchester.ac.uk/~gb/} } %\date{} %\maketitle \Abstract{ Package \pkg{cvar} is a small package with, essentially, two functions --- \code{ES()} for computing the expected shortfall and \code{VaR()} for Value at Risk. The user specifies the distribution by supplying one of the functions that define a continuous distribution---currently this can be a quantile function (qf), cumulative distribution function (cdf) or probability density function (pdf). Virtually any continuous distribution can be specified. This vignette is part of package \pkg{cvar}, version~\Sexpr{pd$Version}. %$ } \Keywords{expected shortfall, ES, CVaR, VaR, value at risk} \Plainkeywords{expected shortfall, ES, CVaR, VaR, value at risk} \begin{document} \section{Introduction} \label{sec:introduction} There is a huge number of functions for computations with distributions in core R and in contributed packages. Pdf's, cdf's, quantile functions and random number generators are covered comprehensively. The coverage of expected shortfall is more patchy but a large collection of distributions, including functions for expected shortfall, is provided by \citet{VaRES2013}. \citet{PerformanceAnalytics2018} and \citet{actuarJSS2008} provide packages covering comprehensively various aspects of risk measurement, including some functions for expected shortfall. Package \pkg{cvar} is a small package with, essentially two functions --- \code{ES} for computing the expected shortfall and \code{VaR} for Value at Risk. The user specifies the distribution by supplying one of the functions that define a continuous distribution---currently this can be a quantile function (qf), cumulative distribution function (cdf) or probability density function (pdf). Virtually any continuous distribution can be specified. The computations are done directly from the definitions, see e.g. \citet{acerbi2002expected}. The functions are vectorised over the parameters of the distributions, making bulk computations more convenient, for example for forecasting or model evaluation. The name of this package, "cvar", comes from \emph{Conditional Value at Risk} (CVaR), which is an alternative term for expected shortfall. We chose to use the standard names \code{ES} and \code{VaR}, despite the possibility for name clashes with same named functions in other packages, rather than invent possibly difficult to remember alternatives. Just call the functions as \code{cvar::ES} and \code{cvar::VaR} if necessary. Locations-scale transformations can be specified separately from the other distribution parameters. This is useful when such parameters are not provided directly by the distribution at hand. The use of these parameters often leads to more efficient computations and better numerical accuracy even if the distribution has its own parameters for this purpose. Some of the examples for \code{VaR} and \code{ES} illustrate this for the Gaussian distribution. Since VaR is a quantile, functions computing it for a given distribution are convenience functions. \code{VaR} exported by \pkg{cvar} could be attractive in certain workflows because of its vectorised distribution parameters, the location-scale transformation and the possibility to compute it from cdf's when quantile functions are not available. \section{Value at Risk and Expected Shortfall} %To avoid confusion, we give the mathematical definitions here. We use the traditional definition of VaR as the negated lower quantile. More specifically, let $Y$ be the variable of interes, such as return on a financial asset. Suppose that it is modelled as a random variable with distribution function $F^{Y}(y)$. Then VaR is defined as% \footnote{Beware that a definition without negation is also used in both the literature and in the R packages.} \begin{equation*} \VaR{Y} = - q_{\alpha}^{Y} . \end{equation*} where $q_{\alpha}^{Y}$ is the lower $\alpha$-quantile of $Y$, i.e. we have \begin{equation*} \alpha = F(q_{\alpha}^{Y}) = P(Y \le q_{\alpha}^{Y}) . \end{equation*} Typical values for $\alpha$ are $0.05$ and $0.01$. Equivalently, we could write\footnote{This equation shows why some authors use the ``big numbers'', e.g. 0.95 and 0.99, in the notation for the VaR.} \begin{equation*} \VaR{Y} = q_{1-\alpha}^{-Y} . \end{equation*} The expected shortfall is the (partial) expectation of $\VaR{Y}$: \begin{equation*} \ES{Y} = \frac{1}{\alpha}\int_{0}^{\alpha}\VaR[\gamma]{Y} d\gamma . \end{equation*} Suppose now that $Y$ is obtained from another random variable, $X$, by a linear transformation: \begin{equation*} Y = a + bX \end{equation*} When this is the case, there is a simple relation between the VaR's and ES's of $Y$ and $X$: \begin{align*} \VaR{Y} &= -a + b \VaR{X} \\ \ES{Y} &= -a + b \ES{X} \end{align*} In practice, $X$ is often chosen to be standardised but this is not necessary. Note also that if a bunch of VaR's and ES's are needed, say for normally distributed variables, this can be computed very efficiently using this property. \section{VaR} \label{sec:var} Here we compute the VaR associated with a standard normal r.v. The three variants are equivalent since 0.05 and \code{"qf"} are default for the last two arguments. <<>>= cvar::VaR(qnorm, p_loss = 0.05, dist.type = "qf") cvar::VaR(qnorm, p_loss = 0.05) cvar::VaR(qnorm) @ \code{x} can be a vector: <<>>= cvar::VaR(qnorm, p_loss = c(0.01, 0.05)) @ Let's set some more realistic values for the parameters of the normal distribution. Suppose that the daily returns on some stock have sample mean $0.006408553$ and sample variance $0.0004018977$. Then $N(0.006408553, 0.0004018977)$ can be taken as normal distribution fitted to the data. <<>>= muA <- 0.006408553 sigma2A <- 0.0004018977 @ This computes VaR using the fitted normal distribution: <<>>= res1 <- cvar::VaR(qnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A)) @ For the normal disribution we could also use the intercept-slope arguments, since the parameters are precisely the intercept and the slope: <<>>= res2 <- cvar::VaR(qnorm, p_loss = 0.05, intercept = muA, slope = sqrt(sigma2A)) abs((res2 - res1)) # 0, intercept/slope equivalent to mean/sd @ If we compute VaR using the cdf, the intercept-slope method has some numerical advantage: <<>>= ## with cdf the precision depends on solving an equation res1a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A)) res2a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A)) abs((res1a - res2)) # 3.287939e-09 abs((res2a - res2)) # 5.331195e-11, intercept/slope better numerically @ Of course, it is almost always better to use the quantile function when it is available. We can use smaller tollerance to improve the precision (the value \verb+.Machine$double.eps^0.75+ = \Sexpr{.Machine$double.eps^0.75} is probably excessive): <<>>= ## as above, but increase the precision, this is probably excessive res1b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A), tol = .Machine$double.eps^0.75) res2b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A), tol = .Machine$double.eps^0.75) abs((res1b - res2)) # 6.938894e-18 # both within machine precision abs((res2b - res2)) # 1.040834e-16 @ The relative precision is also good. <<>>= abs((res1b - res2)/res2) # 2.6119e-16 # both within machine precision abs((res2b - res2)/res2) # 3.91785e-15 @ For examples with vectorised distribution parameters we use data from \pkg{PerformanceAnalytics}. Compute means and variances of the variables in a data frame and store them in vectors: <<>>= ## if(require("PerformanceAnalytics")){ data(edhec, package = "PerformanceAnalytics") mu <- apply(edhec, 2, mean) sigma2 <- apply(edhec, 2, var) musigma2 <- cbind(mu, sigma2) @ We compute VaR using \code{PerformanceAnalytics::VaR}: <<>>= ## analogous calc. with PerformanceAnalytics::VaR vPA <- apply(musigma2, 1, function(x) PerformanceAnalytics::VaR(p = .95, method = "gaussian", invert = FALSE, mu = x[1], sigma = x[2], weights = 1)) @ The results below compare to the value, \code{vPA}, obtained here. The computations below are similar to the previous example but the distribution parameters are vectors. The first pair of results are numerically the same: <<>>= vAz1 <- cvar::VaR(qnorm, p_loss = 0.05, mean = mu, sd = sqrt(sigma2)) vAz2 <- cvar::VaR(qnorm, p_loss = 0.05, intercept = mu, slope = sqrt(sigma2)) max(abs((vPA - vAz1))) # 5.551115e-17 max(abs((vPA - vAz2))) # "" @ Computing VaR from cdf shows some advantage for the location-scale method: <<>>= vAz1a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2)) vAz2a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2)) max(abs((vPA - vAz1a))) # 3.287941e-09 max(abs((vPA - vAz2a))) # 1.465251e-10, intercept/slope better @ The advantage remains for smaller tolerance: <<>>= vAz1b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2), tol = .Machine$double.eps^0.75) vAz2b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2), tol = .Machine$double.eps^0.75) max(abs((vPA - vAz1b))) # 4.374869e-13 max(abs((vPA - vAz2b))) # 3.330669e-16 @ \section{Expected shortfall} \label{sec:expected-shortfall} \code{ES} has essentially the same arguments as \code{VaR}. The examples below are obtained almost literally by replacing the calls to \code{VaR} with \code{ES()} ones. Here we compute the VaR associated with a standard normal r.v. The three variants are equivalent since 0.5 and \code{"qf"} are default for the last two arguments. <<>>= cvar::ES(qnorm, p_loss = 0.05, dist.type = "qf") cvar::ES(qnorm, p_loss = 0.05) cvar::ES(qnorm) @ \code{x} can be a vector: <<>>= cvar::ES(qnorm, p_loss = c(0.01, 0.05)) @ Let's set some more realistic values for the parameters of the normal distribution: <<>>= muA <- 0.006408553 sigma2A <- 0.0004018977 @ This demonstrates the use of \code{intercept} and \code{slope}. These arguments use the linear transformation property discussed in the theoretical section. For the normal disribution the parameters are precisely the intercept and the slope: <<>>= res1 <- cvar::ES(qnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A)) res2 <- cvar::ES(qnorm, p_loss = 0.05, intercept = muA, slope = sqrt(sigma2A)) abs((res2 - res1)) @ If we compute ES using the cdf, the intercept slope method has some numerical advantage: <<>>= ## with cdf the precision depends on solving an equation res1a <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A)) res2a <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A)) abs((res1a - res2)) # abs((res2a - res2)) # intercept/slope better numerically @ We can use smaller tollerance to improve the precision (the value \verb+.Machine$double.eps^0.75+ = \Sexpr{.Machine$double.eps^0.75} is probably excessive): <<>>= ## as above, but increase the precision, this is probably excessive res1b <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A), tol = .Machine$double.eps^0.75) res2b <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A), tol = .Machine$double.eps^0.75) abs((res1b - res2)) abs((res2b - res2)) @ The relative precision is also good. <<>>= abs((res1b - res2)/res2) abs((res2b - res2)/res2) @ \newpage{} \bibliography{REFERENCES} \end{document} cvar/vignettes/REFERENCES.bib0000644000176200001440000000233113501140665015314 0ustar liggesusers@article{acerbi2002expected, title={Expected shortfall: a natural coherent alternative to value at risk}, author={Acerbi, Carlo and Tasche, Dirk}, journal={Economic notes}, volume={31}, number={2}, pages={379--388}, year={2002}, doi = {10.1111/1468-0300.00091}, url = {https://arxiv.org/pdf/cond-mat/0105191.pdf}, } @Manual{PerformanceAnalytics2018, title = {PerformanceAnalytics: Econometric Tools for Performance and Risk Analysis}, author = {Brian G. Peterson and Peter Carl}, year = {2018}, note = {R package version 1.5.2}, url = {https://CRAN.R-project.org/package=PerformanceAnalytics}, } @Manual{VaRES2013, title = {VaRES: Computes value at risk and expected shortfall for over 100 parametric distributions}, author = {Saralees Nadarajah and Stephen Chan and Emmanuel Afuecheta}, year = {2013}, note = {R package version 1.0}, url = {https://CRAN.R-project.org/package=VaRES}, } @Article{actuarJSS2008, title = {actuar: An R Package for Actuarial Science}, author = {Christophe Dutang and Vincent Goulet and Mathieu Pigeon}, journal = {Journal of Statistical Software}, year = {2008}, volume = {25}, number = {7}, pages = {38}, url = {http://www.jstatsoft.org/v25/i07}, } cvar/vignettes/auto/0000755000176200001440000000000014210656663014176 5ustar liggesuserscvar/vignettes/auto/Guide_cvar.el0000644000176200001440000000240714210656663016573 0ustar liggesusers(TeX-add-style-hook "Guide_cvar" (lambda () (TeX-add-to-alist 'LaTeX-provided-class-options '(("jss" "nojss" "article"))) (TeX-add-to-alist 'LaTeX-provided-package-options '(("fontenc" "T1") ("geometry" "left=2cm" "right=2cm" "bottom=15mm") ("natbib" "authoryear" "round" "longnamesfirst"))) (add-to-list 'LaTeX-verbatim-environments-local "alltt") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "path") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "url") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "nolinkurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperbaseurl") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperimage") (add-to-list 'LaTeX-verbatim-macros-with-braces-local "hyperref") (add-to-list 'LaTeX-verbatim-macros-with-delims-local "path") (TeX-run-style-hooks "latex2e" "jss" "jss10" "fontenc" "geometry" "graphicx" "color" "alltt" "natbib" "hyperref" "amsmath" "amsfonts") (TeX-add-symbols '("ES" ["argument"] 1) '("VaR" ["argument"] 1)) (LaTeX-add-labels "sec:introduction" "sec:var" "sec:expected-shortfall") (LaTeX-add-bibliographies "REFERENCES")) :latex) cvar/R/0000755000176200001440000000000014330677051011414 5ustar liggesuserscvar/R/garch.R0000644000176200001440000004277414330267202012632 0ustar liggesusers#' Specify a GARCH model #' #' Specify a GARCH model. #' #' Argument \code{model} can be the result of a previous call to \code{GarchModel}. #' Arguments in \code{"..."} overwrite current components of \code{model}. #' #' \code{GarchModel} guarantees that code using it will continue to work #' transparently for the user even if the internal represedtation of GARCH #' models in this package is changed or additional functionality is added. #' #' @param model a GARCH model or a list. #' @param ... named arguments specifying the GARCH model. #' @param model.class a class for the result. By default \code{GarchModel()} #' decides the class of the result. #' @return an object from suitable GARCH-type class #' #' @examples #' ## GARCH(1,1) with Gaussian innovations #' mo1a <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5) #' mo1b <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5, cond.dist = "norm") #' #' ## equivalently, the parameters can be given as a list #' p1 <- list(omega = 1, alpha = 0.3, beta = 0.5) #' mo1a_alt <- GarchModel(p1) #' mo1b_alt <- GarchModel(p1, cond.dist = "norm") #' stopifnot(identical(mo1a, mo1a_alt), identical(mo1b, mo1b_alt)) #' #' ## additional arguments modify values already in 'model' #' mo_alt <- GarchModel(p1, beta = 0.4) #' #' ## set also initial values #' mo2 <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5, esp0 = - 1.5, h0 = 4.96) #' #' ## GARCH(1,1) with standardised-t_5 #' mot <- GarchModel(omega = 1, alpha = 0.3, beta = 0.5, cond.dist = list("std", nu = 5)) #' #' @export GarchModel <- function(model = list(), ..., model.class = NULL){ ## TODO: check the correctness of the parameters ## alpha, beta, cond.dist, 2nd order stationary, initial value for eps_t^2, h_t ## 2019-03-15 TODO: handle fGARCH models ## if(inherits(model, "fGARCH")){ ## ## }else{ dots <- list(...) if(length(dots) > 0) model[names(dots)] <- dots class(model) <- "GarchModel0" if(is.null(model.class) && length(model$alpha) == 1 && length(model$beta) == 1) class(model) <- "garch1c1" # GARCH(1,1), 'c' stands for 'comma' ## } model } ## 2022-11-01 change .dist from 'list' to 'env', was: # .dist <- list( # norm = list(d = call("dnorm", x = NA, mean = 0, sd = 1), # p = call("pnorm", q = NA, mean = 0, sd = 1), # q = call("qnorm", p = NA, mean = 0, sd = 1), # r = call("rnorm", n = NA, mean = 0, sd = 1)), # std = list(d = call("dstd", x = NA, mean = 0, sd = 1, nu = NA), # p = call("pstd", q = NA, mean = 0, sd = 1, nu = NA), # q = call("qstd", p = NA, mean = 0, sd = 1, nu = NA), # r = call("rstd", n = NA, mean = 0, sd = 1, nu = NA)), # ged = list(d = call("dged", x = NA, mean = 0, sd = 1, nu = NA), # p = call("pged", q = NA, mean = 0, sd = 1, nu = NA), # q = call("qged", p = NA, mean = 0, sd = 1, nu = NA), # r = call("rged", n = NA, mean = 0, sd = 1, nu = NA)) # ) .dist <- new.env() ## N(0,1) is built-in .dist$norm <- list(d = call("dnorm", x = NA, mean = 0, sd = 1), p = call("pnorm", q = NA, mean = 0, sd = 1), q = call("qnorm", p = NA, mean = 0, sd = 1), r = call("rnorm", n = NA, mean = 0, sd = 1)) # generalise and prepare to make fGarch suggested; was: # # .dist$std <- list(d = call("dstd", x = NA, mean = 0, sd = 1, nu = NA), # p = call("pstd", q = NA, mean = 0, sd = 1, nu = NA), # q = call("qstd", p = NA, mean = 0, sd = 1, nu = NA), # r = call("rstd", n = NA, mean = 0, sd = 1, nu = NA)) # # .dist$ged <- list(d = call("dged", x = NA, mean = 0, sd = 1, nu = NA), # p = call("pged", q = NA, mean = 0, sd = 1, nu = NA), # q = call("qged", p = NA, mean = 0, sd = 1, nu = NA), # r = call("rged", n = NA, mean = 0, sd = 1, nu = NA)) .dist_list <- list( ## TODO: allow different packages here by letting 'package be vector or completely ## refactor all this. Only '.get_dist_elem()' should know the implementation. std = list(package = "fGarch", d = list(str2lang("fGarch::dstd"), x = NA, mean = 0, sd = 1, nu = NA), p = list(str2lang("fGarch::pstd"), q = NA, mean = 0, sd = 1, nu = NA), q = list(str2lang("fGarch::qstd"), p = NA, mean = 0, sd = 1, nu = NA), r = list(str2lang("fGarch::rstd"), n = NA, mean = 0, sd = 1, nu = NA)), ged = list(package = "fGarch", d = list(str2lang("fGarch::dged"), x = NA, mean = 0, sd = 1, nu = NA), p = list(str2lang("fGarch::pged"), q = NA, mean = 0, sd = 1, nu = NA), q = list(str2lang("fGarch::qged"), p = NA, mean = 0, sd = 1, nu = NA), r = list(str2lang("fGarch::rged"), n = NA, mean = 0, sd = 1, nu = NA)) ) .get_dist_elem <- function(dist, what){ if(is.list(dist)){ params <- dist[-1] dist <- dist[[1]] }else params <- list() if(is.null(dist)){ ## TODO: this probably should be handled by the caller ## normal distribution is default res <- .dist$norm[[what]] }else{ stopifnot(is.character(dist), length(dist) == 1) gen <- .dist[[dist]] if(!is.null(gen)) # already prepared res <- gen[[what]] else{ # not prepared yet gen_list <- .dist_list[[dist]] if(is.null(gen_list)) stop("unknown distribution specified.") if(!requireNamespace(gen_list$package)) stop("requested distribution property needs package ", gen_list$package, "\nplease install package '", gen_list$package, "' and try again") ## prepare ## .dist is env, so assignment is persistent .dist[[dist]] <- lapply(gen_list[-1], as.call) # dropping $package res <- .dist[[dist]][[what]] if(is.null(res)) stop("property '", "'what not available for '", dist, "'") } } if(length(params) > 0) # set parameters if specified res[names(params)] <- params res } #' Simulate GARCH(1,1) time series #' #' Simulate GARCH(1,1) time series. #' #' The simulated time series is in component \code{eps} of the returned value. #' For exploration of algorithms and eestimation procedures, the volatilities #' and the standardised innovations are also returned. #' #' The random seed at the start of the simulations is saved in the returned #' object. A speficific seed can be requested with argument \code{seed}. In #' that case the simulations are done with the specified seed and the old state #' of the random number generator is restored before the function returns. #' #' @param model a GARCH(1,1) model, an object obtained from \code{GarchModel}. #' @param n the length of the generated time series. #' @param n.start number of warm-up values, which are then dropped. #' @param seed an integer to use for setting the random number generator. #' #' @return a list with components: #' \item{eps}{the time series,} #' \item{h}{the (squared) volatilities,} #' \item{eta}{the standardised innovations,} #' \item{model}{the GARCH(1,1) model,} #' \item{.sim}{a list containing the parameters of the simulation,} #' \item{call}{the call.} #' #' @note This function is under development and may be changed. #' #' @export sim_garch1c1 <- function(model, n, n.start = 0, seed = NULL){ ## TODO: seed is not used currently garch1c1_fields <- c("omega", "alpha", "beta", "cond.dist", "eps0", "h0", "eps0sq") stopifnot(all(names(model) %in% garch1c1_fields)) omega <- model$omega alpha <- model$alpha beta <- model$beta rgen <- .get_dist_elem(model$cond.dist, "r") eps0 <- model$eps0 h0 <- model$h0 eps0sq <- model$eps0sq ## see Francq & Zakoian, p. 142, for alternative initialisations if(is.null(eps0sq)){ model$eps0sq <- eps0sq <- if(is.null(eps0)) omega / (1 - alpha - beta) else eps0^2 } if(is.null(h0)){ model$h0 <- h0 <- omega / (1 - alpha - beta) } N <- n + n.start h <- eps <- numeric(N) RNGstate <- .RNGstate(seed) ## 2020-03-04 was: if(!is.null(RNGstate$oldRNGstate)) # or !is.null(seed) ## (see comment at a similar command) if(!is.null(seed)) on.exit( if(is.null(RNGstate$RNGstate)){ ## TRUE id seed is NULL but also if .Random.seed was not set. "nothing to do" }else if(is.null(RNGstate$oldRNGstate)){ rm(".Random.seed", envir = .GlobalEnv) }else{ assign(".Random.seed", RNGstate$oldRNGstate, envir = .GlobalEnv) } ) rgen$n <- N # or: rgen[[2]] <- N eta <- eval(rgen) h[1] <- omega + alpha * eps0sq + beta * h0 for(i in 1:(N - 1)){ eps[i] <- sqrt(h[i]) * eta[i] h[i + 1] <- omega + alpha * eps[i]^2 + beta * h[i] } eps[N] <- sqrt(h[N]) * eta[N] ## TODO: return eta only conditionally? ## TODO: include the model in the returned value? ## TODO: return also the initialisation values (in a separate component)? list(eps = eps[(n.start + 1):N], h = h[(n.start + 1):N], eta = eta[(n.start + 1):N], model = model, .sim = list(seed = seed, rand.gen = rgen, n = n, n.start = n.start), call = match.call() ) } ## modelled after the beginning of `stats:::simulate.lm()` .RNGstate <- function(seed = NULL){ ## 2020-03-04 - changing the logic below ## ## if(!exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE)) ## runif(1) oldRNGstate <- if(exists(".Random.seed", envir = .GlobalEnv)) get(".Random.seed", envir = .GlobalEnv) else NULL if (is.null(seed)) list(RNGstate = oldRNGstate) else{ ## This doesn't resolve the problem ## suppressWarnings(RNGversion("3.5.0")) # 2019-03-13 temporary, RNG changed in R-devel. ## # see email from Kurt Hornik in Org/ set.seed(seed) RNGstate <- structure(seed, kind = as.list(RNGkind())) ## on.exit(assign(".Random.seed", oldRNGstate, envir = .GlobalEnv)) list(RNGstate = RNGstate, oldRNGstate = oldRNGstate) } } #' Prediction for GARCH(1,1) time series #' #' Predict GARCH(1,1) time series. #' #' Plug-in prediction intervals and predictive distributions are obtained by #' inserting the predicted volatility in the conditional densities. For #' predictions more than one lag ahead these are not the real predictive #' distributions but the prediction intervals are usually adequate. #' #' For simulation prediction intervals we generate a (large) number of #' continuations of the given time series. Prediction intervals can be based on #' sample quantiles. The generated samples are stored in the returned object and #' can be used for further exploration of the predictive #' distributions. \code{dist_sim$eps} contains the simulated future values of #' the time series and \code{dist_sim$h} the corresponding (squared) #' volatilities. Both are matrices whose \code{i}-th rows contain the predicted #' quantities for horizon \code{i}. #' #' The random seed at the start of the simulations is saved in the returned #' object. A speficific seed can be requested with argument \code{seed}. In #' that case the simulations are done with the specified seed and the old state #' of the random number generator is restored before the function returns. #' This setup is similar to \code{\link{sim_garch1c1}}. #' #' @param object an object from class \code{"garch1c1"}. #' @param n.ahead maximum horizon (lead time) for prediction. #' @param Nsim number of Monte Carlo simulations for simulation based quantities. #' @param eps the time series to predict, only the last value is used. #' @param sigmasq the (squared) volatilities, only the last value is used. #' @param seed an integer, seed for the random number generator. #' @param ... currently not used. #' #' @return an object from S3 class \code{"predict_garch1c1"} containing #' the following components: #' \item{eps}{point predictions (conditional expectations) of the time series (equal #' to zero for pure GARCH).} #' \item{h}{point predictions (conditional expectations)of the squared volatilities.} #' \item{model}{the model.} #' \item{call}{the call.} #' \item{pi_plugin}{Prediction intervals for the time series, based on plug-in #' distributions, see Details.} #' \item{pi_sim}{Simulation based prediction intervals for the time series, see Details.} #' \item{dist_sim}{simulation samples from the predictive distributions of the time #' series and the volatilties. } #' #' @examples #' op <- options(digits = 4) #' #' ## set up a model and simulate a time series #' mo <- GarchModel(omega = 0.4, alpha = 0.3, beta = 0.5) #' a1 <- sim_garch1c1(mo, n = 1000, n.start = 100, seed = 20220305) #' #' ## predictions for T+1,...,T+5 (T = time of last value) #' ## Nsim is small to reduce the load on CRAN, usually Nsim is larger. #' a.pred <- predict(mo, n.ahead = 5, Nsim = 1000, eps = a1$eps, #' sigmasq = a1$h, seed = 1234) #' #' ## preditions for the time series #' a.pred$eps #' #' ## PI's for eps - plug-in and simulated #' a.pred$pi_plugin #' a.pred$pi_sim #' #' ## a DIY calculation of PI's using the simulated sample paths #' t(apply(a.pred$dist_sim$eps, 1, function(x) quantile(x, c(0.025, 0.975)))) #' #' ## further investigate the predictive distributions #' t(apply(a.pred$dist_sim$eps, 1, function(x) summary(x))) #' #' ## compare predictive densities for horizons 2 and 5: #' h2 <- a.pred$dist_sim$eps[2, ] #' h5 <- a.pred$dist_sim$eps[5, ] #' main <- "Predictive densities: horizons 2 (blue) and 5 (black)" #' plot(density(h5), main = main) #' lines(density(h2), col = "blue") #' #' ## predictions of sigma_t^2 #' a.pred$h #' #' ## plug-in predictions of sigma_t #' sqrt(a.pred$h) #' #' ## simulation predictive densities (PD's) of sigma_t for horizons 2 and 5: #' h2 <- sqrt(a.pred$dist_sim$h[2, ]) #' h5 <- sqrt(a.pred$dist_sim$h[5, ]) #' main <- "PD's of sigma_t for horizons 2 (blue) and 5 (black)" #' plot(density(h2), col = "blue", main = main) #' lines(density(h5)) #' #' ## VaR and ES for different horizons #' cbind(h = 1:5, #' VaR = apply(a.pred$dist_sim$eps, 1, function(x) VaR(x, c(0.05))), #' ES = apply(a.pred$dist_sim$eps, 1, function(x) ES(x, c(0.05))) ) #' #' ## fit a GARCH(1,1) model to exchange rate data and predict #' gmo1 <- fGarch::garchFit(formula = ~garch(1, 1), data = fGarch::dem2gbp, #' include.mean = FALSE, cond.dist = "norm", trace = FALSE) #' mocoef <- gmo1@fit$par #' mofitted <- GarchModel(omega = mocoef["omega"], alpha = mocoef["alpha1"], #' beta = mocoef["beta1"]) #' gmo1.pred <- predict(mofitted, n.ahead = 5, Nsim = 1000, eps = gmo1@data, #' sigmasq = gmo1@h.t, seed = 1234) #' gmo1.pred$pi_plugin #' gmo1.pred$pi_sim #' #' op <- options(op) # restore options(digits) #' #' @note This function is under development and may be changed. #' #' @export predict.garch1c1 <- function(object, n.ahead = 1, Nsim = 1000, eps, sigmasq, seed = NULL, ...){ model <- object omega <- model$omega alpha <- model$alpha beta <- model$beta model$eps0 <- eps0 <- eps[length(eps)] model$h0 <- h0 <- sigmasq[length(sigmasq)] # TODO: compute if not present? ## TODO: add non-zero mean and possibly ARMA conditional mean pred_eps <- numeric(n.ahead) ## tsff slides, p. II.7.4/y1718 pred_h <- numeric(n.ahead) pred_h[1] <- omega + alpha * eps0^2 + beta * h0 if(n.ahead > 1) for(i in 2:n.ahead){ pred_h[i] <- omega + (alpha + beta) * pred_h[i - 1] } fq <- .get_dist_elem(model$cond.dist, "q") fq$sd <- sqrt(pred_h) fq[[2]] <- 0.025 lwr <- eval(fq) fq[[2]] <- 0.975 upr <- eval(fq) eps_pi <- cbind(lwr, upr) ## need local variants of withr::with_seed() withr::with_preserve_seed() ## but such are not available (as of 2018-09-28), so do it DIY: ## ## Memorise the state in any case but restore the old state only if 'seed' is not NULL. RNGstate <- .RNGstate(seed) ## 2020-03-04 was: ## ## if(!is.null(RNGstate$oldRNGstate)) # or !is.null(seed) ## ## But the check is not equivalent to is.null(seed)! ## Moreover, if RNGstate$oldRNGstate is NULL, .Random.seed should be removed, ## (so doing it now) if(!is.null(seed)) on.exit( if(is.null(RNGstate$RNGstate)){ ## TRUE id seed is NULL but also if .Random.seed was not set. "nothing to do" }else if(is.null(RNGstate$oldRNGstate)){ rm(".Random.seed", envir = .GlobalEnv) }else{ assign(".Random.seed", RNGstate$oldRNGstate, envir = .GlobalEnv) } ) h_sim <- eps_sim <- matrix(NA_real_, nrow = n.ahead, ncol = Nsim) for(i in 1:Nsim){ wrk <- sim_garch1c1(model = model, n = n.ahead, n.start = 0) eps_sim[ , i] <- wrk$eps h_sim[ , i] <- wrk$h } sim_pi <- t(apply(eps_sim, 1, function(x) quantile(x, c(0.025, 0.975)))) structure(list( eps = pred_eps, h = pred_h, model = model, call = match.call(), pi_plugin = eps_pi, pi_sim = sim_pi, dist_sim = list(eps = eps_sim, h = h_sim, RNGstate = RNGstate$RNGstate) ), class = "predict_garch1c1") } cvar/R/VaR.R0000644000176200001440000004416714330677051012243 0ustar liggesusers#' Compute Value-at-Risk (VaR) #' #' @description \code{VaR} computes the Value-at-Risk of the distribution specified by the #' arguments. The meaning of the parameters is the same as in \code{\link{ES}}, including #' the recycling rules. #' #' @note We use the traditional definition of VaR as the negated lower quantile. For example, #' if \eqn{X} are returns on an asset, VAR\eqn{{}_\alpha}{_a} = \eqn{-q_\alpha}{-q_a}, #' where \eqn{q_\alpha}{-q_a} is the lower \eqn{\alpha}{a} quantile of \eqn{X}. #' Equivalently, VAR\eqn{{}_\alpha}{_a} is equal to the lower \eqn{1-\alpha}{1-a} #' quantile of \eqn{-X}. #' #' @inheritParams ES #' #' @param intercept,slope compute VaR for the linear transformation \code{intercept + #' slope*X}, where \code{X} has distribution specified by \code{dist}, see Details. #' #' #' @details #' \code{VaR} is S3 generic. The meaning of the parameters for its default method is the #' same as in \code{\link{ES}}, including the recycling rules. #' #' \code{VaR_qf} and \code{VaR_cdf} are streamlined, non-generic, variants for the common #' case when the \code{"..."} parameters are scalar. The parameters \code{x}, #' \code{intercept}, and \code{slope} can be vectors, as for \code{VaR}. #' #' Argument \code{dist} can also be a numeric vector. In that case the ES is computed, #' effectively, for the empirical cumulative distribution function (ecdf) of the #' vector. The ecdf is not created explicitly and the \code{\link[stats]{quantile}} #' function is used instead for the computation of VaR. Arguments in \code{"..."} are #' passed eventually to \code{quantile()} and can be used, for example, to select a #' non-defult method for the computation of quantiles. #' #' In practice, we may need to compute VaR associated with data. The distribution comes #' from fitting a model. In the simplest case, we fit a distribution to the data, #' assuming that the sample is i.i.d. For example, a normal distribution \eqn{N(\mu, #' \sigma^2)} can be fitted using the sample mean and sample variance as estimates of the #' unknown parameters \eqn{\mu} and \eqn{\sigma^2}, see section \sQuote{Examples}. For #' other common distributions there are specialised functions to fit their parameters and #' if not, general optimisation routines can be used. More soffisticated models may be #' used, even time series models such as GARCH and mixture autoregressive models. #' #' #' @param tol tollerance #' #' @seealso \code{\link{ES}} for ES, #' #' \code{\link[=predict.garch1c1]{predict}} for examples with fitted models #' #' @examples #' cvar::VaR(qnorm, c(0.01, 0.05), dist.type = "qf") #' #' ## the following examples use these values, obtained by fitting a normal distribution to #' ## some data: #' muA <- 0.006408553 #' sigma2A <- 0.0004018977 #' #' ## with quantile function, giving the parameters directly in the call: #' res1 <- cvar::VaR(qnorm, 0.05, mean = muA, sd = sqrt(sigma2A)) #' res2 <- cvar::VaR(qnorm, 0.05, intercept = muA, slope = sqrt(sigma2A)) #' abs((res2 - res1)) # 0, intercept/slope equivalent to mean/sd #' #' ## with quantile function, which already knows the parameters: #' my_qnorm <- function(p) qnorm(p, mean = muA, sd = sqrt(sigma2A)) #' res1_alt <- cvar::VaR(my_qnorm, 0.05) #' abs((res1_alt - res1)) #' #' ## with cdf the precision depends on solving an equation #' res1a <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A)) #' res2a <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A)) #' abs((res1a - res2)) # 3.287939e-09 #' abs((res2a - res2)) # 5.331195e-11, intercept/slope better numerically #' #' ## as above, but increase the precision, this is probably excessive #' res1b <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", #' mean = muA, sd = sqrt(sigma2A), tol = .Machine$double.eps^0.75) #' res2b <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", #' intercept = muA, slope = sqrt(sigma2A), tol = .Machine$double.eps^0.75) #' abs((res1b - res2)) # 6.938894e-18 # both within machine precision #' abs((res2b - res2)) # 1.040834e-16 #' #' ## relative precision is also good #' abs((res1b - res2)/res2) # 2.6119e-16 # both within machine precision #' abs((res2b - res2)/res2) # 3.91785e-15 #' #' #' ## an extended example with vector args, if "PerformanceAnalytics" is present #' if (requireNamespace("PerformanceAnalytics", quietly = TRUE)) withAutoprint({ #' data(edhec, package = "PerformanceAnalytics") #' mu <- apply(edhec, 2, mean) #' sigma2 <- apply(edhec, 2, var) #' musigma2 <- cbind(mu, sigma2) #' #' ## compute in 2 ways with cvar::VaR #' vAz1 <- cvar::VaR(qnorm, 0.05, mean = mu, sd = sqrt(sigma2)) #' vAz2 <- cvar::VaR(qnorm, 0.05, intercept = mu, slope = sqrt(sigma2)) #' #' vAz1a <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", #' mean = mu, sd = sqrt(sigma2)) #' vAz2a <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", #' intercept = mu, slope = sqrt(sigma2)) #' #' vAz1b <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", #' mean = mu, sd = sqrt(sigma2), #' tol = .Machine$double.eps^0.75) #' vAz2b <- cvar::VaR(pnorm, 0.05, dist.type = "cdf", #' intercept = mu, slope = sqrt(sigma2), #' tol = .Machine$double.eps^0.75) #' #' ## analogous calc. with PerformanceAnalytics::VaR #' vPA <- apply(musigma2, 1, function(x) #' PerformanceAnalytics::VaR(p = .95, method = "gaussian", invert = FALSE, #' mu = x[1], sigma = x[2], weights = 1)) #' ## the results are numerically the same #' max(abs((vPA - vAz1))) # 5.551115e-17 #' max(abs((vPA - vAz2))) # "" #' #' max(abs((vPA - vAz1a))) # 3.287941e-09 #' max(abs((vPA - vAz2a))) # 1.465251e-10, intercept/slope better #' #' max(abs((vPA - vAz1b))) # 4.374869e-13 #' max(abs((vPA - vAz2b))) # 3.330669e-16 #' }) #' #' @export VaR <- function(dist, p_loss = 0.05, ...){ UseMethod("VaR") } warn_about_x <- function(s){ warning("argument 'x' has been renamed to 'p_loss'. 'x' still works with this version of 'cvar' but will stop doing so in the next release.\n Please change your scripts suitably.\n It most cases there is no need to name this argument when calling ", s) } #' @name VaR #' #' @export VaR_qf <- function(dist, p_loss = 0.05, ..., intercept = 0, slope = 1, tol = .Machine$double.eps^0.5, x){ if(!missing(x)){ p_loss <- x warn_about_x("VaR_qf") } dist <- match.fun(dist) ## assumes "..." are scalar res <- if(length(p_loss) > 1) - sapply(p_loss, dist, ...) else - dist(p_loss, ...) - intercept + slope * res } #' @name VaR #' #' @export VaR_cdf <- function(dist, p_loss = 0.05, ..., intercept = 0, slope = 1, tol = .Machine$double.eps^0.5, x){ if(!missing(x)){ p_loss <- x warn_about_x("VaR_cdf") } dist <- match.fun(dist) ## assumes "..." are scalar res <- if(length(p_loss) > 1) - sapply(p_loss, cdf2quantile, ..., MoreArgs = list(cdf = dist, tol = tol)) else - cdf2quantile(p_loss, dist, tol = tol, ...) # TODO: interval? - intercept + slope * res } #' @name VaR #' #' @export VaR.default <- function(dist, p_loss = 0.05, dist.type = "qf", ..., intercept = 0, slope = 1, tol = .Machine$double.eps^0.5, x){ if(!missing(x)){ p_loss <- x warn_about_x("VaR") } dist <- match.fun(dist) ## TODO: add "rand" to dist.type ## TODO: include 'dist' in the condition and mapply? # fu <- switch(dist.type, # qf = function(y) - dist(y, ...), # cdf = function(y) - cdf2quantile(y, dist, tol = tol, ...), # pdf = { # stop("Not ready yet. Please supply quantile function or cdf") # }, # stop('argument dist.type should be one of "qf", "cdf" or "pdf"') # ) # sapply(p_loss, fu) res <- switch(dist.type, qf = - mapply(dist, p_loss, ...), cdf = - mapply(cdf2quantile, p_loss, ..., MoreArgs = list(cdf = dist, tol = tol)), pdf = { stop("Not ready yet. Please supply quantile function or cdf") }, stop('argument dist.type should be one of "qf", "cdf" or "pdf"') ) - intercept + slope * res } #' @name VaR #' #' @export VaR.numeric <- function(dist, p_loss = 0.05, ..., intercept = 0, slope = 1, x){ if(!missing(x)){ p_loss <- x warn_about_x("VaR") } ## dist is raw data here res <- - quantile(dist, p_loss, ...) - intercept + slope * res } ## VaR <- function(dist, p_loss = 0.05, dist.type = "qf", ..., ## intercept = 0, slope = 1, tol = .Machine$double.eps^0.5){ ## dist <- match.fun(dist) ## ## TODO: add "rand" to dist.type ## ## TODO: include 'dist' in the condition and mapply()? ## if(length(p_loss) == 1 && all(sapply(list(...), length) < 2)) ## res <- switch(dist.type, ## qf = - dist(p_loss, ...), ## cdf = - cdf2quantile(p_loss, dist, tol = tol, ...), # TODO: interval? ## pdf = { ## stop("Not ready yet. Please supply quantile function or cdf") ## }, ## stop('argument dist.type should be one of "qf", "cdf" or "pdf"') ## ) ## else{ ## # fu <- switch(dist.type, ## # qf = function(y) - dist(y, ...), ## # cdf = function(y) - cdf2quantile(y, dist, tol = tol, ...), ## # pdf = { ## # stop("Not ready yet. Please supply quantile function or cdf") ## # }, ## # stop('argument dist.type should be one of "qf", "cdf" or "pdf"') ## # ) ## # sapply(p_loss, fu) ## res <- - switch(dist.type, ## qf = mapply(dist, p_loss, ...), ## cdf = mapply(cdf2quantile, p_loss, ..., MoreArgs = list(cdf = dist, tol = tol)), ## pdf = { ## stop("Not ready yet. Please supply quantile function or cdf") ## }, ## stop('argument dist.type should be one of "qf", "cdf" or "pdf"') ## ) ## ## } ## - intercept + slope * res ## } #' @title Compute expected shortfall (ES) of distributions #' #' @description #' Compute the expected shortfall for a distribution. #' #' @details \code{ES} computes the expected shortfall for distributions specified by the #' arguments. \code{dist} is typically a function (or the name of one). What \code{dist} #' computes is determined by \code{dist.type}, whose default setting is \code{"qf"} (the #' quantile function). Other possible settings of \code{dist.type} include \code{"cdf"} #' and \code{"pdf"}. Additional arguments for \code{dist} can be given with the #' \code{"..."} arguments. #' #' Argument \code{dist} can also be a numeric vector. In that case the ES is computed, #' effectively, for the empirical cumulative distribution function (ecdf) of the #' vector. The ecdf is not created explicitly and the \code{\link[stats]{quantile}} #' function is used instead for the computation of VaR. Arguments in \code{"..."} are #' passed eventually to \code{quantile()} and can be used, for example, to select a #' non-defult method for the computation of quantiles. #' #' Except for the exceptions discussed below, a function computing VaR for the specified #' distribution is constructed and the expected shortfall is computed by numerically #' integrating it. The numerical integration can be fine-tuned with argument #' \code{control}, which should be a named list, see \code{\link{integrate}} for the #' available options. #' #' If \code{dist.type} is \code{"pdf"}, VaR is not computed, Instead, the partial #' expectation of the lower tail is computed by numerical integration of \code{x * #' pdf(x)}. Currently the quantile function is required anyway, via argument \code{qf}, #' to compute the upper limit of the integral. So, this case is mainly for testing and #' comparison purposes. #' #' #' A bunch of expected shortfalls is computed if argument \code{x} or any of the #' arguments in \code{"..."} are of length greater than one. They are recycled to equal #' length, if necessary, using the normal \R recycling rules. #' #' \code{intercept} and \code{slope} can be used to compute the expected shortfall for #' the location-scale transformation \code{Y = intercept + slope * X}, where the #' distribution of \code{X} is as specified by the other parameters and \code{Y} is the #' variable of interest. The expected shortfall of \code{X} is calculated and then #' transformed to that of \code{Y}. Note that the distribution of \code{X} doesn't need #' to be standardised, although it typically will. #' #' The \code{intercept} and the \code{slope} can be vectors. Using them may be #' particularly useful for cheap calculations in, for example, forecasting, where the #' predictive distributions are often from the same family, but with different location #' and scale parameters. Conceptually, the described treatment of \code{intercept} and #' \code{slope} is equivalent to recycling them along with the other arguments, but more #' efficiently. #' #' The names, \code{intercept} and \code{slope}, for the location and scale parameters #' were chosen for their expressiveness and to minimise the possibility for a clash with #' parameters of \code{dist} (e.g., the Gamma distribution has parameter \code{scale}). #' #' #' @param dist specifies the distribution whose ES is computed, usually a function or a name #' of a function computing quantiles, cdf, pdf, or a random number generator, see #' Details. #' #' @param p_loss level, default is 0.05. #' #' @param dist.type a character string specifying what is computed by \code{dist}, such as #' "qf" or "cdf". #' #' @param qf quantile function, only used if \code{dist.type = "pdf"}. #' #' @param intercept,slope compute ES for the linear transformation \code{intercept + #' slope*X}, where \code{X} has distribution specified by \code{dist}, see Details. #' #' @param control additional control parameters for the numerical integration routine. #' #' @param ... passed on to \code{dist}. #' #' @param x deprecated and will soon be removed. \code{x} was renamed to \code{p_loss}, #' please use the latter. #' #' #' @return a numeric vector #' #' @seealso \code{\link{VaR}} for VaR, #' #' \code{\link[=predict.garch1c1]{predict}} for examples with fitted models #' #' @examples #' ES(qnorm) #' #' ## Gaussian #' ES(qnorm, dist.type = "qf") #' ES(pnorm, dist.type = "cdf") #' #' ## t-dist #' ES(qt, dist.type = "qf", df = 4) #' ES(pt, dist.type = "cdf", df = 4) #' #' ES(pnorm, 0.95, dist.type = "cdf") #' ES(qnorm, 0.95, dist.type = "qf") #' ## - VaRES::esnormal(0.95, 0, 1) #' ## - PerformanceAnalytics::ETL(p=0.05, method = "gaussian", mu = 0, #' ## sigma = 1, weights = 1) # same #' #' cvar::ES(pnorm, dist.type = "cdf") #' cvar::ES(qnorm, dist.type = "qf") #' cvar::ES(pnorm, 0.05, dist.type = "cdf") #' cvar::ES(qnorm, 0.05, dist.type = "qf") #' #' ## this uses "pdf" #' cvar::ES(dnorm, 0.05, dist.type = "pdf", qf = qnorm) #' #' #' ## this gives warning (it does more than simply computing ES): #' ## PerformanceAnalytics::ETL(p=0.95, method = "gaussian", mu = 0, sigma = 1, weights = 1) #' #' ## run this if VaRRES is present #' \dontrun{ #' x <- seq(0.01, 0.99, length = 100) #' y <- sapply(x, function(p) cvar::ES(qnorm, p, dist.type = "qf")) #' yS <- sapply(x, function(p) - VaRES::esnormal(p)) #' plot(x, y) #' lines(x, yS, col = "blue") #' } #' #' @export ES <- function(dist, p_loss = 0.05, ...){ UseMethod("ES") } CVaR <- AVaR <- ES # synonyms for ES, currently not exported #' @name ES #' #' @export ES.default <- function(dist, p_loss = 0.05, dist.type = "qf", qf, ..., intercept = 0, slope = 1, control = list(), x){ if(!missing(x)){ p_loss <- x warn_about_x("ES") } dist <- match.fun(dist) if(length(p_loss) == 1 && all(sapply(list(...), length) < 2)){ if(dist.type == "pdf"){ fu <- function(p) - p * dist(p, ...) / p_loss iargs <- list(f = fu, lower = -Inf, upper = qf(p_loss)) # stop.on.error = FALSE,? }else{ fu <- function(p) VaR(dist = dist, p_loss = p, dist.type = dist.type, ...) / p_loss iargs <- list(f = fu, lower = 0, upper = p_loss) # stop.on.error = FALSE,? } iargs[names(control)] <- control res <- do.call("integrate", iargs)$value }else{ ## TODO: this is lazy if(dist.type == "pdf"){ if(is.list(qf)) res <- mapply(ES, MoreArgs = list(dist = dist, dist.type = dist.type, control = control), p_loss = p_loss, qf = qf, ...) else res <- mapply(ES, MoreArgs = list(dist = dist, dist.type = dist.type, control = control, qf = qf), p_loss = p_loss, ...) }else{ res <- mapply(ES, MoreArgs = list(dist = dist, dist.type = dist.type, control = control), p_loss = p_loss, ...) } } -intercept + slope * res } #' @name ES #' #' @export ES.numeric <- function(dist, p_loss = 0.05, dist.type = "qf", qf, ..., intercept = 0, slope = 1, control = list(), x){ if(!missing(x)){ p_loss <- x warn_about_x("ES") } v <- VaR.numeric(dist, p_loss = p_loss, ..., intercept = intercept, slope = slope) bad <- dist[dist <= - v] res <- - mean(bad) res } cvar/R/cvar-package.R0000644000176200001440000001115114330275453014062 0ustar liggesusers#' @author Georgi N. Boshnakov #' #' @importFrom stats quantile runif #' @importFrom gbutils cdf2quantile #' @importFrom Rdpack reprompt #' #' #' #' @docType package #' @name cvar-package #' @aliases cvar #' #' @title Compute Conditional Value-at-Risk and Value-at-Risk #' #' @description Compute expected shortfall (ES) and Value at Risk (VaR) #' from a quantile function, distribution function, random number #' generator or probability density function. ES is also known as #' Conditional Value at Risk (CVaR). Virtually any continuous #' distribution can be specified. The functions are vectorised over #' the arguments. Some support for GARCH models is provided, as well. #' #' @details #' #' There is a huge number of functions for computations with #' distributions in core \R and in contributed packages. Pdf's, #' cdf's, quantile functions and random number generators are #' covered comprehensively. The coverage of expected shortfall is #' more patchy but a large collection of distributions, including #' functions for expected shortfall, is provided by #' \insertCite{VaRES2013;textual}{cvar}. #' \insertCite{PerformanceAnalytics2018;textual}{cvar} and #' \insertCite{actuarJSS2008;textual}{cvar} provide packages #' covering comprehensively various aspects of risk measurement, #' including some functions for expected shortfall. #' #' Package \pkg{cvar} is a small package with, essentially, two main #' functions --- \code{ES} for computing the expected shortfall #' and \code{VaR} for Value at Risk. The user specifies the #' distribution by supplying one of the functions that define a #' continuous distribution---currently this can be a quantile #' function (qf), cumulative distribution function (cdf) or #' probability density function (pdf). Virtually any continuous #' distribution can be specified. #' #' The functions are vectorised over the parameters of the #' distributions, making bulk computations more convenient, for #' example for forecasting or model evaluation. #' #' The name of this package, "cvar", comes from \emph{Conditional #' Value at Risk} (CVaR), which is an alternative term for #' expected shortfall. #' #' We chose to use the standard names \code{ES} and \code{VaR}, #' despite the possibility for name clashes with same named #' functions in other packages, rather than invent possibly #' difficult to remember alternatives. Just call the functions as #' \code{cvar::ES} and \code{cvar::VaR} if necessary. #' #' Locations-scale transformations can be specified separately #' from the other distribution parameters. This is useful when #' such parameters are not provided directly by the distribution #' at hand. The use of these parameters often leads to more #' efficient computations and better numerical accuracy even if #' the distribution has its own parameters for this purpose. Some #' of the examples for \code{VaR} and \code{ES} illustrate this #' for the Gaussian distribution. #' #' Since VaR is a quantile, functions computing it for a given #' distribution are convenience functions. \code{VaR} exported by #' \pkg{cvar} could be attractive in certain workflows because of #' its vectorised distribution parameters, the location-scale #' transformation, and the possibility to compute it from cdf's #' when quantile functions are not available. #' #' Some support for GARCH models is provided, as well. It is #' currently under development, see \code{\link{predict.garch1c1}} #' for current functionality. #' #' In practice, we may need to compute VaR associated with data. The distribution comes #' from fitting a model. In the simplest case, we fit a distribution to the data, #' assuming that the sample is i.i.d. For example, a normal distribution \eqn{N(\mu, #' \sigma^2)} can be fitted using the sample mean and sample variance as estimates of the #' unknown parameters \eqn{\mu} and \eqn{\sigma^2}, see section \sQuote{Examples}. For other #' common distributions there are specialised functions to fit their parameters and if #' not, general optimisation routines can be used. More soffisticated models may be used, #' even time series models such as GARCH and mixture autoregressive models. #' #' @references #' \insertAllCited{} #' #' @seealso #' \code{\link{ES}}, #' \code{\link{VaR}} #' #' @examples #' ## see the examples for ES(), VaR(), predict.garch1c1() #' NULL .onLoad <- function(lib, pkg){ Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames") invisible(NULL) } cvar/NEWS.md0000644000176200001440000000447214330704765012323 0ustar liggesusers# cvar 0.5 (CRAN) * made `ES` generic (`VaR` was already generic). * moved `fGarch` from Imports to Suggests. * renamed argument `x` of `VaR` and `ES` to `p_loss`. `p_loss` seems more expressive and suggests that it relates to the losses, usually small numbers like `0.05`. Other suitable names like `alpha`, `p`, and `prob`, are commonly used as arguments to other functions that might be used as argument `dist` and make them mmore difficult to pass via the `...` arguments. For now, an warning is issued if `x` is used as a named argument in a call (e.g. `VaR(dist, x = 0.05)`) with the intend to turn that in an error in the next release of the package. This change should not be noticed by most users since it is much more natural not to name this argument and use something like `VaR(dist, 0.05)`. * moved `fGarch` from Imports to Suggests. # cvar 0.4.1 (CRAN) * when the input was numeric, `ES()` was not handling the level `x` properly (fixes issue #2, reported by Marius Bommert). * changed the JSS reference to use the new-style doi. * fixed a bug in the tests, in v0.4-0, that was causing faiure of the tests on travis, despite all checks on CRAN passing with OK. `devtools::test()` was failing too, but only on the first run in a session, details in the git commit. * set up GHA. # cvar 0.4-0 (CRAN) * fix tests to pass with the changed R random generator. * some new examples and minor documentation changes. # cvar 0.3-0 (CRAN) * now `\VignetteIndexEntry` in `Guide_cvar.Rnw` is plain text. * added experimental support for GARCH models - currently GARCH(1,1) (the API may change). * now the first argument of `VaR()` and `ES()` can be a numeric vector. This is useful, e.g., for computing VaR by simulation. * bugfix: in `VaR_cdf()` and `VaR_qf()`, the code for the `if/else` clauses had been wrongly swappped. # cvar 0.2-0 (CRAN) * suggest 'covr'. * setup for travisCI and Coveralls. * more tests. * corrected \VignetteIndexEntry in the vignette --- I used the vignette for Rdpack as a template but didn't change this entry, which resulted in the vignette appearing with a puzzling title on CRAN and other sites.! * added author@R in DESCRIPTION. * added experimental web site (docs/) # cvar 0.1-1 (CRAN) * added a doi to DESCRIPTION. # cvar 0.1-0 * first public release. cvar/MD50000644000176200001440000000302514330710446011517 0ustar liggesusers24eced12792c1b13caf5d9effbff02b1 *DESCRIPTION b0545f51806f58edf48ebda4ca295c50 *NAMESPACE 48cdda522be879807a2c579f5171c503 *NEWS.md 97a2fcafa7b92107143c144349aa82aa *R/VaR.R 5e895ee09b3f99bd12e7316851aa3192 *R/cvar-package.R a482cf2ed19a01118ed37639a6aef47e *R/garch.R 3fe35053c9c29f4e865ff8756136b42f *README.md ac4fbf496c435f90fafe07d19b5cf69b *build/partial.rdb 95e94bfb82e40a71d6cd33388b3acf9c *build/vignette.rds 2a87d8dae0626a5d81eeee24dd1f9a72 *inst/REFERENCES.bib c06deb911fae19138395ca4f79cc026b *inst/doc/Guide_cvar.R d714972828cc5fdcb5cfb0d8543c210e *inst/doc/Guide_cvar.Rnw 79436a37dfc24aeb9fff37dc8d252ae7 *inst/doc/Guide_cvar.pdf d869bfe71414189d4a07746103761dac *man/ES.Rd 9a27fb266a6e471b3d161ebaa3265284 *man/GarchModel.Rd 6378f3023b8242a12842b64627babf99 *man/VaR.Rd fd6a0b95012581d75acda800aa0bfd9a *man/cvar-package.Rd 6e604659f91a96169483194ecc101a2b *man/predict.garch1c1.Rd 41d5c1f841b5e53d6456c2c8c926e240 *man/sim_garch1c1.Rd 32e67ae25ca51c0a429ccd166a1bfef7 *tests/testthat.R 58140e1d8933e014abc7ab5d481b9111 *tests/testthat/a.RDS 17bfcf5140c800a7cf57b6bc07e96019 *tests/testthat/a_before_6.0.RDS cf640ab785180cfce3d4ea1524be4494 *tests/testthat/a_pred.RDS 6c50b97c3d91d256f30aa902eb813362 *tests/testthat/a_pred_before_6.0.RDS c7776039446c3b0bbeed1ad29910c3a2 *tests/testthat/test-VaR.R 2d588c9ad8807c0bf8954c6e98cbc8ed *tests/testthat/test-garch.R d714972828cc5fdcb5cfb0d8543c210e *vignettes/Guide_cvar.Rnw 905dd4a699da274ebc7f9f3f290fd70c *vignettes/REFERENCES.bib 14b361d4dbff27d5f2b5cf86782e6c84 *vignettes/auto/Guide_cvar.el cvar/inst/0000755000176200001440000000000014330705053012162 5ustar liggesuserscvar/inst/REFERENCES.bib0000644000176200001440000000231614127262070014264 0ustar liggesusers@article{acerbi2002expected, title={Expected shortfall: a natural coherent alternative to value at risk}, author={Acerbi, Carlo and Tasche, Dirk}, journal={Economic notes}, volume={31}, number={2}, pages={379--388}, year={2002}, doi = {10.1111/1468-0300.00091}, url = {https://arxiv.org/pdf/cond-mat/0105191.pdf}, } @Manual{PerformanceAnalytics2018, title = {PerformanceAnalytics: Econometric Tools for Performance and Risk Analysis}, author = {Brian G. Peterson and Peter Carl}, year = {2018}, note = {R package version 1.5.2}, url = {https://CRAN.R-project.org/package=PerformanceAnalytics}, } @Manual{VaRES2013, title = {VaRES: Computes value at risk and expected shortfall for over 100 parametric distributions}, author = {Saralees Nadarajah and Stephen Chan and Emmanuel Afuecheta}, year = {2013}, note = {R package version 1.0}, url = {https://CRAN.R-project.org/package=VaRES}, } @Article{actuarJSS2008, title = {actuar: An R Package for Actuarial Science}, author = {Christophe Dutang and Vincent Goulet and Mathieu Pigeon}, journal = {Journal of Statistical Software}, year = {2008}, volume = {25}, number = {7}, pages = {38}, doi = {10.18637/jss.v025.i07}, } cvar/inst/doc/0000755000176200001440000000000014330705053012727 5ustar liggesuserscvar/inst/doc/Guide_cvar.Rnw0000644000176200001440000003272614330671606015507 0ustar liggesusers% preamble taken from the vignette in package strucchange % \documentclass[nojss,article]{jss} \usepackage[T1]{fontenc} %\usepackage{a4wide} \usepackage[left=2cm,right=2cm,bottom=15mm]{geometry} \usepackage{graphicx,color,alltt} \usepackage[authoryear,round,longnamesfirst]{natbib} \usepackage{hyperref} \usepackage{amsmath, amsfonts} % \usepackage{Sweave} %\definecolor{Red}{rgb}{0.7,0,0} %\definecolor{Blue}{rgb}{0,0,0.8} %\definecolor{hellgrau}{rgb}{0.55,0.55,0.55} %\newcommand{\E}{\mbox{$\mathsf{E}$}} %\newcommand{\VAR}{\mbox{$\mathsf{VAR}$}} %\newcommand{\COV}{\mbox{$\mathsf{COV}$}} %\newcommand{\p}{\mbox{$\mathsf{P}$}} %\newcommand{\email}[1]{\href{mailto:#1}{\normalfont\texttt{#1}}} %\newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} %\setlength{\parskip}{0.5ex plus0.1ex minus0.1ex} %\setlength{\parindent}{0em} % %\bibpunct{(}{)}{;}{a}{}{,} % %\newcommand{\ui}{\underline{i}} %\newcommand{\oi}{\overline{\imath}} %\RequirePackage{color} %\definecolor{Red}{rgb}{0.5,0,0} %\definecolor{Blue}{rgb}{0,0,0.5} %\definecolor{hellgrau}{rgb}{0.55,0.55,0.55} % %\hypersetup{% %hyperindex,% %colorlinks,% %linktocpage,% %plainpages=false,% %linkcolor=Blue,% %citecolor=Blue,% %urlcolor=Red,% %pdfstartview=Fit,% %pdfview={XYZ null null null}% %} % SweaveOpts{engine=R,eps=FALSE} %\VignetteIndexEntry{Brief guide to R package cvar} %\VignetteDepends{cvar} %\VignetteKeywords{expected shortfall, ES, CVaR, VaR, value at risk} %\VignettePackage{cvar} <>= library(cvar) pd <- packageDescription("cvar") @ \newcommand{\VaR}[2][\alpha]{\text{VaR}_{#1}(#2)} \newcommand{\ES}[2][\alpha]{\text{ES}_{#1}(#2)} \title{Brief guide to R package \pkg{cvar}} \author{Georgi N. Boshnakov \\ University of Manchester } \Plainauthor{Georgi N. Boshnakov} \Address{ Georgi N. Boshnakov\\ School of Mathematics\\ The University of Manchester\\ Oxford Road, Manchester M13 9PL, UK\\ URL: \url{http://www.maths.manchester.ac.uk/~gb/} } %\date{} %\maketitle \Abstract{ Package \pkg{cvar} is a small package with, essentially, two functions --- \code{ES()} for computing the expected shortfall and \code{VaR()} for Value at Risk. The user specifies the distribution by supplying one of the functions that define a continuous distribution---currently this can be a quantile function (qf), cumulative distribution function (cdf) or probability density function (pdf). Virtually any continuous distribution can be specified. This vignette is part of package \pkg{cvar}, version~\Sexpr{pd$Version}. %$ } \Keywords{expected shortfall, ES, CVaR, VaR, value at risk} \Plainkeywords{expected shortfall, ES, CVaR, VaR, value at risk} \begin{document} \section{Introduction} \label{sec:introduction} There is a huge number of functions for computations with distributions in core R and in contributed packages. Pdf's, cdf's, quantile functions and random number generators are covered comprehensively. The coverage of expected shortfall is more patchy but a large collection of distributions, including functions for expected shortfall, is provided by \citet{VaRES2013}. \citet{PerformanceAnalytics2018} and \citet{actuarJSS2008} provide packages covering comprehensively various aspects of risk measurement, including some functions for expected shortfall. Package \pkg{cvar} is a small package with, essentially two functions --- \code{ES} for computing the expected shortfall and \code{VaR} for Value at Risk. The user specifies the distribution by supplying one of the functions that define a continuous distribution---currently this can be a quantile function (qf), cumulative distribution function (cdf) or probability density function (pdf). Virtually any continuous distribution can be specified. The computations are done directly from the definitions, see e.g. \citet{acerbi2002expected}. The functions are vectorised over the parameters of the distributions, making bulk computations more convenient, for example for forecasting or model evaluation. The name of this package, "cvar", comes from \emph{Conditional Value at Risk} (CVaR), which is an alternative term for expected shortfall. We chose to use the standard names \code{ES} and \code{VaR}, despite the possibility for name clashes with same named functions in other packages, rather than invent possibly difficult to remember alternatives. Just call the functions as \code{cvar::ES} and \code{cvar::VaR} if necessary. Locations-scale transformations can be specified separately from the other distribution parameters. This is useful when such parameters are not provided directly by the distribution at hand. The use of these parameters often leads to more efficient computations and better numerical accuracy even if the distribution has its own parameters for this purpose. Some of the examples for \code{VaR} and \code{ES} illustrate this for the Gaussian distribution. Since VaR is a quantile, functions computing it for a given distribution are convenience functions. \code{VaR} exported by \pkg{cvar} could be attractive in certain workflows because of its vectorised distribution parameters, the location-scale transformation and the possibility to compute it from cdf's when quantile functions are not available. \section{Value at Risk and Expected Shortfall} %To avoid confusion, we give the mathematical definitions here. We use the traditional definition of VaR as the negated lower quantile. More specifically, let $Y$ be the variable of interes, such as return on a financial asset. Suppose that it is modelled as a random variable with distribution function $F^{Y}(y)$. Then VaR is defined as% \footnote{Beware that a definition without negation is also used in both the literature and in the R packages.} \begin{equation*} \VaR{Y} = - q_{\alpha}^{Y} . \end{equation*} where $q_{\alpha}^{Y}$ is the lower $\alpha$-quantile of $Y$, i.e. we have \begin{equation*} \alpha = F(q_{\alpha}^{Y}) = P(Y \le q_{\alpha}^{Y}) . \end{equation*} Typical values for $\alpha$ are $0.05$ and $0.01$. Equivalently, we could write\footnote{This equation shows why some authors use the ``big numbers'', e.g. 0.95 and 0.99, in the notation for the VaR.} \begin{equation*} \VaR{Y} = q_{1-\alpha}^{-Y} . \end{equation*} The expected shortfall is the (partial) expectation of $\VaR{Y}$: \begin{equation*} \ES{Y} = \frac{1}{\alpha}\int_{0}^{\alpha}\VaR[\gamma]{Y} d\gamma . \end{equation*} Suppose now that $Y$ is obtained from another random variable, $X$, by a linear transformation: \begin{equation*} Y = a + bX \end{equation*} When this is the case, there is a simple relation between the VaR's and ES's of $Y$ and $X$: \begin{align*} \VaR{Y} &= -a + b \VaR{X} \\ \ES{Y} &= -a + b \ES{X} \end{align*} In practice, $X$ is often chosen to be standardised but this is not necessary. Note also that if a bunch of VaR's and ES's are needed, say for normally distributed variables, this can be computed very efficiently using this property. \section{VaR} \label{sec:var} Here we compute the VaR associated with a standard normal r.v. The three variants are equivalent since 0.05 and \code{"qf"} are default for the last two arguments. <<>>= cvar::VaR(qnorm, p_loss = 0.05, dist.type = "qf") cvar::VaR(qnorm, p_loss = 0.05) cvar::VaR(qnorm) @ \code{x} can be a vector: <<>>= cvar::VaR(qnorm, p_loss = c(0.01, 0.05)) @ Let's set some more realistic values for the parameters of the normal distribution. Suppose that the daily returns on some stock have sample mean $0.006408553$ and sample variance $0.0004018977$. Then $N(0.006408553, 0.0004018977)$ can be taken as normal distribution fitted to the data. <<>>= muA <- 0.006408553 sigma2A <- 0.0004018977 @ This computes VaR using the fitted normal distribution: <<>>= res1 <- cvar::VaR(qnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A)) @ For the normal disribution we could also use the intercept-slope arguments, since the parameters are precisely the intercept and the slope: <<>>= res2 <- cvar::VaR(qnorm, p_loss = 0.05, intercept = muA, slope = sqrt(sigma2A)) abs((res2 - res1)) # 0, intercept/slope equivalent to mean/sd @ If we compute VaR using the cdf, the intercept-slope method has some numerical advantage: <<>>= ## with cdf the precision depends on solving an equation res1a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A)) res2a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A)) abs((res1a - res2)) # 3.287939e-09 abs((res2a - res2)) # 5.331195e-11, intercept/slope better numerically @ Of course, it is almost always better to use the quantile function when it is available. We can use smaller tollerance to improve the precision (the value \verb+.Machine$double.eps^0.75+ = \Sexpr{.Machine$double.eps^0.75} is probably excessive): <<>>= ## as above, but increase the precision, this is probably excessive res1b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A), tol = .Machine$double.eps^0.75) res2b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A), tol = .Machine$double.eps^0.75) abs((res1b - res2)) # 6.938894e-18 # both within machine precision abs((res2b - res2)) # 1.040834e-16 @ The relative precision is also good. <<>>= abs((res1b - res2)/res2) # 2.6119e-16 # both within machine precision abs((res2b - res2)/res2) # 3.91785e-15 @ For examples with vectorised distribution parameters we use data from \pkg{PerformanceAnalytics}. Compute means and variances of the variables in a data frame and store them in vectors: <<>>= ## if(require("PerformanceAnalytics")){ data(edhec, package = "PerformanceAnalytics") mu <- apply(edhec, 2, mean) sigma2 <- apply(edhec, 2, var) musigma2 <- cbind(mu, sigma2) @ We compute VaR using \code{PerformanceAnalytics::VaR}: <<>>= ## analogous calc. with PerformanceAnalytics::VaR vPA <- apply(musigma2, 1, function(x) PerformanceAnalytics::VaR(p = .95, method = "gaussian", invert = FALSE, mu = x[1], sigma = x[2], weights = 1)) @ The results below compare to the value, \code{vPA}, obtained here. The computations below are similar to the previous example but the distribution parameters are vectors. The first pair of results are numerically the same: <<>>= vAz1 <- cvar::VaR(qnorm, p_loss = 0.05, mean = mu, sd = sqrt(sigma2)) vAz2 <- cvar::VaR(qnorm, p_loss = 0.05, intercept = mu, slope = sqrt(sigma2)) max(abs((vPA - vAz1))) # 5.551115e-17 max(abs((vPA - vAz2))) # "" @ Computing VaR from cdf shows some advantage for the location-scale method: <<>>= vAz1a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2)) vAz2a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2)) max(abs((vPA - vAz1a))) # 3.287941e-09 max(abs((vPA - vAz2a))) # 1.465251e-10, intercept/slope better @ The advantage remains for smaller tolerance: <<>>= vAz1b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2), tol = .Machine$double.eps^0.75) vAz2b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2), tol = .Machine$double.eps^0.75) max(abs((vPA - vAz1b))) # 4.374869e-13 max(abs((vPA - vAz2b))) # 3.330669e-16 @ \section{Expected shortfall} \label{sec:expected-shortfall} \code{ES} has essentially the same arguments as \code{VaR}. The examples below are obtained almost literally by replacing the calls to \code{VaR} with \code{ES()} ones. Here we compute the VaR associated with a standard normal r.v. The three variants are equivalent since 0.5 and \code{"qf"} are default for the last two arguments. <<>>= cvar::ES(qnorm, p_loss = 0.05, dist.type = "qf") cvar::ES(qnorm, p_loss = 0.05) cvar::ES(qnorm) @ \code{x} can be a vector: <<>>= cvar::ES(qnorm, p_loss = c(0.01, 0.05)) @ Let's set some more realistic values for the parameters of the normal distribution: <<>>= muA <- 0.006408553 sigma2A <- 0.0004018977 @ This demonstrates the use of \code{intercept} and \code{slope}. These arguments use the linear transformation property discussed in the theoretical section. For the normal disribution the parameters are precisely the intercept and the slope: <<>>= res1 <- cvar::ES(qnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A)) res2 <- cvar::ES(qnorm, p_loss = 0.05, intercept = muA, slope = sqrt(sigma2A)) abs((res2 - res1)) @ If we compute ES using the cdf, the intercept slope method has some numerical advantage: <<>>= ## with cdf the precision depends on solving an equation res1a <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A)) res2a <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A)) abs((res1a - res2)) # abs((res2a - res2)) # intercept/slope better numerically @ We can use smaller tollerance to improve the precision (the value \verb+.Machine$double.eps^0.75+ = \Sexpr{.Machine$double.eps^0.75} is probably excessive): <<>>= ## as above, but increase the precision, this is probably excessive res1b <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A), tol = .Machine$double.eps^0.75) res2b <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A), tol = .Machine$double.eps^0.75) abs((res1b - res2)) abs((res2b - res2)) @ The relative precision is also good. <<>>= abs((res1b - res2)/res2) abs((res2b - res2)/res2) @ \newpage{} \bibliography{REFERENCES} \end{document} cvar/inst/doc/Guide_cvar.R0000644000176200001440000001607314330705053015131 0ustar liggesusers### R code from vignette source 'Guide_cvar.Rnw' ################################################### ### code chunk number 1: Guide_cvar.Rnw:57-59 ################################################### library(cvar) pd <- packageDescription("cvar") ################################################### ### code chunk number 2: Guide_cvar.Rnw:205-208 ################################################### cvar::VaR(qnorm, p_loss = 0.05, dist.type = "qf") cvar::VaR(qnorm, p_loss = 0.05) cvar::VaR(qnorm) ################################################### ### code chunk number 3: Guide_cvar.Rnw:212-213 ################################################### cvar::VaR(qnorm, p_loss = c(0.01, 0.05)) ################################################### ### code chunk number 4: Guide_cvar.Rnw:220-222 ################################################### muA <- 0.006408553 sigma2A <- 0.0004018977 ################################################### ### code chunk number 5: Guide_cvar.Rnw:225-226 ################################################### res1 <- cvar::VaR(qnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A)) ################################################### ### code chunk number 6: Guide_cvar.Rnw:231-233 ################################################### res2 <- cvar::VaR(qnorm, p_loss = 0.05, intercept = muA, slope = sqrt(sigma2A)) abs((res2 - res1)) # 0, intercept/slope equivalent to mean/sd ################################################### ### code chunk number 7: Guide_cvar.Rnw:237-244 ################################################### ## with cdf the precision depends on solving an equation res1a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A)) res2a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A)) abs((res1a - res2)) # 3.287939e-09 abs((res2a - res2)) # 5.331195e-11, intercept/slope better numerically ################################################### ### code chunk number 8: Guide_cvar.Rnw:250-257 ################################################### ## as above, but increase the precision, this is probably excessive res1b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A), tol = .Machine$double.eps^0.75) res2b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A), tol = .Machine$double.eps^0.75) abs((res1b - res2)) # 6.938894e-18 # both within machine precision abs((res2b - res2)) # 1.040834e-16 ################################################### ### code chunk number 9: Guide_cvar.Rnw:261-263 ################################################### abs((res1b - res2)/res2) # 2.6119e-16 # both within machine precision abs((res2b - res2)/res2) # 3.91785e-15 ################################################### ### code chunk number 10: Guide_cvar.Rnw:272-277 ################################################### ## if(require("PerformanceAnalytics")){ data(edhec, package = "PerformanceAnalytics") mu <- apply(edhec, 2, mean) sigma2 <- apply(edhec, 2, var) musigma2 <- cbind(mu, sigma2) ################################################### ### code chunk number 11: Guide_cvar.Rnw:281-285 ################################################### ## analogous calc. with PerformanceAnalytics::VaR vPA <- apply(musigma2, 1, function(x) PerformanceAnalytics::VaR(p = .95, method = "gaussian", invert = FALSE, mu = x[1], sigma = x[2], weights = 1)) ################################################### ### code chunk number 12: Guide_cvar.Rnw:291-295 ################################################### vAz1 <- cvar::VaR(qnorm, p_loss = 0.05, mean = mu, sd = sqrt(sigma2)) vAz2 <- cvar::VaR(qnorm, p_loss = 0.05, intercept = mu, slope = sqrt(sigma2)) max(abs((vPA - vAz1))) # 5.551115e-17 max(abs((vPA - vAz2))) # "" ################################################### ### code chunk number 13: Guide_cvar.Rnw:299-305 ################################################### vAz1a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2)) vAz2a <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2)) max(abs((vPA - vAz1a))) # 3.287941e-09 max(abs((vPA - vAz2a))) # 1.465251e-10, intercept/slope better ################################################### ### code chunk number 14: Guide_cvar.Rnw:309-317 ################################################### vAz1b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", mean = mu, sd = sqrt(sigma2), tol = .Machine$double.eps^0.75) vAz2b <- cvar::VaR(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = mu, slope = sqrt(sigma2), tol = .Machine$double.eps^0.75) max(abs((vPA - vAz1b))) # 4.374869e-13 max(abs((vPA - vAz2b))) # 3.330669e-16 ################################################### ### code chunk number 15: Guide_cvar.Rnw:329-332 ################################################### cvar::ES(qnorm, p_loss = 0.05, dist.type = "qf") cvar::ES(qnorm, p_loss = 0.05) cvar::ES(qnorm) ################################################### ### code chunk number 16: Guide_cvar.Rnw:336-337 ################################################### cvar::ES(qnorm, p_loss = c(0.01, 0.05)) ################################################### ### code chunk number 17: Guide_cvar.Rnw:341-343 ################################################### muA <- 0.006408553 sigma2A <- 0.0004018977 ################################################### ### code chunk number 18: Guide_cvar.Rnw:349-352 ################################################### res1 <- cvar::ES(qnorm, p_loss = 0.05, mean = muA, sd = sqrt(sigma2A)) res2 <- cvar::ES(qnorm, p_loss = 0.05, intercept = muA, slope = sqrt(sigma2A)) abs((res2 - res1)) ################################################### ### code chunk number 19: Guide_cvar.Rnw:356-363 ################################################### ## with cdf the precision depends on solving an equation res1a <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A)) res2a <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A)) abs((res1a - res2)) # abs((res2a - res2)) # intercept/slope better numerically ################################################### ### code chunk number 20: Guide_cvar.Rnw:368-375 ################################################### ## as above, but increase the precision, this is probably excessive res1b <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", mean = muA, sd = sqrt(sigma2A), tol = .Machine$double.eps^0.75) res2b <- cvar::ES(pnorm, p_loss = 0.05, dist.type = "cdf", intercept = muA, slope = sqrt(sigma2A), tol = .Machine$double.eps^0.75) abs((res1b - res2)) abs((res2b - res2)) ################################################### ### code chunk number 21: Guide_cvar.Rnw:379-381 ################################################### abs((res1b - res2)/res2) abs((res2b - res2)/res2) cvar/inst/doc/Guide_cvar.pdf0000644000176200001440000057510314330705053015505 0ustar liggesusers%PDF-1.5 % 30 0 obj << /Length 3449 /Filter /FlateDecode >> stream xڝZ[s~̚%@6ifR>l@KZݙ+P&q!sp.>(=ǫT]/E53ebMfwTլURWn9<65,#V,+{|f[.>7д:/̓t[|bw+K cY{\5,`aPrר:LGwLh6 6+o͌&6@_߸~ࢷo 7AE]n=a워e`l.}( ͲB!ݰXʅR,; ~NfJ67+_oQң.{M$!y  ܃j o,(AEh`%}>`J5h Lj).'T!ݾ)^&cp ?ic5́pKĞ[X;{pK} 8sAGT\UCR{#iRM*ɳXd"0-k EqG#s]QX)c7X^oh5$6IZ?K-i=rx{_q&Zئ#6SQq) Xl]5q it07ΰ}xj9lHR2xF^ g~ܫȐϒU L*V%s/qB^Qfvc{ހvH[ 0MR 4R[.iڹxMw_keEY؏Aw3Dv8MNƙdT|{su41Ab4X7c XTq$}~AFZZFcRjoX)>HgidyJ"$u;G.f9։(Pg*0e%.ޑ9;SAJhdL&iBiH)I츁 И6 ,=-ƥ&a@4%qM>e禯[.ىL4y!%ǧsr6h4Wwj\=>$[I;Ee^. =D̴}u:-hD 3`QINf2;E7ES164.gsQ]_(3XVG~Vi5?A7vzo!rP63Ԧ ~;;W.d2\#ŝ2gJ*t.%t23|k5I8q=}l)یW+ŅVS r~8%dv~TQ]JG -/B5gW_3tI"tNFT* lZ )RQ5M:}2F[ְN,G?k E{dSil 93~>`yMȠ'ʹ11G$I Gc8­GWy~$~*^ :Pț8 aMd6;5`cx!i+(|G6齅N#ф4HYSǀх8|~F<13B&2ŸVLok۽r AL|#*솵/XC41-5xoߒ7$N:4ʟe1_<#a#4`+Ef1e᡾D`| -^ S;~NTB]#b(˱BP`a!GHk>>1ք LX""p%<+/69=hZs"۰q{ry?~ʚvŸ*V f7p~AX̀O\34#^$.b<:}D Ȏ}LW\E5i@A2/2U 9ɛ1^8 hz2k,ZILy.EV+O ,مu{}( gbczy+OE9P҄ېa>,|kri{]MxK+Eh/h%6(nU(AԖ+)qW{(TI /'Y 6|ntՀ)wqo6\A;AƳǭ:腑#g >v&ݨK]/P͋牸L̍T!"n d8Ƹ)ǙA>8Kb<pwi>t#c^$˙3{2`,(9X,&|QOL͋”qazhK@c4OӷCipZðC4\|j N9^'FW*W L)h"Yɋ(ι؈y0>=Al> ,`:'SNŬIeGe63%TeM7ʥS0$.Xi^ R?Kȕ7G8Mj}RwgJ [,ߒTr(lL"Z+9;C6L`2;a;nC82ĩ=kqrSd4\pGXS9'* wa}vƧ^ϴ~MȵisLKVBE> stream xZo8/kjO*P4n[[NMTJyqmQ,p(RҐALv fJJVjvBeQNֳsx{/| ]0z p?GVx~&g0pmjHAh8c(EY}HDUJ™0Rh*7ɬ\6,*@ U=nGې9ln"1B @EKʬ&PyJ؂(@y4&x_ZB\Q@[F1ɫ~؋ҕZrim@@,kza}SetB Xs&͖Ra 6tcK:85 >Ɇ]VQ2 y'+?}xxFTS4&2l;/V.TS/Rc P[@l@&-V -=~v_ 8vP7YtMvtL1k=Xt J 徇= 6Ibc`@::{0# ZGOEV1]t vuQXC.{ٍB>zP(#dt!m7%Tۯ,c8~Q}O >(*,T2/ۘ7Z@1_O7 A"N@6 詨PS,H !*=j QmH&|fZ} (8rZ&?$SZsvٚdiU.m+`l 4w iL[sPf7' ՘[ X {5 +sYןL<}ƧiwG@FʹD4 puu%lwDz'YG>\R %3f̀!~˩F`bɝ8V+ŜX_3zg#Tʕ"8tM M&PPb EAϮ{ul|٦,=MYWN v:Ww}2PckNu`(B?ҁqj55Zd3qodz5(6qH|cj3*jOUe1:ojC~k޼ШCfG#J6qHhׄX>Ntz\쵱Yu/ f};.i ogrDP3`{Wݤ0^"gn!i6cظ\u9^B=O?;I8l 1pe iLLoKục ` P{G +\UKYN\gkjzNBQOñ ޞ~t1n1ބ[d AnHZ:B[*)k"x)>sE}(*Q)5:cm0 Vmn\Qx!}A}(}#8|Zī ߋ8dZZdElۤrBmܣ]Mv1w܄Qz=ۛD+ lKAriiJkZˌa|Ǧ3"i%T+R xY]<1di bOq`lݍ}0>O4nh@ WAMxՅ@~t`e^l*o(^ %hU?Cnt!ls}5MhsQw_s7u{_8SҌ, J4 t_a;4gwI9<; sǤW8 z/z,n#o(܌&oJIbzD} ,*`ßl٬'}gF~g4تJ?`ϊ!'kzX0մ-fb[LUT3i)LJD BR>2^TEa9uSآ^e=CG!|MAQbpXªn..ma<<lᬟFi5YJAE`K"L:HpIlPxn/exx1_ǐGU=+ꌒXK?Jm8IXϗ3:s7;.L36ݗKDZ7ؐ!cgqa h3C/< ӝk h}E^ "THoKm1X sq=ȈON*O endstream endobj 66 0 obj << /Length 1771 /Filter /FlateDecode >> stream xn6=_a&cB.:`b]= Jb4\KNυeI]ELb O@0"y#0NU4Hdaf& {8KdUnkB1}tAևĄژt)S=ȮR.s^ -ȍZt;۸n0)16D1i,$fOM(mE&Qs;;mg_eEeEI'{B]pq9MMx$SHp $g6n..az{1LU?'cwqin,6 H*AY5W:۰U * rKoZo} &lh( z@bu1ݦ NB9ͪgW](,TF/W#Z](A@7ZQη ف)o~E:&:NZmv:]A[UW-Ȱep ALny(EIm.=4*-*f5s4_="Q]Ѩّs.FU=.%xت BY^g+Fh5r;S%=?o]سM E* D +fb(E2 il\(h3%O+m,BbCrQYdZxw ⯉k@c1NԌ} s5/6=Ȋ7^9ǽhe퓹JB/-~@&[~L6O RcKLXI |p$Nؑ hv bmo]eL#>$|.Q,8 |d=iիC{VCb5"Ix| vc;(ӂ=ran*cv򿟬w QAk:%.R)Weq09\R2os¤] ^2α^sz :f#JQ\=FtB-u_'ifZ(M7엤G`,7((޻kI)6y[0]+2min`ig݁eC,W.=;޴{/V];5[f3if?+92̎koS_oQigK@1g nc4YDzGw=<;C|D> endstream endobj 70 0 obj << /Length 1558 /Filter /FlateDecode >> stream xYo6_a/6+D}ۀvh {(2{hAem??N>AZ"ywG,׋/ID &A:a0p0LfC9z?&"JyYj|4}oï|p^ z[%F^48 aBIX x0 0-aKv(ݤ=e%J}~aU ޏƁ㫣gOs4%Ԋ5r:OV#_y;0bKAOF ?Q)̯z*j o8Ah~֖j;7pͣ$;+s'$tݚXwg!ItPgL?R#']k lt@1.-6YtlW,G9kW'lHH߈|>hGsP"oF3lvt3te2EUgmG@鞄$Z*SWG0 =sXXkC6ԗzLf4Fހ/ȥ2CMznȄ"9 R&ڭl7qY22Se+M2 x o0ik(vQ>H3hR HۢleV 3@Rڞ܆ѐK^ӧfΤ!V1.^}<2X4aNpw3'S6^ZxeȒ#/ _04Y##HM[j,~C=^-8w,,c@ˇ"YFɆhƂNYjn+E $5oFBVz=)GUš˧uи^jD0( - Bw.ab7 ^vCa^4M5Z1󃪛C|ju (2w-]dacm/@e!]?T{'K2fSI^siG՘,Z~@H).*`ӌiJޓkYWH'}f.},9pWzbI>PYe pأJo #Ԕ &F1 ;@:WDnqW"vQvEoOu:Sb׌oX\ w\1 R:|+N~ YΔz5uG h:u:=PW "DgsU8eeu =H+R$tI˓eK71ްY9jۡxm,{ c~_uJq>[ o6$t[- '; "]-\N^.!oEN3, %%`bm6!h70ނtwK604Y̪47Ӹun*6}<1וggfݗhȎ m@F'y])]%7d o{tщN@du}Xr[eſP( endstream endobj 74 0 obj << /Length 1348 /Filter /FlateDecode >> stream xko6{~ M(lV 0lu(v0J,Iww<2mZEMiމs!ɸ!˘sI:CBy #3 Vr9$MʃJ|E JJe_U&_t Yi?yRTL ]hhw P[)gwQbNmʉl0*.m up<7_PJϐA;[Ro!\1!]v_CoUS\r{'3aq 's&$$ lל#a]3g ʴ 0M8i+{uYRƣrxO$JXXqu"ji{#%Tq$-LYށ޺,|t%rٵ֙+ PEϭq4"OR C,aR0يUuv;I=kRmCH%a]0'rŃ|t ž^7{#|Zpy6ɸsUPX@BGٱc9Ol]ͫ鎅|M{;h?m{G ؅Ij S~fϠ[{yB3Wo"X:@6:5qn{I4p7R\KGO*CmX}'~&S²N~D;ߌMvc;a9' 3tz9c[? O5+NعGb#Q?qL0;h!"vdӇaВu=-5Wb6W}lTG}p=ӺuF j>-p'F,|6=v] endstream endobj 79 0 obj << /Length 1397 /Filter /FlateDecode >> stream xYK6d$֊/=@)Kc 4-dYeW7_g(Q."I{EQÙ7Oq NjkGy` T%DEiE6L&f?]^gOR<1|,fµd*WxZ L5儧ŪBAy>Y$SN P^ĴMLynԗI0*ʒnHEm'1jm~AhH򰽡 i[&rQs+Ȫ3Jqd <(j ,@%Kl`cFkE*cnI4*.J6 ,n+cG{D`EGG=%h4֒F1S&"%`n?$;L֠HibUZ+;1PI,6^li )yx=$h޳! .udan~NܮG϶> stream xWKoFW=Q7zp@PZ& Kqo"ƎC$Y\%29?x6?8z|e2C'w"y2_$V֓1:}#kglWi3Yz?svɹ>`cɚ!QV5N )M25NKc/xPWہءS-!#B'e+:|LZlK<٪}tVh)544$>23NڧUcЁ*]1q`Yk1."Ϊ z[W-j4.SlXbuG#;kqGҍ: t&sZ00cl&Sesцg}ܷ(M{(2+ -&~vQcRXzԹOM5!`L&ܼD; +u+vGÓT%=-<K+ lWޓ!59"HDҷp2cW6:OO(̧gyr46@3*Br8)ymenxK=;nZcaSL]Q)Vf14H78vaqf4:CF؇ gr E:=V4(*!n'QYgh5 lU?5Z(ձ%ʦHTҴKe 4 9rew)8JJv)attM u#C 8 <{1v=oKRO3!ؿtI4ٷ:o9>r.#z*(@r#:.p{ bH8Btp%?SY.?8cV 9sѻ-{b*f+Zs&vNm3:*VIEߴII}/ߴ1@H Tgt@}pVR"ۋn.۾@>| x[wܡV_E&:(;g%Y`E]6Ⱗn7eb;G:dr\`MտcZb;5W"8^^3q>滨~N endstream endobj 110 0 obj << /Length1 1951 /Length2 13065 /Length3 0 /Length 14264 /Filter /FlateDecode >> stream xڍT[.; `pww>.Bpwww w .\|9kݻf~v=vw+ %lxr"L&&V&&rrU5o1: dg/QGLN b `f0s0s01XΑ f 21dlNv s e@eB ` lt䌜-6+YTL@@g Agl`d`h.@Mp9[N@GW)y#_ *vfnF@duzp5:H쁶e@6f@ ?LLll=@35 !L05dmdngF a%;98읝@Pd#{mMEllN'r݃񯝵slM abϨf rpJm.BGft311qr0U=*3z̀NF@ ߊFS3hE'h~|G;@Ls^vڲj1NDIgag03/~a@/_i[3;_پ2vjǒ{Z &ebg2y0?.G[$\TSl@7ٽ65"v֦['l>¶)"I4U9X+1k-P ǡgfb_2z?8O}n{Iq[;?`h>@?[`kx' 0sDc?9BF7Q?(b0JA\Lb0*TAqsA1A﹘Lߋ??jh/-_=  ;2=)3?۹8+{*߉X gk/N>>vlO3G^??+qԜ=#_߳qv;w.@wsxjRGSC佃H݁&Kv&?g4R=]P`gm8 'S -x4+>{6UkEX(8I^UhK S< E1Oҽghwψ˦#"t}gs3pH` h/?͠gO"xFzjoD=}YPeq%!E9L^,)_ \苛KU1?l'YWIɄ<3D,t @%Nܔ\ã Rj⬶nU,5g%pJQ)gl 1KCFfCnњ.',^AHF-"ͬP{[=a:Wz_9lиK՛Γ9T# koۨ hrG(jvWQHGugCFR45rEuʕjs0?cZ+"_` Vb%NH>T5a** .8kltMכdg40 "ţXKj6$w<,#^⿧M]SQ{6C -וT2!jb iw`|Zd/ֶة*]'mظh&99b!m"%ZHnCOwm)X~2-ɐDeA:QhnD|1)cؐ;% 0!\ #SpMk^bU1[---5Bif߈ VÅ yەbc] Z:y߀R7pqϕ;ljBFAӇsR؆DrLKyXih[/lΙ0Y4ѩyzΗ䐌bI#z^ YS2\P?8%1A|h>imc?c|k:o/p7Խ_ru":<L!3ݻOSn g>呅#}xv% !S$dƼ"C):NIY;(Fl [0H!@y aVZ5 ; io[}Z0vpxFQՓ 9no,439hr m^<m$֛rh.toi=j: %iM8>@%{$e"ZB(%vC#eS 1n:.Wd-EGrnW_S5rV ݰa`l[=?mސ/ #LT}I.x* 4uexef!sY$+T1bxꚡ-Ge+3s` ^:8 z5NH.^ѝ-@Oba 2VfN@WTrb+}XUq:=OOa*\@lG.MwvF`H}b[괭7[ c(3qQ5l-;^H]c=vo0$URY^N@ȁe!>V q,S ɯ1mDUX_<)ƞ6U5Zoe"1;gY-A׼of=֍ל,y>}z{b؄!IYpJI^ PJ@W?# o^/su(ƚ4?eY\ӉjϻRf`8۞#>褐gUȾC5}f%cu]ia,JVùT!ɣJP^jB"Ɨzߚb 0Ɋaafhc^E~SyDqt?O.,ai{vsBKF:}ggٽ,*]&3 <&0I^ne0KEuMb%kW3:m4HMUe-,4[KwJfSWc#UMh9% Y9PYz@M"/6"ۀ]Kc= I %-KƹOֹp(m'.Zv!HSY#;xJ% 0OzppՉC%yi}][h'4ݸZs P~Df-p&2A7O_ĕ"!/?GQH: fT}=:a#Eōf]\fJCC`~JU뫢Q fb.)kA'#LJ`JA6|PȽ㥚6S0%6T(MgxDf: L͟%z2m9s~fY334H%`  lV4{U>b4ETo ~_<~Ŏ!;C%F5 wO{53Uu:K<)WҸ[}ڇ-eSkcfp]f_;X§07NɁq^Nv#6+5MY&byD#4'?LB[V|ѹ/IcH;/> 'Ѹũ$j 45:S(y&Ҕa|%Uo Kڿ@fVyF Z? CWc~; ,;";:,';=HJ?0M+-[|.h;Ci;q%XE/IzDf&I0 |onojjS7h*!Vީ%%>e<2S⠈M-@ }mԤR(XӋSP]vَ0χ~! O"?OaX oeđ}XTJjD`G~~Ir"^ TwJ-= cAL!'_\#ܺQA.+oM~"tYpqur{kT01I-:+ sep[)ܹNCe k %q8Z8Jc@-a}@\dka?!޽Cw&:ĽRq\lOR8+. p?_Խwgg .6\%59#sA 7!$!| ~=-ode5KR症Gg/9 EAyT]IN %}kL6vJsu4.*&Y \s‰/!ϮiEYGI5$4^-/< 4ʃҗϢt3 JcLՋlt"rϦG;EY/Y-b0B*ㅀOk4i;6h57%v[2r/Ggc}єѸ5A9yENT~<@"s{s":n7 ל/[Az3Ylp!y V|  2vo sRdw)Xɶ1Oc_9L'Ek,YMGzA`E74}zPEH) hճGaቫ]^DJ(EyOwc:ݻ@8 ѥc5/ SUP^OD y(e,H{1cD[`QO#ʱ L ,>H*dΨ\/%4,K{TBDCkCj3 hԅιUq(2)uf]$Q~Sb0HHPe(+Vh|㺝"HpY! V,xh&0eꙜ(Ec_THAOW8e5^d^H?8pչ y\gX6@sbm+7혠 l~ utx7OPhrEheU4>PAEnG>y4z.xe% r̾HVT8yS4zFVv)hTfHf _ݧqse nHjDN9h Cw'fu#[t4bMӿ1|jI 7],i6FțL8nn@ WzןܭG 6bBfȐmݜ\,cwmO*GCYh>'ϔ`\(3?2ޙ5}l !hɝraKHjՑ&.\S fik2X$٭̴{d.RҗFMr}6&09`2WB/ovgw%4GE^{Chə B8b`J2˟ÒCȌfQ%to *> Y[f$b vC%;EǀEAǫ+A6L x?MzD"Gߍ0w8k2Xm:CisБb+8jWecܑC+~QXG2L"w=3 Ncn}/ׄZpZc'>M*}7AQj@j*a=JA-}[A<%,6gktƗ%'trȻ lܙsɣZx'є)޼)WY%GwojXb N;Gܰ?V1HQ(g*a/U_ޢZv0}~n]~~! _)ٽoe68B;);}IjZ\ FV$ !r[_snՖV {$ +BS3o((m!iK.NxXZ/I4{boU d}n* ,!] (<5yѮivP%brWi<=Q 1] Qz~\5 .`BFϤu5NW+eq^= PQP*&o `#κfJQŢSn<͏6pQhl:z[IP(ڇZr$]$Xv'8>\'M|]V;K,M/ 7@R15jnc'Ep]{um*lr )$uo߶bw^ 2XUwn*e~{ξ/IT2Wߠ3'FXj.{&)z r{sW:LrBM:}>FAS쇖F$o$^ԗ:H B˛u=vC8SۣYc,,g~V<fE/3y ?U\kl+WP#f R+Wd+`VbBem1"j i! ~`o{=xC$-bdUZRSBEO*z MM8s,HALJ RQgE<ӕ(qf{ZFkq_JLNbVxlR:wTtzd[{]UBv'rѴ[g8aws* 3zi N+M{^MDhU|RmQ5.d\]ƍvG{?_ʟYf jHk_v0ڄla2gUX+B?n h0я>c7M5)xݒ4Fw@Si'axV~*RNI2#-' 껭7Tl:7NiScBP@EO"cT{NR/caikkJz9>._)RxҍG'TFg9:Dx]aׂn {l=,V(1yVg#jt(HVhzva8 ?&M^dcehRo2^mFVkU}^=5$gm B_<}\dFC-{l-6Nj1W\G}ƫ?z[1Gݍ&Ы dzt6pvXhF1H~($~X!|cD~c9pYw.16&tWUYSqTz@B=_Ry#7)Ñ?S[w-!cV1_e#DK!ȿWzxxJLS~EIuah ޝicf7E|"V{.M蠹Y8«!8K:4XĦz: ;ٖ/U3NǟmtԞl8]_bJ'9鞺 zy/xcd l}\ק4zdqxoMb_x{{BVYpC 1EƮES(YK{dnCq@w_( &rD%{]DsL&-zog1$SzJ4-_=]0u.Ewܱ=xF2&p2lŚ)<?B7՗"S`S@NY0}S YTc>v0KGb $I}SV韇,\eܸ<YDuP̈́'VPkvo9hTQl~󻚾&a$ FQcܭ*0|' $Zz$d欯lUѰE})5'+&.-hD&Bٌ#BFS:Tt?g>0vre2va61ǚ`'E])+ yr8cAV0rmx҃^85gϳR,<2_VwǦ[L<%ۊYa1]Ϧ'MV^V,<8,QFe<>upehu,O6H$񻧬t@x:Lx@i/GyUxurc7FӞ-rqBg9L`Ѻ;^? 咨މS".FfPWW6>/ MG2]v*^`kv6Jy*ElcCK;Zkշ6extI+."mR|C$͵zUCvC2)^Ah|Է鸞7~t'^Gh|+ M'"[bQK  b}'Rc,&eo=li3BCfvYeûxz~Pħ&Vʧw0 !zee3ύ<[u~yiںKZgHrwj5xQGcF0U IyúBd3ŃHXǢi^MBz-EsPwW֭7u{r^8;TNiG*6p:lFyI|*@= 2Z>!:49/]Ǜ4%SL%S}j-)E1Z55tV'<0Hܡ |Y_A7j͉f^s.7Aw/67!\!)@&: lHgO5 oTq|۰To.ÄiIg+dg`Fx{Krv,?h:vlTXx{V:3ʊijk̜ ϥL횘PS" Un#^0ڲ󢒠gTL_"N5*/iGlWa/G}ŠJ|d~Cfmc=qV3jAaTDjU߇PxgXc히4YZ8$|o6ݴ 8l:`"`bMK.`wGԋf6;JUnǾMnB$fq\.НLˏYH`C-f҄`ߋaeT;ti~-Bvy3"ShN(icV4!;yse( g5c& 4놐' iw seXag疅:Nmi{a*[Qh{׸0K襌h|?(z;PUH¾1Zf_S6(J:aV>7jJ'ʃcU9د S@#Q!W"*퓲(83N[94XdQS|(RFyEQcG):bxs"Z}pѡbN e'9pt2{6HTX KG7H7LE 򗒜n:suw`)r}61Z6Qn]]Zװ7 P^^B9$hQIiŵ X716B󑿏ww,h=-qrOF6Y܌*v,H{Y;A~SZ~yηR6n\TV]$% ѭM"[hj?L<8[tMP"oo`ɵŖ·6TR] 5쇳)@cd ?c, !ENYO4'` 0U#p-^BQ*M{jd2>^#(r /LL.%N&dm˝x@ez,)Y w}cޣ0̩l&bD'2H.INdNʣ=QcTVzҽtky23> stream xڍTuX]$)I霡[Z;a`!TnA@iD@F@ZJ.~qyߜ}ZAK[aUDݸA<@1y@>\ff=#. C#n}`[:Pqw !1E"byPArgo$v6;$**; E `8@fuv" 0JIع9zzz\yH[)v.'u"=ր_c4Nпe\"l%<~Ht75\|jwXbU͝o]ĒnmK_y,=Nr6Dn@d8C~<R ѱFe&CxZŭԎ^>/3aKΪR)BTCQV1l٬\4Cc0izA׻gS{'b/ݥ%cx 1v' }J"{O*f?ђy#s'D7>\KURÇ Os5>͑!,3~ Hu 0UTH9TGs]ݽ^'A\wsy8lD>}TΗeec&pڕ ܥJM۷'}w`qy_iKTxf4-_FݜW,N-TB+~-#sF*bC}&=, jPhfL8+-g)tF7G]| ["7Y\\F:60qX2=2wgQ? W:-?AXe܆]t?ך!^LɩellDS!lzm.T; ;UIu7؈BᶌiDD6)!b4*O`&kdBZxզD:;mEu፝@7(}f MWշt}Fb7Ն5%QZ6cȑg "Dz(SgXDQ"X `yi1 HfYƚI~̡A.]\BKxYqWZY_+x@2F6"C+=Я1Ul!ld|v{8~AT?asQUk6\͵7+쥼 ~6!kR,"Lhޛ%AXoJ׮giFҼIk+cjUh -#i(JԃH[{" X&?Ćjੀ2+^#;Um\Og?I[P0pZ|o] k:Yk8Eȇv>oB<>hݒ +1Yڑ@p׈Equ|-Ǣ9qrq EεFpv{¡Th{%2lꐣiO;obӖ3u5ƥppKs/h{C (\%}ǻ~xxĖ5ȨcHwbF'& }KbsMt*n{ŧQ=A=y{mVﭚ9QsÏJ1奞+tHFt76SI3ζ[3'Aꑂ^{@Ξ5 <׭z&r{֘i2h43+CkqmbJ3lI+1qw͆;*=Èd0w0u!4\/Q+źӯvL.wuӧ 1rZP#DBXG"52sP,2B~~v^gTΫN)خjYzRz{yOCHZQwb5K[ƅKץGJ>Y'X%aܸXJ31#ERz043UpCea uLfi[7VoB#ov@S63i\j% 2-CXe(yW{SK[, K=,<Ҵ|P+ŸrJER_")xUIic]=8\Pz5o>aں2(}r}jhg~8bX[A^>:G@[3mO6ͷ09mt KկEXSv֊f;Zzrf$Gdu ht$7hi^&,qJ+cʷ*+/&QCJ82&4k+G/prtUP.,adE߅)3.aУNBx3z2JVJFKV7*Omh Jn.S#*}Ç#S=· f0=ԀFrc:)yV߫+@t]p.я#Y4mKQyHQxFsڦF' <7[`e3cZUHn]a{^gAzrjB"o*puQ39ӽvSu +byXv)a1I/@UYh7mFYm#i$W&Q)ϕO 1z3 "tUQFoGeo/E'(I} 1Y)~I9 ~*HRKE~{AMǟwZY~9RS؎~eVo5$ӣR_ M 4ZʖcOXW)S _!{$,N#JmV |/VkNք%|66kP[#h aB+;z8szgҥZx; JhQVaϜxc=$K1t!8ubFZ 8⹎5x'yYkb2}~k-1+$Kg!w*UbzM7Pk|6z7nK;|}9-SQױ69{w<.)`N(G&'\ea6:#sj pyܫOgp)tIt}/xgx;7zu%ߞYc0~Zo&Q#rE@}yC_Pڱ,'=(@xTUΐF]]nP~t~s7(FQ.{0P_b6nA[7[QkΦx֤e@6a H n8!FudeyLK;KZh`XX\?UWQkYu$V(;FM!|'!SF_"gݞhnvR0o"LnQ읓F/`Zp47^v@ir]e^WY([9'd=6}Qa˟%Ŵ0ǑދAε(bFô}>-aS9|}(FLM7Q1QR;dICs^ZyϞiquzdJ͵wUPcŐ^ΐwWS=0]t e`u":Mgg")#&~0\; [űX^.n恒Y6nǤIai %D(%wW]Ztޯe IbEMK޻\gF 3 ux%{Qٽ.Â\k9jS![Wui7+4&H%1g_E3KFv~ͽצs%b+IijINBorLpu9N+E++ s}YĊ;KH{^jƑt(>0iT'9;U\"ڟB\_ xP&Fw,h'r"4lϹP3a`W3@ &ߍalnRIKyr"{A'N&][_M C&Ъ'1u̗@''ϻi6%&ѹ'1r8uej5¡ݥ^b^EL!f& x O̓7N*X yibM'6Yd%Q'jr^Dxy Ou_2MT|"6.ۊL63Tzc'"۸uzrJ^3Qɵo)!ӕ` qot3wȨ-\ߙ wME50o+~ -LbS sZ;-z"enT@ihwթ3+gOa2h޽p3=V'ڇί} LݣRJV.v󀪓,+wHh}Rä-/fZ;ߍ; P%|(ZU Q8'>Ky Ph{/\!F͍l1w'E7\vbcQ&5 7)~U9Qu%&CqyQ-m`گn٧f˺9/_X]x(ߐ^KuiSP{0 &O*m-!~1 ˡ.lҁ6m1閗@n<]2߅ TS> stream xڍuT۶5U:ҋ {{WB B"Mt(]@@@T)i/zg4!R.3/  FXCxaCP 0xu\$W?ѿ#p7@CW_@X e#; (K kF_i׬"a({@"01f7L[k" E$%$0O,ˌ!8bǀaR@aAtD ps#Hk9u>z2 D{fV準FSEE%@RRD`F#XH/ x(\H,ua3(`@gWݑo?_vA`@⿡½۫c堌prE½4~0! q1~i ".A_> 7]0~YRAB MD\F5cO H(7B$pDHTƮA^n`_xPX&Ͽ sHlu7}Gs[d bP?)2xk/N3{Wy>]`vZbZ`^7ڨ!;L2K +*tȝb⸆d!9>y|&AIeө*SW̷Xiގlfe.O';z\i*ڜ]p3@_GljTU2vUHMٰ⯾;7T:DZb8}(%[5 EmJK&2/SY# &+9'yGR@՚WkÀG|>_S$Ep3PevOǯVm\ڷ4Dz60e'[eʥV*Y%JΧ.$ʨY[vyW,rGj㓮wT#ǧ9U Ӷ}T}5\!wkzĕ njODo3lp[dzE~7|Er#1 Gg{?h_.{kS+g9!w)\L5" /2e!&~b3I|Gʼx]0l&E^滋,#od)9%x5TTeQur"|!F=c[x%ĸqC&76)f 4oДap ȝgPLOw6u`IKy$b@L)-'I Xsֳccx`M.nHS{Vzw7ʰ#%avzgMdX7kmr!CWAY!%? yKUkܛOӳxcXnӹus8`a S0ORW2@XWZw~x36w2Uqi@WbQEE)}9pT%*u&MSY"vevo}j݉ ԲwX;[]c|f 8߾ɽ`OqH*p-*V%C>g7FVv_)2WD0z: OϽ/v);ŏU0k%k"wO2kFu$WgRRgMdmVۈ|ùE),+YРǏP3vgF4||Fw}7&ܐmcp@hmbz4*BWz/Y+AȜ<:/NV3}JVI^(?zG=Fn 25$O=&7($ܢ%^(7$n]Qpj,{=uĦ ;.+EaL軪;ۂ) &:Pr-3 ' Մ([vݰ|_nld"3[ƑҒZ{~0,}-/^ `͇ >j2>,h gxc]\(ILGcBpf%1=Pio(_wjfRjߜF: 81ƻ1y E 3Yfl ݲ+Vr~u!WynQJw ~l!{F"M|sV֌չ]e};t9^oY *DVbv*ݜħ=^ծϙDVϕf%bnr'EʨO?b"%8ebk~^;QUv+?;%uX`q3HHgY FڳScH@jlΎDxXXW |C%KZ9Ǯpgߜ~ |a'.9F& T[o5/ qMTڒuwX(+1'89no;>xky]R2N-G17PV 3lhY^V> ~yN7xMsķPKrhx%.`5|4#q)kQϖg|`]Np6m͊B#S$d~̓e24V."[j6a,qL@6kI,9ʩ#M? 7vg=e貥^ Meٚm9| b|dҠDBV1Ty"uݬ]2;\KkԵw|%?]H;yipqa-6r\/厼NJ1x:kZHLO O96_\q8|e ʬ1:4~.={}*c3ܗv-aE='4[ibdxqJ`vpveo7 >5;֫.i5kmtCmw~[F k;]E-վ7vg_ y:3f$ ߓiT%h}$ w'=_s@cd'K[*~aT'J cgQ Q߳GT! C.*XSZ3}[4$ft[oo]\{J/T2f"$7ƸQezǶ O2J9<}Y zϷ'oP$Kt,BġطMjg5Hʐvk7 oحi.jo9HIf$ŠDsMS]FuMۇK_;zi:nen3qHPۙ=ڂ#'ǧش~*og̨?=V9}eeEN/xp%v7}ѵ77g4⫥fKNk4CJJœuژ+ßOL[~ }r/ApcQ7.1XT4KN)K @W*ʂRS.s#2X3N=Q&6+n75:EL~Ts^RڝG2SIn;O"f(هQfO9H#҃jH &7 [Ž19 +waG+in* PR uVQ }繼LlR:+ωQTBJhnY3H\t'&9~Ԗ֋ӴǪV'pדB[t/WH0RF3 W,i aǘ 砥.WU}QZZfyUMMFvAIXӰ%$|C)=aُ>jw>F3-Е6e܉q7YqR@"a}'dGF~XWF%cjŽ8L U2g#P|[!y9'5f]Ol}{u]K jJ&/Iq~#gnBvGc!{, ,}5VYY9K#Fۻp%dk{;b̋#2yuVOM [X1lPuc]RI_;feޏL_ߖ6_qaEB*N8k$ԙ ^tGPd"15Q ^a:& b7 _Atf7u5{QnY’ RL&ܷjdQάKץeWP&(<# 7ŽΎ.mȹ1WВ 2*{KMAލ͙ ߡ9Hǂ)?I:Z~nb!6l#}dITR8$cT^ m/Z`rEڧ˪u Mzv6_ូ~'[~_zڽ۫34yBbМftaQ2]~Y$~t2h(D0<ثh)'N ljBAnLj;?:6FLrJOmh|Lvޏ܍G1ݦGNrrLYxΛ!n6G䂩WT^ȧFD0o 105&P-*ˉ;^/0;U3&{s{͋:Pe4@sMi%e9\9?<ʌAquU^ҿ. ~p;'ՎXGLb#IoCtX&ի+-e~6OȾ=CP|pZ(K-vIB;Dk; vp:]JӐ{ v!Mb] |`=C41ޣ9/y O59VQiTHKʚ,cOk^]O]`2 (-X.Ui:2'(kqQKPb@3p;_.f}5v_vb- "*w-QMnts5ŧʠ>Ӟ8X5fS⪯Vᡚve (Oݠ%nT E'۪ΟZa >w7PلtSA@D嶛Z/𥬪5Qr%7%VU.e]d6EڔHoa }JRWzID1i&RPu\_12bO*zW&" Qq56eL0 UDfsК(c}"ؿ+넷w iPVqR6>[y)XOci%cQai R:܈ֻXGDc\ endstream endobj 116 0 obj << /Length1 1595 /Length2 8924 /Length3 0 /Length 9983 /Filter /FlateDecode >> stream xڍT5LK)NZKqh%`Zݭ[qP(RZG_Z߷V=ssg/uإ  K b`@۱A.00I?. &?!NW7/[@[P %7" zml`dp v-Nu %Iprsa f6;n @.n +@G_q`1tm?:k;x08-ANW'+ au@ r' Ws+w"@KK# vX@M5 tM: @7 h@c@P_,]P8v]#4mw8:0,;AܝF`'+eXB9ή e8&m6 8KHWr<,m9/ m~ A?X^0wqx77 l XlNXf0z7'YA4=%&4 U1?,W\3I`Ͽu?:ajsvAV`W*Á d ivn>.?`d S6~ b0eAq1a{N/= NCf5A r8~DBNЃg/pЃ9P- ؇k?":i/p "~<zA..CqW@ Kih]]`E4;A!h)_~l%^'+sVLa]EczO3vZMZGS ^Tϧ[ ehDJ\^RGtcJZ0{HR Ԯ]SFJ%Cj1B"cLjqXFsUKxjOC{"T EЫnrJv҉,v˗/4l׎vL1%v ښ'ZGr". $2.Vs!(̓ 04Rbj{ U٩WcLlwk> Qnm/j YI3}Ϙ x^ ڶJ ⺁S8y!;;eg#"yWܜ,j#e+g+&j"JD#7H6vWx`G[ʹ4ȱVHW'~ HXn~W;tZD`~?6 D[ 4ȭ6ot+ ɐW'k>i0Ju}L=qMS ևx)ןDk(`+>&]z5'yrjTC̝^JLq<םf'd ћ #5ee. `q́ VMo X[ůW,rHHq܋R_EEE<7`Lc' \9;?s֔GIuQ;q#N/Kp7~"59 x tXw<>\f5#F8K qć9K/nP2xFA㻦N<ÂS#^NK.Z?eW!{Mr2d~N%f"D_m,bE,0hQ5SVMee(Y R^j{IU:ᄵ&ҜRK({*jS_cղ/*3~=:bG*!?e_[̰[-"o0N/,cpD54q70p ~< 6TmP"Z4(qK5sp #+?S@$w}TEFqf-ἜKUS믤Yp5gdP}cT dWQPӑbT-[_v1?bZKZe58:)$3C*粪&M&.cW"iwT\b YpJ풝kk ߄Q$}c3#U{)8驆lՆWWY$<uC^ovt}YrBGGϚ—>Qlͪ%ŲJVQojK3bNFI|^,40[r@fWowQ鰡JrH``OKO/y:0=jϥE9Ћ%&/w`!%oE.2дaMįQڂnhc# o{ 8'&iQÎGtkn'= Tǫ)gv2V[AUni7:ߺA\p 28~7Rj*xY_Bt܍[o#!)S1gJ;2q,w?ˮHEC =>wI7(P˴cJqʭΜGʹGpYĨA9yo3ёRXƽp%mO4iXr+08i(byՔc޽^)5!\L%oe1RY?SPͼj % e JQHKO yQ+K z.gi"[?FؿQWы;(6}uF+Sb2B fC#.L<8Uľ]|\6zA\:𻱣=7u-Fc6*>[C傌.sM\k n+m.VOcSUՙ_eGվn5@=OۣI0͘#$ 95T0S/G[ tHB-qau|NhoQbܔ|( ^4OZx 1RKꦘhñw]/(XzD)փ u-~,tU7wt$vJz8-4PWfl~7U0"!'UݖqcR_$D$Qڜ}9P?%Z}}[^Aa(f͎탵H%9SWB5{S#m-i ӛLxNVeQ߻uE"EI\KSO6osD:M)Ex:$,I^<amùsRpY'%_s{-m'B2Fsc> )2AG? 4L&]9[P?+nJ 1+,͚$(ۼccq_q ~ ;Qf& .o*%Tqo7d *D^~?E?!`i;u?}I 0(zsx%2T(ŽT /sƉi.O$)xi4m9qvܿ^tu&uzOܝS0Eij٣GV^|0$$۶@^E[8n5fM xK[V=m?e؇7Oa _Nw3m!Ƿ:4,9#Hri#fpEm>j&T˃4r:G(Қ9LUֵ LQ9|jZQ^䁑P7-]K7+&| iB*U6TV&w%bD|%v<$d+MDUO+Y2N>?6J=#yBh=½*eFc=qX1=&oPNFzy,.wؕ zBX( WBIxDT;.);>s,4pɇwU}r!$HqRyK"서>qӭA_ =bQ>x`sږa)op ![6i%U)Y n9+q~L:0d멺p *ft%MQy!.Km1m5  W: gKY >U㦅 IyCm+t 9'R:W*'JƏ)H|'$Ę}L 3n e'9]~SYl3)]Sڻ.G\b5K<*d&fqk5,FT7۷!A(cp}gUohoSOu 4i8pZOc۝4K_ ɚ9uEmߋ6nYS'4׃}FW2mz|?Tj`ѝ˨8g-~#a;oRzgTla"jKq+Ue\&fK݅'3 д7/Rݪ%<얃d$NfT#xxҠ0gf9R"XpRUpLdRx׶x  ㈟`Л!t]IBOh;ZlU{r-YHŽᑔl \D\5 abmHy,1 G)}soz  ןH ^UkjX`:c./ M/$-(†Bu͋5p]M`_|? / [s+mTIMCNF"hGSTۻnu|sѭp>RK`10 ОX)+lT AVEj!"W@V"ڔ,$7uS"\wTLxw9xۧ29U;[hO{O!tq-Gصs$XF0'JwxCm7ڼ9]{̵^O3KlbA?K'K7- X 'Q_Rc+K~VP/]:b ]BvBCƷ(lSCZ ˳AOy'g;XWO[.خu{CF=3fB)%C&dsKy } "[tCDJ"Id CR$zXDBxL=vU/Y8SgÆ-NMԴX.T6KI8g!e1wU|> !f}BI+J ^¸RQ I-?c-(=xqEG:(EjYVը \fXYeRkjq2bX(n6oWc ōV8\MϡTdTW}1dga%&1b6[iڧ/Q ̳95Zڐ+Hb~yQ2o1j=Ms]2i]_pɠ ~괙鞶-C$%Mqud}/}N4%0|Yp^)leX30)|VASMRh:`4j5 =vOyHi鉅 +aoI5 c==/jhn}bTQ@,`dJ> }ڻQ:1MdOnNi߱x=~f.1w5oŀ Lg.N! =r P`;,∵MN#Vƒ bu;DYP4'Z[iܟMGHwImޒG= QN}}y؏wʕU.v-v"{(&H{&ӗ/\[IVN;uUtmk=ZfoO[udҦt8ig}Hi:jА=pќ#~OW.I)'$xhԵ(YE1ll׋!֭0]0j7H(_4*C۔fܶ Lw*pI%O4TCȘ̎,, JઐYy͉#U[q~s?Kb[L67AÈA#tԉɵʫ,3 g?>-YC7mSͧVG,Z@뾑nM0PMŸyDn&}:R iMUo:Gv*|a**ڙh3L"E5XE1# ,G ";~ߤ:,Aԫbijz$[Cq՛T'I&*5hRTh9Fx9|Sysɻ~jTe8DqgHpJ:BU]hcf' ̓P " WUiD>Z!!)I(_- PU"yv~ÊrN0K[1yWRv^^KiD7˫u> bn\OGoG#HvZP; ?/_pM<6ؐPcT7!+E9&9dzJsXфc+ML Rϻ(^P>y6i[5ի+z[=cN:5 9 #"RC /6V;*WL$H; ɗ~ $HsY5o9$ޏ>mTэJ)]/5>,k~z x_yscG.TKqjv LeHYG{[@jbK p+q2=e0*:_s iQktshV-^'b]op:L!55JK]3œG5 X&D6s%.IO+^0,/>p}c扤lيwJ _O틳hzWӧr G+ wX̔Qz]:7$Gw+1B行eG~qݘ]rgUvSh2JVb^JczIJЀ+̈y1?&wLZʣKe N!(eN5t)ä<~3O b;{c?GBqI<*;F0Vka8jVvU C'#^Z'?._,yrͣ2z8vP0N! E09$#pH 7\YDTYre_2 ¾|X0xW:wo?MP<\9%"ߊ5mc%bCH uuo2Zgۣ* $1KctBߍ>Jfn]QgY~k6Uvd^:)7|1uN KW篩a1%JDtE]!B˸ #䃌U&"՟tn"Ce!W)j[AuJOJqX@z87ss3WYP^Rᘾʰ5?[~Tat;b{C7. -~Պ4ti>L<-_Iο~&z/9u'uQX52J=n/wᇖΛ]8ƙ)הO%Q87U} 8?Y,2g$d==0~.{g}{ԋs!^[4l3Y̘8¸pk+՞}$ sZFYxEPL"'x^ɽȢB #/&[8r.Rm>Yc)-E7}J Ǻ ݢi֧oOؿ~&hƖޱ ij>f\g8&N1XX}d+iXIēu,p;6}&a?ⰣLV~l!XUXF!nE ݂ *Ӛ5݉/J+RYpW\T.OHp-HUb2o MH^k*,tƳK7EmX/.s{> stream xڍT4])ZW`^wA1`F^$ZtEBѣAtNu9gs}XxdQVp%*"$ #0`BC+B7+b P BnX @ *(@ր/Bф,(g/WͿ; sd h@1vp'0#!``<<Z 5?*(vdX5yApZ F``v475k$\Fz\Q s> h0ha~_/֡ ?DBW ;px( 6 ؠ\ ](g maut|P'??bkl]?p'F85WWx|I>6kNiWXx6V4V2oԔs9ΘY_%xs_iU>GDp&ыhE7ݐmc!zV:ƒnjhfCSEa:9E]{.JEh'I)j '=ʉ;{fH蚣U݃V3aHŻh grgoX)ɓid3RvĿߡ4=g7O{bpcN<;T@҉%X$)s16ZbVI7Dx0|ϲͦ:4v%{~zQe0އYq6RN{epgF{^rCp$"s&eIA[x=MaD=9-F/z-]HK`hE{o)G)%*1V qYpBrg~FJGߑ|aMc(s8 >B >37rnҕɔ/9Ȋg$_GCB3nEw|oI:2LXQhµd a!" v"Eg9YKY);JfcNhNƪZ㏀H=;C ETQ>Ds-S:$4)A>~`3ǜ5ec,)ȴ&8V#TbEM!3Q(A48swC K]vA >b$1QTNvxϴRϬd2pp؎)glJ=%Y"Xwf9Ӽ;ՍwXzrv1c7CJ˟ 456{!D$7֙zt0.MnR0s,SlkLO@țEA~5ՇN+yirlWcdQg?p*'r;ȥe% >ppE*m,|U)ǂ D"ۯCx2|>ꬶ3.>ќO` 躙?/Ess_n@67uǂtжQg" Y;A۞ԫC('?OvIE[b56{u9h2ި`Rw9afu'&%pԆ.ŭ+D`k#(D}Ąc)Ĭ`r>-}Df."8 ^FG->WY4{NbɇUbn4 nfKk Oy7-d|T)ܦNczImihEje ;fUXWը)xPx>xjA'];\S=:ԯ2!/Jbzu=+'"U_ 역BAt\bow ^.|Wh{swnC F݅?.Rx/PM'ܔq&DŽ8OoM(Kby%3!bs jA*qr_ B{LKg%sL&sVFr_fےG_ \[|pwKo$x|kkƋ3Ch}a`4yҽ\yWCm7HYVsbY]qx#|qLV W_Z.ѓ UǗK ؍Ŷ`[$ŴƔق_K0&$W$ʕaV=LeJ^x "m9ȿGBAHS~^LkyB9A=C Q6[}n)̪2ǯ ?3=+S؄+I8MEPm֬|pFv#KyYa~G)*}=lF֟p>ӝor3dKr0:̝x4^Ya'5 ,6'5e &NK&_=4VHYg8x'xky]mV̈́\͙ =U~n{ jw9+f^$Ǵş(!Q:#lp,Q5&{|>bhTH,S>]@HGza|uۣdǽ TѨ4fc?\ދf@v^Fuܻ[u_pЁGf3h34 8ƀA>J͘ 6܌gu_p5N /`{#q2u;޼1-X9%gzqIXĕt}ٴ<×254ғ85.!BEbp0Xh})gK\F#DMRq.aJSnjRלg p<7l+("3 l -} |]]}wqAvBP뭚 Qibd_oI1=v$įP oF(܅2mr*[,*jƣlx8{;*T^ڲCLoI Ϯ`NvV-&/OOk lx#Jz/ sX&fs_6O~a{pmGa:kxxJB< i#L~da!PrV-Ж,˱(|&p~m חGUEb8Z!w9(;n :\i~V^ŀmMM+/p$L8{W;zN#6oE O0z>[ՙTwe(A'-.ek}ygnN[{bGsR87,1QO8S~Ai44P&-ᙯ\NJEƲ{_/[q;/^ERjrPb"؃WZ3j>^ɡגl:[`_0 Br@ C nƦKĘW\kVٻ{+<'#sK /xk_ppEUg7%͉ҠZޓnu5@&٠{U MG1rP}Ttve׸wݭ;It<>Vͳc/\i]CWT,rDA tӕA(fgR pK54]˔p?YZ+VnGp"|&2BX<?㔈ȻȴG/!SJRL84##}<σumj90_?ʣc,3Fh%64LcX}9uuHfkb8e旇̆T7])~K J-OTxS1,\_1h4-?xCO{\Fo$Am>N8UaO#O3|^߽9[U:0]s2 %>D ZSYY,yQ!rla71#0߰Q~&YAEbA&bji)OF'&e&2`TDڐY}s@G[,JO0b*֭Qj_+z]=ΖCeTF:* z0.H'7Z dMޯN@>f>9j7c1vM'd.tI9 \(vsz~y{?Mrs>1a${H11׊4RzEA6\:,.qo'9}WڃH0>/R&m =Ljk9Gkñ#i 9O(Mܳ>QNq/ndBt Nd=H5}ɈM)W?""L>J9jp Y*Jכ5Ĭn75QM Y^-%7đ|7kP"V_H3A|{CZ9Qp!IZGnv}QDllB`:KIv4;3~v[OUV{L$?S#kd=z6hy(TғxNM._ W'K}ɏc̴:-Kק\)Yk,MG8~iuO+P-&jV'4 u!/:B CYms[+OɫH+v #zⷆ[WѨ!-y8McpӬ\dpC[&?9WFUrP'q*)N!JKl~BHN~VQ8rEf*u/Юi<ca)[ߩ'mb-Z13y-Q6Ɗؖv^/*Õ_jBRkMaBd7q!z+H[f'ǔ(knkCl}@4"/ $qkiɵuW#9ԜmLɎ@[ܰ8NZ0p&ϾD@Ur<lS:}+^橞4HإqB`QJV2V,ɈJ?-L] U< ~"FS<'$o$rVis֟C2.OL ]45c5Hcby7Uy5/4*3l~lW=8<նϰ2UOhh./n4˻Nn 1?iEk<-VeiO/Ev1F V('\o\y˥Ja^ ̦)漬 ;*9ϼ>)ب-"[1j}S$=qRS:cy[aA²E)өi>㛸YsGDK4aBW2^ߤO4ћn:#Y#7ٝW9΅nJ2{'Yǥ=%Rb׈BSL'w Hp`)9)j̟) 왎:c.ҤDibԝ3#~D_UZD!;u?/h Fiz:Z,m/sZ]:Irpg~L 6iqjKm endstream endobj 120 0 obj << /Length1 2513 /Length2 21656 /Length3 0 /Length 23094 /Filter /FlateDecode >> stream xڌt .5m۶s66F6j4Vc6j3{oZ第5uyTEQ(`WTce3SRjXSj]e 4q$L\Av97[+;?| wks"@O)lmi ?_4fV^^nv@gk3{`f t/ +WWG>ff&;&gK!Z@ tv~ P2]<%@o3Z]@n@g(8@]VXo?2D999{Y[,me)&WOWoC[)MRPblbmD4.Kڛ;]]'a 4݋~wXXۛ[.͑Y (+ HGf tppNoz /G_JbP~> P@?k ;<++` -Ơ;[{X@ `o2wc|?:11O# {ɸA_F4+ko;[P'c7hk?Kb`^\67mwBRni&vֶ^t3ߦVhnf&CO]=*֮fVorWfkmTqpX0Ft2ztV/t9RqrLMAC!N+́-1pp=Q.No߈ ,q  `f0KAf? ,e ErQ@(A\x@Aj(kAZ(/A\L P.fA -h#-{0{cڙXK* qqr]jP3,@H@d [󷹃A ?pkhH,ZmAm/k5=0s\A/=9;T5ZZi<?R(kGЃ 9@pus?HgI@ќ\榶⿣o1!k rN :_ֺ /J_W06ן.\sCf׿^;׏ h`bSq_+J7)8GF L[hhڎ$͍ ɋIkLx[jQ^;4TA"8BF }'_rNn<*Ҟ_WTkgc4J)LA2ҡ_xΡL%ưn>|^`s%A;LY)-ZZl("AbH]cDe:dˬVos_bMP a&Օ5c9)cմEaֱvYwjZؤ~}#X<58 1ޅݏ6i ZzIZEe+wb2'<3 x)Ϻ]¢|'ge_UR<ڢA[0қiwE!0LOyqԪr拭*l&2/mΥa"YH^6L?49 TIwO'FĂCxoo+* .<"Fchp}R qQN(gJ~!Nj!3SP.+AI]8($l$QԏW(9S z,UHrfW|1u|r-ىo3;>U%-~tH*ŝMAWȖ Mцº!89L'; ˆB=BRͶw#I\`~@h~8Ŧp13WrάtpAF$ޮu lx60: _;E?šE|KTPa# aCFzECaz

jǐwQr݂].3 Yީtة5yUk7^+ gjn ۍ{p$ژzo$bŎ/b>㍧9eT39[JLW;^H?l^>Tʎ}ſ11^̤eS@|j#/%B&(/ugХkKckYݛb:[NrX=7/&8 m'"@ᇳ|L{d^XBBloqxoQ9^LWz뮬nUYSLzKle?Vd܎x:뜒kIX9Fk)ҍw?.iEm1f~1]Y&{`mwhaIs0*9s0u`juӸ6Ef@폛Z~ՋE~4X,˾EGJq\lR||-xA|m# 4Rud18֏"ʾ3*MHArHb^F8$qIP|J,դI"΁Nv;ESppj*bS>E#.s7ßID-iRqxz#S̳ic{*)`MhI3{GE~WM#+_94Tܚ(Sj|Uj玫WK_8s.|ѹ8qu-"E-鄫<ה?~"M](*2"JYG{9j> Hz~դIsf:}2B6,M|A F%"y }g 5&yୃ> kmIX(0D~$c ]_nBҥ ݍ\8db$x- D2i6#l:ZS0LgR)8vCb g6>24[L{{0 &> q|qܤ{|j82) <=ehDzՃQeIJ;)as珈뛏?$7M">Zܫxrʄbh?7J/``\~޿!O6W}Ϛ2~fƩt[(-.r 3ɒW'*^6D`K&UģW5u#^M߭vi€!mWE,zNŒ0U(O6[y~ƟHPi.o,9@w- δCx)dUᜂj~-KyUT}JT; lCUKFl8cRy .@SIMB CnUDŽ09ڞƢ+~uz3 L/M}H^J!8XɨZJyg77 ȚPH tʒHUW>xmR%Jձw9GmFZy.§~)'ߊwȤRЪ-]f`Ikk=66 4"/RL tG)˼NĒ=4EO^$l˵!S,ÔR[ q }I͂0ldL 0 ;uoPvk.!_5^Y5fp'6n} ت#kxλS;-Yv.8hrhdu8g#bUuS?=g?˺GSdM*.\}k>.ЁUj#rV׫44P4_ďL]}830biCܭob1^J-M삸O;0CweD,_>1d޼S1SOI/z=r'a#,;j4lv4΄o\f-~BqeGx݊߾TZea$!MoQnkEAX:n r`d8*-Y]1|+t.Zn!qSڭ2o}st]H/.fŜFr$ꊆxXπIfR^8f=ū7_~+6!_fbr4I9Xo3i8 J&S\Ǭ׊"[bCs/ޣ]'Ro``p kUm2`^ka-!cp's̓EzR^d$l׸dvA~Sb<}+t?ڃQ=Osw0{.i,t>5ºeQcQB-ݣ.mڇ ?%b-(U2_v Y.ф𞹶<0ٍwkʝIxR^9 H1by!͠/T&c"?s*ðwIP%M(1q[v:]>>JG"LMEqp׃^q^- ʾ@nM"ɸsLQg{Ē_ۘR%0 )B䬵ԇiP !D}hhЅw7-ŏʠDUJa]_+{%3?kGXLdI@ F}:K@%mՖtP'EDU*W ZCw3ġ~/ J-Xjtbo/;fᛖ\^_u~pHezCjfFQOlA\@E'I9Xz2z^K'=רO泄{ή=t9+r|0FetV2>fїG KoXN|[6E5kXV0NE_:\[E!vȪ|U!W. 7cDZ(e?[PG`KXj޼,E+6q n/7.֙LHꞙWq9>y_pЩd/iϙ! zk> Rn)s~)&_Pc}дL{z]yHjD\կ]$PF/j.+N`hf{2En"Hoq]H}O%jZ\:x{`9Ҵ w/N ή(c(b¢Aƈا t0K6Jm}H+;G㧵+>Ŏ3!D`֏$I> Uvΰ>5j:T5UJ" _ʙ̇~Tዐ,W#T7S/3WoEk ~#7c'~@-'IRJkp`5(.,îj?0l-N4fz W"&b_@33sjavpZ33v urTi]Eg)ޭfjOjT6wSMqq[+0r; Ƭ&ч-ILK܎wtBh4Vhq,A'9UPgݡ/%BLV~RUvk*5AFvG z1SRpw2Mvd2F: dseSd^jabeYE/t1Kmi+OL)by!r'X]6)APibgmqpc^C{[Kd$fǯsQnH fΧj{-FOD}h㵣< ]iD5j v}1 V(={?)Jj^Wq '>IXD{kG!>Tbk ,R, 8_'H(?iQS/oetj&yNDlp* DDYqZf*BT"ԝ>d9N?] Z@fE\le nᕙ? Yu\[\ 2vC頕EXT];Ypy s;OT&"JCuhUs2"QVq҃@+CCuD\wYU4I̽B`i*9(>2K> .…y1ӣ -576泾[!<ޱa8#4"lj̠ >^jFt׃>!s( ØRmfx8Lt&>GO* J9&+Hotj?zZau#f`n?.iG,83,5wQ1\!Y-QÉ*^culuXAk18 \"!܌ V9H6u0~3FW{TQ)n&j`l.3c\dĪ |(7SyNzgTK+mIWXz^Zf٢,Ƀ(K4,l!Uq bS8Ck7mqKM=xu_xΌ;8GZ^wy-.[ik}q7  fƚ32n~^@p|@YuIѲ啼@ﰂ])ߴD٪yǤ<}"Ùh_Hm JdžB&"KG͘ ]JIN*ijY )8s/GqS(+8M22i\}?,#q5ZoU,/Oi'2RwDKy˖X,"ʯ9'um&Uka'ힹn+:wn"X!#-Q5zcO9a2{ප%sB&3a_脙/j^NVHV0plI I> 0 \ ]Fb\, x|3=MI=$Uc5\"B[cQ*)ojjmH'| D!_lmD΃e l'\Qʻ O lRkIi8w.NXnNE'ʜbnDf4n?JZ<TKY?fĦ0]4su(%@,Lsi!ֽ~ZD㳜Dh ޅƴj$h1\ 堒9\ 5U\8)B&ЬD;$ J&3stAIךMkSgfrGsh$ʙ$i1 jAFknp(æCA:B۰ujc3^pvL]C]|-ooq}&~>#>ND/ܘU '3FC!=ZEQ<-y3F&{^Lt]YOj3 4쏊޳w \@ 8~ƕ_NjF3xDTNO7[tH,aTgt{ S:$%*`.9bi !@l&`Cdږ3ph&`[泥IU 8=Tj. B!؛,Eƌ{+*!!vEI8Itxw9|J%cO;2Rf1kwrhm?z.2 qӭI˔t.0`C~. uswP_eKΞP>L$m%XC0k֡㇎` @ Emm4v&q}=vJx .K3@;ކ6u{L\OSP\:|pNպ'W7BnS͸ВjMEh*Y(zHL+6 2e ~sғp4KZB`J93wcua9G–hWb~hݚQĶXtM!:N]=$[Oh [č6iyj1a^r kfqTSI&I"=;Iց)Ц29oO+I9CmQ:@X 9"jOE:rihwm%N]kfmy9 ,qw0&ڍ?Fgi#t,k=/$>3u$I7D숽1B_DF rIE g+%1ڳHLO:ybMg.YF謝%6_$!d/\~qAn*>;pmqaA5xdCh[8R\OMc /&MVd edpb7x9*:(cčĪ (XtJu@!mL@THNB>#0+{~&߯G zvq%{|VӶAܰ6o ,ko#һyGf|o@V#!xL IS-k|B S=Ylt_sSͨ=ta9>ߑvtz"p6܏Mp`ZQ}'u۫dQ\[kv:Hfb/1k[q۞Rj3|WUZ+qm }%#'僐$96 ^h (F$&#;^+>!rSW_u/A-_P _ 7EƢ d<4`>i5SP} R:{`T6eK`!K$Wx2[-rrٵ@rzE= *zDaoe%Ү%D0 $K=ska4cJ3T崥1Dȶt\*vʊdF FᖩATkHbP=Q[/Av7R uW] hhc_)Ϯ?`$US;ֆlo=HuEG=:iDACA!5t&bI"voo4a@0[ѳ%(L%=|US$ySsWWsZ竄m*l| z>ShǫDP镝"e 9I%'ԧf\Q20ry.3s6s^bҾ.@#ɡ7ݯ__vM#l0T!8ta0+L9O/e+C9nzMÊ˹8,2m5 lu)~)Qv?൤c;~NmXm$0>XVa3*s;A[9#G-qʢYjgwmIc81Md٠:& =$[jҩR 8umP"uܰ5Wd VaUH վgہ'l:6 gaC+Œꮭ8]:Kڕ=gi7fֻ(!jqe<(_-!(UQE *+G\XqwfNI Rvd~/jO̺eX+J4iX5Ke4'C"mv]U75kfVzNHNjZ E>qquM8Uurf%CCܼ7;6Odžz竧@7XTXELWO S5ݨy=jBOSPJ 4麸O8Q~XmBNyڢ!G|=Imvɽ kkB7N #uږVZ}8H1+ v`ZS\S$$om?0 0Åd旮kF {R3 q~Yu+o76iKTl}Q\S6Zjg)fzo@$ȣMQ\`NPCoB%|L K =`*zʝei9wv1 ǗiT9p꧴' $:K 5[)ʫ4\􂃻XeV[:/'0ubb3n67AIr{JE# >&ΆQznCADBK?=8 ʌ|bnT=4,AU9xM8!/볦;mqS#˙ɪpv*0k= qUVFŇ[hOBޒ~{u$~67B*'1}![E_#6e=t./q:`g չ"Vd{\ TÖ{wK2 e`U&)\f;| w.w,n ծAdHZKRs<şϦw3ˈ=Ja}{`Ô1\û#lGͰw؂LN$E= l]#O +g˓/)?>\Z҈e~]ZhVl[j*ܱ~jT֠AAB][4aLM[MA-$ "*L82`{GZc 0[={&16n?zt8ϞbBf;e܋0zCᐷc_6[*[jΉ'cꧏ۟j'O A NFDhԓW}TѰ|G95P0멺'!h\Nqmi60c\a԰{($7.h*jB|lW6ped*B֯tw,⌄L7f_'ɻ6xCU=wut:'~@?ɺ=tw)L:>&Fec]vLcMR3CRP==~AAo\RbgvU%f2L\wvWD×zH!5:.MtZ%ك'xӂc68ouM3*DĚ2NKC{eWR$sޓCkRQ qKK-,UB-\Ew_FT=-\96)XM6B7ApT T~kADUl0F>y%sOBQQw99&`=56rP%ߏ~t].ñxj[$OJm4V]gBy}&JOv-tRW+{fgI\8;VD}Yrr^J nu7 RA&7"[ +y< 2l̜7񔔗2juzMZ@tϷ|MRLoF(kø˨YP@r1[|QV滲 *ށQz~[V˼v1-?t8wTkuɟesNT׬V_^qEHԙG/oy0WԍwPק-'z9&>y_rfJGwG'Xszޒg%pxy<|/RS6H#ktم+_PxX@{s_:, X~﫫iJ82T0uF0?kDFCY ?V{/@p3Ŋ,?hǕ>Nў;.wnRCN|yJ ιM;hVkd}XX И>'ŝQ@EI7,l{xִ/uQ/k<^Z;{Crt[U$r}e:x)ur4Sg xC;}fqs)B^Rinz<@{ t5>菟vUώ4MC"?zbnro\Ұ&6pQ1╉20RdV ~oǽougUelCq[|47ױQ栙:D4hZ9ʜGC}NMB 7o%QʴAiwLQ6| ׃ ryp)xl\v F-&^#ú`XWh )u(x7"ֱټ&v!xi̇4̾_ذiQp]B暹0cH ..it] Ԡc~lCUbA)`MǼvE뢴TT-%z7Rv6}d``^ՠl@yR Z'هD[(wvyRMMLve-~=ÐI;˓VycL[*Q[Ǥ`*y:]yChuu}EcߨuM/C'Ӯm וSӵt2!;ۚޗGX\ a @H ll|ȅZqwAi> 2 Bп2, yqO %U=+0`N.^`909Ɣї+Mx 5Йs|bΦCKXy?ZT:9&/`y ՗[G|C5baȸ-wM0Zӈ=Fտwg)}M8ﰌuCxn@B1pķDžRp@yjgE,Lqt>UߪOYѵ͆{$!տWL\ )~wY l 8FdS+О/Ƙȁt#A%v3BˏJB* 7T/8X/J]%IsO4|Ovx{" s{"8'D-eE/[t9r'g\ *vH5CY\oYPyVRhh,gn> fy R~^yZ)ơs Py]@/\h@ >Q|/#.L6`B"#*d.%=*-hY3b'rbAq!ڠy&W4Gd;U7),Z, WXy [R2^ nOیh inG.Ə߮+U[ :K4wP9h&ݣޚpH˗9]9uT ' yq&E%eW^rӳО0z@3OF{<"#]v W%g'$3?R]{AE+`1x>/m.V>ns XjCx6hL*_,3 D"䞗Wa%Z;E[+}!_8TG7"ZCI 'jv)8Vz;β͟.aӟv ZӋ,u2)AA#q< P{I?L2$f{0v+EEt%|%Jvt?[}!NMnPr'n9)4&e5fGk]zxUZOx8[,pʥNeCoT!8(kn?oALo!|HDMEu8[ljv>X>/153A/ 7N4Mf  Yg'4pm 8zqaӝNL ~elthL$iekшH&Hۇ3VDP\@dWdtʖR )s9@6AR0hc*SgYk_{r0 p}c^/\ˣ-yGmKhw+mӬʏ)2dCMb;|U Ue`Uk98 ƭE4eQYvӐNܡjut.`H s2V )\-pVvˢS+3x50UÒ(i䘒+~uJSiSS=yl,S>s: kVnxȻlaji O4dVS{v8fm2tPĜLkJH|Nکօ?8yjN FH U1-~T %HAy{/}ԔS>:slQ:0BLvOVfJHg/"5?㬝!E-z!%.ݐ6 ܢh1<ɑO_60hO}  X~}6;n#h؝?ʼїE 6jQ748",ysmT=w0+m`vB"Z/k`MwV%&8^'14a GA ߶Btq q@=ʶdSuy?&.w]*8N|4"ntHĺ1b$[i w\!j:)v"fY,p`bͲ QĨA gWjpx  2; <_ 2>|G=ILGzRBXܷ|եgā&bAZ*4.[ }fuC0T,ĨvL\|Zuj0Y[#CkFVMŠO$T~ХaVoO; @5ikDGu/r)MikNl70z@c?EVFB..ނ8}K=~ETZA]{i6LԴoB$1᤭/`~mQwULKa%%JGH,q 6zHT Q (S8~,5_JU܄UtkVCvTa7ݓ8nJqTMi9p&f z?Ps˽!&&^E k0'j~( )!n@jjKx_V6DǂL4ї`A^ x]yTɐJ`I=Qд 䄽BY#]c'}Ik)/ApO|V. ,YdiJ&x`o9Lc[ lJfԮ5~ 9fUZoC[WNCߴSs;%ͫŎ&}Hq6/ u'n,ҳP$1fT2G.@\w< l{g:`FWaZPL8s[h(nY?;߿QsDPZ v?f)OAc=`@U?=v<|C*{ƍo}DH(,#ifN$ ų'pP5ҚzPvi3JfO$Q6 ="& @! J,<Å!U# kPLu].bҿRtʭek 2c*vI: 5nγtk"TBE=ˈbeT^<#yWR=`dNUqLdb>!O-1˥#Phq$!qC DQ"ɓqg&$!Tp@E g1d3TO f[n+`Rp;?I{> QpЦH򔏢=<=hq,,qbb}*%ƕ#IXRM6Dmx=`Fj"lg'E() 5"|NY~ k'<"xUi̘ʿTNB{+a&n%W(ZN1q2tT5'jV+'cÿ_E)FF13vz.RGt0xn ~RL'zedL6A_8lo/fפJn; ,p- 1@;EȿKb穦>ԈcҔ[v"\=[GFdܦ꺷":Y o9^cӚ~Ǚ";/z9۵Vo̎Rȋ`JB7ŖqWn3Ri)$1dNȏĎ+:.}~)U ?[/1-8Kק϶kSʙԉ|pH~2T 0Ջ683+5:r ׳DNԨuUk1;M 'mǠ:f%U>=.n'KiMJ3 B҆np4MJ!E#)m0>)(oUF endstream endobj 122 0 obj << /Length1 1373 /Length2 6096 /Length3 0 /Length 7038 /Filter /FlateDecode >> stream xڍwTl7ҍ #FnPBc6F74 !tJJ7H! !Ny~;;gw3 #E@5}I$&f0/- !ˮQ:qG:n1,d@>0G@z~H S_G "##%'E `8@rc*BnSE# !+,+vB y0 E@ݡ"\`^MN(_0 (`(  w"Sm=_Ww'!;`nP Ꮏn^L< s;`4h y`n'd  GyOB0[sp/<௳ {Goas8FE3@R2'Nnc8aF/BzCA08cPd#ah5<'[ p7\f:VIU @ sg#0.@Ն;!25ҿy&/ B< H|O ݿ?hz6V;o;( ]0ojD& u4 .A/oP#ˆahxaŐ%5ovJHH$؏sI #a!8 ` 8!$S\ y~+Ș:(_ H$f_NCh(dn|TvVrWpmDafW0`0:'|S%=W y֫ǭo^%%-VK|GLy=3"C-MnTHsQ ]]0=f^-KzY6!`oV X;NKG}ts:oU'$h'A8jU4|LԫɊ. 8WFLPi"n+64M,lgA-tejq uY<J |~ΌXz^Pij<@E{H6̒z*֪r6YwW͔%IOǘ=OC SAQ|`jo0(97!7q3TX ~(r'QDREE9/$6Z#Q QiqJ :uܮq=.gmnXN|\2~eZ/ SߴJ*K[ "`AOt>>{{\S*gȷ ^5Z踓݋|lQ_tzO`Qcvԥ{c5.qv]_$[7(4$ZyP,l#l}"kU[/-uinDdH>pG+fܚz`{AEWrkl>^yӏ&IqTt>V48˳mXmǿ`Uޒ|9]\Ti=&Fu^V—LkvCÍD9)'jgVߦYwqHARK=O՜4r$.4me] 91 ts]4)Vyv!9_"~ d|* GM5jH3l=xZʼnĨ; i8=GH=y[B~u:od-t$х>gv-VsOzmvJ/11r QqΎ!enIdRPY)/;<Ig^\]RKlu#5dFTڭ`B"#ֳ{ 9T#t,E/yi-i;Ǘ dZiiɒiRה"& NJA3(oSK˞01/|bCFCE@7{3ZlR}Qj5ʊA,Qx[4GG\8Yg3X^b%MƵ^8ٱڰ,X斞Ѽh,[gp0ߺj)yq_DnPOgYҷXaBs+n;'h=uo ﱵUtxZɷ,#&I0SZR=. Ӌ)Qw([r}FsVoȴ}0jg-@B!˓Tn]/Շ5)ۜZ,$Ģ'V6֪vt}v pgJztCXL Aw'*dw~in0>jBL[=lz+A`FR~>,%fC3f&n)K"ֺEyFM *VQg)&X*pǀ #Ȩa8@Gg_(*1lF V_Г 1ՎdT[E+bE蒋:y`=.Tfvt{ }LTzJg2U2f> <}՗'CoB19BųWFsXKUw'w)v zkjsȃZQBM;,/o#v6>,l "" XV?Ɉϑ7AEY ?0Lj3U5{ȜGͧW #M0z^#{1zD(źMU>)PY [5οДEG>>PۏOj:-%OԾ\И~\8 sXƭrH/} L^e}NO.( į{? qp3;|+q,Y|(G^Cq/&?gIU~Hgn›k-W 2K%#[j^%M#҅HDrin󓙿\K5r} я;9Y4TjP1c2>ܒ_hL[_^:cKMWf}pjgݚ7sD0T=[X鷴9I UK[yV$MyS8gIYܸ=̈́6*w) ]I t)Rut6Wp8W' /FUT\p+s?zm'JUDǮ9WvMhNw/zY -dp ќ{ONU)vf63V{dHDBt~A0u1WcΉ~f,Dǜ4/kn_vM (mF簪ŔK> 7k^?~\& !i"뭆l*Dە@NȚYRGEѮBȻ .Ⲩ+CTZm0W(dI?r>aV1|R43or/}Be$yى9ْ?N >#~H1*3j07}iON!zN$WX?;Av5njsϿS2PpMJ'OS_>k:qt3 NOߏo8|\n%T64*xƓ䫂g@S[28$7]oN1X.6=ߛ/$9 ţjcb!+Gfd$7t/y5:)vTp<^!cq! \8AM4 Xy'Fgؾpkט(=9O\rB['B3N#y &u{YfrHT'By^$."ו3O.`l8aIE@\z1~W<<iq9<ɧ>}X{ǹg'cԀL|}3usnB\"އ_ QI0,p@v珆ϵHkgiάphVoӉYJ9abV:Brc٪=]Ivo-b D'񎰇l,bɧ"صa{^6W*8{m;J&i>e -`G ? {+y^PZpvy*s%gSE| 3IG$^"汞JQ~e!72}{D5>Ju.Cϐ+%Ҭ<MHE_dq uh;߀TF J4U*7-"yXz(!B>u|.;֧H4]!:H;AJOqNJwOWXyRjYiiκriJ#nPQiYA5Vb w7cfwSY~8UQS!6s8:&*,p>G5K:"{ '2x+Ԏ1%_VthE1myZYDbAogogܾ3,楶`U._C@襼֣x VQrw7?φҤTo HW"I]:Xh@wɌ#83E*4<;;A x3Q=a×@ ~Q8 54~lFk+m{lv(V?mxnnNl:"Vtٽ /TnkΖM峣q)mF[6Ē)CFw?YIXȪl](72)-ORT,^| [nZ5Dlqq|M> stream xڍtTk/%)2 Ctw " !! -tzs޻ֽkϳ{g~+!"y|Emq >+ Ⳛ0 *p5SFܴaP;E%bA8%k@0Wo8#ÖwP5䂪hk l RpH;"|.>!'t k\ `|#G0f(l "PP; 0T躂8w%C[\\` tU^H55C[{X!6(ߍ[T֨a "|0ׄҠ.YjsqA_) [ԭ{^3 sC`o ԕ@91 y:Jn mF sأFA?|_}>"6 0(5<0@d– rLԴIA b1Yu!O:,Ӱ_ҁ pps[ !7tr2Vk0/; Ha(@]Av`w#Q:@D0B#m@ `(HzP@Xez4(<6PwIe-EDp7>j(I D~>( ),G=KeT~'oYXQ;od vf+ܩyY<'ƈ$ƣtN^YxN gu%|/krs׾ߚq›[. 7Z?Q&_ÀGk$wgل^5]H̳[ի|~(lzCZT|78tKoCJm|K IoGyt{hD u?AXaR^@ycU8DJ Or+A_o2V+gp:;fh& 0O=k .e*7 5&k]̜F %^k)<Nn(5\d>TncbՉig9U&1JH[&T54ŃiI@'Ɉw݋+!*IB2h{a(ix:qʜq$^WPH|. PW}ff/>T2Spf6a@tU!%R#sY_z%OX2MGZԶgzov<$ި f\P<+?#}~?iRMrg"Xp5Ѳ;L|*ES#4:lMe +Ljkj}"qp}aᚩfNt,-Z!fhUxd;b+a ;Ѿ f"` '?`=$3mb=Y$~C_h2Eà52WB8TsECh~svsEMe&$t׮JF=|]l O[&h)#Uu8 #WSXͲRrCE{ :K폏;0BL]B׳ +1svg:$clI#pq`^01wIă =c6ضNŶ,`$- FHw[W>Y>a{>F[@<|Ix>Ҟм_-C>9 kԅ4px*Ԛ:H;F"2x7;މTi/Ų\t!Ȼ_FȳIQTQL[EWDcQ7޸=qsK^f[uâ432[f=' l&XF'β?gN&Hr~ZqUp-\nGU["yT,%xxu@q0+S:MÉe+MGReZ.yTղfQ+#x c~ 錓='n1dY!5b%D\rEm5r٣J;J=b_Z$:O5sO6.FNiP;<3=<)čP3[#85Чh')^mȰNYozkETyk+C ݝ=E+O~c8]A{G6]1ـVșmuV#?~G lr!| ǟ'>9\§n՗wYI!I]-5G0csn#UX#w|F.&e|{5x3ذ\=\WE3i Iou}~=*v,|diJ!m#b<.kʥ;S&h>QƏ|^ȚL%-BFroږ:Sd 3&'jjj?W^-ƧO zAtgCk Eð>FkƾS,cy^ C"wꧠr*Slv~)ܨ2lY#0LzBz&yaePs&m;E!ٙ̀8w_!kr MŸ/.=FqW:㞿@FY_vvmj7iY6 /fQB0ɽ\G/ME?()npKj&LD$Y9_Pq(⪎4o`& %ݝ]\z[x1٦Y^&w ҩoZiJ0O#5+#G Lzek7w5|",dճb#4 DžY?o )BF4fXptmJ29jׅg,1ɿWp4i2fdEFFbUI*̸!QQ]ۺˏ\PRrz SV'ÕS} 샙'?`3KlN ={ǚmOk?ޙ`d_xZ+#cr[ LA+VsУB>e*e8nw(q.~#=`<wPGz4R 5|&7z!gvF <vh9m[> }aO ,CNW~XvOEF@U{j%"_ت+&M1.f6&J6%qO!m$y]!Rl~aD8g]'DEDZ-:t1lrOI& 3%AE?jGRlm}лGm \7e>:#]O39H['R*F2˖rq)lp' ۴Gn Y3u0d/n%Pn&I,1+D3]*Pú5H$`Uk7Y' +qNV[3s4L!5h=m{ w?DnLynm*SO#Ӈ"+7Ѣ KsQqZG.0 к q3N+NGM+t[Hm7_<ܺsuk9 M(U!;խ>%w1911a^5/Z>Nq&5ؒU=}V1%u_ɋ~}iHNVz+3`1 )$*j.2qP$mx skڡ'0Bk8jkxn#ѳe%k?KE]A.לRB*_y_M>, /F N"?`>% EOzRXulub)1u./81+Z?=2k=:F&2ȋ~͇]^f(qZ&z_eVWն%#pc~t[%A*^.jfWi*s)lIP`3Pȓ'ŋp~{4ܘiP1#rֶ˙.FFMNg5ĝDOi6pNv^?MjrnM$fv2mħ)"0\ͮ|~Rp qWC$ԐoHE+K"+5WĠ˥,j59A|_ >17Lh*U~dRy g}pDUDeTlsef )R|ߥpK~Yc*MK7C:| jk[ƇⶢǚJDyhy Eʏ#kƯ@%=Wڡ>hjE\2\FgM'|2ux?]n4cpNY/;Asb{_p&Mn^)s&9RCp7w wf|Vp\JW2ԧsPๅO.KB[=e [nJsz";/0_b:d$"dΘ9\7[KO ;K ݀^C%<_/T[x1:7(_߽UqIȰ8b;1m{#A{_y&K8FsЩw0UxbMDj5tnf[].32VQh tšgv~&Up1c0#u'4΢efp<*9Wm bN<ѧS^}ʨ'cEB֍. s, tcj$Z5%Eh}h>cz@o6Ѥ:aC7dkU_VHedS~p`<"g} :p."K3?>."9}`s cș]Nz7GȮksm9qHRzU`? AUD ]lPw ha.c~ihuJx{bSdD>&MC4Y!Zl j3 L4>lw|rkh`K@@Ğudg5wc{7j WS+u#! :-o ބTXASQm aek6Aqd6P=JER/CT55Й~Wx;A@ܸ "6m^rȮsu!f^X\,Cr3Enb)Yjy?/_ ?,[閦T6h[T?;cUD+A|2g-z=E4?X_{PxRڜ{(Aӝ]S/DSG!1q?Z,l#zw􌎃؈vY.g3؃_rqɤ0"\7ͧ ~d2Z˗ PW\1F̳qR>O[#*.4xAo endstream endobj 126 0 obj << /Length1 1878 /Length2 13238 /Length3 0 /Length 14418 /Filter /FlateDecode >> stream xڍTʲ wwwwgp$kp-Cpw瞽[LeUuUOS( ٛ%x*&&V&&D 5 o)"^ 4v~;d\l̬ffN&& ڃybƮ 3<@H!jYX:?K)5/w- 25;[mv45ڛ+#=Br`WOc[_1 R,ANU͝݌@d szsp3o{T@64f@ MMm<@vs (!L03chldoj 16y31@BX`s2@62dvf@;g'?@`[=:Vk;{7; ;3?)80ہ]bx!#:ؙ8Y@GԒOp5_J?7^ s+ vz{["33 d 0Z&N r253+2eUQT+DD^zv&3+m(Â_i;s{dߪ?]sT j`ֱ@? dr4#bcGkl _]z_m&q\lVm,l[Dhr6U0P B331TZ]No 64{Kq;S{?0=ߎ  W\oyΓ(Gb0j7K"nN? h0Eyl'ٿ 3/F Y@I,߶d0h[ |#nd~iovog/o7V.Wohfbc4wO7_-;=m_-;?t* 0S0~xk]@;qqޔ7Ъ&Jߍ~gbG5">2|+8aeKFh먹>Gr߆*;- ?kՄv??;~n쐡vtBQŸwt<4[!}z_ EI,.)3=;swԙiWbXZDH/ Y25Ώup oG&)Ddp潊 V~.7g!%`gI5T,3og'?؎.i4*bUc8WZ EV[o5̭ j_$șnZ,w`*:!ηòfC;$:_ NGnlsEmvӳuu$kJ=&qV-̀% ?e|^o,N؂dNˑ}jSw9_v.) ?}K— UΓ" fOVAwQoi&GSno6H% iaF-+. yZB4^wtEFҤNFDgf^rW >@TܓYmҗ{O?k UT S%n}2jpnQP;KW1˖;/PMJP uenn{o~ o幇4]8]aewC`y4`ѷ KBRʘrH@Wwnp"'2#WPf.#B2:B64 L]bs16Ņqty/B++v>iZͦ#Rc>j@cK?QBCE`BW+~ji[G'4,Uta{ @ |{&Bsu 1n@g~Vǽz{ew|)YO"b \tJ*iz>D#\{ [m>ȱ1Hdח~_]K#~lX .:: r*'y~CV;G@ѯw*>~jVl/咝Fj=4SMe>^o!d@e&ܕzJRkv+¸mO)'$RXUgmt3.'aC| RL24MPZt9J&2ۃtɶĐld΁]AF)9DŽV"<$e^bݦ@:uW {\L>NfIjQ\6Myϵe?0ijE5N^ԸuQPzq,J*ۼ*K><տ=~ݾlΊG&fZH. Ȩ5tKú*͙*͒CP*d[SZ{F)i w}̣v n<\ͰVVjey̮8B"\ EE?aYX[ۂwGX%%Fv׽'aXzX.#v'4# d"ء4&?Mh)O dʽ>A *Lu"OB /b?,G='L&mIKnJg4)馉G=jrhyirf=wJb" >. 9]/FD^6z!ݒk]GO 1 ̜~5 ]02 HJ_̣H.oyRM^)%U76#΍NpZNIo _oTy6c,O>PR/l/*;~͑yd lm0_5=uz Sz5fhZ+ Kuh:0 +cV'~jUy{= G+6[ ݱp~Φ6LU0I a+G.}l i|DUnPAqYӼ/T(+eMWtW%&=)V;lS,OSMl 2-KҶTq6EӭsW/5nU= P3&]R}Pt (G_?w}u_fbP\a)]_F$Y_Aûi/8ХF裠NdzzEY ]O% 9oXY'ZxM+x3m.{:\5Bö7F-1aɵ?,nICT|0 *dW"i(7 }aȉe~խ6q, =šgfJgf"Qc\òT? ["&.lR# AiɁ},A݉ڼE?ZB1A{MOe aIy}vB4nt=%N a}f:$aeUyl:z%(>lԾ@fH %?EiBNqGG qKNޯ:2e0] ]^zI%?;*3!拢bη<*Q0^& 3$N5ppe k9!L!gS҈{ _' -plJD@$TJ{V\Oȍc- ~ 6?WQYeE_ uP-H^9״,JfkfbL2KfSOGXEǾ4z'_87`uM@SjH ".?jJv2*w|'(pd{SAIkʇW~IA.:Rb)n{U\>mw{ï*( ^9o^>6d~PެpkpIGNzLc6z-Hi*':t0@/w-eS5> 6XLA7DݍM{>8jls3v ʌO T`hClrZ}8&Sl-1Fmv]O gmT|!ܘWaT&;+(V1|}(3uE@;dw02G֛.sN/ x*8n38j~c]L.tH8r!jkQQw=$6T1*2lSE;cbTw\@͛D&E@I3a>4u$|t&i z-z+h$[nޝ *@I֪̔* VҝI72 RPx'_C,PAH Z~%C#?U?~}d6kA&?AőXҶ.F|Y˚4Y w_pQV4)RBvJ)3:[ I!+oRJSт>Ҷ 8yK@)Z B/2DFwMCKՁ̎UJDr_pi:oDz}B s/U0Qg-7%B FƏ6P3xc.:]97mvȍ1*?F5V4+8[]N(nFWJ򉙲V㯆qU_/ω 0eY <1>~9 5!!(A2זyv ؛a:Yf0Ob1 Xe5~>db_ޙv蕊kwB:!DQbƞCR![w咜[[G@aL_:,ؤ6lԝib8{'WGbˉUJP )pS\KuJeo t_֗OFH%Uf)H`+kĥWDF7 cYQ?;N$"EBb21N+>Y0FX`qKhpzy-r쁫T.D4œIq5͓/ [aVY|@.cNiKQ{Hcb(*$Ԏ;|^W%Z[ȃ4W!CuavC M?Mq"xtUI+<˷>E Z>Rf6ƫ,"DAuNdHPHj"OF6 jGYB4bq ?NAH^uO&) rg>XŦ[ PԬT7G =H^l"dWU`0E7Mړ:c$C[MWQͨZ5 /?Eº(B`vDBA&N5glZGA_ p{+"31T8;#ִ-|P-[ǬP1lFԄ쩮6qSk B!oЄ؋X"%7*`3r4ȻR ^֏* #KdxD#܋ߐۺh;K2P%c ݃6bb[ B=5iXFʫFLwT#W`8Elunj*%j[X^~gzIZ"q)SytM]4X:}Q0E!̱m}_#\^D /[a:Ѭ~}ֆVf#/oGyM6QiedAA^)F޻ξV #!R3XA0`d]lcݛ$Mr0lBaydh\/>bԺ><:mƂw˗bYv-IB"|'y9$@9O=mc˓}]\R]K Ygko%œUyS' >y{7"}6@"&9\<QN߻Y#IaeMϓJ H9j=/5I> qk_ lA tWT6PBp`xnY Jw.h4ޛ){{ _|.Ծ ?Vŭ *5;J@mD0lѶt$5eJ. I}=VJ`Z$zyW5v$2![b%ki]gԺf1u'4&PP=2(#UDk֡-4.2'|Qb7{ˤb.KnD1G:/x}N=%|7-3V3d7U2QDm?Z3Yi.CCx>sPD|!gB a+C4 N];ceuo@,R R89%5QOU?*TCvyetäBe ƅ6sW|N[#"HOP$7G'fde%u1 YC׸><@o+iC=x4b7L73cOd\X{]Xad-{tt w\J#ݩ,<4cBl>){$|/x٪ un2& qkj!.ʮZ~+u֏9ɝvyxz-ι $fo-&D- is\ɐ!G9 {WH tY0:1kwDΨjDTU{Ն7`|mx9G.Ĕgdh!7 uHGg\:kS"7)g _W `0I~_<^f-!gFfl"DmB˴EWx gJ =T ՞ogX#ϖqb\,qxr.10m[lY쏌-Oνot;\cbw\X?1pa)9T̹d'ԆƒCZ܂Dъæ饖LxX*S&9 5xmZD+mM6[?4OQW2|YFxx숧Y:^Tتj!21fBUةF.4櫫}y"'ZQyS/wYeލ,'uS7A1$t\pٽۭyזvɍ;88H G?o8pMVkNMy0{bu#AmhWr1V35WYD0ݷKb<ns0 1e P*,]HZ[U{d-۶U3O%]Rd(߮#0бik?܄3(ϖ#P-ܫ4I Scp{R#{ZD&O"Esң6o`v'd_˓lpV4'y<з9傞Tkn/Ѓu{~> k8W;+F$Q. z93]e5Ƀ٫2_MYg6nh!딝n-얾dO㳼oAH0HqZ΋G`^8|n]8M2 Ѐhor]v#Zm19Od%Y@2;N4L !wI<-Y^ƵlA͝$ude׻-y!&k@ sbk(Vʮ\2AHI) \V0(=&*eh gZ ^NNH J)dR2ף~pJ(ATCضԱaj:- Ptk4+oKIV5$_@eSHkеIޗw!g]'Tߋ޴dӌԧĹozn2%N(~.<.F8Rˡ̭'":Ĝ -,*yBH\7gʜ!gBGRqmgO@O2ƃpꈉ%߉kkTM7C  hѰM]}]!;z\3ͩ i&к4|ԟm)Ka-t`unKi7"""p'*Yl۔s{퍮yecI@>ּ8bA`wЪ#K{r|=o1Y-4^|a c}Jɩec1q4l+)Bw`>"΅ZrI_Y|V-ִy0c qnnd[)ۂOJœ!yI4~2Txuup'gq+Aü6&~ eSyE}HT ~lHHdi`hM E~;`5dҒ^5 .o"LpP ͹ӱL9&n/ MYo6̓ rnc hPk<^7Bvbh gn~!&OV,/zGG=Ykm&W8d/X> u}>Sl.JkcgcYmU,N]ȴ"'x(ܽW&G6iSQTq2[>;B=mX$r~:{CdߥB@N-B,V]tdڽ^QjJ1vL$坐sE1罢 * t083a3Tޜw$qɥB:C7̍#1Lv_^i?hv2CkWΖx8ߧF2^ao gbBNh^O |~2cd|Qպl& QB G_Fz/ᨑ;pb_~\ߙd$8n>A Xr &JꞺP*HasHSs m 1N3Ax$<)nOX~UT G}i_)^ϾJ ?Z(*{$T/ɨu|dGFhPgھ8HgM̯$t!w@;~)h=CAt8w݁v ?o*%,pKs!8-DiBKKf%P0I{fK8 bƼz'K H؞ºA&n3ti'H(b$ e . TƔLy9wc6 A e"-=كMZY< Dw>Pu)d,6p5023@Tϡ▖!c6It; z#m,g$PgIn-m%6fnÉ0:c0=jC,RBL6⋇,;8;(Pk.RS##q81I&ɋ;1(p$JBLƷ-e> BfIn_CwV=AM'm;-G\N?!u*m5mlw(iWvnc?uzRѷN|(G$[{6F_WOgq/!7o>/j﨓 P A9sL%ZdL"|z~ [ ~v&^U吏3k&$$4iFH},SFj8r\ՙ{za F7}Xn ޣ!Z8Ok~󾓼ڕ.%,l3 oӰ/ĸsFCҷ]F-<0'BNO8J_CqZw?Xc!P\=}(mfo*(3g/rH$/OUZjϢQY:khr1)B 3d}1rrb;4H33؉-dy V*}p!JRC>\M P&>c}̞_)Di8]ygIZDB4?۷Ipqvt5paoɳ$ڤvO+;S3ƛ'>(gy)YZep9mONs҅Vґ!T8hNKc47u b73$ᠧ,#h$0vz/,8ϗ+s^iY9)0Y0_--bP6="rܜلW( @qTdO.{^̩$U7S Q::-3ctQMvs j,tX# R&58!j"' BAt'ŭo:Xp5Cgoh$2a lL=$ endstream endobj 128 0 obj << /Length1 1689 /Length2 10445 /Length3 0 /Length 11530 /Filter /FlateDecode >> stream xڍP.P\;]$w+R] ww+n-^.{sz;Igz׳BE$bfg81Yb @V++;3++/9 a!2vz;=*A6 ;ceΑ n6(0d (#9Ͽt //7_[#P0v>g45ڙANVɞՕlh!Dp;YT@P e-֘j` U;s'WcGY`6A.3#9;@UFdm,#@`_Ʀvw0`$噝ܜ߆6Pgccɳ_$E;?# wcڂ NPAp!v!s0wf,3HFgd ''+++7/ZNnK -~`lzAN o?@ `CY 2?e}'gAlc׈YDՕiJQQ;7';1:𕁘x.U?gAK j_.,JH/=-g:;=o.@T*ζq2~3x9`72o-Wn6`H }{1SK̿TS;߻0vt4vGz3x ,;gss;Gs E߈b `179*`rX,93Y DvDa9ANq @L/yZ݄ iaΔ?Ъ:Rؕi{" QsKe%{nļHN![Sק>ږW&^XwPygot!fx*Wηg˯,OhꏘQ`F"xxQ`[E[EDdB/ލ'H~b],f| ^D|pj/w~ qHh0E)ApKGkVϐ8Ъx g@1~RigRS8hU1CT;~襓~is0z@Fӿ~rTytrTD2BTO((;lŖtV9#1'y SDA}!ATX4RʜN:cQM43^_ ihB " WÆ Dg;^npIe˜%+N^&_Ο* n7'tCC ltl6]yTefÈ%&>&Q98Tmꠓ>|"Dt2C71ŰʬSS1rV2[`0IE#JKyڮ#Gc\^ZAU:y#\ DMy|?.{"}4p|sNK 0\pC_NXA2byVС 3 r;Iv =921*iz6rPwbBWZZX$q,x6-m'8 R DwZd"B D8 ZݹL2e{!p=fdEŨE# A#_k3%\f`B GvKǸ*>ZBXtŚfo bfn5pSvTe z9%㨲hN]׎+K-Bgug:E&T&O8\-˙&N<4 uqI`?TDW%ZEQkf;-Tј^&Νjd:+4ۿI<_ʐRYr(K](#X~Fd/Ӽt'bEe] (RAQ!;rzBEGE_،Lћ&T&t+Q9N\0_ 4+ڏŪGΤlC~-%dlcm;^/'x1D;O{fu.#%NXAW'!0rUBVd.ge~jtƌm~V/ 3.,DᄒS{!1l9 <psXYhPMl.:h Q. KNB4DDQIrwaWs똤BEXxmۭNxXBl`YrhACVO<ԌVt}J0h'^3(}9k5u}t<մ}V<h<3cI#mV9obP$vtV 8tr|v7طƔ7( S3MTMo(]q /3 {옒pիߟ&cc>gMTΈg8;1D6Y:]pdN_ۨqG.Aw7 r0C~m~$@FdIIq] TҴOƟr/3FqGܮz[>8R9ЙlHwM\%c H5s:uY;N4H{gp ,) ˷Ktw^̬dlYtpb0>]>ňt0Ktqfj`5C[^n.ebK߹K~c`Smdo }uH싟?V)ɵ/zuJ 8oG=Xi6Ҟ`o~cAMfu k-XT;YN0gsCjr| A<J?џ8%Z}'0T$?i 4 ̐?ydJӿ˕<>߇\X}ۿ3SADP[W_xt~r<~, d؀Q^ 0L*a N}JJdAHq,^q |Xj]s0Q8sDJpe }H)sKY4`\m!gpeM؁ϫLjRΖA| K5Z5B9ܲ0#핧S00n:OS>KQ/;|0 -52UH[.]@ŲSJ|mSF= PZvu$a˗&R昈:JqebcK'[_i2Ê|^srz% ?Ud[(SZHXDkW!uz RnPjƵCSM\s\AQ픧ڭfԖ ASY-w?+V4 W-=dJ#侽7׿j?$ܱ>cRŘ+WHl_Td]p\S;ux^A6FЙ:GgQIk)m)A5\ZS2ٮbM01 i 'ir曡?@36 t7"9Z>[1D_{O>.2NĚoeT(&](JcC0/۸]fXǶz 6M)Sf;B uӷbxeA ^5 7'Cxo^~JvZΊ, ?;8>=Hb Rwfbi!fMwTxHKIIk|[h^~ ՐA);X 8޽qED2rЈȩ!d ^ҫ.|[hv0㥈ie«GSDSgSm.fkX?{Ao{TO"F*A[2XG T+}܋E)|{T*3r5.9 {eߡ:C8HYQU(T3dm zdM&XcW橏Yr8^5OC~do/'$+|zk ?Wu{\zYm!M ̧5V7{LS_ PG:f^8_4 uz MP|l~k|}8}w?^22#8)]@M=%昳x?I&~ tQn4NJZxpdx|fNE߆;ORLF-^c='5҄hv˭.SÑdHr9F_5pǛa0HL3N@I%͙-lPjR&;lo2:ɇ%Y{~qğ4uf"94O֣ pH~!6+ǨuIvzz^3݊ -!V~oeճR\r̨5?֍-hn'\Ў_zY|x~'1H}͙X?\Ƶtpe _,L>*f{,Ǔ`[R52㐉sWtjw=w#t9fs'}͊3ȋ^Ίpcp|VqT ^M^>],%,n}SUjwps/ˊ|dӠw!v҆qԎaR<}j| _Bٟz f!~=1-{ހB/#8BAue 0KDEp*5ׅT&{gKO5=rO` RYu+ty* BbVXߖ*n2`O[Gvr՞Gდ|&]b\6u m^L6fcc,v̤Th1D]KfMIIn:&wAZ[/U"a!ƝGX_'6$:*2Ym UVD/jU@WJImy=6ƀ\.ˋ#XQb>=<ĝ; AOp }׳ h""] &eŵVVn0qKSkƝB-HnE !2XBRtAg`@(t1x7\[2~%2qTU)~vkINIܜ6 ڎ}ADpԅ섿2U9 xQ;MLʎ]-gcL,5_Kx J8fҴ$# Q"ibs {0O@3aXݲYeYƊ y֠vS}!O=h(q x": ĜX~.s-4(FAtm ewe\"0gjs^ӈd kx8!%=3:ǯ)*֘ zL˯[.zs|}bjhm4|3Bi2pA.UewL Gb M频ܼ ""#("6hSO>p:;siL3qt*ם6-~ /wJ_\m}{i;'-ZZ2C?}:$lB%%!C(TMd]LF:k}9q7 ް;,:RDOs^:Sb|aF.[&!tal/~Qr$u'gQ+*LS^t0A}PnLQe1#EKQ'L.[nՔv2VHitfKJdu2N~4\fS5aE*%/v)}Zrθ=UI2wNoіcN Nć['CSq'RD!PX1M_eP[M+s HJSd08qqeڧ Cb}r6V^Nɩql|RcDL^[R@NARf_bkCv0h z}`nLxVECS[dZZBM >p.s/8}<aSSINօdxVy3^[F03P8w qՏ,6 Ebc7e@G1ޒ_ яѶY`T1c'$`L [ p˸ ,g^^j)2\z.Yxg %(4׎$;g$mVHh1]r *J*cKX>nnVD~3)磰 }5 = u rq r|1$ ⒰@2:r9;zcznC^J--93ԭkvFbvTSd6 , TTL?C0q}嶶 CRprJ_h1m>"' 55J?*;9֢h% Ou$[Paha0,ݾPi0|Z _EX=fG]J:Ïl,>gmp%[K_I:u$uk͙#vL*OM9ųmĜ0I3_4q$J %&N[|S;o*M1^N 𬱤ZqviDsR!w(+iVLǭ3ǩO n|9Ec!9[9C ˺p0ZFA~Ο3: x3x"ڷeZ6Buĺ?+BνkAr&J݉(Ȯ1r=A&޻4L u\Fhs:FuC1g&R̒ a Mh09(;o-NpYkY_"' ف FKUȀwtᄾd39NbCL}JK]j~p]o}"S!rʶ5G%1vňx{# ?;0Vxϛu\dx6tB(+#Bj^SԠ9],a`Ʈպ pܫ7W  .?U*˩!?D*yOr 0 v[ua 3{aXFg.N3ٛ`+PaqPw@L%XN[nACiQ\*m H$i_<V) S0A76ToYvG "̞;. 5Z"3j.{+AH>|\ 9"56ec YDP]c= g9ϚxHOsVA&4~zG Cd+%*L:a%wW';F7,[ߕY%72[U~ g{eBzL_ %_j*iWUۿ&N*iZ?U6|Ӕ2oxOc&`U&ZvtiF&畘rS(w` x[)rQLJ&XWsGk wJ Q6VAAUj̄r3k2]ɓ1ZWOnI ([uIуȭߡsz;rM!r4qzHLȝa.5lXT#jNElӋ܄^ٔ0W+ 7F'0KԵ€*S}_Sﶙ-9 pg>ȹ V$l oBn9L]UwyĜņ;`>Mܰ4X*͝MW"bt6GI)h8V0/n$b 6W hKx74ZxX{ݔd#`j4 2 .\Ge<'"{fñKŴ/R _f(*i_M.z'V 5tyA_eŒHE8(GY)(Hl!5 endstream endobj 130 0 obj << /Length1 2434 /Length2 15185 /Length3 0 /Length 16624 /Filter /FlateDecode >> stream xڍsX%m'ۓl0ٶkmքɮ6'N56{g߽ܧY~2PƉ ",`bbe`bbPpQ-lmx%#4tz:̬ffN&& mx.&9 B>S9RY, mrN@wƆVe[c ɎՕڑjdt:MZIbn7Kx'XYmߕmLwe)Yoaٿ)sm/eCcc[k;Cw 3 .D01-hhhobhaeh.Wq!%{ɑwͼZDh;>Q {iljacb;g;FU {gIphf@';{c9o'*v̿yx{LSz[y:N@o313L,F@3 ?@ӿ8XއosfbkcGF3J?laa[7'=  x!EC/U)S[1g>gOkK}]5쿭_+0r;;R_Qu[,4p\)'1{mzn6n@E 'coﵳ*:Z>5zf&{5cs>^lmM~ ;}Xitk 6N* p[`MqALF?(qA\  `Tޭ߭Al hbfy7h`h :bj t_:?g{ wƶVm/7O|hd}O_Q}S|{y^-?*Zo}7-L{lng;_"{Vv~vfe> 0W 'O6m}ޯnW_I|/_a~]UVwqR8Z:{h}N=O'W)p3>zm] _+n_ݫ{=nwsk+׳~z@711o·Z!|WI~7gb6(+]8elyw\IYcr!bQ] hh`xg y~|bNjs,>$yIRqI/2bKuxdOTQPpH͍p i5?-9 4^yJZ 'zU0"|S#|2N'.n^\˲>d|JX築Ţ,wRQ vS4A<aM]O%/=9NG8$?\X̎CG~ ɓ"YR2; jk9ýoą|^H洅7"VqztW31. 8>v$#&f薸K\c<0뢫=aJn6LlїeU7@ /EHwz w>jNXCiqִӯ|z~08' ݦV.48VqdxICd%E#0`rIli>*m~ ˋ*|H2o `DŋM'e+`5̫q iDoz u5VXZnX}\=fzH@}Ser@*~eN՛;Rgng,C[K4m"c-_q0.2ɼ7Yt6$KN1갻z-3tgVNR36<;xx|~?jOpvꖳgF$--*'%]9\O̔"LN;r1HPBxDr H} 4(?oUM5//e_H[رd { uW6.)3U/?t8 'YjRRO?3VUe4Z<I{Wؾ hAy<W!Ef4(}Nd)OS #qR=h1mK@ա'lh>fs ۽Fy%DF#)f/fZˊBJmBij]iU9J6 TEB!%doIKpNtP>tmt]h rn> 5n*ueQÌh0O|m|²bӱIS :TgeP4Ĺ!z˔ 814aĹIA#9H2~Yh3w ͹cjUM݌-Z=4 gV*w|a #F%Nm2Nxg;PlՅ3_6P*d>4WvBؚb`lv5:P~2c,+Zh>_ox +K RSGH)+S'^A= LLSXպ/ܗy|˶J$n0B!âAY|M1|w_P6 Us_2]Nf G1ۦ3 aagI\&V[\ ټ;ŋpBXi)lmpX:idXмhݏge@tUlkM`pn$N.^i?~aa1پ)qMݢfr[ ̉鶘}Sw+{ż6#;G)͠~W#K~oH2;Q5{uRH$@R5vU([:IF}wY$txe㇭rRS5I}OɭmJgW綜߭o:Wm?oQz|9@ԡѸ⶿ Ut=!N>i]FHwڧ( I lg7m"iuxkh3_P8DՁtPp?ZԱ1? BUut@/w"`-p#dV_AT`ANdǗ46^*Z^.>bl][[ Tzѥ9q4U2Is4ֆNZو-=_q^9A3ZX΃g#2!x}ٳI)"G>G/Ùy$7/ToSCnbZy=*Cp//@BUfz`,^CO84-ԤX<\"QćNd#s:i̛Oc@8);~s?^UiKn^?}_i2,oXd“%)4NHLZt:sDI:2+l5╤)j,>hɜZc(a{yJ]#J!deLo"C5i.$W3+'BJeN)H@hB6W!Ks-38UUKwVzHϲV/GP=u\9+<$l&hٖ6‘UTDH\clp$k<6ÓRBe^!tHb8 K 4^gl%wS&Na'˖|mɢ?У\ @0_n8~` ]@{jo|^\M5b uB 0j%ov9G2R zXrjV=~(uOn\/gdH&XDm[Bt]5Ru+j{LD3f)Jr/I⼲ŮO׋㈟)-a[Tt&5rUub5] %anlTyC d l Vd脙nZm;a#VhǣM&v9E0ம OoLe6J/KZT: 0;͚sPQx)swuؼƢ@ez : */ d ;Ϟ1<.1!-M .TU?| duKe5I\= ]Vn  D>>‰Jm :~s1T5焝'z,ShGzG/t ^w~p##_s \$@d@пf(#y6)`g&1R ̿xvIڠ6kfT SxE'84Lg48ϰ귟k+v'ՉOí5_2bNWxyɣ}A; m'OxK? ZtJ0:q} VR x56(py wI2{K:6FTeW gm%Φ/!(-jxZ"qT zsX }>˜( bG+/ hi`؟ġ˿a0o.ijD;ja .?']͓QPrneSC6a?3EL`,nÔe S}$B 0YɅAWrG H~>ES_7KBBt|y 68]:gAOD楮*u d3]J?x/T NNX⣛<E&|wfhDGa`,'$/ݷOPr2ӆëpg )2+x}nT@/rfL۽9mل(%zYnה*47Uy r~ STdű-Nt{ v66׳ +>3FSM U_x[qѣ6DT8L9G!ާ2ߏ{KF1WBR; JИ$Bþ_W4J|~ 9Z% Ag O.,NP:): N]21'7mC݄t➕? TBz#sT-&Ѷm^DR8%`$ɆG~0b>JWN1e 9[SY(t*c< }AfҺlQEBE˕)hώ|k$ηi*ywa$}F\ahx-h,lZ FLjaըȺxںҷӔ! UuF"XؠCMMjcl~ْd@Öc^uX)18 ~>(236TG"}RYm2r$kHt9axEp2RCӠ(=J}<3Mሏ!(wp`3[ O@U<IbFR)}O};k#*Tn[BVfZT2oVE]!}@}e 7p>],]b9V j~̦vuEVx-u?Z/ި"G+'(9A'9O{&]Dh'Yw;]Dr+CUɂa$EtE>pXʛrInO\Е~uDxa+b3QJw,vE9˟(GxW2dž,)/v %! /ѠLLu J(ÎM˝dQ2'e$B\|TwҭJ°C.wxoW(7J`W.7643@Z 2Jv҅ڠgXߟ_)sA[Ù*H>aPhF8LsY\B,E|aL$CGdHEM Im#D3=4ALESnfQ_#pԞy|٬"@Qڑm@!WͺE5qr6iC- 6%aI o3B7Qhg[VA7=Fe(y:7VKr Fwbp{L"~Nmw1 4kdp*-4Z өr½hc6nA8HY(4M,%yGO ',_Չ fb&~Xϝ´`Ș~eh9o=81:ɜ3im?Md "B)(T E| ]BPH+5 %.^#"9PԵ)ZBA';rmop<(uґ{PV)7SBm4>kSR# iN?"g;膏ꀚ5=ދYLyp5Ow=xod4P+'.#5ˁ5|) a^G߬Φk3=79+pŠ燻>?)424~N<*5)tN b,*=8(]=b_5 5w;ɧ~/4eE:;ōO1ӖgHSlq>iX:q;c Ym]B,|_+UߊF'7Z8ggը뎻 GaG>aS6 3n\яg@G>,7z8VP^Zӱ=^y]Bwe*Ƣp20GLE-?X;W%6r~|۝WI:'`I;g<Ϧ0<5 &{$Nan-He,[RzuPA٣%)!lDz;]j[;?3״gsV-DR>~WXtaM`KF2n 8H|4 $nִ-.ə~{e}v4⅑J^IՐt\ODՙl`WArZJ~ uN,CylmVj6iR9gJO! 1ʆ)4nJBs A8#J i}Ҋ7y2hY0%'σgl);®E<ً{dG=0c 1NL@v+]`RdjJm;vG0&HџVzsrU,:nCO[/Z|nTސ*L凁Py03I y<5g==oP^w^l yV4 $nGȎ$wH*hb\rp!PtU-v:xg|JcYkdf)mu2" Khsu)2 .4)TƇ"K9p~я$ 7FYؑ)Rb.3tǯT#&iM$fʰMۚpk?L/#O<CX|ۤO] aг: 9ix 6h_ؘS+ys'4ar?f\gacacLIs级 n~݂Wٷ%_*h5iubˠ̩HbM#N xFbCL6M_JD@!RŬ7L}L=ıIK>ޣ&-!GmƕhH-В4_UDxKv 7 < bCA ]{ZDap+~YJa!\"SNbjT~xnb8((m W[\b"H<ݞJ/弡۞@TM"Є)I&Gr>|%j_/ZsF Uak=i$b&X+|h7TRTK>UԐvւF dr p{t p)R?-Ob[܉6.{ߚ;xofm5,ɃY*Quk-6S\Tp|b/Qvs{𪷋68$N/8^HU'_1G EɩEpaS\܊!2{jA8{Y\uͼ'RJ"~KHy_A-h=iChJUZa{>s!E 1u awd;  E)0uB0|}/{f}G(_R2A~sP%5?/SCj$^]|'Cq20e]+PY!?ސDb$l+ÚXyXGt]V ̡d ">πfl"JvMX)">1"#T]k (sIgN8qRM/qW'I^Xes&2P̽PUI1ռ ,g?W8R/4.*ptk^k] LV #i|Y$s"4Y`TU}ŴR#iDԗH?Aq(s] J*T) Xuڬ\&5ˬ9G'2%efs'SȗѲ%J+ŏci[~ݑ0 ק]b؁`eAVF6toagj?Ŕ\f9Z9͜(Eͫ]=c\Ab ou\k*|^39 jNyL@^>NV[+ m[^M!#Q"w/a32H_{8[>T.@bPQ-E[n<8*ūh!kf lv[;#7Mvg/FSA513`&бwƶ67\[bحr#yz&*$BQsp.*~tNb2Ma"#ZTi~^i,z]$?bWiLꥡz. 1"׊ik KpA\$~*(=teXAڏƶS> %P{P2]qe)P3eֆ"on~ZePnQ(eB+IdEOIQ)Q0ޡxtE*Qii˔.$W'Sc'+CiVt%G1Q;[LY,f$\,d~(=r8S#F@߽?,lD#nI+:҅.zXӲ;$3@.g5rfSP{}o)03g[//8Zrn?OLDLE)'MD*J C;tw QdT 1z!˂-dod_)';o;ǑW1#CHގ4? w{~s3Z ,a窙 rB]̆07oSbОM)CȟM+9ƭ ߒePL49@r;M#+l3=4Ivn*L OLJBzFX{'g:*MhWti`CAyCyhrVϚ#XR &\.#[ y}@y;8WI"_B|li]tPCg=f(qY,C1wXR(+C0-K$6 {T4lx!{W$bƴ*Df#iUa]=ic6Z46*A 6g Y]ykԨWY4PoJ|;.M܄C7zc&y^0G/ ,wYym%.MAL<KA))=R? 47>6L?d&8V۷藂`IH=F(:DoM]GN=ݟ .]fo;CtHʤ`as∽A}qr jܞ1&T bX`PЁ#;5[,[Gk>5ʮi豒SSEpѲyS"!U vEvFԜ+uzCw0 Huy2o% \O_X=ˏ{2~vŊk֒ ]m>ɵ^RqTYst۟-gtm{1/`-+μ.yҪ910[ؽ+I0k״\LFUG<(bK+ꇳ,|/$ߐE2.cvp N&)?n0јcƢl7!< I;#GdjpfR=:21,ɔ9Q#1sY Iԥy߷dPmhj4+h7c_z{\uM1HLc%T-At2\4:'B=`%hXc\bJgq!٪syGYf;g_@dC{CcwƘu3}nrMFhB$,џtpާ I8-|? g:V5PVeO+o f@o4+ y~N4M5|в?A5@ SӵLM*v.߾ؚ;n.l R`qOG*^b?8@蓠,o>g|ɶmhX@}fn✲PگJS9Oe_zR&{D3FFԛrvbY@G8"6v350aU}`eI6=ѐ h5q5S{aIin@B"C-hCԘÌjuE:TLέv+2K Cya+UWJg?Q?$uHfı}d8J~VTLÀOKUAD %}+ڪDy1I?[)}q@zyȽ}~jçoٞ{ z~sÒS$)wN6]M[ΈUsci_1L] !LZb<ôh'zWۏ T4$^nI:E&z%Gs; T8$JO< #~$&4BRd V!ո`zW 5M3fA)XwHoG%k;@-q rrQ&+Sj= ueuo fk#[AѠ^9vI!rZe ~ rEMiK'ϨyȜ[~ ^ƺč7`6BAf, tȉ>' b=p P"LfAoӾqttB`Ƚ,Gʲ}KM;݇Sp ;&F QU_9]nuDPCc⯼|u'"; l?),jX6yFKḦ́/':_x{A]U + "gkV2 .|SZ$Z4p ؖҽ+oDU8iNLX/%gO]eBm{TJCϨVjj-} endstream endobj 132 0 obj << /Length1 1401 /Length2 6195 /Length3 0 /Length 7155 /Filter /FlateDecode >> stream xڍx4\ڶ d^Aޣ0fČN zD-z $7ɛ_֬5<׵^Ƭk'AB4 ?Pe`&@!! m'd3`H \ 4ƦBcZH@ JI! Po UrAZu$"dS@xИ:_8\Aqq19g+ B@h3" 0()89. g?^C;(;52@ 3?!aC{\C(Lu` 4:.P_`Ϳ?W?ѿA`0!v08ɏD@/ BbA dnP0vQ(׌`Y Q@:;ChaP0f߽{eC@~qs0BA`0&hP\TTD}z~0rv6cfqA0c@`vP ]ݠ~>PP[= A35]a ~Ͽ,1 p.ϟ唗Gz||@(@LL< ؟>#V a.fn8 \H s1P| ;_YWwGnpo?_r 0uCcThP_ՂB`nUC0jCc'/; Btah_nKopD~a0Q@0";a"( 5 ( "Ĝ5f%ĨMf?Ƅ03쐮Vc @ama7o?\]1M L3+ g`!mr|#x+f}"h>*Om 4isa3RUsXJ}kG|yNL$XZa#GeXWMs]3茌9#ӱ̌u=d,E3X|[475،f kTVQVgNLVoDaˋ)ij:/؈-oMvV][-RdF*{z=1MSbou<[l(JۃKX5,.97^h,ly&&3AP2E pKyQ]8˰6}^/`[MoۆÏ홻; j"gɍD5Nk)\IsYq8cak"rt𑢥A@}|SO:o䐝5Ow7-M+i5E=X.> k"7~oty%f-|C(H9I{wpַ͍I|qD~Rq~Fst=T5ɱ_1)~) +\X 9 By?"-Qv~M"Fbo{cdk,k#{ɱ%CxJz#=$K ~uՊ+p7D|Rq0?^Bn'rfeI('r!*/EX0\#̈kc 8/͝JyƐ #qU  >Mka:mgW 7*G;A[2ӼDǶI=y87_؛I֘RRp;iԛW{%WT؃Ϲ0=f%4FĖsiŊ%݆:#>h zN~!\dzp8ZgTPKUhfؼBݶ&Q~ne`udjf/Q*%p ;zKR?TX|8 j8;izRji>6{Oj6G*`GmEgnDn`% \zrsW;Q3zgeg Ս{u`y8-0] rXb{Xsׁu=2;w"O6vJC~:zf;|N[}R^a6$pMK q K- }a7icjUFgy-xF.xlg^!Q˂+j7!mڗ|{$ѹbJ" _ > eҬ8ʷ#_"[n:F?R8R<~קg1%[Њ$&*hn qӷ?//AĖlwYl[K_5]ޜ2 EMp&G^q}̐oUtw*/ѿ<.SyŸrIdc.Do;dFui]~0Z w~dE`J]\K,LAFb8vU{_;62%G4Gb({A<>[\ r=;؋ 'n!nN%d/j.o[)J,$Phfrw(oV}o"!vFQ;Ot/'}~FgbgEt|u{P_b7 y]xy|˅DIJN%Vէ1o (6S+-Q, P":N݀gpdlujjOIU=Ny&ӧGJ-TR,e[}x.'WR~g뱣a{o&G1ďҵywƠ/Wt& ׂb]6k~Pv{̥)k.XHF2&3!Hˎ=2~Clv]ao\5Ye8AfzZ ۂO=Y1sS|j)_S1Pi=`;ktfev `.2K2Tii,6n-?UI˕.Ղwr:#(Ftʾ .J3l{\5Ӝ߳ oki׆?wgo:WXj4Gz$PZƪ/ts=,3zVBUc4,mҬ*F!,L9#A35$ŻpGm^}=,7N*QŊ*`RjOGD&- / Vt2.^iwuؔZT4tjjY4 YD(Ry/Mڼh*592SYIpFj#-< %BNvscSEl%aٸRco&wŇ4]"/Vd)EL.aAv#jrUpԄiD7QZhi/0@[V>z9ך<8GE_Qɍǧs ػyIbh4)&F7.Z RRۇ.*=w&4:s t$/c+n[tP#9Lp&XI1GFQc-N9h\Yhy&pҾMR lÊd4茅_FOS۵c7ŰHއW3ŭt`NAvi8L7:y.HgO(lQ\GL:Sa~i;iG"lRGFůgj"!Yapit_R')Jq%#u< HC>hᴷRBiaᙥ]@Png0g(>SAҌ:ꒊWdu'G===ҋ)M-[6 ъڸO3Zzm^:e ?>qJ= Zh@\du &=u˨"ۣ[Wۭ;;B&.FRyp ec5yץ:lZ jAK9wtk=ZʔC@$UC{y-^&z#c=bXfژfZXc)"u=drRAO+ EeAKbOr(BƕGs ޳4yDqSGcrRMv,!JI#a 6}D?.-TZg,Q,*iFt1x!^QGhwi 7^׆<]:as*Ok:5ti8e=,튌3-vF *f"v5>Y tÝaaǻϲnXdy{%NB+E r{6}>R7L;"֥'Tmz~l_ =`ԣG^bpfvϸS yn;G?s R2K/ P~L5Ө\3]L.>Syն+֜,2xљdsMcٛ];.%NZDxP7/S=ChϽl\[.KoXhӕ"<ըbc:5_?mF车;=6u;yb->e~}7/*drJiw j,4I.E0T 1Ig4/4$=(16SϤE׉:?ZM'r3sscq{;Rbwh2.ʉ ԖRe.Ee[Pu ӭ$hW*"@O?(8A- @kǧrb&Հڕ;epdoٖ{!1i3HchL5"9cTX5OjՂߵj9)~iGlc9!W/gc&!\EHT< =p`Rs'{v.;[U\rAԯy #_` Ÿ"I4t2e땼7U]YK!-]x0"鈬h)WCj.Fsb)tأ|D E]FZm9-zh78[+֬v3o5m҇ amVe/1ۖ%eEu篦Ww8*XN{imLR_BI{s21\|ljP~$H8dkp:]bۻ`X8bq0o](xoW ! ,/*yp3g7*V$0/!]xߘ@z 4b)y*ZL5lAc-4[4;wFGJ?︪C;Ӭk t?$ݧn>W$}\ endstream endobj 134 0 obj << /Length1 1371 /Length2 5903 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xڍuTݶ-AzBUz/A1 JIW* "M:H/RD)"Wo,xods͵Z{DH~@pB" ,PUR`Q7) ,_U cjPFuܝ"b@IY)Y0( ՠH8PAX*w#TvA`0( 9 \; @4 y*+, `Ah s#50g2hMv8O(Hg 9D[h@!! P$rB~'Ca0+DBQ_D3χz@xΡ@ e# ?0 aοFU(*aSCb0{ Y'waD~ ww6C!j)xJe$%e7 +wP G!?_,a;@DGp{$ xag| '//86WUSѿgTT^@_!10PHFB(""-! rQvh̟n= 9uW-[%0Kݐ0 u T #Hwjx#(bH 7D`$7e5g$ a"[Y`9X.xs_u 3Q I zx9WoH8뷒 Ogڡ1_  Q_(a a_vF 0&*RS/щQ8gz35GTˮNc8nKz#P\P=mG܄퇤Ң7ݠ!>8 j[._*8o.[ɬ]T,9k\_p-i0twSmsXdJcӱ$>lOvWgNn{dY-{N_R7l:,āꋔD.{5:7)ã8Kd_}ϊfQn?'U40ȣaiL+nqg"-oU:u\ HM`jjUjd5Ԅy̡mN1j6JcLh('A*q/ɌRC M&z(i`S/T1_\_9Kyi{S⣷D *b6Ө3j)ryVuٟ19a? oJfl,AÜ-PU`<䀹-AvV zCO <y2X%#Ɔm%QXX ikcB]SnrB%Qd4O؋]_.闐J (D#/A͔% y#c"cIUO1g}k>]'{ 6*SNwo6qY5fk )"@ؚv9ȶIrbȢo%feXwC&&PΝDCwfϢW"-BAMYaPK ASսXΝڸe arȡbJM75 %T =ȹ@Ij 4 R kV?WvG&P6ԏ=k5?F]3 m3)uő(;Z۟>!>#ZXHZt+,%{&_Ř\;4 m)=n/3|aO\nCD T+QE;j^L r`}75̼XE`=P^xN e7>ޙuH2K&*9zX]x#>G͡ul%hȰP0Z{cyn ;[*k.2;~:^8f|VQe'ի.BEhnXs k?'M F,puMΔ1(xNwYEB}Xh5q~:|xL g]flƩin.psY7=5 9{f_vVhzRpqd=һ?y<)Qkl]| #` ?xI޸R}J $ A%Sʊ eËfGuyri\/^ {,zh0XcOA@Lɧ@`VKRfBȢx,? P4;iwp%{#UZWLbJ[4PĈYWƑƶyf?>nqm{ߴ(UȰ~V6"?|k`|ٖl=O'/fʹd+Et} .jz[*vzq,GJ4J K?CEqQI]'mW µ%u-l$=J_'S_װ{:)m|%a CLG'PQrEp4I_@ԝV7]85)F,ʓr6ۻoH`ӷR MyK7G/|,c0Uq Fc$ԨGu Oʹtͭ4~l̬;B\ewxM-ƖO[j}qKs) ߞA-mZY (LJ[tW2 &Ȍ)=Gqxt.~Ѻ\4\fԸ~Bl0!ڧN7E5<:!ESF-} FuI|u)!OǡRtUw;|,T*2Zw{ʄ«IC8!-=FNɹʍr?8xt:ˆ.^#kd7C,T?yɏ"b^'*oA]J8g_O>o^]vɕT{!o,뛹v1 U>K俺=nUymZjV·$̥&qJ4腡8-`M!J1OI?U=htQSBYVg'>5S2YԸUCG2G Ξ)/ h-е>ٹDO@psjK󓘰km{k BtʁԵ/9IwHL0'!Ry[Āζ'u#^˔ eZvo+BD %է|mʟ%[3s3V:MKwdMD:{RIubdj:L_]@qN{Tܻ.*p锓RIoϲc!$m*ʐ7!bQkJ(xsŎ3qYmDhە?\6{$_J1NytNn~[: ÄXz|THOMp/slR&7\Ə\o>Zmƪ4X"'wE ^L;o^gΒ-~;WFkˏ6+U4ϙT*޳'n˵6wGzVJ11 <֗{xf<㱖@ ŦT5s"O(ƃםKٓ9HVǓ.DŝE?5羴Cp<|@tq%k{$')Q`xgԿ,.S#>d?f,RIE21 A-l㑞O@ZT:(m5)Bn~jaRۀ砎܃EP%,k%%zA;Dr{\VJW>1G0eo,SW^hCͦ΁( %E;4*קH4۱$LjDl`IgZTkw$wy&d@zV*.j 措u3gh Nfն#G/EV Ma>yP1N_u(}V\#W &*]WV z7'QϕTMvn3) k65a;hVU{eӳc[(z{MOL%/[Fwg<ĥZ}̋9yvJZtxw'{lK\!Jv Pof\8Q0O{>]: ͼI~NF'bKmlTB[C 0&Bkҭ* EYzy0J$sܕV;ˡ$Vo*Ξ6UBmWij( *}A dK|p!ۖ WLSѨu,f3"U*:aIFA&D9ɠP|E,PQ#k"U]8ϡC6:q g-Yu1A 1Oqޖ#宇[$+X=4o ~j5өmnňYDz'o"DPmDE|Y  # 7g$_H2|+سc$h{i\޻|]YMY^j:pm. S;ܶs5dj`5Zgp 5YJ=_UCTfL~;BC endstream endobj 136 0 obj << /Length1 1880 /Length2 14268 /Length3 0 /Length 15436 /Filter /FlateDecode >> stream xڍP\ֆ 4NHph݂;B Kp4e9{^ϐ91T5Mv.Ll̬ %M96V++3++;&;6do '˻M=P j`qYYh4vv@g* {O'>yКxL@v%cK6 {Stqqgaqwwg6ufwc\,@g Gec[ߥ1#P4-A94]܍w hjgtАS8 V+ؘ,3dg0*Ҋ..c;?m݌A6&J7H+>gS'33YX$mmv.9Mݓ˵w(ՁE ;݄beee@SK?6td^ /l8}_B`cL]&@ ?;<Yۏ OffogOW̢AJx3qpعXll]Gٙ~Nw= t]Ks+v3_k_EҮ66i ۂlf@?lgx`nrsX0E<"_Cy %^V?`Q8,*{w7x,&л׻cXl]]п]}3}X%}Yrppp˿]]ۿ}+]ǿ]?SNv2uurz9EzMMjݙ~Ms"\F^JJ>\qE-uE=lb5YZlF,շC0La=;+)tuqؙY5_2:^K?n5 31U5ئMGbA;A`1V 6k.5Z}TdO$D>ܓc2|씱'v!cS>ly:Q2?z#2k!52Z7\mzS'L}0CYuFϼ By=}jqBU3fX;c`"Z^7w!)U[2TGNyQF/r vvYV]^<:aQWMRW_ ŸP19 P Rq9 yˏYcOuj+'X?d8 `а0Yh)'tucU^*-u_ IytrAx*z vin&X&x"J1@S,|sE#N`Qw36ޣߜV)mLHEy F'.o)[VDR-IVduCueTU]ru򉄨-܎4m(K  x vYLe&1 POp4͹> IxW8`?w EiI Fw2Qzg(v6Z >LVrb2c-x=_ޫY655c;fJi>,H!@KԬIN2d-9>Kpӌz {oYRת:?;ѰsV'|%}; +Y+9B8]w\3Iuλ؃e1"{~{ڡpUs>9Yk6ڍP(d7"#I{+$8m䕣Aq ܿ(;Njdwɪ$;6 {#ܨ)W7 9p̈́>L)L$hϙmUí2B`W=S]8daZҷu /o QѵueŸX2Xj RjZ)/6@]zx> ׬]1-T|?r(VK^`}ZLI?|NwOC$ rwn%x9wjv[S$?(u ٘M޽q d.[QzxG!dd!D [iFX+% .*d/"Mh8ÕWWBp=%/r>gpuhlE OeJkM|jsRՋcノTRRv&@Jˮ/ew7S3{`b&^Vt:ӌsg<8pgT($19^˱RPK|5+َ$B8 1y64L' /В6)pSnMúCÅ(E4mS:f]uiPhxh[H:v Ujፕq{--3(G=t@!ۑǑ@f4&dB\Qi0 ;]\ՠnpzOȘ#0N x |CVːOwyf8ioә|RRWlt=^xr&j,4i,ZpWާ&WzLW%~$=jplXش/%Ą_wv2sst`#h(r,E{P}Drz$Ƌ-b$TSv|zj #vb}]kpėNZz>:t\'jilFA ={EMu@VQ% f7Vׅ;N>l՝؊7v1E%h 2] X C\0μP-6$67|J w/i?Fˠ8X$Z"Z ̣^~1#nI:"MD;S;Ðgq05,vM5Σv#HK,L;a l&rH7F (d:`8۴G02m*m:\sK%<9 0GWhcpnˑfw.~mS3y\N0<1}53za2jCvI NMezy•ޤYy{2zw"na1Th?A@==`vT],70t`pLe*9~YHUE&{K~B'd ʔ٥ȅœE ed^iu2^pxEM2rD3*?ANqFtz'-Xh3AQCܑs-` ./W%۳ cwmAhQiRtp\șȰ9K>֪9$yD!y<>?`ǚ$cUZ>aV#_x <ݬcW0+0>/}[(qlY), l|h{Of 6О:~TY)$"I}Ao s|v)pXџ*@O7/Fu%GDW*pwj L@̱A CLճ聽wb6d&O8As,FQ~jy0=/gw`FOGmgR˯ưZfbUUv WLq` zّ`o=to5b8׳Ń\I|\WzK5nA)(v|/:ZM R-#a 9]8xpcj[lAԎӿsgܹ|C{Ca1;#\,;m" '~g`aEm`9QzS\@@SV+edͥ挹d4l;=#3 Sz I'j-Uf'Ӻ'1)7MXۮ1_ךNshҤd54#F'N:U*X'Jc:֧59.d^慦D:(k^Q爪ajFǯbý-⥮p;.S^-CEI_EzfYVmV?ڬQc`D鸋]'=2qЗu\"Fz׳ ry=tr~ Ǎ^o-8{E5{@&u[posu`w1vtzq:t*hW'Iǔ8t|QPU&JRK+N@99iX{N ܇i;OrD:nUpHv0JAvK xj)|Sҷ:10ӡq<|d L=;G2Kq:e"aZN{mۺIA^Wv0T ۸X(4l?=UAA dP, ;7v Qi\&uVnq0m3}%.ܙxt[u=* [@;ur(.Ԃtӆ_WaG$;rI*'k8|ʖ A=Yh⬭+vFky1`$Fi/@*8w >XI!d}:&m?Y2-mA`B3+RM)Ew"8[Q|d夙6*︴[z."8jI!d|>*g P N8c*#7?_p(e{l׍346L1g6sr?GdŹ\ 6}2qqeQ[ na\*{VHFSDmڅ1=_^F;Q; O2Ech_$-D"v?11?| X(^T h5ʹuPKOQ)32 W*{JStג!q(VZ[ SrxZ/1]Cv1w㧞_ +bU4=&M$i/vSyU&ՔXQD@FݦH+܄<Y7(BBw|DޏJ1E..ы׶2cYc"3 iy})fSNg̐j¶P`^UA])_-}4 \o&:qc6s_)^}c%`Jl3SUwM:j\9@o*F:v% ҒM?⼦mN~}g^In >}"y^Y&y0];U+χ>t'c9լx^cxe:&lU~J)i6ͱz9y/ʟ"?T w>:F+69XFD{0&m;d> \P.ݔ{&zM&(Gl;RQdڲO>e^ǕR |QM|5qRt=N*{t8ۺ}Xv c HΙ\q7ԨYٲ=ٌw浈",\VO]/pUE̱G'+F, .J7!z)ARшOnXg ';}Z1zƗP"a(Z=^:Q?94eN6mD\v(k۴ӱ9H 8qC7` 摽u"6LݽqWE %C(v? Cp?{/pO`2IYL߭Mq0p'IT_AdI+&$VHq}a.j(Kb5?7W`#q5RTD-E|+I6Bɺ&| :2hmk1,He5]?Z4Yv݀عs4uR^tT_3\?uK39[@YB5WqqXzL#\_T-SўS!&OhgV]lpG硋Qme i&}yIOr{ Cm o@geBS"& 79$.x!yC?D0(ق DxQnwn]uJ'QI[隣NNVmoyLYDgy=\9%GU ֳV@F#eqPqFjYAˆxރKzQS:߆&񡗤ɰ*ΖW3eqU !=%'kݿot~;guY#Z#JS`+uc@d]G$S] ;2+QcϸebjW٠)'-/FD m(9d@S0z=J'9*=a)J/6`w)!mXM0|t~:Lvts <–CxQ5~N5pFD1~WYק(8HDkv3Njr@`*\GI]+?6vA٫zQT0"RatNP~C끣s0Mâws|R@M:I=& : 9no4f|ƾn>m 6,H%Ai7 %xxßFnKgBTtPJʶBn^G}kU!iǍx6=ycrLN[0%R)d/=ﲿY6Nb!/p(BTb$eڈxk)WJ\IL!P)zWWcIZ@H)w;׎ w5y0+!ƙ=Hf#{CiA/䦐ߟ.Y# 7XSš P!"Y2z}Nj]|Ifj(}[[z/1[>/|R.:eCvpEHj(ͺ.\77զJga.<qɫ7lBA푙`,~!ïX$ zY#>mm5ZJ} Eonas>&yES׆d_Le5˜j/gBY; T;2柏>,l']uU?*0vp >Ptqs\z 1ϑw':jKsL4o!C{?%('-6' \/f|& z9*Į'6 Biu8#Єu{b:%()&Fp0e?` ~A#BG<\\*_䱕tÀS';ZAe6HZ{dKˡj|}Q1ӟbTJOf|lBkAp̣3SK?:xIP4Opd\`uIO\,>>q{gHшõ ͐|eË ~k* L\3S*C"=qYJ/+}:CYЗ:gt~RGs3dža>ٛRR. p[D ^ ZqCj~Ev6ވb(k w x3:|z*ݺz) )J93{muUGn$9HiЧ~M`n|J3ZVQxv|EWtS&VxcP &[3kLp7'Y 6:cj6 4z->A^UcTup\uT|_R1(ilzElDf3\WBVx`xoQ1p7eybJs?(ChRZtgT wGxEh6l6 zͪ;C`ArO= ʱ VRn|̝?@G4Z*N KTaYub_0jNHIr{7-hWc_LI=2~lf覒nx)@R{ mYU cE.3~&~%dSSu(*tYw[qvQ X%eI-Ͼ-՚9)"p`<8^c_L0TC6MȔDP&}&v@Ft20 %aFAI ,)~9p.g>oJ:L0:Lo*A/jn{JZ ۋAN39 h&3Vq&͞d;7Up7hv)g_Oݓoh9Q/Bm`$~p #bI> (8 c{Z L4u4A\ V,K0tS|#<j W¯ˤTgvXt?ij<C{8ti >M0A4w"DPrE8sAm+xY`%s߷o Plń'\oj9f0a=Y}5󋞜NcE=2Kq<aZDaW5Q Kۼ[5R *sX@zՆsg#ΠG\mjRh ulR1+H9_%U;N22TzP0^š{։3-{l;.eR=ky?n^Q)F~,M|(Xݔ6.F(r&C "Eg^a_?NEo$fuR)>ۣmV=PyUwLR8^Ih 3K*g  ypkj'3l#跺T穴`5( 9S߯^PڞEf{q[5<<45{qG]B=!uﱜ)F2"-B3vʳ<Z_1cv䯘[_2Ex- pEN Jݩ1f̹e׆f QzzF C特q}b!*}oZan$i!l3)0k JkY HL3v8Y@Zʎ'Zӑ̲Og|xr:,[ QoIB?Uϻ2"0vr\p qqdL(a S{)̛Ժk嶾hM)?E8d ' B`+._tj†NsWW7)%P Pq6W&AU_/ *ԹcTVv ┇wJq_k1yLF?^Xkm]`+g1M2Jf榤J#վ|G"U\Q#H$0)}drr`ƹE9Xi7S]L†y>wHdn&hSt[ D艟_ݒݙig1ƴ 8ʜeiWZԆ n  !W|V/[[iBY<丗'tUҮH1N)g9ˡz?dIR伢4wЋ/L[W^4$ۻ|2&?cp-Pp;L[AIT:dc̹exWom$A􅶭\V c8B ,ʹ08g=ڰJ;bd6Pt\6[Q/fȈkw^sd7::õ#dn'ͩQz5-qK\h1*f>VV].T #v1M`V?CDD>d(aRشF%:S?tN ⮵CK|S@fzpэz۬˹r:NxL=o-L_V5 ,i ښ(@b%߄?{;Q ^Lv!`@JKO +}tY1*mۦ`Lm^59A/LW+͢|~Ate-IGZ%?c endstream endobj 138 0 obj << /Length1 2296 /Length2 15899 /Length3 0 /Length 17273 /Filter /FlateDecode >> stream xڌp Ƕ3QǶ9ݱmOl[ۜm[ۚ`r{_սUvXQ^(ngLSQaf01201X8[K#W::YKBhAl!(gg v09x9y,LLs|6t01lNpvf~@eL `S lt06:m><Z-c͍ٞƉLflP:]&?RJbn#A0:}ؚR{e#@8f! ? l m=,l@,3ACk'}CWC kC?C7 ~dW~NƎN N2ٚmﳅ#54L\Um-\R C3:ؙXY@؜*??r񲷳~0~|y9Ύ.@313L,F@3 [wph3}3t?&?[̨ .+'CW3ED^lzVV;+'V -_RvQPԀ%o1@?cdyT7X| m,=[+M,\l/Wcmͬ.;DY=*9YqYLL\Vc$d?v=ۙd,CGGC8Ibagx1l !029>9Rv N?(7#.&?b0*8j# dlaalhb7/ A qMM0Hoahߐ#;kkCI|'0|G8|gj/\C_HC{؛_#*[ ~>j,~L̇?a}3J8ӏB89M_c? *ǡGNֆN2?q}0FgsG:ݿ>l ~T_HnmD tY{cǏ9y?n?@;neΘ7ز>S0$z5׊g$dꚬ-^]1{U7ӶF//ޯJ3pXS *BojVm]y.\HOn k!_j8d_gUtJpH `hЮܑrމi|΢YYb~-xnT8ujߣPxHc/yGm/0Q3lyuhJa3Y;pKt40h!f+۟"-КK( >9ҚȹB{x\<9=6݁\o!w]hYFVg9uf?~cB 090|$MVZ{wU\u7yV̋~uTZ qf%Rz]"gnHLIL\c~y *m)ˑiļVv_kK:~=F$&.V`Qa~@"(D$E^|/bT 2iKvU9MxRLYnDb`k;rle}8~_n-oڸ\ֲǨpMT}hP:gcL ^n>|:㷺f -&V$6lNbGZhmZ4S1+M>w{sUg0t{OM3<( Cl̃dY?ScGn y\وڸ nL[]Ha )R^{QPD`وѨOx8Ը[r }~-ND{ekYlLƠ lW.gn?R2rYk;Oώ~j4Kh5fd kf8O I`uuL`i)6ԯ MO(&%yYh /,9{O-SvЇQqAgTA>O=Ƶ1'9Mζl!c3}SLNξ-v "~a6s{j޼XWOTUdqAcH"wUM n8£@g1֑h~TXEkmՋ+Ua+k.@1pؗg,%B⇨dn;xS횩,e6ڑV 9?MpmILu'o*C CU8hjg)|sa4Lyu5CDñۜ ڬWLm˿_>~nP8l▄(!ؒu$I٩E,7Y];2ZǹU#kFMjt5(,]ŮUևMEq֫GU[klmGNd8,V ]򮶎P&EƉ!L5{k 4;stNW?ɻX7HAP0Fm!o@}<#CIdhY*f"+ܪo'5$h𫐣Q=y !`\S ! `د<2IdˡMbcTʣcL ]51̛&/XARPh?F۰@~'%K% ff'<NM.qyILln\K"2f ۪q'Ҙc&ږLJط%H6lN|nS>>C zR'd9khxY2Qe]mj ; ãE$Nߋߴ 4CsD& ĩ+STӸ#%]wo58a$7G5rٟ2Tn,O`á{+fw&TyJ *قeۊ>=ZG&}G,ɹDڽ!kixN 'רƻ6fQSqkOXW^GyiߑS7oyUV 7 ]?>Uo6B?-L;-FR?lCK_k]er5u3AJ2c 5 dA¿l35nulQgf}ϮY#3{j'V; r9xx9nr`xCf Ǹb *FMZ mjyPxlJ$XM'W?BSc{(0ۼյ~LKŽNr(}; vP 1Yq&v%!"L8^ڱ䖗ҁLd6_@I'Kh4CWc`KɅ9:\^UMIl>Wf,@nH֨% tIʬP $7ILs ^iFbd)[vn` ~<>I*u GVA h)Tan`yЖc{G~*Ɨ R{8M)h_atsiJDЊV|*qۧaΓ a *^4:L*"yyLIe4W7}N20 @sζ ˤ<'е=TŘ_ݩbM#wMXUInwrbom]h ~ idcW.`&X W𢧋FDS % jK%_0m2,0,b 3s,cF>ss> "VqRm^|E"͗T%}CksX#tˑ2 0.%8L[8E]6}G[~_\Lv )`! :vG,˯өFcN3isцf v:8($Dm!8n%~H;nۤ0olqW<ٜ|y,5 Cд0u5c-Acl(5rV+Л7[3aj47~d c-K;ibO X˻LtX{"b x?KR9[8S&ۃ:2hϒcjw #.T^\%Э!*o$9 R`I`:&G2|XpS}>q؎`uRBcSt`7&=}N;fy5HVc^̀hjXcWc|)a;(5Y(ٽ]Iq q:mJ;Oxb.1֠# `vSXM .ap2-ʂLZ|or~.^&!ie|[ia:l$\=̘JIuRN#"R*-Q 7h+|"X+Wk2*3&p_Afv%5z^f]Vb JƁeFij5W4?'`A;|#EE «fI32'E{g=F^_鋙je6PQ~c-$I]0fIs_PKł%L l5tҖVaۚL)i)Vf Ykm`6͚慀boK ̿.7NUY肉q.3C NX>;R1j zo:r.h#ҁ}QzriPzh /RMh^2p}΅@;p35E%+X9tyiԕT,'jed')u`;l׊`FpÚг@ zUA\|h'kb6դf_w{aM)<\94k\(I0x\eDbw,)MǺA`eӶ]'-QLփ(8UQK1w?ٙүܦϐ5;<ƖŁ,p M.~8Elkj۴ _NJɜ*O}Fzg^k*2][=B'@Smp;Bm4d:7yO/櫝tSpzgm2)$h fF((Þ25/bN.vC+ױO&?pbd`JVz1Gmi 4AW:*SIMC%[m˾eMMtޒ$DݵCn5>B$tuHLw @ӯeRh8暈TcyG<> gEC)kjŻW9mB@gv=s"c e34xlJi6+L+J2GL猷N`-HY/󈻲U f-!K$ aMa(bo4;pȵr<5l2ʉ(!0X1{yqzN#(So31/V33asL^M'Ԧ}_q[rLվ*Qҝu{ BI)"O~0.@B{x2E%;+U=#n[XҢ\S\!gU`xpOfUyk2Ʃܡwzja~ )CďVS {];ÖW՗ 1]'s (Ub/r%!Ȝo]xHwB= mH`OV+y4%.T7.>^bv1z+\Q,˔Gz`\ B0&o߅/1<)/R!Cϒ*b5j-et0X>Pyodre)&HlVv2Kg!Z0G=W P\H&Kj) i7 žDmpZr&ZXH{!J݌l3gaHNHٯg%/geD4ħ3a !O0^Hwo c+kϛ+opq1Y ϱC}>qĪģėI͝1R`k+gX kRg!vnc!)Ξ՗n*^?@_Q&AIgBOj1-q^ٺ[ Y(ɅT 1Њ>2?ꨣ4r"CD5_*9R՝ fG':\Vp Z~F{?@+_2[@}f8Z Q(]̖[_~N|Ζkc h%px$nˠqhLS3%SWmВ܄TD>DDVB%A&ctsٙ»L:+gA+@ G擕=X"+/}VtT@HNR긒j. bcE}JcY73 wijŶk Ay PӿY8u4R[bn^GZ V~V g?TƳ\5ZCxRZܱ:'N2O!YoDk_T@}#-x>hs mtMlVigE!+*;Uӹ)=PO@rS`%>*ٕta f5kbfZ);Ĝǻ"0|\""?yQ!}X>%D|y<)'w;ѤH<)%Iq]$霨@.VO}=垱JPG5^7J*LϝoO  <|/0 !It1A_xT.+[ez)&2E\!p 4此od(!. zTK9d~gb KT+B ^ W649쀮gp!GvZҦ6my-?賴l.bcc'1z{>>vtS9) VXd uIgT6a;LHg:A)ML=įec+KI?L,}bOw-Cqc_ѧqίgOΫF%TcxZZpδ&m5䡬"Qz 0l|um4|KӮBTB6E K'zFl›Dqi]lr5=-ʋNB/s":,[a.Yef&b=uenA89='~|4:|t(E?U;iWdH -r͈L+Q['Uߐ1W2)xݰtj$j[ k ъ"#lL#U{sڵs=n㤺j5L"(R;VzXK\5Ĩdeɮ}7]2Y9zh@l & 'sLvQӌ[vjKJ69N9aZmsOZtib 7L#\Z[l l{c!58)#IU^!!&|=Td!4aN,q*3D>a{`H~iTa}ƣĜ菛ØmB3*lE NN}zYazziMLy3ZDvsv&өx{ԗvO )Av &Z]a};dkcם_[=p?E}Hn=] L$ gt ҒxU6=39X^.<؎xUvr3AEG2\Y M|<7]%x%+zӞL)\% J{L,∺nv 8ɅrNZ8[M "#ީENlgnW&BwN6h&:|؆"KMR`uDI*GI)JT*'KєݲUHba<=( 鸭s_ZL125|-Ug*dV]?A`kxcEՅrVn AQ &jWqȬ7'ҕHTRe9Į9=eZX?w&F?s;əq*(l XFusHjt8?]]|VIywQխ t E@OOΖ@za?-WqTrݞݩ2!Mү2Qe-Fw,,ESmK ȟ7>Ƙ/gcFq.q*iE4ИAoէ[9_%=a8T5R}A]Ni$F2n]Hb&%l b@rd4uhAncd&pə#ocV>h~ۀMQ=jǖ䇖i`W9SG+f#ƻ/7V? t'X^cj{ Zy a]0s?Kkd-Bp8RD>[SPp?=fA/e;l8ќD:5 eg7$ 믻:'񮷊!_sK_hU62Z)WWƙZ @& +Swid0Mc5 foNBk֪P!-W)#]V%N[(t<[;=A}lo~1WrU4c2[E#ٺ=xCK718VfO ?-F:{D"3Wr[t9UvYq'rb[Xզ|R(.6tq[gt\b@&;%q +V_Es]8)K}j7933;7N>@v2Kh pU&X& LX4vR0Օ޶  oǭS>zC#`iYx7 }lnRͻ ad{V<,9ie Nr^ }ۄ(}̷uY[T|H&s/"#3]9YHLQC502bvDXuuTU7z7qF's+ ChsXLhʈ4+qN fCL,=utTxOG­S. c@1N4kQ^ ^4E 놚܅s;&))գP "Ŋi!'n&^!(_k;Y,8]I/MOu .QO,:*uuøpM4!2a \Pӻ+ѣ=r2wwSf'k?,-r(oO߄_1(6=ɱqr>3Ɨ\816Foa 6X $O*z'R6X*bKlD+T- gFp4 KΆl1 CձTRv35]; ~ru^F7*Dn`ryol=} MUTt zP s[2j-p/=LjMzR)G@Ue( -vKO'g5q緳#H^'ΰǦ{CȜuY99Rf=[ V pDb ӆmqV;n1*#η]ڋ.$rVzNRܦ#Upy|ƻX"$O\2K")gոS>c5ʈ_ecP<1JcZV[y'3$1Fq >H)|3Mwޓ3O+Q9WwYo'}]ON#gNX "YV5븡zPg]n+%Եw0d{tXq|wn+y]EYB 5Pܐ(.[lmWn>u#080:^ Άx잷YUm႙,b/g\@xF_8͔ՒRmhwꎱ{[y#{6rZIF Kv!*9i9Nԫ\tw<_3O `/d2V"8))B-L6ٔrBl 4G|~܆)fv M %HV%6G} *T\mr|@tR'8gRvZ-к#N!"rڬz֧7iiHz@<0XArSa~&UKsgԂ8Z:L 'Vo{5e!mi|06B=T@uHeU/"MRwQ =V\r>CqT-O&sx?[gbK?3Q0Aބ3 ɰHጄGKau"׷"_C[35SD<4\5KvZK[{AyލTFQtXLa/(pdbi2ț1`~'U(7ݔܘL!ZD^|qҥ]6|9mlY8>- 4O 2$<2U4>٢ ^Ɍ_[lRGόߙ(0dl33٧}Bfz{d>DPN홐pyJ(&4^2v%R.؜2CӸB'L! l~MDy]*Iў,а!job;lht=<`$H" Mi& qU?*y`EJsYHb r0W-8diwׄ7* әuvF J {V.C#KVjY閳-˦PBN:&2]r%ϊպq$t-, 6S52%]a$ws+PoˉM_=tQ+^67^ڤ|]*xct*^*MT%;,Ԇ$wxX_2sQ32nEލ/Kaq #S{7T'+n$1ռ-6g_%{{ckL6jᒖ*%~tjOW§)O:cE54 keĐ)yQ& Ϊ8YE5mA Pa+#Aj5,:H>v~HvKR ߴBlKd@C FIhS]_`etWȩo1QK !I:1Kr}$MNRB[I(CTTn.]rhk0~ %ܕsP!^@װVQ?oH Zt5[@̟߯bFuBr|,͹[ls#-rx;P fDBSv3#^ j S}n^rs**6(k_3<ㅤ0doK pZ""°jko_Z.ﲍ y I5Swp{2ov~߿4")dBˈ4þ)ԗ~kO26= r^sY THŮ5qC*&yJ>f!T{`5L"TpUI}bm'N"wfC*QAq7JRl|gn]Xp#qbN;ZwVR,1z3 )J2fW~=I9, !x?tm 0Ԁϡ` ,J'u~XaU9$ 8 djE}^R14|VS4S($RbM*l\7ċ:n4&kVXv"_rh3)Dƴ#L cg4UV4'c3QBr=%MmKrY;8X]緰ëUH JZ3Hń|Ngp~\zTqV^dD%}dP ~ʠ[ ڦ0zT=8-dc;1"1u}9֠\ *q bibЬi–w£O<1JI\ # u޲|&/䱥r'_˦BLrK&,B#Rv~$1bϠ6RxU[ Z `"9;JiKe.P343ѢŇA-m۹ E7lQ.#v8oPP.&O)!!e|ߵ!liJEW5 ϝtI)/4||uGƹ=68fڥO8DSlU{$PeZ7VWNv:2XyAagZ$G OI_ltlQ"rzNRҖ!F‰S>qڍ%CQIr$ԨzȚE{o7Hs5SEPl&+p^ W>hEE듙wjMpaGnWK\tz=;}k#L(KOL Éc$-`I:#kL~YZF\fG)t{6NZdV?#%oDYrPD~꜕IҒҒh }̾t5w{#§D#-C0KŁ eO]NBn]Ⱥb2Y=@ౌ7_z Je" F+a R2hmñ>ȰZ`4J$./"<*n_Bu||FC dB6mhwk8h|u%RL+2P81B [P}`5RvS'bYNwvqC𴝸HB$ќG K/ nI|Vab'q>Ҙbg7f -BL:l 3 y 8\">?P 2|#()X?­ ܃E ѫ>9x\8.}5  2l,*F[9Ǵ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 822 /Length 4095 /Filter /FlateDecode >> stream x[sǗ~_1߶_m -!mYr$>߾9=FXwCROOsΥg*d _xYBY[(Yh e h*:.Fy*҃XB"D[X$4VI j "a,/3X;G]EukP%i89l -# i:V ,-taqoc*@鰄Æ.ՃYރ?i Oc-b7Xx\SJ+;+ z1dxm/)0AWkq(~,L` lie ,`-EY\fGNHEW8 )u4"6)͇(.A y b t0֍vVlAHX`4 @z}F ,PCEV =h@3iy$r02Ēޱ< c ϊPnh 34Jt"pB`etE2=fX =mI [zJ [*Q5dquzyyt4*ê7폆,_ uUOSsI\UtI+Sj|7<ˋoWx1OϺl ZtM*0s5>X,uNi&U6NZ7/ӏ4ٳ8*~ꈝpZ #vA5]{ՄbU[H6%2ZUuX;L||A;/6_\| |Y▗OS?wh|Z/Q"^`Ǐ$HoZ|1Rx%uRtV^Z^j0QXA)-|pJ4~+ɗmf[:xwYٯgewث_~oq\%M0 $)ɹ!G2`[ ѯL\([Mׇ@|D~vJ4hWRA)61T.eijftUGG9CVK+:XP v%* 6z0F3e>cULye|ɵ^ TۺY>cz$e!o|lXnmr"vdf8LHFuPފ_F)I%.!$N~J %һAQ?N{:ϔ%=(ANm>8f̊8M)@l8̬sl(lc_uFo zw?-TjSKB77k7:+}PՊ7R@0+KuVz0X\*fXzq-]I1LcvTe,[b"9SFB) Q^ilZl={-~% +t1^Qυ?Pq=TJIKU}V-2_ar~0a^NDo4<}zٝ SI|8*=ϖީVL/^5)Eڗ^R;6~Z1vٔYpM8xq}ml)^G`n3\?vwW;2)v'N) %LYTVo{밹u,]kWo8-{!cI1Ť$.ɴ<^^sIN2!2@8A "# ~y8/L7mn4mI)6Km6ym6d {~,Q$LgHaų H'y x-~?4E\#C䝚wEtwVkW$%6"H,ZDd$ ЦHօ1xf%;Jz/ @ )6d;cIh(( C΁K}G~fNBOY$+:Tq 1F3x@+&`!p3j9`¢?rFR=@PԛsdC9#"RDž+-iαEb_8$`,g\z)$Z-AqO}fЊU-+8iĩ 3lY;EF xeHH;I2[Kض1`)J\&ՔA9s}>hpգFe1FH5l:SXv븵S>R(ibBR]u$H},̑C jmeZQ$xn4l}F&\Ϸ/ x;yF=kDc8-Sg ó񔀠Ijj34y$p լXu lL9q MB]īki;dJnS\.FM͵SY ޛ2-XsjsTle櫩^Omd'3LafХSZi][ŀڧN/' hDհPפjE5'[ ]`j:d \4+ h.c~ 29wX>4z.8'.iu %Bq2VYg_#dee:AQX⸷" .A焰9l 4X !&^=&qj:Weoj7$Ia36zuT)gIUAwӽ_6]SE_M~okx> ,8.O|;]= 1qIlmB,^7b_Cq"h0SQ3qvg/莮\\,R HWո?:c1S1W~kE|="1dC4fgw-inPg7Q4ךZB?ceY(POvߝ@D"%+k^deS$n؂?V?tWlebjmg)sth/{ج;`l./@y5n\Ũ_Gݣ,wÚ$6Ďbed7ې͜V)&rqSTvsYaU=m1BoKAlfJ𲢺Xǐ="ZTn#U>;GfmtVzBvhlRlWIVipZ uY!V jXKfi_gŒ})?}O߂P۝h[tz1|7 URh2b>ݍec{wOqzupCUfWN;w<'/dR endstream endobj 150 0 obj << /Producer (pdfTeX-1.40.20) /Author(Georgi N. Boshnakov)/Title(Brief guide to R package cvar)/Subject()/Creator(LaTeX with hyperref)/Keywords(expected shortfall, ES, CVaR, VaR, value at risk) /CreationDate (D:20221103093018Z) /ModDate (D:20221103093018Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) kpathsea version 6.3.1) >> endobj 140 0 obj << /Type /ObjStm /N 25 /First 196 /Length 914 /Filter /FlateDecode >> stream xڝ[o: +`8d]lÀIu/Q[q`+%>2 DGJlƁ$@ Ccx0 B@(0&!c`(:z,F @r_"'/:Q 05@C) %*9@( @PB@ A 8aQR拉2?;ސZ_rVd+ŵ>+JFt'pJ"k/Ӊ8;؁ c|`:3-jM = İvƚ}|e2QqZҥ)/v2Zxܔ}d8 ^9wq/,8v=><H4w(vy y7\:MϪ$_# mipf.].Z JjwEt UP_E4Nv1W a*9fziQyU]F.Oqre;WrµK L"On\. IO_.U>gBYczkզ-X,_If|Dt;2iXoTaVk ׿Vh|)],L0NqFOi~7{Q!5Uo X%.V~1˰*5]2]٬:fH8tY@H684`z#t&&f'Vxj֪޵wGS#s\{eȲq19rKښR)վc6 =Ta":T41։{mUfZ!hf+kWlt?{ՕsBPmsOJWjyi@w?$"p endstream endobj 151 0 obj << /Type /XRef /Index [0 152] /Size 152 /W [1 3 1] /Root 149 0 R /Info 150 0 R /ID [<762129B599EF7871253DCC0A49A7F867> <762129B599EF7871253DCC0A49A7F867>] /Length 398 /Filter /FlateDecode >> stream x;OTQ6rQ@0xAqFeE;8޹XY7?jcH 5 )!D'YYffY0?֍t@