1 Question 1 — Single-Factor (Market) Model

Given information:

  • Sample size: \(n = 96\) months
  • \(\hat{\alpha} = 0.0017\), \(SE(\hat{\alpha}) = 0.0020\)
  • \(\hat{\beta} = 0.98\), \(SE(\hat{\beta}) = 0.17\)
  • \(R^2 = 0.50\)
  • \(E[R_m - R_f] = 0.70\%\)
  • Critical value: \(|t^*| = 1.98\)

1.1 Part (a) — t-test for \(\hat{\beta} = 0\)

Formula

\[t_{\hat{\beta}} = \frac{\hat{\beta} - \beta_0}{SE(\hat{\beta})}\]

Calculation

beta_hat  <- 0.98
se_beta   <- 0.17
t_crit    <- 1.98

# H0: beta = 0
t_beta0 <- (beta_hat - 0) / se_beta
t_beta0
## [1] 5.765

\[t_{\hat{\beta}} = \frac{0.98 - 0}{0.17} = 5.7647\]

Hypotheses

\[H_0: \beta = 0 \qquad H_1: \beta \neq 0\]

Decision

Since \(|t| = `r round(t_beta0, 4)| > 1.98\), we reject \(H_0\) at the 5% significance level.

Interpretation

The market beta is statistically significant and economically meaningful. A \(\hat{\beta}\) of 0.98 indicates that the fund moves almost one-for-one with the market — for every 1% move in the market excess return, the fund’s excess return changes by approximately 0.98%. This suggests the fund carries near-market-level systematic risk, consistent with a broadly diversified equity portfolio with minimal active tilts.


1.2 Part (b) — t-test for \(H_0: \beta = 1\)

Formula

\[t = \frac{\hat{\beta} - 1}{SE(\hat{\beta})}\]

Calculation

t_beta1 <- (beta_hat - 1) / se_beta
t_beta1
## [1] -0.1176
abs(t_beta1) > t_crit
## [1] FALSE

\[t = \frac{0.98 - 1}{0.17} = \frac{-0.02}{0.17} = -0.1176\]

Hypotheses

\[H_0: \beta = 1 \qquad H_1: \beta \neq 1\]

Decision

Since \(|t| = `r round(abs(t_beta1), 4)| < 1.98\), we fail to reject \(H_0\) at the 5% level.

Interpretation

The fund’s systematic risk is statistically indistinguishable from that of the market portfolio. While the point estimate of 0.98 suggests marginally lower sensitivity to market movements, this difference is not statistically meaningful. From a risk management perspective, the fund behaves as a near-passive market replicator — investors should not expect meaningful protection during downturns relative to a simple index fund.


1.3 Part (c) — Jensen’s Alpha (\(\hat{\alpha}\))

Formula

\[t_{\hat{\alpha}} = \frac{\hat{\alpha} - 0}{SE(\hat{\alpha})}\]

Calculation

alpha_hat <- 0.0017
se_alpha  <- 0.0020

t_alpha <- alpha_hat / se_alpha
t_alpha
## [1] 0.85
abs(t_alpha) > t_crit
## [1] FALSE

\[t_{\hat{\alpha}} = \frac{0.0017}{0.0020} = 0.85\]

Hypotheses

\[H_0: \alpha = 0 \qquad H_1: \alpha > 0\]

Decision

Since \(|t| = `r round(abs(t_alpha), 4)| < 1.98\), we fail to reject \(H_0\).

Interpretation

Although the point estimate of \(\hat{\alpha} = 0.0017\) (0.17% per month) is positive, it is not statistically distinguishable from zero at the 5% level. The marketing team’s claim of “positive risk-adjusted performance” is therefore not statistically justified by the data. The observed alpha is well within the range of outcomes expected by chance, even if the true alpha were zero. A rigorous investor should not pay active management fees on the basis of this result alone.


1.4 Part (d) — Interpreting \(R^2\)

R2 <- 0.50
systematic    <- R2 * 100
diversifiable <- (1 - R2) * 100
cat("Systematic:", systematic, "%\nDiversifiable:", diversifiable, "%\n")
## Systematic: 50 %
## Diversifiable: 50 %

Interpretation

An \(R^2\) of 0.50 means that 50% of the fund’s monthly return variation is explained by market movements (systematic risk). The remaining 50% is idiosyncratic — attributable to fund-specific factors such as stock selection, sector concentration, or manager decisions. For a fund purporting to offer active returns, a 50% systematic component suggests moderate but not dominant exposure to market risk, leaving substantial room for diversifiable risk that investors could, in theory, eliminate by holding the market index instead.


1.5 Part (e) — CAPM-Implied Expected Monthly Excess Return

Formula

\[E[R_i - R_f] = \hat{\beta} \times E[R_m - R_f]\]

Calculation

E_mkt_premium <- 0.70  # percent
E_fund <- beta_hat * E_mkt_premium
E_fund
## [1] 0.686

\[E[R_i - R_f] = 0.98 \times 0.70\% = 0.686\%\]

Interpretation

The CAPM implies the fund should earn a monthly excess return of 0.686% as compensation for its systematic risk. Comparing this to the actual average fund return would reveal whether the fund over- or under-performs its risk-adjusted benchmark — the difference is precisely what Jensen’s alpha captures.


2 Question 2 — Fama–French Three-Factor Model

Given information:

  • \(n = 144\) monthly observations
  • \(\hat{\alpha} = 0.0029\), \(SE = 0.0018\)
  • \(\hat{b}_{MKT} = 0.97\), \(SE = 0.08\)
  • \(\hat{s}_{SMB} = 0.75\), \(SE = 0.11\)
  • \(\hat{h}_{HML} = -0.13\), \(SE = 0.13\)
  • \(R^2 = 0.92\), Adjusted \(R^2 = 0.918\)
  • Critical value: \(|t^*| = 1.98\)

2.1 Part (f) — t-statistics for all coefficients

Formula

\[t_j = \frac{\hat{\theta}_j}{SE(\hat{\theta}_j)}\]

coefs <- c(alpha = 0.0029, MKT = 0.97, SMB = 0.75, HML = -0.13)
ses   <- c(alpha = 0.0018, MKT = 0.08, SMB = 0.11, HML = 0.13)

t_stats <- coefs / ses
sig     <- abs(t_stats) > 1.98

results <- data.frame(
  Estimate  = coefs,
  Std.Error = ses,
  t_stat    = round(t_stats, 4),
  Significant = sig
)
results
##       Estimate Std.Error t_stat Significant
## alpha   0.0029    0.0018  1.611       FALSE
## MKT     0.9700    0.0800 12.125        TRUE
## SMB     0.7500    0.1100  6.818        TRUE
## HML    -0.1300    0.1300 -1.000       FALSE

Summary

Coefficient Estimate SE t-statistic Significant at 5%?
\(\hat{\alpha}\) 0.0029 0.0018 1.6111 FALSE
\(\hat{b}\) (MKT) 0.97 0.08 12.125 TRUE
\(\hat{s}\) (SMB) 0.75 0.11 6.8182 TRUE
\(\hat{h}\) (HML) -0.13 0.13 -1 FALSE

Interpretation

The market factor (\(\hat{b} = 0.97\)) and the SMB factor (\(\hat{s} = 0.75\)) are both highly significant, confirming that market and size exposures are the primary drivers of fund returns. The intercept is marginally significant at \(t = 1.6111\), suggesting possible alpha generation. The HML loading (\(\hat{h} = -0.13\)) is not statistically significant, indicating the fund does not have a reliably distinguishable value or growth tilt.


2.2 Part (g) — Investment Style Classification

Interpretation

The fund’s factor loadings reveal a clear investment style profile. The large positive SMB loading (\(\hat{s} = 0.75\), \(t = 6.8182\)) indicates a pronounced small-cap tilt — the fund systematically overweights smaller firms relative to the market portfolio. This is consistent with strategies targeting smaller, potentially higher-growth companies.

The negative HML loading (\(\hat{h} = -0.13\)) points toward a growth orientation, as growth stocks have low book-to-market ratios and therefore load negatively on HML. However, since this coefficient is not statistically significant, the growth tilt cannot be confirmed with confidence and may simply reflect sampling variation.

In summary: the fund is best characterised as a small-cap growth fund, with high confidence on the size dimension and weaker evidence on the value-growth spectrum.


2.3 Part (h) — Intercept Interpretation and Manager Value-Add

t_alpha_ff <- t_stats["alpha"]
abs(t_alpha_ff) > 1.98
## alpha 
## FALSE

\[t_{\hat{\alpha}} = \frac{0.0029}{0.0018} = 1.6111\]

Hypotheses

\[H_0: \alpha = 0 \qquad H_1: \alpha \neq 0\]

Decision

\(|t| = 1.6111\) is marginally above 1.98, suggesting the alpha is statistically significant at the 5% level (just barely).

Interpretation

After controlling for market, size, and value exposures, the fund earns a risk-adjusted alpha of approximately 0.29% per month. While this estimate is statistically significant at conventional thresholds, the margin is narrow and the result should be interpreted with caution. Nevertheless, it provides tentative evidence that the manager adds value beyond passive factor exposures — a meaningful finding in asset management where genuine alpha is rare. An investor evaluating this fund should weigh the economic magnitude (0.29%/month ≈ 3.5%/year) against management fees before concluding that the alpha represents a net gain.


2.4 Part (i) — \(R^2\) Rise and Why Adjusted \(R^2\) Matters

R2_capm <- 0.75
R2_ff   <- 0.92
adj_R2  <- 0.918
improvement <- R2_ff - R2_capm
improvement
## [1] 0.17

Interpretation

The increase in \(R^2\) from 0.75 (single-factor CAPM) to 0.92 (three-factor model) represents an improvement of 0.17 — meaning the Fama–French model explains 17% more of the fund’s return variation by incorporating the SMB and HML factors. This is a substantial gain that confirms the fund’s returns are materially driven by size and value premiums in addition to market risk.

However, \(R^2\) always increases mechanically when additional predictors are added, even if those predictors are uninformative. Adjusted \(R^2\) corrects for this by penalising model complexity:

\[\bar{R}^2 = 1 - \frac{(1 - R^2)(n-1)}{n - k - 1}\]

The adjusted \(R^2\) of 0.918 remains very close to the raw \(R^2\) of 0.92, confirming that the additional factors genuinely improve explanatory power rather than merely adding noise. When comparing models with different numbers of predictors — as is the case here — adjusted \(R^2\) is the appropriate and unbiased metric for model selection.


3 Question 3 — Logistic Regression for Market Direction

Model:

\[\text{logit}\, P(\text{Up}) = \beta_0 + \beta_1 r_{t-1} + \beta_2 \Delta VIX_{t-1}\]

Coefficients: \(\beta_0 = -0.02\), \(\beta_1 = 5.4\), \(\beta_2 = -0.38\)

Inputs: \(r_{t-1} = 0.010\), \(\Delta VIX = 1.5\)


3.1 Part (j) — Predicted Probability

Formula

\[\text{logit} = \beta_0 + \beta_1 r_{t-1} + \beta_2 \Delta VIX_{t-1}\]

\[P(\text{Up}) = \frac{e^{\text{logit}}}{1 + e^{\text{logit}}} = \frac{1}{1 + e^{-\text{logit}}}\]

Calculation

b0 <- -0.02; b1 <- 5.4; b2 <- -0.38
r_lag  <- 0.010
dvix   <- 1.5

log_odds <- b0 + b1 * r_lag + b2 * dvix
prob_up  <- 1 / (1 + exp(-log_odds))

cat("Log-odds:", round(log_odds, 4), "\n")
## Log-odds: -0.536
cat("P(Up)   :", round(prob_up, 4), "\n")
## P(Up)   : 0.3691
cat("Class   :", ifelse(prob_up >= 0.5, "Up", "Down"), "\n")
## Class   : Down

\[\text{logit} = -0.02 + 5.4(0.010) + (-0.38)(1.5) = -0.02 + 0.054 - 0.57 = -0.536\]

\[P(\text{Up}) = \frac{1}{1 + e^{-(-0.536)}} = 0.3691\]

Interpretation

The predicted probability of an “Up” day is 0.3691 (36.91%). Since this falls below the 0.5 threshold, the model classifies tomorrow as a “Down” day. The relatively large negative contribution from \(\Delta VIX\) (a rise of 1.5 units) overwhelms the modest positive signal from the lagged return, reflecting the market’s fear gauge dominating the directional prediction.


3.2 Part (k) — Economic Interpretation of Coefficients

\(\beta_1 = 5.4\) (lagged return): The positive coefficient on \(r_{t-1}\) captures short-term momentum. When yesterday’s market return was positive, the log-odds of an “Up” day tomorrow increase. This is consistent with the well-documented momentum anomaly in financial markets, where recent winners tend to continue outperforming over short horizons due to investor underreaction and herding behavior.

\(\beta_2 = -0.38\) (ΔVIX): The negative coefficient on \(\Delta VIX\) reflects the inverse relationship between market fear and future returns — or more precisely, the asymmetric effect of rising uncertainty. When the VIX increases, investor anxiety rises, selling pressure intensifies, and the probability of a positive next-day return falls. This captures the well-known “fear index” effect: spikes in implied volatility are associated with market stress and downward pressure.


3.3 Part (l) — Confusion Matrix Metrics

TP <- 67; FP <- 44; FN <- 33; TN <- 56
n  <- 200

accuracy    <- (TP + TN) / n
sensitivity <- TP / (TP + FN)        # True positive rate for "Up"
specificity <- TN / (TN + FP)        # True negative rate for "Down"
precision   <- TP / (TP + FP)        # Positive predictive value

cat("Accuracy   :", round(accuracy, 4), "\n")
## Accuracy   : 0.615
cat("Sensitivity:", round(sensitivity, 4), "\n")
## Sensitivity: 0.67
cat("Specificity:", round(specificity, 4), "\n")
## Specificity: 0.56
cat("Precision  :", round(precision, 4), "\n")
## Precision  : 0.6036
Metric Formula Value
Accuracy \((TP + TN)/n\) 0.615
Sensitivity \(TP/(TP + FN)\) 0.67
Specificity \(TN/(TN + FP)\) 0.56
Precision \(TP/(TP + FP)\) 0.6036

Interpretation

The model correctly classifies 61.5% of days overall. Its sensitivity of 0.67 means it correctly identifies 67% of actual “Up” days — reasonably strong. The specificity of 0.56 means it correctly identifies 56% of actual “Down” days. The precision of 0.6036 implies that when the model predicts “Up,” it is correct 60.36% of the time — a key metric for a long-only trading rule.


3.4 Part (m) — Naive Classifier and Limitations of Accuracy

# Balanced classes: 100 Up, 100 Down => majority class = either (both 50%)
naive_accuracy <- 100 / 200  # always predicts majority class
beats_naive    <- accuracy > naive_accuracy

cat("Naive accuracy :", round(naive_accuracy, 4), "\n")
## Naive accuracy : 0.5
cat("Model accuracy :", round(accuracy, 4), "\n")
## Model accuracy : 0.615
cat("Model beats naive:", beats_naive, "\n")
## Model beats naive: TRUE

Calculation

With 100 “Up” and 100 “Down” observations, the data are perfectly balanced. A naive rule predicting the majority class always achieves:

\[\text{Accuracy}_{\text{naive}} = \frac{100}{200} = 0.5000\]

The logistic model achieves 0.615 > 0.5000, so it does beat the naive classifier.

Why accuracy alone is insufficient:

In a trading context, accuracy treats a missed “Up” day and a missed “Down” day as equally costly — but they are not. Missing a true positive (failing to go long on an “Up” day) has a different economic consequence than a false positive (going long on a “Down” day). For a trading system, precision (the fraction of “Up” predictions that are correct) or the Sharpe ratio of the resulting strategy are more economically relevant criteria, as they directly measure the profitability and risk of acting on the model’s predictions rather than simply its classification accuracy.


4 Question 4 — Resampling and Regularization in a Backtest

Given: Monthly returns over 48 months, \(\bar{r} = 0.70\%\), \(s = 5.50\%\)


4.1 Part (n) — Sharpe Ratio and Annualization

Formula (monthly)

\[SR_{\text{monthly}} = \frac{\bar{r}}{s}\]

Annualization

\[SR_{\text{annual}} = SR_{\text{monthly}} \times \sqrt{12}\]

The scaling factor \(\sqrt{12}\) arises because with \(T = 12\) independent monthly observations per year, the mean scales by 12 and the standard deviation scales by \(\sqrt{12}\), so their ratio scales by \(\sqrt{12}\).

Calculation

r_bar <- 0.70
s     <- 5.50

SR_monthly <- r_bar / s
SR_annual  <- SR_monthly * sqrt(12)

cat("Monthly Sharpe :", round(SR_monthly, 4), "\n")
## Monthly Sharpe : 0.1273
cat("Annual Sharpe  :", round(SR_annual,  4), "\n")
## Annual Sharpe  : 0.4409
cat("Scaling factor :", round(sqrt(12),   4), "\n")
## Scaling factor : 3.464

\[SR_{\text{monthly}} = \frac{0.70}{5.50} = 0.1273\]

\[SR_{\text{annual}} = 0.1273 \times \sqrt{12} = 0.1273 \times 3.4641 = 0.4409\]

Interpretation

The annualised Sharpe ratio of 0.4409 is below the commonly cited threshold of 1.0 for a satisfactory active strategy, and well below the 2.0 benchmark considered strong. While the strategy earns a positive excess return, its return-to-volatility ratio is modest. Combined with the short 48-month history, investors should interpret this with caution — the statistical precision of the estimate is limited.


4.2 Part (o) — Bootstrap Procedure for Sharpe Ratio SE

Step-by-step bootstrap procedure:

set.seed(42)
n_months  <- 48
B         <- 10000
r_obs     <- rnorm(n_months, mean = 0.70, sd = 5.50)  # placeholder observed data

boot_SR <- replicate(B, {
  r_boot <- sample(r_obs, size = n_months, replace = TRUE)
  mean(r_boot) / sd(r_boot) * sqrt(12)
})

SE_boot <- sd(boot_SR)
cat("Bootstrap SE of annual Sharpe:", round(SE_boot, 4), "\n")

Procedure description:

  1. Take the observed sample of \(n = 48\) monthly returns \(\{r_1, \ldots, r_{48}\}\).
  2. Draw \(B = 10{,}000\) bootstrap samples of size 48 with replacement from this set.
  3. For each bootstrap sample \(b\), compute \(SR_b^* = (\bar{r}_b^*/s_b^*) \times \sqrt{12}\).
  4. The bootstrap standard error is \(\widehat{SE}_{boot} = \text{sd}(SR_1^*, \ldots, SR_B^*)\).

Why the i.i.d. bootstrap is inappropriate:

Monthly financial returns often exhibit serial dependence — autocorrelation in volatility (GARCH effects), momentum, or mean reversion. The standard i.i.d. bootstrap destroys the temporal ordering of observations, breaking any autocorrelation structure present in the data. If the true return process has serial dependence, the i.i.d. bootstrap will underestimate or misestimate the true variability of the Sharpe ratio.

The appropriate fix: The block bootstrap (e.g., moving block bootstrap or stationary bootstrap) samples contiguous blocks of consecutive returns, preserving short-run dependencies. By choosing a block length that spans the autocorrelation structure, the method respects the time-series nature of the data and produces valid standard errors even under serial dependence.


4.3 Part (p) — LASSO Model Selection: \(\lambda_{\min}\) vs \(\lambda_{1SE}\)

lambda_min <- 0.030; factors_min <- 14
lambda_1se <- 0.065; factors_1se <- 7

Recommendation: Deploy \(\lambda_{1SE} = 0.065\) (7 factors)

This recommendation follows directly from the one-standard-error rule introduced by Breiman et al. and widely adopted in regularization practice. The logic is as follows:

The minimum-CV-error solution at \(\lambda = 0.030\) selects 14 factors and achieves the lowest average cross-validation error, but this error estimate is itself noisy. The 1-SE rule selects the most parsimonious model whose CV error lies within one standard error of the minimum — in this case, \(\lambda = 0.065\) with just 7 factors.

In a financial backtest with 60 candidate factors, retaining 14 factors raises serious concerns about overfitting and data snooping. With only 60 months of training data (a common constraint in finance), a 14-factor model has a high effective degrees-of-freedom relative to sample size, increasing the risk of capitalising on spurious in-sample patterns. The 7-factor model under \(\lambda_{1SE}\) is substantially simpler, more interpretable, and more likely to deliver stable out-of-sample performance — the ultimate objective in deployed strategies.


4.4 Part (q) — Walk-Forward Cross-Validation

Walk-forward (expanding window) scheme:

# Conceptual walk-forward structure
n_total   <- 60  # months
min_train <- 36  # minimum training window
results   <- list()

for (t in min_train:(n_total - 1)) {
  train <- 1:t              # expanding training set
  test  <- t + 1            # single next-month out-of-sample prediction
  
  # 1. Fit LASSO on train using lambda_1se from inner CV
  # 2. Predict on test month
  # 3. Record prediction and actual return
  # results[[t]] <- list(pred = ..., actual = ...)
}

# Evaluate Sharpe, hit rate, etc. on the sequence of OOS predictions

Procedure:

  1. Begin with a minimum training window (e.g., the first 36 months).
  2. Fit the regularised model on the training window using the chosen \(\lambda_{1SE}\).
  3. Predict only the immediately following month (the test period).
  4. Expand the training window by one month and repeat.
  5. Collect all out-of-sample predictions and evaluate performance metrics (Sharpe, accuracy, etc.) on the full OOS sequence.

Why standard k-fold cross-validation is unsafe:

Random k-fold CV randomly partitions observations into folds, which means future data can appear in the training set and past data in the test set. In a time series setting, this constitutes look-ahead bias — the model is trained on information it could not have possessed at the time of prediction. This artificially inflates in-sample performance estimates and produces overly optimistic model selection. Financial return predictability is weak and fragile; even small amounts of look-ahead bias can make an unprofitable strategy appear highly attractive. Walk-forward validation strictly enforces the temporal boundary between training and testing, producing honest estimates of real-world strategy performance.


5 Key Takeaways

This examination demonstrates several interconnected principles at the intersection of finance, econometrics, and machine learning.

On Factor Models: The single-factor CAPM provides a useful but incomplete picture of return drivers. The Fama–French three-factor extension materially improves explanatory power (\(R^2\): 0.75 → 0.92) by capturing the empirically documented size and value premiums. For practitioners, understanding a fund’s factor exposures is essential for distinguishing genuine alpha from passive factor harvesting.

On Statistical versus Economic Significance: A coefficient can be statistically significant without being economically meaningful, and vice versa. Jensen’s alpha of 0.0017 (Question 1) failed to reach significance despite being positive in sign — a critical reminder that short samples and noisy returns make it genuinely difficult to detect manager skill.

On Machine Learning in Finance: Logistic regression provides probabilistic predictions that are more useful than binary signals for position sizing. However, accuracy alone is an inadequate performance criterion — metrics aligned with the economic objective (precision for long-only strategies, Sharpe ratio for strategy evaluation) are far more informative.

On Resampling and Regularization: The bootstrap’s power lies in its distributional agnosticism, but its validity depends on correctly modelling the dependence structure of the data — the i.i.d. assumption is almost never warranted for financial returns. Similarly, the 1-SE rule for LASSO acknowledges that in-sample error minimisation and out-of-sample robustness are not the same objective. Walk-forward validation is the gold standard for strategy evaluation precisely because it enforces the temporal discipline that real trading demands.