Description Usage Arguments Details Value Author(s) References Examples
Fit a fundamental (crosssectional) factor model using ordinary
least squares or robust regression. Fundamental factor models use observable
asset specific characteristics (or) fundamentals, like industry
classification, market capitalization, style classification (value, growth)
etc. to calculate the common risk factors. An object of class "ffm"
is returned.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  fitFfm(data, asset.var, ret.var, date.var, exposure.vars, weight.var = NULL,
fit.method = c("LS", "WLS", "Rob", "WRob"), rob.stats = FALSE,
full.resid.cov = FALSE, z.score = c("none", "crossSection", "timeSeries"),
addIntercept = FALSE, lagExposures = TRUE, resid.scaleType = "stdDev",
lambda = 0.9, GARCH.params = list(omega = 0.09, alpha = 0.1, beta = 0.81),
GARCH.MLE = FALSE, stdReturn = FALSE, analysis = c("none", "ISM",
"NEW"), targetedVol = 0.06, ...)
## S3 method for class 'ffm'
coef(object, ...)
## S3 method for class 'ffm'
fitted(object, ...)
## S3 method for class 'ffm'
residuals(object, ...)

data 
data.frame of the balanced panel data containing the variables

asset.var 
character; name of the variable for asset names. 
ret.var 
character; name of the variable for asset returns. 
date.var 
character; name of the variable containing the dates
coercible to class 
exposure.vars 
vector; names of the variables containing the fundamental factor exposures. 
weight.var 
character; name of the variable containing the weights
used when standarizing style factor exposures. Default is 
fit.method 
method for estimating factor returns; one of "LS", "WLS" "Rob" or "WRob". See details. Default is "LS". 
rob.stats 
logical; If 
full.resid.cov 
logical; If 
z.score 
method for exposure standardization; one of "none", "crossSection", or "timeSeries".
Default is 
addIntercept 
logical; If 
lagExposures 
logical; If 
resid.scaleType 
character; Only valid when fit.method is set to WLS or WRob. The weights used in
the weighted regression are estimated using sample variance, classic EWMA, robust EWMA or GARCH model. Valid values are 
lambda 
lambda value to be used for the EWMA estimation of residual variances. Default is 0.9 
GARCH.params 
list containing GARCH parameters omega, alpha, and beta. Default values are 0.09, 0.1, 0.81 respectively.
Valid only when 
stdReturn 
logical; If 
analysis 
method used in the analysis of fundamental law of active management; one of "none", "ISM", or "NEW". Default is "none". 
targetedVol 
numeric; the targeted portfolio volatility in the analysis. Default is 0.06. 
... 
potentially further arguments passed. 
object 
a fit object of class 
Estimation method "LS" corresponds to ordinary least squares using
lm
and "Rob" is robust regression using
lmRob
. "WLS" is weighted least squares using estimates
of the residual variances from LS regression as weights (feasible GLS).
Similarly, "WRob" is weighted robust regression.
The weights to be used in "WLS" or "WRob" can be set using
resid.scaleType
argument which computes the residual variances in one of the following ways 
sample variace, EWMA, Robust EWMA and GARCH(1,1). The inverse of these residual variances
are used as the weights. For EWMA model, lambda = 0.9 is used as default and for GARCH(1,1)
omega = 0.09, alpha = 0.1, and beta = 0.81 are used as default as mentioned in Martin & Ding (2017).
These default parameters can be changed using the arguments lambda
, GARCH.params
for EWMA and GARCH respectively.
To compute GARCH parameters via MLE, set GARCH.MLE
to TRUE
.
Standardizing style factor exposures: The exposures can be standardized into
zscores using regular or robust (see rob.stats
) measures of location
and scale. Further, weight.var
, a variable such as marketcap, can be
used to compute the weighted mean exposure, and an equalweighted standard
deviation of the exposures about the weighted mean. This may help avoid an
illconditioned covariance matrix. Default option equally weights exposures
of different assets each period.
If rob.stats=TRUE
, covRob
is used to compute a
robust estimate of the factor covariance/correlation matrix, and,
scaleTau2
is used to compute robust tauestimates
of univariate scale for residuals during "WLS" or "WRob" regressions. When
standardizing style exposures, the median
and
mad
are used for location and scale respectively.
When resid.scaleType
is EWMA or GARCH, the residual covariance is equal to the
diagonal matrix of the estimated residual variances in last time period.
The original function was designed by Doug Martin and initially implemented in SPLUS by a number of University of Washington Ph.D. students: Christopher Green, Eric Aldrich, and Yindeng Jiang. Guy Yollin ported the function to R and YiAn Chen modified that code. Sangeetha Srinivasan refactored, tested, corrected and expanded the functionalities and S3 methods.
fitFfm
returns an object of class "ffm"
for which
print
, plot
, predict
and summary
methods exist.
The generic accessor functions coef
, fitted
and
residuals
extract various useful features of the fit object.
Additionally, fmCov
computes the covariance matrix for asset returns
based on the fitted factor model.
An object of class "ffm"
is a list containing the following
components:
factor.fit 
list of fitted objects that estimate factor returns in each
time period. Each fitted object is of class 
beta 
N x K matrix of factor exposures for the last time period. 
factor.returns 
xts object of Kfactor returns (including intercept). 
residuals 
xts object of residuals for Nassets. 
r2 
lengthT vector of Rsquared values. 
factor.cov 
K x K covariance matrix of the factor returns. 
g.cov 
covariance matrix of the g coefficients for a Sector plus market and Sector plus Country plus global market models . 
resid.cov 
N x N covariance matrix of residuals. 
return.cov 
N x N return covariance estimated by the factor model, using the factor exposures from the last time period. 
restriction.mat 
The restriction matrix used in the computation of f=Rg. 
resid.var 
N x T matrix of estimated residual variances. It will be a lengthN vector of sample residual variances when 
call 
the matched function call. 
data 
data frame object as input. 
date.var 
date.var as input 
ret.var 
ret.var as input 
asset.var 
asset.var as input. 
exposure.vars 
exposure.vars as input. 
weight.var 
weight.var as input. 
fit.method 
fit.method as input. 
asset.names 
lengthN vector of asset names. 
factor.names 
lengthK vector of factor.names. 
time.periods 
lengthT vector of dates. 
Where N is the number of assets, K is the number of factors (including the intercept or dummy variables) and T is the number of unique time periods.
activeWeights 
active weights obtaining from the fundamental law of active management 
activeReturns 
active returns corresponding to the active weights 
IR 
the vector of GranoldK, asymptotic IR, and finitesample IR. 
Where N is the number of assets, K is the number of factors (including the intercept or dummy variables) and T is the number of unique time periods.
Sangeetha Srinivasan, Guy Yollin, YiAn Chen, Avinash Acharya and Chindhanai Uthaisaad
Menchero, J. (2010). The Characteristics of Factor Portfolios. Journal of Performance Measurement, 15(1), 5262.
Grinold, R. C., & Kahn, R. N. (2000). Active portfolio management (Second Ed.). New York: McGrawHill.
Ding, Z. and Martin, R. D. (2016). "The Fundamental Law of Active Management Redux", SSRN 2730434.
And, the following extractor functions: coef
,
fitted
, residuals
,
fmCov
, fmSdDecomp
, fmVaRDecomp
and fmEsDecomp
.
paFm
for Performance Attribution.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  # Load fundamental and return data
data("factorDataSetDjia5Yrs")
# fit a fundamental factor model
exposure.vars < c("P2B", "MKTCAP")
fit < fitFfm(data=factorDataSetDjia5Yrs, asset.var="TICKER", ret.var="RETURN",
date.var="DATE", exposure.vars=exposure.vars)
names(fit)
# fit a Industry Factor Model with Intercept
exposure.vars < c("SECTOR","P2B")
fit1 < fitFfm(data=factorDataSetDjia5Yrs, asset.var="TICKER", ret.var="RETURN",
date.var="DATE", exposure.vars=exposure.vars, addIntercept=TRUE)
# Fit a SECTOR+COUNTRY+Style model with Intercept
# Create a COUNTRY column with just 3 countries
factorDataSetDjia5Yrs$COUNTRY = rep(rep(c(rep("US", 1 ),rep("GERMANY", 1 )), 11), 60)
exposure.vars= c("SECTOR", "COUNTRY","P2B", "MKTCAP")
fit.MICM < fitFfm(data=factorDataSetDjia5Yrs, asset.var="TICKER", ret.var="RETURN",
date.var="DATE", exposure.vars=exposure.vars, addIntercept=TRUE)

Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.