On Thursday 27 July 2006 08:35, Diethelm Wuertz wrote:
Brian G. Peterson wrote:
Has anyone done any work on Modified Cornish-Fisher VaR calculations in R?
----------------- YES ---------------------- You can download R-functions and Description PDF from http://www.itp.phys.ethz.ch/econophysics/favre/ WARNING - UNTESTED and not part of official Rmetrics !!!!! Diethelm Wuertz
Thank you to everyone who responded to this thread. The file provided by
Prof. Wuertz was an excellent starting point. I've corrected a small
calculation error, and added some type checking and other bits to the
function. I've attached the modified .R file here which implements a
Modified Cornish-Fisher VaR calculation. Interested persons can now
consider this updated function as tested and working. I'll post again as
we get the co-moment calculations for co-kurtosis and co-skewness
working.
Regards,
- Brian
Brian G. Peterson wrote:
The limitations of VaR in modeling of risk for non-normal distributions have been known for quite some time, and this approach seems to hold some value over other approaches already implemented in RMetrics like Conditional VaR. I'm trying to replicate the calculation as laid out in: Favre, Laurent, and Jose-Antonio Galeano. ?Mean-Modified Value at Risk Optimization with Hedge Funds.? The Journal of Alternative Investments, 5 (2002), pp. 21-25. and presented in a different form in an earlier paper: Fallon, William. "Calculating Value-at-Risk" Working Paper, Wharton, 1996. Both of these papers rely on calculating traditional VaR (as is done with fPortfolio.VaR() from the RMetrics package) and then using a Cornish-Fisher Expansion for skew (both papers) or skew and kurtosis (Favre 2002) (as is done using the fBasics.skewness() and fBasics.kurtosis() functions from RMetrics) I'm wondering if anyone has already replicated this work in R, and could provide a pointer, or alternately if some of the more experienced people on this list could render an opinion on which of the Cornish-Fisher functions in the core R stats package might be appropriate for this kind of analysis. I would like to implement and share a function for Modified Cornish-Fisher VaR, so any assistance would be greatly appreciated. Regards, - Brian
_______________________________________________ R-SIG-Finance at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance
-------------- next part --------------
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU Library General
# Public License along with this library; if not, write to the
# Free Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
# Copyright 1999-2003 Diethelm Wuertz for this R-port
################################################################################
# FUNCTION:
# annualizedMean
# annualizedVolatility
# annualizedSkewness
# annualizedKurtosis
# maxDrawdown
# timeUnderWater
# maxMonthlyLoss
# modifiedVaR
# monthlySharpeRatio
# skewnesskurtosisPrice
################################################################################
################################################################################
# The following functions are implemented from Extreme Metrics
# These are the risk measures implemented in the hedge fund
# software from www.AlternativeSoft.com
# See, "ExtremeMetrics Software", Help Document, Alternative Software,
# March 2003, 4 pages.
# All returns are assumed to be on a monthly scale!
# The argument r is the monthly return time series !
annualizedMean =
function(r)
{ # A function implemented by Diethelm Wuertz
# Description:
# FUNCTION:
# Mean of Monthly Returns
result = (1 + mean(r))^12 - 1
# Return Value:
result
}
# ------------------------------------------------------------------------------
annualizedVolatility =
function(r)
{ # A function implemented by Diethelm Wuertz
# Description:
# FUNCTION:
# Standard deviation of Monthly Returns:
result = sqrt(var(r))
# Return Value:
result
}
std =
function(r)
{ # A function implemented by Diethelm Wuertz
# NOTE: std function is listed in the doc for fBasics, but not implemented
# Standard deviation of Monthly Returns:
result = sqrt(var(r))
# Return Value:
result
}
# ------------------------------------------------------------------------------
annualizedSkewness =
function(r)
{ # A function implemented by Diethelm Wuertz
# Description:
# FUNCTION:
# Skewness of Monthly Returns:
# [Skewness is part of the fBasics library]
result = skewness(r)
# Return Value:
result
}
# ------------------------------------------------------------------------------
annualizedKurtosis =
function(r)
{ # A function implemented by Diethelm Wuertz
# Description:
# FUNCTION:
# Excess Kurtosis of Monthly Returns:
# [Excess Kurtosis is part of the fBasics library]
result = kurtosis(r)
# Return Value:
result
}
# ------------------------------------------------------------------------------
maxDrawdown =
function(r)
{ # A function implemented by Diethelm Wuertz
# Description:
# FUNCTION:
# Maximum Drawdon of the Return Series
result = NA
# Return Value:
result
}
# ------------------------------------------------------------------------------
timeUnderWater =
function(r)
{ # A function implemented by Diethelm Wuertz
# Description:
# FUNCTION:
# Maximum time under water:
NA
# Return Value:
result
}
# ------------------------------------------------------------------------------
maxMonthlyLoss =
function(r)
{ # A function implemented by Diethelm Wuertz
# Description:
# FUNCTION:
result = min(r)
# Return Value:
result
}
# ------------------------------------------------------------------------------
modifiedVaR =
function(r, modified = TRUE, p=0.99, column=1)
{ # A function implemented by Diethelm Wuertz,
# function completed/debugged by Brian G. Peterson
# Description:
# The limitations of mean Value-at-Risk are well covered in the literature.
# Laurent Favre and Jose-Antonio Galeano published a paper in the
# Fall 2002, volume 5 of the Journal of Alternative Investment,
# "Mean ?modified Value-at-Risk optimization With Hedge Funds",
# that proposed a modified VaR calculation that takes the higher moments
# of non-normal distributions (skewness, kurtosis) into account, and
# collapses to standard mean-VaR if the return stream follows a
# standard distribution.
# This measure is now widely cited and used in the literature,
# and is usually referred to as "Modified VaR" or "Modified Cornish-Fisher VaR"
# Diethelm Wuertz's original function was called monthlyVaR, but did not
# contain the required modifications to get to a monthly number. I have converted
# it to modifiedVaR, and made the assumption of p=0.99, with an option for p=0.95 and
# a collapse to normal mean VaR.
# FUNCTION:
# NOTE: see the data type conditionals in 'cov' and replicate here
if (class(r) == "matrix") {
r = r[, column]
warning("Column ", column, colnames(r)[,column], " of matrix used")
}
if (class(r) == "data.frame") {
r = r[, column]
warning("Column ", column, colnames(r)[,column], " of data.frame used")
}
if (class(r) == "timeSeries") {
r = r at Data[, column]
warning("Column ", column, colnames(r)[,column], " of timeSeries used")
}
if (!is.numeric(r)) stop("The selected column is not numeric")
r = as.vector(r)
if ( p == 0.95 ) {
zc = -1.96 #95% probability
}
if ( p == 0.99 ) {
zc = -2.33 #99% probability
}
#} else {
# #some function here to compute zc with arbitrary p
#}
if (modified) {
s = colSkewness(r) #use regular skewness and kurtosis fn if data.frame is converted to matrix?
k = colKurtosis(r) #to compute excess kurtosis
Zcf = zc + (((zc^2-1)*s)/6) + (((zc^3-3*zc)*k)/24) + (((2*zc^3)-(5*zc)*s^2)/36)
result = mean(r) - (Zcf * sqrt(var(r)))
} else {
# should probably add risk-free-rate skew here?
result = mean(r) - (zc * sqrt(var(r)))
}
# Return Value:
result
}
monthlyVaR =
function(r, modified = FALSE)
{
# stub function to preserve the original syntax in the port of ExtremeMetrics
result = modifiedVaR(r, modified)
# Return Value:
result
}
# ------------------------------------------------------------------------------
monthlySharpeRatio =
function(r, modified=FALSE)
{ # A function implemented by Diethelm Wuertz
# Description:
# FUNCTION:
if (modified) {
result = mean(r)/monthlyVaR(r, modified = TRUE)
} else {
result = mean(r)/sqrt(var(r))}
# Return Value:
result
}
# ------------------------------------------------------------------------------
skewnesskurtosisPrice =
function(r)
{ # A function implemented by Diethelm Wuertz
# Description:
# FUNCTION:
result = mean(r) *
( monthlyVaR(r, modified = TRUE) / monthlyVaR(r, modified = FALSE) - 1 )
# Return Value:
result
}
################################################################################