I am trying to wrap my head around the statement that time series regression should not be used for testing a factor model when the factor is not a return. This has been mentioned in multiple posts, and there are specific posts about that, too, e.g. this and this. Cochrane explains this at the end of section 12.2 of "Asset Pricing" (2005):
Most importantly, you can run the cross-sectional regression when the factor is not a return. The time-series test requires factors that are also returns, so that you can estimate factor risk premia by $\hat\lambda=E_T(f)$. The asset pricing model does predict a restriction on the intercepts in the time-series regression. Why not just test these? If you impose the restriction $E(R^{ei})=\beta_i^\top\lambda$ you can write the time-series regression $$ R_t^{ei}=a_i+\beta_i^\top f_t+\varepsilon_t^i, \quad\quad t=1,2,\dots,T \quad \text{for each} \ i\tag{12.9} $$ as $$ R_t^{ei}=\beta_i^\top\lambda+\beta_i^\top(f_t-E(f))+\varepsilon_t^i, \quad\quad t=1,2,\dots,T \quad \text{for each} \ i. $$ Thus, the intercept restriction is $$ a_i=\beta_i^\top(\lambda-E(f)). \tag{12.24} $$ This restriction makes sense. The model says that mean returns should be proportional to betas, and the intercept in the time-series regression controls the mean return. You can also see how $\lambda=E(f)$ results in a zero intercept. Finally, however, you see that without an estimate of $\lambda$, you cannot check this intercept restriction. If the factor is not a return, you will be forced to do something like a cross-sectional regression. (Emphasis is mine)
But why do we care whether $f$ is a return or not? For me, the crucial issue seems to be whether the risk premium is linear in $f$. (Not only affine, but also linear, so there is no level shift.) If it is, then by definition $\lambda=cE(f)$ for some $c\neq 0$. Then $$ E(R^{ei})=\beta_i^\top\lambda \ \longleftrightarrow \ E(R^{ei})=\frac{\beta_i^\top}{c}cE(f)=:\gamma_i^\top E(f) $$ and we are back to legitimate use of time series regression for testing the factor model by examining whether $a_i=0$ for each $i$ in $(12.9)$. That has nothing to do with whether $f$ is a return or not.
Question
If this is correct, then the practical question is, when is the risk premium nonlinear in $f$? Could you provide an example of that? And would it not make sense to just redefine $f$ so that the risk premium becomes linear in it?
Update 1 (27 June 2023)
Here is an R script showing that the GRS test (which is based on time-series regressions) works just fine when the factor risk premium is linear in $f$ – even though the factor risk premium does not equal the expected value of the factor, $\lambda\neq E(f)$.
(You can run the script online and see the results for yourself at https://rdrr.io/snippets/. Just paste the script there, delete/comment the irrelevant lines following !!!
and click "Run".)
library(MASS)
library(GRS.test)
data("data") # Fama-French data: market's excess return and 25 portfolios (5x5, sorted on SMB and HML)
data=data/100 # because original data was in percent
N=25
T=nrow(data) # 630
Sigma=cov(data[,c(8:32,2)]) # empirical covariance matrix; the last column is the market, the other 25 columns are the portfolios
# !!! Choose one of the two following lines for H0 vs. H1:
alpha =rep(0,N+1) # Jensen's alpha, in this case zero for all assets
set.seed(-1); alpha=runif(n=N+1,min=-0.01,max=0.01) # Jensen's alpha, in this case nonzero for all assets
beta_m=rep(NA,N+1); for(i in 1:(N+1)) beta_m[i]=Sigma[i,N+1]/Sigma[N+1,N+1] # actual betas from Fama-French data
mu_mte=rep(mean(data[,2]),T) # expected value of market excess return, in this case time-constant and in line with Fama-French data
# !!! Choose one of the two following lines:
c=1 # factor risk premium is 1x its expected value; Cochrane says we can use time-series regressions
c=3 # factor risk premium is 3x its expected value; Cochrane says we cannot use time-series regressions
# Generate a matrix of returns according to the CAPM in case of c=1 or
# a no-name model in case of c=3 (normality is mainly for convenience):
set.seed(1); r_matrix=mvrnorm(n=T, mu=alpha+beta_m*mean(mu_mte)*c, Sigma=Sigma)
f_matrix=cbind(r_matrix[,N+1]) # factor return matrix for the function GRS.test()
# GRS test
result=GRS.test(r_matrix[,1:N],f_matrix); print(round(c(result$GRS.stat,result$GRS.pval),3))
# Individual t-tests and individual estimates of alphas and betas:
# full dots ~ true, hollow circles ~ estimated
par(mfrow=c(5,5),mar=c(2,2,0.5,0.5))
for(i in 1:N){
m1=lm(r_matrix[,i]~f_matrix); print(summary(m1))
true=c(alpha[i],beta_m[i]); estimated=as.numeric(m1$coef); ylim1=c(-0.05,2)
plot(estimated,ylim=ylim1,xlab="",ylab=""); points(true,pch=19)
}; par(mfrow=c(1,1),mar=c(5.1,4.1,4.1,2.1))
Related question: GRS test does not reject a nonsense factor in place of the market factor. Short answer: the test lacks power.
Update 2 (30 June 2023)
Perhaps a concrete example would put me on track. Question 2: What would be a data generating process (DGP) implied by a factor model where
(i) the factor is not a return and
(ii) the risk premium does not equal the mean of the factor,
so that a time series based test of the asset pricing model fails?
I would like to simulate data from such a DGP and then apply the GRS test to see for myself that the test fails. The construction of the DGP may well reveal the real statistical/econometric issue with running time series regressions with factors that are not returns.
Update 3 (5 July 2023)
While I have now converged quite a bit to understanding why a time series regression cannot be used when the factor is not a return, I still have a puzzling example that is in line with my original point. The GRS test does not reject a scalar multiple of the market factor. Why is that? Follow the link to the question and find a simulation illustrating the point.