This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#' @title Estimator for the value of sigma. Sigma is the standard deviation of | |
#' the random component of returns in the Geometric Brownian Motion model. This | |
#' estimate can be calculated in a biased or unbiased manner. | |
#' | |
#' @description Given a log price process and a parameter, q, which specifies | |
#' the sampling intervel this function estimates the value of Sigma. Sigma | |
#' represents the standarddeviation of the random disturbance component of daily | |
#' returns. This estimate can be annualized and can be computed in a biased or | |
#' unbiased manner. | |
#' | |
#' @details The parameter, q, specifies the sampling interval to use when | |
#' estimating sigma. When q = 1 the function will use every day's prices, when | |
#' q = 2 the function will use every second day's prices, and so on and so | |
#' forth. For a sufficient number of days the estimation of sigma under | |
#' different sampling intervales e.g. 2 and 4, should converge. | |
#' | |
#' @param X vector :: A log price process. | |
#' @param q int :: The sampling interval for the estimator. | |
#' @param annualize logical :: Annualize the parameter estimate. True or False. | |
#' @param unbiased logical :: Use the unbiased estimate. True or False. | |
#' @return sd.est double :: The estimated value of Sigma. | |
#' | |
calibrateSigma <- function(X, q = 1, annualize = TRUE, unbiased = TRUE) { | |
# Get the estimate value for the drift component. | |
mu.est <- calibrateMu(X, annualize = FALSE) | |
# Ensure that the format of X is appropriate. | |
X <- as.numeric(as.vector(X)) | |
# Calculate the number of times q goes into the length of X. | |
n <- floor(length(X)/q) | |
sd.est <- 0.0 | |
for (t in 2:n) | |
sd.est <- sd.est + (X[t * q] - X[(t * q) - q] - (q * mu.est))^2 | |
# Calculate the average sigma using the unbiased or biased method. | |
if (!unbiased) sd.est <- sd.est / (q * n) | |
else sd.est <- sd.est / (q * n - 1) | |
if (!annualize) return(sd.est) | |
else return(sqrt((sd.est * 252))) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment