[Uwgarp-commits] r221 - in pkg/GARPFRM: . R data demo man sandbox
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Sat Feb 7 18:16:00 CET 2015
Author: rossbennett34
Date: 2015-02-07 18:16:00 +0100 (Sat, 07 Feb 2015)
New Revision: 221
Added:
pkg/GARPFRM/man/impliedVolBS.Rd
pkg/GARPFRM/man/spotForwardRates.Rd
pkg/GARPFRM/man/vasicekPrice.Rd
pkg/GARPFRM/man/yieldCurveVasicek.Rd
pkg/GARPFRM/sandbox/CAPM_TF.R
pkg/GARPFRM/sandbox/GARPFRM_Outline.Rmd
Removed:
pkg/GARPFRM/data/.Rapp.history
pkg/GARPFRM/demo/CAPM_TF.R
pkg/GARPFRM/demo/WebApplications.R
pkg/GARPFRM/man/Modified.bondDuration.Rd
pkg/GARPFRM/man/plot.loadings.Rd
Modified:
pkg/GARPFRM/NAMESPACE
pkg/GARPFRM/R/discountFactorArbitrage.R
pkg/GARPFRM/R/options.R
pkg/GARPFRM/R/riskMetricsAndHedges.R
pkg/GARPFRM/demo/00Index
pkg/GARPFRM/demo/DelineatingEfficientPortfolios.R
pkg/GARPFRM/demo/EWMA.R
pkg/GARPFRM/man/CAPM.Rd
pkg/GARPFRM/man/EWMA.Rd
pkg/GARPFRM/man/PCA.Rd
pkg/GARPFRM/man/backtestVaR.GARCH.Rd
pkg/GARPFRM/man/backtestVaR.Rd
pkg/GARPFRM/man/bondConvexity.Rd
pkg/GARPFRM/man/bondDuration.Rd
pkg/GARPFRM/man/bondFullPrice.Rd
pkg/GARPFRM/man/bondPrice.Rd
pkg/GARPFRM/man/bondSpec.Rd
pkg/GARPFRM/man/bondYTM.Rd
pkg/GARPFRM/man/bootCor.Rd
pkg/GARPFRM/man/bootCov.Rd
pkg/GARPFRM/man/bootES.Rd
pkg/GARPFRM/man/bootFUN.Rd
pkg/GARPFRM/man/bootMean.Rd
pkg/GARPFRM/man/bootSD.Rd
pkg/GARPFRM/man/bootSimpleVolatility.Rd
pkg/GARPFRM/man/bootStdDev.Rd
pkg/GARPFRM/man/bootVaR.Rd
pkg/GARPFRM/man/chartSML.Rd
pkg/GARPFRM/man/compoundingRate.Rd
pkg/GARPFRM/man/computeGreeks.Rd
pkg/GARPFRM/man/discountFactor.Rd
pkg/GARPFRM/man/efficientFrontier.Rd
pkg/GARPFRM/man/efficientFrontierTwoAsset.Rd
pkg/GARPFRM/man/endingPrices.Rd
pkg/GARPFRM/man/estimateLambdaCor.Rd
pkg/GARPFRM/man/estimateLambdaCov.Rd
pkg/GARPFRM/man/estimateLambdaVol.Rd
pkg/GARPFRM/man/forecast.Rd
pkg/GARPFRM/man/forecast.uvEWMAvol.Rd
pkg/GARPFRM/man/forecast.uvGARCH.Rd
pkg/GARPFRM/man/getAlphas.Rd
pkg/GARPFRM/man/getBetas.Rd
pkg/GARPFRM/man/getCor.Rd
pkg/GARPFRM/man/getCov.Rd
pkg/GARPFRM/man/getEstimate.Rd
pkg/GARPFRM/man/getFit.Rd
pkg/GARPFRM/man/getLoadings.Rd
pkg/GARPFRM/man/getSpec.Rd
pkg/GARPFRM/man/getStatistics.Rd
pkg/GARPFRM/man/getVaREstimates.Rd
pkg/GARPFRM/man/getVaRViolations.Rd
pkg/GARPFRM/man/getWeights.Rd
pkg/GARPFRM/man/hypTest.Rd
pkg/GARPFRM/man/impliedVolatility.Rd
pkg/GARPFRM/man/is.bond.Rd
pkg/GARPFRM/man/linearHedge.Rd
pkg/GARPFRM/man/minVarPortfolio.Rd
pkg/GARPFRM/man/monteCarlo.Rd
pkg/GARPFRM/man/optionSpec.Rd
pkg/GARPFRM/man/optionValue.Rd
pkg/GARPFRM/man/plot.EWMA.Rd
pkg/GARPFRM/man/plot.PCA.Rd
pkg/GARPFRM/man/plot.backtestVaR.Rd
pkg/GARPFRM/man/plot.capm_mlm.Rd
pkg/GARPFRM/man/plot.capm_uv.Rd
pkg/GARPFRM/man/plot.efTwoAsset.Rd
pkg/GARPFRM/man/plot.efficient.frontier.Rd
pkg/GARPFRM/man/plot.uvGARCH.Rd
pkg/GARPFRM/man/plotEndingPrices.Rd
pkg/GARPFRM/man/portReturnTwoAsset.Rd
pkg/GARPFRM/man/portSDTwoAsset.Rd
pkg/GARPFRM/man/realizedCor.Rd
pkg/GARPFRM/man/realizedCov.Rd
pkg/GARPFRM/man/realizedVol.Rd
pkg/GARPFRM/man/rollCor.Rd
pkg/GARPFRM/man/rollCov.Rd
pkg/GARPFRM/man/rollSD.Rd
pkg/GARPFRM/man/rollSimpleVolatility.Rd
pkg/GARPFRM/man/simpleVolatility.Rd
pkg/GARPFRM/man/tangentPortfolio.Rd
pkg/GARPFRM/man/uvGARCH.Rd
pkg/GARPFRM/man/ytmSolve.Rd
Log:
major cleanup of code and documentation for R CMD check
Modified: pkg/GARPFRM/NAMESPACE
===================================================================
--- pkg/GARPFRM/NAMESPACE 2015-02-07 16:24:38 UTC (rev 220)
+++ pkg/GARPFRM/NAMESPACE 2015-02-07 17:16:00 UTC (rev 221)
@@ -1,4 +1,4 @@
-# Generated by roxygen2 (4.0.1): do not edit by hand
+# Generated by roxygen2 (4.1.0): do not edit by hand
S3method(forecast,uvEWMAvol)
S3method(forecast,uvGARCH)
@@ -73,6 +73,7 @@
export(getVaRViolations)
export(getWeights)
export(hypTest)
+export(impliedVolBS)
export(impliedVolatility)
export(is.bond)
export(linearHedge)
Modified: pkg/GARPFRM/R/discountFactorArbitrage.R
===================================================================
--- pkg/GARPFRM/R/discountFactorArbitrage.R 2015-02-07 16:24:38 UTC (rev 220)
+++ pkg/GARPFRM/R/discountFactorArbitrage.R 2015-02-07 17:16:00 UTC (rev 221)
@@ -1,285 +1,290 @@
-# Ch 6 Prices, Discount Factors, and Arbitrage (Law of one Price)
-# The Cash Flows from Fixed-Rate Government Coupon Bonds, Discount Faors, Law of One Price
-# Arbitrage opportunity: trade that generates profits without any chance of losing money.
-# If there is a deviation from the law of one price, there exists an arbitrage opportunity.
-# In order to estimate the discount factor for a particular term gives the value today,
-# or the present alue of one unit of currency to be received at the end of that term.(Pg.129)
-
-#' Constructor for bond specification
-#'
-#' Created a bond object \code{bond.spec} with data for bond specification.
-#'
-#' @param time vector of sequence of coupon payments in years
-#' @param face face value of bond
-#' @param m compounding frequency
-#' @param couponRate rate the coupon pays
-#' @return a \code{bond} object with the bond data used for pricing
-#' @examples
-#' time = seq(from=0.5, to=2, by=0.5)
-#' bond = bondSpec(time, face=100, m=2, couponRate = 0.0475)
-#' @author Thomas Fillebeen
-#' @export
-bondSpec = function(time=seq(from=0.5,to=2,by=0.5), face=100, m=2, couponRate=0.01){
- if(!all(diff(time) == (1/m))) stop("misspecification of sequence of time and compounding frequency")
- bond = list()
- bond$m = m
- bond$couponRate = couponRate
- bond$face = face
- bond$time = time
- class(bond) = c("bond.spec", "bond")
- return(bond)
-}
-
-#' To determine if user is specifying bond parameters correctly
-#'
-#' @param object a capm object created by \code{\link{bond.spec}}
-#' @author TF
-#' @export
-is.bond = function(object){
- inherits(object, "bond.spec")
-}
-
-#' Estimate price of bond
-#'
-#' This function calculates the price of a fixed rate coupon bond given the
-#' discount curve and bond data. First it converts the discountCurve into CF
-#' @param bond a \code{bondSpec} object
-#' @param discountCurve vector of discount rates
-#' @return price of the bond
-#' @examples
-#' time = seq(from=0.5, to=2, by=0.5)
-#' bond = bondSpec(time, face=100, m=2, couponRate = 0.0475)
-#' DF = rbind(0.968,0.9407242,0.9031545,0.8739803)
-#' price = bondPrice(bond,DF)
-#' @author Thomas Fillebeen
-#' @export
-bondPrice = function(bond, discountCurve){
- if(!is.bond(bond)) stop("bond must be an object of class 'bond'")
- # Number of periods in discount curve
- nDC <- length(discountCurve)
- m <- bond$m
- couponRate <- bond$couponRate
- face <- bond$face
- time <- bond$time
-
- couponAmount <- face * couponRate / m
- cashflows <- rep(couponAmount, nDC)
- cashflows[nDC] <- couponAmount + face
- price <- sum(cashflows * discountCurve)
- return(price)
-}
-
-#' Estimate discountFactor
-#'
-#' This function calculates the discountFactor (DF) given price
-#' and cashFlows.
-#' @param price of a bond
-#' @param cashFlow of a bond
-#' @return discount factors
-#' @examples
-#' cashFlow = rbind(c(100+(1+1/4)/2,0,0),c((4 +7/8)/2,100+(4+7/8)/2,0),c((4+1/2)/2,(4+1/2)/2,100+(4+1/2)/2))
-#' # Created Price of the bond
-#' price = matrix(c(100.550, 104.513, 105.856), ncol=1)
-#' DF = discountFactor(price, cashFlow)
-#' @author Thomas Fillebeen
-#' @export
-discountFactor = function(price, cashFlow){
- DF = solve(cashFlow) %*% price
- return(DF)
-}
-
-#' bondFullPrice
-#'
-#' Estimate price of bond w/ acrrued interest
-#' The present value of a bond's cash flows should be equated or
-#' compared with its full price, with the amount a pruchaser actually
-#' pays to purchase those cash flows. The flat price is p, accrued
-#' interest is AI, the present value of the cash flows by PV, and the
-#' full price by P:
-#' P=p+AI=PV
-#'
-#' This function calculates the price of a fixed rate coupon bond given coupon rate, yield,
-#' compoundPd, cashFlowPd, face value, previous coupon date, next coupon date.
-#' @param bond is a bondSpec object created by \code{\link{bondSpec}}
-#' @param yield is the yield on the bond
-#' @param cashFlowPd cash flow period
-#' @param t0 previous coupon date
-#' @param t1 next coupon period
-#' @param currentDate current date
-#' @examples
-#' t0 = as.Date("2013-08-15")
-#' t1 = as.Date("2014-02-15")
-#' tn = as.Date("2013-10-04")
-#' currentDate = tn
-#' bond = bondSpec(face=100, m=2, couponRate = 0.0475)
-#' y1 = 0.00961
-#' bondFullPrice(bond, y1, 8, t0, t1, tn)$clean
-#' bondFullPrice(bond, y1, 8, t0, t1, tn)$dirty
-#' bondFullPrice(bond, y1, 8, t0, t1, tn)$accruedInterest
-#' @return price of the bond: clean, dirty and accrued interest
-#' @author Thomas Fillebeen
-#' @export
-bondFullPrice = function(bond, yield, cashFlowPd, t0, t1, currentDate){
- compoundPd = bond$m
- face = bond$face
- couponRate = bond$couponRate
- # Apply a general dayCount (weekend included)
- d1 = as.numeric(t1-currentDate)
- d2 = as.numeric(t1-t0)
- # Initialize
- tmp = 0
-
- #Will go through the loop only if the number of cashFlow periods are at least 2
- if (cashFlowPd > 1){
- for(k in 1:(cashFlowPd-1)){
- tmp = tmp + ((couponRate / compoundPd * face) / ((1 + yield/compoundPd)^k))
- }
- }
- # Calculate dirty price based on partial periods formula
- dirtyP = (1 / ((1 + yield / compoundPd)^(d1/d2))) * (couponRate / compoundPd * face + tmp + face / ((1 + yield/compoundPd)^(cashFlowPd-1)))
- # Calculate accruedInterest
- aiDays = as.numeric(currentDate-t0)
- couponDays = as.numeric(t1-t0)
- ai = couponRate / compoundPd * face * aiDays / couponDays
- cleanP = dirtyP - ai
- return(list(dirty=dirtyP, clean=cleanP, accruedInterest=ai))
-}
-
-#' Estimate continuously conpounding rate to be used in term structure
-#'
-#' This function calculates the continuously compounding rate given an initial dataset
-#' with specific format, date of reference coumpounding frequency, and face value
-#' @param dat is a dataset with cusip, issueDate, MaturityDate, Name, Coupon, Bid/Ask
-#' @param intialDate is the date when the estimation should be conducted: date of reference
-#' @param m compounding frequency
-#' @param face face value
-#' @return continuously compounding rates
-#' @author Thomas Fillebeen
-#' @export
-compoundingRate = function(dat, initialDate=as.Date("1995-05-15"), m, face=100){
- # Convert the dates to a date class
- dat[, "IssueDate"] = as.Date(dat[, "IssueDate"], format="%m/%d/%Y")
- dat[, "MaturityDate"] = as.Date(dat[, "MaturityDate"], format="%m/%d/%Y")
- # Convert the coupon column to a numeric
- # Vector of prices
- price = (dat[, "Bid"] + dat[, "Ask"]) / 2
-
- # Generate cash flow dates for each bond
- bondData = list()
- for(i in 1:nrow(dat)){
- maturityDate = dat[i, "MaturityDate"]
- # Intialize a new list for every price, coupon, coupon date.
- bondData[[i]] = list()
- # Store price and the number of the coupon
- bondData[[i]]$price = price[i]
- bondData[[i]]$coupon = dat[i, "Coupon"]
- # Remove initialDate
- tmpSeq <- seq(from=initialDate, to=maturityDate, by="3 months")
- bondData[[i]]$couponDates = tmpSeq[-1]
- tmpDates = bondData[[i]]$couponDates
- tmpCoupons = vector("numeric", length(tmpDates))
- for(j in 1:length(tmpDates)){
- tmpCoupons[j] = bondData[[i]]$coupon / m * face
- if(j == length(tmpDates)){
- tmpCoupons[j] = face + bondData[[i]]$coupon / m * face
- }
- }
- bondData[[i]]$cashFlow = tmpCoupons
- }
- # Create a matrix of cash flows
- CF = matrix(0, length(price), length(price))
- # Populate the CF matrix
- for(i in 1:nrow(CF)){
- tmp = bondData[[i]]$cashFlow
- index = 1:length(tmp)
- CF[i, index] = tmp
- }
- # Utilize the discountFactor function
- DF = discountFactor(price,CF)
-
- dates = bondData[[nrow(dat)]]$couponDates
- years = vector("numeric", length(dates))
- for(i in 1:length(years)){
- years[i] = (as.numeric(strftime(dates[i], "%Y")) + as.numeric(strftime(dates[i], "%m"))/12) - (as.numeric(strftime(initialDate, "%Y")) + as.numeric(strftime(initialDate, "%m"))/12)
- }
- # Calculate continuously compounded rates from discount factors
- ccRate = vector("numeric", length(years))
- for(i in 1:length(ccRate)){
- ccRate[i] = - log(DF[i]) / years[i]
- }
- rate = list()
- rate$years = years
- rate$ccRate = ccRate
- return(rate)
-}
-
-#' Estimate spot and forward rates
-#'
-#' This function calculates the forward or forward rates given an discount factors
-#' and time increments
-#' @param time increments of time when discount factors are estimated
-#' @param DF discount factor for during time increments
-#' @examples
-#' DF = c(0.996489, 0.991306, 0.984484, 0.975616, 0.964519)
-#' time = seq(from=0.5, to=2.5, by=0.5)
-#' rates = spotForwardRates(time,DF)
-#' rates
-#' @author Thomas Fillebeen
-#' @export
-spotForwardRates = function(time, DF){
- if(length(time) != length(DF)) stop("both time and DF parameter need to be of the same length")
-spotRates = matrix(0,length(time),1)
-for(i in 1:(length(time))){
- spotRates[i] = (2-2*DF[i]^(1/(2*time[i]))) / DF[i]^(1/(2*time[i]))
-}
-
-forwardRates = matrix(0,length(time),1)
-forwardRates[1] = spotRates[1]
-for(j in 1:(length(time)-1)){
- forwardRates[j+1] = (DF[j]/DF[j+1] - 1) *2
-}
-rates = cbind(spotRates, forwardRates)
-colnames(rates)= cbind("Spot","Forward")
-return(rates)
-}
-
-### Modelling a Zero-Coupon Bond (ZCB)
-#' There are three main types of yield curve shapes: normal, inverted and flat (or humped)
-#' Estimate Vasicek zero-coupon bond to be used in term structure
-#'
-#' This function calculates the Vasicek Price given an initial data calibration
-#' The function is a subfunction for yieldCurveVasicek
-#' @param r initial short rate
-#' @param k speed of reversion parameter
-#' @param theta long-term reversion yield
-#' @param sigma randomness parameter. Modelled after Brownan Motion
-#' @return t length of time modelled for
-#' @author Thomas Fillebeen
-#' @export
-vasicekPrice = function(r, k, theta, sigma, maturity){
- mean = (1/k)*(1 - exp(-maturity*k))
- variance = (theta - sigma^2/(2*k^2))*(maturity - mean) + (sigma^2)/(4*k)*mean^2
- price = exp(-variance - mean*r)
- return(price)
- }
-
-#' Estimate Vasicek zero-coupon yield
-#'
-#' This function calculates the Vasicek yield given an initial data calibration
-#' @param r initial short rate
-#' @param k speed of reversion parameter
-#' @param theta long-term reversion yield
-#' @param sigma randomness parameter. Modelled after Brownan Motion
-#' @return t length of time modelled for
-#' @author Thomas Fillebeen
-#' @export
-yieldCurveVasicek = function(r, k, theta, sigma, maturity){
- n = length(r)
- yield = matrix(0, maturity, n)
- for(i in 1:n){
- for(t in 1:maturity){
- yield[t,i] = -log(vasicekPrice(r[i], k, theta, sigma, t))/t
- }
- }
- return(yield)
+# Ch 6 Prices, Discount Factors, and Arbitrage (Law of one Price)
+# The Cash Flows from Fixed-Rate Government Coupon Bonds, Discount Faors, Law of One Price
+# Arbitrage opportunity: trade that generates profits without any chance of losing money.
+# If there is a deviation from the law of one price, there exists an arbitrage opportunity.
+# In order to estimate the discount factor for a particular term gives the value today,
+# or the present alue of one unit of currency to be received at the end of that term.(Pg.129)
+
+#' Constructor for bond specification
+#'
+#' Create a bond specification.
+#'
+#' @param time vector of sequence of coupon payments in years
+#' @param face face value of bond
+#' @param m compounding frequency
+#' @param couponRate rate the coupon pays
+#' @return a \code{bond} object with the bond data used for pricing
+#' @examples
+#' time = seq(from=0.5, to=2, by=0.5)
+#' bond = bondSpec(time, face=100, m=2, couponRate = 0.0475)
+#' @author Thomas Fillebeen
+#' @export
+bondSpec = function(time=seq(from=0.5,to=2,by=0.5), face=100, m=2, couponRate=0.01){
+ if(!all(diff(time) == (1/m))) stop("misspecification of sequence of time and compounding frequency")
+ bond = list()
+ bond$m = m
+ bond$couponRate = couponRate
+ bond$face = face
+ bond$time = time
+ class(bond) = c("bond.spec", "bond")
+ return(bond)
+}
+
+#' To determine if user is specifying bond parameters correctly
+#'
+#' @param object a bond specification object created by \code{\link{bondSpec}}
+#' @author Thomas Fillebeen
+#' @export
+is.bond = function(object){
+ inherits(object, "bond.spec")
+}
+
+#' Estimate price of bond
+#'
+#' This function calculates the price of a fixed rate coupon bond given the
+#' discount curve and bond data. First it converts the discountCurve into CF
+#' @param bond a \code{bondSpec} object
+#' @param discountCurve vector of discount rates
+#' @return price of the bond
+#' @examples
+#' time = seq(from=0.5, to=2, by=0.5)
+#' bond = bondSpec(time, face=100, m=2, couponRate = 0.0475)
+#' DF = rbind(0.968,0.9407242,0.9031545,0.8739803)
+#' price = bondPrice(bond,DF)
+#' @author Thomas Fillebeen
+#' @export
+bondPrice = function(bond, discountCurve){
+ if(!is.bond(bond)) stop("bond must be an object of class 'bond'")
+ # Number of periods in discount curve
+ nDC <- length(discountCurve)
+ m <- bond$m
+ couponRate <- bond$couponRate
+ face <- bond$face
+ time <- bond$time
+
+ couponAmount <- face * couponRate / m
+ cashflows <- rep(couponAmount, nDC)
+ cashflows[nDC] <- couponAmount + face
+
+ price <- sum(cashflows * discountCurve)
+ return(price)
+}
+
+#' Estimate discountFactor
+#'
+#' This function calculates the discountFactor (DF) given price
+#' and cashFlows.
+#' @param price of a bond
+#' @param cashFlow of a bond
+#' @return discount factors
+#' @examples
+#' cashFlow = rbind(c(100+(1+1/4)/2,0,0),c((4 +7/8)/2,100+(4+7/8)/2,0),c((4+1/2)/2,(4+1/2)/2,100+(4+1/2)/2))
+#' # Created Price of the bond
+#' price = matrix(c(100.550, 104.513, 105.856), ncol=1)
+#' DF = discountFactor(price, cashFlow)
+#' @author Thomas Fillebeen
+#' @export
+discountFactor = function(price, cashFlow){
+ DF = solve(cashFlow) %*% price
+ return(DF)
+}
+
+#' bondFullPrice
+#'
+#' Estimate price of bond w/ acrrued interest
+#' The present value of a bond's cash flows should be equated or
+#' compared with its full price, with the amount a purchaser actually
+#' pays to purchase those cash flows. The flat price is denoted by p, accrued
+#' interest is AI, the present value of the cash flows by PV, and the
+#' full price by P:
+#' P=p+AI=PV
+#'
+#' This function calculates the price of a fixed rate coupon bond given coupon rate, yield,
+#' compoundPd, cashFlowPd, face value, previous coupon date, next coupon date.
+#' @param bond is a bondSpec object created by \code{\link{bondSpec}}
+#' @param yield is the yield on the bond
+#' @param cashFlowPd cash flow period
+#' @param t0 previous coupon date
+#' @param t1 next coupon period
+#' @param currentDate current date
+#' @examples
+#' t0 = as.Date("2013-08-15")
+#' t1 = as.Date("2014-02-15")
+#' tn = as.Date("2013-10-04")
+#' currentDate = tn
+#' bond = bondSpec(face=100, m=2, couponRate = 0.0475)
+#' y1 = 0.00961
+#' bondFullPrice(bond, y1, 8, t0, t1, tn)$clean
+#' bondFullPrice(bond, y1, 8, t0, t1, tn)$dirty
+#' bondFullPrice(bond, y1, 8, t0, t1, tn)$accruedInterest
+#' @return price of the bond: clean, dirty and accrued interest
+#' @author Thomas Fillebeen
+#' @export
+bondFullPrice = function(bond, yield, cashFlowPd, t0, t1, currentDate){
+ compoundPd = bond$m
+ face = bond$face
+ couponRate = bond$couponRate
+ # Apply a general dayCount (weekend included)
+ d1 = as.numeric(t1-currentDate)
+ d2 = as.numeric(t1-t0)
+ # Initialize
+ tmp = 0
+
+ #Will go through the loop only if the number of cashFlow periods are at least 2
+ if (cashFlowPd > 1){
+ for(k in 1:(cashFlowPd-1)){
+ tmp = tmp + ((couponRate / compoundPd * face) / ((1 + yield/compoundPd)^k))
+ }
+ }
+ # Calculate dirty price based on partial periods formula
+ dirtyP = (1 / ((1 + yield / compoundPd)^(d1/d2))) * (couponRate / compoundPd * face + tmp + face / ((1 + yield/compoundPd)^(cashFlowPd-1)))
+ # Calculate accruedInterest
+ aiDays = as.numeric(currentDate-t0)
+ couponDays = as.numeric(t1-t0)
+ ai = couponRate / compoundPd * face * aiDays / couponDays
+ cleanP = dirtyP - ai
+ return(list(dirty=dirtyP, clean=cleanP, accruedInterest=ai))
+}
+
+#' Estimate continuously conpounding rate to be used in term structure
+#'
+#' This function calculates the continuously compounding rate given an initial dataset
+#' with specific format, date of reference coumpounding frequency, and face value
+#' @param dat is a dataset with cusip, issueDate, MaturityDate, Name, Coupon, Bid/Ask
+#' @param initialDate is the date when the estimation should be conducted: date of reference
+#' @param m compounding frequency
+#' @param face face value
+#' @return continuously compounding rates
+#' @author Thomas Fillebeen
+#' @export
+compoundingRate = function(dat, initialDate=as.Date("1995-05-15"), m, face=100){
+ # Convert the dates to a date class
+ dat[, "IssueDate"] = as.Date(dat[, "IssueDate"], format="%m/%d/%Y")
+ dat[, "MaturityDate"] = as.Date(dat[, "MaturityDate"], format="%m/%d/%Y")
+ # Convert the coupon column to a numeric
+ # Vector of prices
+ price = (dat[, "Bid"] + dat[, "Ask"]) / 2
+
+ # Generate cash flow dates for each bond
+ bondData = list()
+ for(i in 1:nrow(dat)){
+ maturityDate = dat[i, "MaturityDate"]
+ # Intialize a new list for every price, coupon, coupon date.
+ bondData[[i]] = list()
+ # Store price and the number of the coupon
+ bondData[[i]]$price = price[i]
+ bondData[[i]]$coupon = dat[i, "Coupon"]
+ # Remove initialDate
+ tmpSeq <- seq(from=initialDate, to=maturityDate, by="3 months")
+ bondData[[i]]$couponDates = tmpSeq[-1]
+ tmpDates = bondData[[i]]$couponDates
+ tmpCoupons = vector("numeric", length(tmpDates))
+ for(j in 1:length(tmpDates)){
+ tmpCoupons[j] = bondData[[i]]$coupon / m * face
+ if(j == length(tmpDates)){
+ tmpCoupons[j] = face + bondData[[i]]$coupon / m * face
+ }
+ }
+ bondData[[i]]$cashFlow = tmpCoupons
+ }
+ # Create a matrix of cash flows
+ CF = matrix(0, length(price), length(price))
+ # Populate the CF matrix
+ for(i in 1:nrow(CF)){
+ tmp = bondData[[i]]$cashFlow
+ index = 1:length(tmp)
+ CF[i, index] = tmp
+ }
+ # Utilize the discountFactor function
+ DF = discountFactor(price,CF)
+
+ dates = bondData[[nrow(dat)]]$couponDates
+ years = vector("numeric", length(dates))
+ for(i in 1:length(years)){
+ years[i] = (as.numeric(strftime(dates[i], "%Y")) + as.numeric(strftime(dates[i], "%m"))/12) - (as.numeric(strftime(initialDate, "%Y")) + as.numeric(strftime(initialDate, "%m"))/12)
+ }
+ # Calculate continuously compounded rates from discount factors
+ ccRate = vector("numeric", length(years))
+ for(i in 1:length(ccRate)){
+ ccRate[i] = - log(DF[i]) / years[i]
+ }
+ rate = list()
+ rate$years = years
+ rate$ccRate = ccRate
+ return(rate)
+}
+
+#' Estimate spot and forward rates
+#'
+#' This function calculates the forward or forward rates given an discount factors
+#' and time increments
+#' @param time increments of time when discount factors are estimated
+#' @param DF discount factor for during time increments
+#' @examples
+#' DF = c(0.996489, 0.991306, 0.984484, 0.975616, 0.964519)
+#' time = seq(from=0.5, to=2.5, by=0.5)
+#' rates = spotForwardRates(time,DF)
+#' rates
+#' @author Thomas Fillebeen
+#' @export
+spotForwardRates = function(time, DF){
+ if(length(time) != length(DF)) stop("both time and DF parameter need to be of the same length")
+ spotRates = matrix(0,length(time),1)
+ for(i in 1:(length(time))){
+ spotRates[i] = (2-2*DF[i]^(1/(2*time[i]))) / DF[i]^(1/(2*time[i]))
+ }
+
+ forwardRates = matrix(0,length(time),1)
+ forwardRates[1] = spotRates[1]
+ for(j in 1:(length(time)-1)){
+ forwardRates[j+1] = (DF[j]/DF[j+1] - 1) *2
+ }
+ rates = cbind(spotRates, forwardRates)
+ colnames(rates)= cbind("Spot","Forward")
+ return(rates)
+}
+
+### Modelling a Zero-Coupon Bond (ZCB)
+#' There are three main types of yield curve shapes: normal, inverted and flat (or humped)
+#'
+#' Estimate Vasicek zero-coupon bond to be used in term structure
+#'
+#' This function calculates the Vasicek Price given an initial data calibration
+#' The function is a subfunction for yieldCurveVasicek
+#' @param r initial short rate
+#' @param k speed of reversion parameter
+#' @param theta long-term reversion yield
+#' @param sigma randomness parameter. Modelled after Brownan Motion
+#' @param maturity maturity of the bond
+#' @return zero coupon bond price estimated from Vasicek model
+#' @author Thomas Fillebeen
+#' @export
+vasicekPrice = function(r, k, theta, sigma, maturity){
+ mean = (1/k)*(1 - exp(-maturity*k))
+ variance = (theta - sigma^2/(2*k^2))*(maturity - mean) + (sigma^2)/(4*k)*mean^2
+ price = exp(-variance - mean*r)
+ return(price)
+ }
+
+#' Estimate Vasicek zero-coupon yield
+#'
+#' This function calculates the Vasicek yield given an initial data calibration
+#'
+#' @param r initial short rate
+#' @param k speed of reversion parameter
+#' @param theta long-term reversion yield
+#' @param sigma randomness parameter. Modelled after Brownian Motion
+#' @param maturity maturity of the bond
+#' @return yield curve estimate from Vasicek model
+#' @author Thomas Fillebeen
+#' @export
+yieldCurveVasicek = function(r, k, theta, sigma, maturity){
+ n = length(r)
+ yield = matrix(0, maturity, n)
+ for(i in 1:n){
+ for(t in 1:maturity){
+ yield[t,i] = -log(vasicekPrice(r[i], k, theta, sigma, t))/t
+ }
+ }
+ return(yield)
}
\ No newline at end of file
Modified: pkg/GARPFRM/R/options.R
===================================================================
--- pkg/GARPFRM/R/options.R 2015-02-07 16:24:38 UTC (rev 220)
+++ pkg/GARPFRM/R/options.R 2015-02-07 17:16:00 UTC (rev 221)
@@ -58,6 +58,8 @@
#' @param option an \code{option} object created with \code{\link{optionSpec}}
#' @param method the method used to value the option
#' @param N number of steps in binomial tree
+#' @param verbose TRUE/FALSE default FALSE. TRUE prints the node information
+#' of the binomial tree
#' @param \dots any other passthrough parameters
#' @return the estimated value of the option
#' @author Ross Bennett
@@ -415,6 +417,15 @@
#' to maturity varies
#' @param plot TRUE/FALSE to plot the greek value as the underlying price and/ time to maturity vary
#' @param \dots passthrough parameters to \code{\link{plot}}
+#' @param S0 underlying asset price
+#' @param K strike price
+#' @param r risk free rate
+#' @param q continuous dividend yield rate for options on stocks or stock
+#' indices paying a dividend. Also the foreign risk free rate for options on
+#' currencies
+#' @param vol volatility of the underlying asset price
+#' @param ttm tmie to maturity, the life of the option, measured in years
+#' @param type type of the option; "call" or "put"
#' @author Ross Bennett
#' @examples
#' euro.call <- optionSpec(style="european", type="call", S0=30, K=30, maturity=1, r=0.05, volatility=0.25, q=0)
@@ -428,6 +439,7 @@
#' # Plotting
#' computeGreeks(euro.call, "delta", prices = seq(20, 40, 1), plot = TRUE)
#' computeGreeks(euro.call, "delta", maturities = seq(0.5, 0.01, -0.01), plot = TRUE)
+#' @aliases deltaBS, thetaBS, gammaBS, vegaBS, rhoBS
#' @export
computeGreeks <- function(option,
greek=c("delta", "theta", "gamma", "rho", "vega"),
@@ -507,6 +519,7 @@
}
}
+#' @name computeGreeks
#' @export
deltaBS <- function(S0, K, r, q, vol, ttm, type){
d1 <- (log(S0 / K) + (r - q + (vol^2 / 2)) * ttm) / (vol * sqrt(ttm))
@@ -533,6 +546,7 @@
# return(delta)
# }
+#' @name computeGreeks
#' @export
thetaBS <- function(S0, K, r, q, vol, ttm, type){
d1 <- (log(S0 / K) + (r - q + (vol^2 / 2)) * ttm) / (vol * sqrt(ttm))
@@ -562,6 +576,7 @@
# return(theta)
# }
+#' @name computeGreeks
#' @export
gammaBS <- function(S0, K, r, q, vol, ttm, type){
d1 <- (log(S0 / K) + (r - q + (vol^2 / 2)) * ttm) / (vol * sqrt(ttm))
@@ -577,6 +592,7 @@
#
# gamma.put <- gamma.call
+#' @name computeGreeks
#' @export
vegaBS <- function(S0, K, r, q, vol, ttm, type){
d1 <- (log(S0 / K) + (r - q + (vol^2 / 2)) * ttm) / (vol * sqrt(ttm))
@@ -592,6 +608,7 @@
#
# vega.put <- vega.call
+#' @name computeGreeks
#' @export
rhoBS <- function(S0, K, r, q, vol, ttm, type){
d2 <- (log(S0 / K) + (r - q - (vol^2 / 2)) * ttm) / (vol * sqrt(ttm))
@@ -660,6 +677,31 @@
}
}
+#' Implied Volatility Bisection Method
+#'
+#' Bisection method to compute the implied volatility of a european option
+#' using the Black-Scholes-Merton model.
+#'
+#' @details A bisection algorithm is used to compute the implied volatility
+#' of a European option priced with the Black-Scholes-Merton model
+#'
+#' @param vol_range c(lower, upper) the lower and upper bounds of the implied
+#' volatility range to search
+#' @param S0 underlying asset price
+#' @param K strike price
+#' @param r risk free rate
+#' @param q continuous dividend yield rate for options on stocks or stock
+#' indices paying a dividend. Also the foreign risk free rate for options on
+#' currencies
+#' @param ttm time to maturity, the life of the option, measured in years
+#' @param P_mkt market price
+#' @param type type of the option; "call" or "put"
+#' @param tol tolerance used for stopping criteria
+#' @param max_it maximum number of iterations
+#'
+#' @return implied volatility estimate
+#' @author Ross Bennett
+#' @export
impliedVolBS <- function(vol_range, S0, K, r, q, ttm, P_mkt, type, tol=.Machine$double.eps, max_it=200){
# use bisection to compute the implied volatility
# http://en.wikipedia.org/wiki/Bisection_method
Modified: pkg/GARPFRM/R/riskMetricsAndHedges.R
===================================================================
--- pkg/GARPFRM/R/riskMetricsAndHedges.R 2015-02-07 16:24:38 UTC (rev 220)
+++ pkg/GARPFRM/R/riskMetricsAndHedges.R 2015-02-07 17:16:00 UTC (rev 221)
@@ -247,7 +247,7 @@
lines(x$loading[,3], col="red",lty=2)
legend("topleft",legend=c("PCA1","PCA2","PCA3"),bty="n",lty=c(1,2,2),col=c("black","blue","red"), cex=0.8)
}else{
- plot.zoo(pca$loading[,1:3], type="l", main = main,
+ plot.zoo(x$loading[,1:3], type="l", main = main,
xlab="Maturity/Items", ...=...)
}
}else if(ncol(x$loading) == 2){
@@ -257,7 +257,7 @@
lines(x$loading[,2], col="blue",lty=2)
legend("topleft",legend=c("PCA1","PCA2"),bty="n",lty=c(1,2),col=c("black","blue"), cex=0.8)
}else{
- plot.zoo(pca$loading[,1:2], type="l", main = main,
+ plot.zoo(x$loading[,1:2], type="l", main = main,
xlab="Maturity/Items", ...=...)
}
}else{
Deleted: pkg/GARPFRM/data/.Rapp.history
===================================================================
--- pkg/GARPFRM/data/.Rapp.history 2015-02-07 16:24:38 UTC (rev 220)
+++ pkg/GARPFRM/data/.Rapp.history 2015-02-07 17:16:00 UTC (rev 221)
@@ -1,10 +0,0 @@
-load("/Users/tfillebeen/devel/R/UWGARP/uwgarp/pkg/GARPFRM/data/returns.rda")
-returns
-colnames(returns)
-returns(,1)
-returns[],1]
-returns[,1]
-returns[,"SPY"]
-load("/Users/tfillebeen/devel/R/UWGARP/uwgarp/pkg/GARPFRM/data/consumption.rda")
-load("/Users/tfillebeen/devel/R/UWGARP/uwgarp/pkg/GARPFRM/data/bonds.rda")
-load("/Users/tfillebeen/devel/R/UWGARP/uwgarp/pkg/GARPFRM/data/treasuryts.RData")
Modified: pkg/GARPFRM/demo/00Index
===================================================================
--- pkg/GARPFRM/demo/00Index 2015-02-07 16:24:38 UTC (rev 220)
+++ pkg/GARPFRM/demo/00Index 2015-02-07 17:16:00 UTC (rev 221)
@@ -1,7 +1,15 @@
backtest_VaR demonstrate backtesting a Value at Risk model
bootstrap demonstrate applying the bootstrap method to various statistics
+DataAccess demonstrate methods of accessing financial data
demo_CAPM demonstrate Capital Asset Pricing Model
demo_EWMA_GARCH11 demonstrate fitting EWMA and GARCH models
EWMA demonstrate fitting an EWMA model to estimate volatility, covariance, and correlation for univariate and multivariate time series of returns
+EstimatingVolatilitiesCorrelation R code from vignette on estimating volatilities and correlations
+Fixed demonstrate functions fixed income analysis
monte_carlo demonstrate running a Monte Carlo simulation to simulate asset price paths
+MonteCarloMethods R code from vignette on Monte Carlo methods vignette
+PerformanceMeasures R code from Performance Measures vignette
+QuantifyingVolatilityVaRModels R code from Quantifying Volatility and VaR models vignette
+QuantitativeAnalysisBasics R code from Quantitative Analysis Basics vignette
+RiskMetricsAndHedges R code from Risk Metrics and Hedges vignette
univariate_GARCH demonstrate fitting a GARCH model to estimate and forecast volatility for a univariate time series of returns
Deleted: pkg/GARPFRM/demo/CAPM_TF.R
===================================================================
--- pkg/GARPFRM/demo/CAPM_TF.R 2015-02-07 16:24:38 UTC (rev 220)
+++ pkg/GARPFRM/demo/CAPM_TF.R 2015-02-07 17:16:00 UTC (rev 221)
@@ -1,73 +0,0 @@
-# 'Load the GARPFRM package and CRSP dataset for CAPM analysis.
-# Standard Capital Asset Pricing Model (CAPM) fitting and testing using CRSP data.
-# Where CAPM describes the relationship between risk and expected return.
-suppressMessages(library(GARPFRM))
-options(digits=3)
-data(crsp.short)
-
-stock.df <- largecap.ts[, 1:20]
-mrkt <- largecap.ts[, "market"]
-rfr <- largecap.ts[, "t90"]
-
-# Plot first four stocks from
-plot.zoo(stock.df[,1:4], main="First Four Large Cap Returns")
-
-# Illustrate the type of data being analzyed: start-end dates.
-start(stock.df[,1:4])
-end(stock.df[,1:4])
-# Count the number of rows: sample size.
-nrow(stock.df)
-
-# Excess Returns initialized before utilizing in CAPM
-exReturns <- Return.excess(stock.df, rfr)
-colnames(exReturns)= c(colnames(stock.df))
-
-
-# Univariate CAPM
-uv <- CAPM(exReturns[,1], mrkt)
-getStatistics(uv)
-
-# Plot data with regression line
-plot(uv)
-
-# MLM CAPM for AMAT, AMGN, and CAT
-mlm <- CAPM(exReturns[,1:3], mrkt)
-getStatistics(mlm)
-
-# Plot data with regression line
-plot(mlm)
-
-# For uv example
-# Estimate CAPM with α = 0 & β = 1 for asset
-getBetas(uv)
-getAlphas(uv)
-hypTest(uv, significanceLevel=0.05)
-# For mlm
-getBetas(mlm)
-getAlphas(mlm)
-hypTest(mlm, significanceLevel=0.05)
-
-# The CAPM function can handle multiple assets at once,
-# and will cycle through each asset one at a time and output the results.
-# MLM CAPM
-mlm <- CAPM(exReturns[,], mrkt)
-
-# Plot expected returns versus betas
-chartSML(mlm)
-
-
-# Load FED consumption data: CONS
-# To illustate the power of the CAPM model
-# test its relationship with explanatory variable con- sumption.
-data(consumption)
-
-# Convert to yearmon index and align consumption and mrkt
-consumption <- xts(consumption, as.yearmon(index(consumption)))
-mrkt <- xts(mrkt, as.yearmon(index(mrkt)))
-consumption <- consumption[index(mrkt)]
-
-capm.cons = CAPM(consumption, mrkt)
-coef(summary(capm.cons))
-
-# Plot data with regression line
-plot(capm.cons)
\ No newline at end of file
Modified: pkg/GARPFRM/demo/DelineatingEfficientPortfolios.R
===================================================================
--- pkg/GARPFRM/demo/DelineatingEfficientPortfolios.R 2015-02-07 16:24:38 UTC (rev 220)
+++ pkg/GARPFRM/demo/DelineatingEfficientPortfolios.R 2015-02-07 17:16:00 UTC (rev 221)
@@ -1,8 +1,5 @@
-library(knitr)
-opts_chunk$set(tidy=FALSE, warning=FALSE, fig.width=5, fig.height=5)
+library(GARPFRM)
-suppressPackageStartupMessages(library(GARPFRM))
-
# Colonel Motors expected return
R_C <- 0.14
@@ -21,10 +18,10 @@
# Create a vector of portfolio weights
X_C <- seq(from=0, to=1, by=0.2)
-# Calculate the portfolio expected return (ρ = −1)
+# Calculate the portfolio expected return (rho = -1)
R_P <- portReturnTwoAsset(R_C, R_S, X_C)
-# Calculate the portfolio standard deviation (ρ = 0)
+# Calculate the portfolio standard deviation (rho = 0)
sigma_P <- portSDTwoAsset(R_C, R_S, X_C, sigma_C, sigma_S, rho)
# Combine the portfolio returns and standard deviations in a data.frame object.
@@ -99,7 +96,7 @@
minRisk(R_C, R_S, sigma_C, sigma_S, rho)
-# Correlation coefficient (ρ = 0.5)
+# Correlation coefficient (rho = 0.5)
rho <- 0.5
# Calculate the portfolio expected return
@@ -184,19 +181,13 @@
# Estimated correlation between equity and bonds
rho <- 0.45
-
-
# Calculate the allocation and values for the minimum variance portfolio
minRisk(R_SP, R_B, sigma_SP, sigma_B, rho)
-
-
ef <- efficientFrontierTwoAsset(R_SP, R_B, sigma_SP, sigma_B, rho,
[TRUNCATED]
To get the complete diff run:
svnlook diff /svnroot/uwgarp -r 221
More information about the Uwgarp-commits
mailing list