Computes a wide variety of summary performance metrics from stock or portfolio returns
Source:R/tq_performance.R
tq_performance.Rd
Asset and portfolio performance analysis is a deep field with a wide range of theories and
methods for analyzing risk versus reward. The PerformanceAnalytics
package
consolidates many of the most widely used performance metrics as functions that can
be applied to stock or portfolio returns. tq_performance
implements these performance analysis functions in a tidy way, enabling scaling
analysis using the split, apply, combine framework.
Usage
tq_performance(data, Ra, Rb = NULL, performance_fun, ...)
tq_performance_(data, Ra, Rb = NULL, performance_fun, ...)
tq_performance_fun_options()
Arguments
- data
A
tibble
(tidy data frame) of returns in tidy format (i.e long format).- Ra
The column of asset returns
- Rb
The column of baseline returns (for functions that require comparison to a baseline)
- performance_fun
The performance function from
PerformanceAnalytics
. Seetq_performance_fun_options()
for a complete list of integrated functions.- ...
Additional parameters passed to the
PerformanceAnalytics
function.
Details
Important concept: Performance is based on the statistical properties of returns, and as a result this function uses stock or portfolio returns as opposed to stock prices.
tq_performance
is a wrapper for various PerformanceAnalytics
functions
that return portfolio statistics.
The main advantage is the ability to scale with the tidyverse
.
Ra
and Rb
are the columns containing asset and baseline returns, respectively.
These columns are mapped to the PerformanceAnalytics
functions. Note that Rb
is not always required, and in these instances the argument defaults to Rb = NULL
.
The user can tell if Rb
is required by researching the underlying performance function.
...
are additional arguments that are passed to the PerformanceAnalytics
function. Search the underlying function to see what arguments can be passed through.
tq_performance_fun_options
returns a list of compatible PerformanceAnalytics
functions
that can be supplied to the performance_fun
argument.
See also
tq_transmute()
which can be used to calculate period returns from a set of stock prices. Usemutate_fun = periodReturn
with the appropriate periodicity such asperiod = "monthly"
.tq_portfolio()
which can be used to aggregate period returns from multiple stocks to period returns for a portfolio.The
PerformanceAnalytics
package, which contains the underlying functions for theperformance_fun
argument. Additional parameters can be passed via...
.
Examples
# Load libraries
library(dplyr)
# Use FANG data set
# Get returns for individual stock components grouped by symbol
Ra <- FANG %>%
group_by(symbol) %>%
tq_transmute(adjusted, periodReturn, period = "monthly", col_rename = "Ra")
# Get returns for SP500 as baseline
Rb <- "^GSPC" %>%
tq_get(get = "stock.prices",
from = "2010-01-01",
to = "2015-12-31") %>%
tq_transmute(adjusted, periodReturn, period = "monthly", col_rename = "Rb")
# Merge stock returns with baseline
RaRb <- left_join(Ra, Rb, by = c("date" = "date"))
##### Performance Metrics #####
# View options
tq_performance_fun_options()
#> $table.funs
#> [1] "table.AnnualizedReturns" "table.Arbitrary"
#> [3] "table.Autocorrelation" "table.CAPM"
#> [5] "table.CaptureRatios" "table.Correlation"
#> [7] "table.Distributions" "table.DownsideRisk"
#> [9] "table.DownsideRiskRatio" "table.DrawdownsRatio"
#> [11] "table.HigherMoments" "table.InformationRatio"
#> [13] "table.RollingPeriods" "table.SFM"
#> [15] "table.SpecificRisk" "table.Stats"
#> [17] "table.TrailingPeriods" "table.UpDownRatios"
#> [19] "table.Variability"
#>
#> $CAPM.funs
#> [1] "CAPM.alpha" "CAPM.beta" "CAPM.beta.bear" "CAPM.beta.bull"
#> [5] "CAPM.CML" "CAPM.CML.slope" "CAPM.dynamic" "CAPM.epsilon"
#> [9] "CAPM.jensenAlpha" "CAPM.RiskPremium" "CAPM.SML.slope" "TimingRatio"
#> [13] "MarketTiming"
#>
#> $SFM.funs
#> [1] "SFM.alpha" "SFM.beta" "SFM.CML" "SFM.CML.slope"
#> [5] "SFM.dynamic" "SFM.epsilon" "SFM.jensenAlpha"
#>
#> $descriptive.funs
#> [1] "mean" "sd" "min" "max"
#> [5] "cor" "mean.geometric" "mean.stderr" "mean.LCL"
#> [9] "mean.UCL"
#>
#> $annualized.funs
#> [1] "Return.annualized" "Return.annualized.excess"
#> [3] "sd.annualized" "SharpeRatio.annualized"
#>
#> $VaR.funs
#> [1] "VaR" "ES" "ETL" "CDD" "CVaR"
#>
#> $moment.funs
#> [1] "var" "cov" "skewness" "kurtosis"
#> [5] "CoVariance" "CoSkewness" "CoSkewnessMatrix" "CoKurtosis"
#> [9] "CoKurtosisMatrix" "M3.MM" "M4.MM" "BetaCoVariance"
#> [13] "BetaCoSkewness" "BetaCoKurtosis"
#>
#> $drawdown.funs
#> [1] "AverageDrawdown" "AverageLength" "AverageRecovery"
#> [4] "DrawdownDeviation" "DrawdownPeak" "maxDrawdown"
#>
#> $Bacon.risk.funs
#> [1] "MeanAbsoluteDeviation" "Frequency" "SharpeRatio"
#> [4] "MSquared" "MSquaredExcess" "HurstIndex"
#>
#> $Bacon.regression.funs
#> [1] "CAPM.alpha" "CAPM.beta" "CAPM.epsilon" "CAPM.jensenAlpha"
#> [5] "SystematicRisk" "SpecificRisk" "TotalRisk" "TreynorRatio"
#> [9] "AppraisalRatio" "FamaBeta" "Selectivity" "NetSelectivity"
#>
#> $Bacon.relative.risk.funs
#> [1] "ActivePremium" "ActiveReturn" "TrackingError" "InformationRatio"
#>
#> $Bacon.drawdown.funs
#> [1] "PainIndex" "PainRatio" "CalmarRatio" "SterlingRatio"
#> [5] "BurkeRatio" "MartinRatio" "UlcerIndex"
#>
#> $Bacon.downside.risk.funs
#> [1] "DownsideDeviation" "DownsidePotential" "DownsideFrequency"
#> [4] "SemiDeviation" "SemiVariance" "UpsideRisk"
#> [7] "UpsidePotentialRatio" "UpsideFrequency" "BernardoLedoitRatio"
#> [10] "DRatio" "Omega" "OmegaSharpeRatio"
#> [13] "OmegaExcessReturn" "SortinoRatio" "M2Sortino"
#> [16] "Kappa" "VolatilitySkewness" "AdjustedSharpeRatio"
#> [19] "SkewnessKurtosisRatio" "ProspectRatio"
#>
#> $misc.funs
#> [1] "KellyRatio" "Modigliani" "UpDownRatios"
#>
# Get performance metrics
RaRb %>%
tq_performance(Ra = Ra, performance_fun = SharpeRatio, p = 0.95)
#> # A tibble: 4 × 4
#> # Groups: symbol [4]
#> symbol `ESSharpe(Rf=0%,p=95%)` StdDevSharpe(Rf=0%,p=9…¹ VaRSharpe(Rf=0%,p=95…²
#> <chr> <dbl> <dbl> <dbl>
#> 1 META 0.193 0.345 0.605
#> 2 AMZN 0.215 0.314 0.265
#> 3 NFLX 0.199 0.355 0.606
#> 4 GOOG 0.213 0.296 0.310
#> # ℹ abbreviated names: ¹`StdDevSharpe(Rf=0%,p=95%)`, ²`VaRSharpe(Rf=0%,p=95%)`
RaRb %>%
tq_performance(Ra = Ra, Rb = Rb, performance_fun = table.CAPM)
#> # A tibble: 4 × 13
#> # Groups: symbol [4]
#> symbol ActivePremium Alpha AnnualizedAlpha Beta `Beta+` `Beta-` Correlation
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 META 0.431 0.034 0.493 0.846 3.00 0.819 0.234
#> 2 AMZN 0.246 0.0144 0.187 1.46 2.04 -0.0442 0.524
#> 3 NFLX 1.02 0.0632 1.09 1.35 1.90 -2.78 0.234
#> 4 GOOG 0.142 0.0123 0.158 0.901 1.56 -0.247 0.451
#> # ℹ 5 more variables: `Correlationp-value` <dbl>, InformationRatio <dbl>,
#> # `R-squared` <dbl>, TrackingError <dbl>, TreynorRatio <dbl>