Branch: Quantitative Methods (Finance-Plus Ring, Finance galaxy) · Node QM1.02 · ~18 focused hours · Standard gate ≥85%
Somewhere in this program, and in every research note you will ever read, a number arrives wearing the word "significant." A fund claims its process beats its benchmark. A factor "works." A screen's coefficients "explain" bankruptcy. Every one of those claims is a hypothesis test wearing a suit, and every regression table you have seen, including the ones EX2.03 taught you to build in a single Excel cell, is a bundle of hypothesis tests standing on a foundation this module is about to hand you. QM1.01 gave you the distributions and the sampling theory. This module gives you the machine that turns a sample into a verdict: is this pattern real, or is it noise that got lucky? By the end, you will not just run a t-test or read a regression printout, you will know exactly what each number in it is entitled to claim, and, just as importantly, what it is not.
Advertisement
A warning before anything else, because this branch carries the highest AI-over-trust risk in the whole program. A chat assistant can produce a complete regression table (coefficients, standard errors, stars, an R² dressed up to look definitive) in under five seconds, and every number in it can be quietly wrong in a way that reads exactly like every number that is quietly right. A misspecified model, a violated assumption, a coefficient regressed on the wrong variable, a p-value from a test that does not apply to paired data, all of it comes out in the same confident monospace font. Nothing below can be safely delegated without the by-hand checks this module builds, and the discipline of running them is not optional homework; it is the actual skill.
One more thing to hold before you start: this Ring is additive institutional/CFA breadth, it presents the toolkit and the plumbing alongside, not in place of, the program's process-over-P&L, concentration-over-diversification philosophy. A t-stat has never once made an investment decision for anyone; it has only ever told a disciplined analyst whether a pattern survived contact with noise. Carry that humility through every worked example below, the arithmetic is exact, the economic judgment it serves is not automatic.
Last, the boundary that keeps this module honest about what it is. QM1.02 teaches hypothesis testing and regression as concepts, the logic, the formulas, the failure modes, done by hand and by table lookup. It ends the moment a result is computed and interpreted. It does not build software, does not validate a pipeline, and does not grade a model against hidden tests, that is the job of the quant-code region's DA1.05 "Statistics in Code" (forthcoming), which implements this exact material in scipy/statsmodels with train/test discipline. Nothing here duplicates that; nothing there re-derives this. State this boundary to yourself every time you are tempted to reach for a notebook mid-module, you are not there yet, and that is by design.
Case Lab: run case CL-QM.1 (Does the Factor Work? A Multiple-Regression Autopsy) in the app's Cases tab, estimate a 3-factor regression from summary statistics alone, judge its fit and multicollinearity with R², adjusted R² and VIF, then run a nested-model F-test on the factor in question, the same multiple-regression machinery Worked Example 8 builds below. Attempt it after Worked Example 8, blank sheet, before checking the model answer.
Learning objectives
By the end you can:
- State the hypothesis-testing framework precisely, null and alternative hypotheses, a test statistic, a significance level chosen in advance, a decision rule, and a p-value defined correctly (not as "the probability H0 is true"), and apply it uniformly across z, t, chi-square, and F tests.
- Define Type I error, Type II error, and power, compute power for a stated alternative, and solve for the sample size a test needs to hit a target power.
- Choose correctly between an independent-samples test and a paired (matched-samples) test for comparing two means, and show numerically why the wrong choice changes the conclusion.
- Run a chi-square test for a population variance and for independence/goodness-of-fit in a contingency table, and an F-test for the equality of two variances, reading each from its own distribution and degrees of freedom.
- Test a correlation coefficient for statistical significance and separate that from its economic size.
- Derive and interpret simple linear regression by hand, the least-squares slope and intercept, the standard error of the slope, the t-test and confidence interval on a coefficient, and state the assumptions (Gauss–Markov) that make that inference valid.
- Extend to multiple regression: read a partial slope correctly ("holding the other regressors constant"), compute R² and adjusted R², and run the overall F-test for joint significance.
- Diagnose the four classic regression diseases (heteroskedasticity, serial correlation, multicollinearity, and misspecification) name the test for each (Breusch–Pagan, Durbin–Watson, VIF, RESET), state what each disease does and does not break, and apply the fix.
- (Productivity objective: R10 duality.) Know precisely where this concept layer hands off to code (DA1.05) and use an AI copilot to accelerate that handoff, while stating the assumptions and verifying every diagnostic yourself, because the model cannot be trusted to know when its own regression is sick.
- Build every worked computation with at least one India (₹) and one US ($) example, on synthetic-but-fully-specified data, so the mechanics transfer across both markets you operate in.
The duality, stated once (R10). Objectives 1–8 and 10 are the understanding objective the mastery gate rewards, you earn the pass by computing and interpreting these statistics yourself, closed-book. Objective 9 is the productivity payoff you keep: knowing exactly which forthcoming tool builds this at scale, and refusing to trust its output until you have checked it against what you know by hand.
Prerequisites & connections
Builds on. QM1.01 (Probability, Distributions, Sampling & Estimation), this module assumes you already hold the normal, t, chi-square, and F distributions, the Central Limit Theorem, sampling distributions, and point/confidence-interval estimation as working tools; a hypothesis test is a confidence interval's more decisive sibling, built from exactly that machinery. EX2.03 (Financial & Statistical Functions) already taught you to produce a regression in one Excel cell (SLOPE, INTERCEPT, LINEST, CORREL, RSQ) and already warned you that R² is not causation, that small samples and spurious trends fool a fit, and that extrapolation is a guess dressed as arithmetic. This module does not re-teach any of that. It builds the layer underneath the cell: where the standard errors in LINEST's second row actually come from, what a coefficient's t-test is asking, what the F-statistic in row four is testing, and: beyond EX2.03's four warnings, the four additional, regression-specific failure modes (heteroskedasticity, serial correlation, multicollinearity, misspecification) that a clean R² can hide entirely. M2.07 gave you a live preview of why this machinery matters: the Beneish M-Score is a fitted linear combination of eight ratios with published coefficients, and Altman's Z came from multiple discriminant analysis on 66 real companies. Neither module derived why those coefficients carry the weights they do, why a sample of 66 firms is thin evidence, or how you would test whether any one of those eight coefficients is statistically distinguishable from zero, this module hands you exactly that lens, aimable at any fitted model you meet from here on, including your own.
BINDING BOUNDARY (C-3). Quantitative Methods (this branch) teaches statistics and regression as concepts, intuition, the math, the failure modes, computed by hand and by table. The quant-code region's data-science branch (DA, specifically the forthcoming DA1.05 "Statistics in Code") teaches the identical material in software:
scipy.stats,statsmodels.OLS, validated pipelines, hidden-test grading. No worked content is duplicated in either direction: this module never shows you a line of code, and DA1.05 will never re-derive a formula this module already gave you. When QM1.03 (Time-Series, Monte Carlo & Intro ML-for-Finance) closes this branch, it hands off every build to the quant-code region in the same way, that is the house rule for this whole branch, not a one-off.
Feeds forward. QM1.03 leans on this module's hypothesis-testing frame to test for unit roots and stationarity, and on its regression frame to fit AR/MA models, then hands every implementation to the quant-code region. The AA branch's CAPM beta is the slope of Worked Example 5 below, run on a real stock; Black–Litterman's uncertainty weighting rests on the standard errors this module derives. The FI branch's yield-curve fitting and the EC branch's elasticity estimates are regressions read with this exact toolkit. Every "statistically significant" claim anywhere in the corpus, including your own future work, is answerable only by what you build here.
Two siblings own material this module deliberately stops short of, and both should be cited rather than rebuilt here. QM1.04 owns the full ANOVA table as a reading object, dummy-variable coding and interaction terms, and logistic regression. It also owns prediction intervals for an individual forecast, which are wider than the confidence interval on a fitted mean and are a different object, along with the nonparametric tests and the multiple-testing corrections that decide how many hypotheses you may run before a p-value stops meaning anything. QM1.05 owns functional forms, meaning log-log and log-linear specifications and the elasticity readings that come with them, plus the ARCH family, trend models, and the tabulated Durbin-Watson bounds d_L and d_U with their source.
Core teaching content
The hypothesis-testing framework, once and for all
Every hypothesis test in this module (whatever the letter attached to its statistic) follows one fixed five-step shape, and internalizing the shape once saves you from re-learning it four times.
- State the hypotheses. The null hypothesis (H₀) is the "nothing interesting is happening" claim, a specific value, a specific equality, a specific absence of relationship. The alternative hypothesis (Hₐ) is what you conclude if the evidence is strong enough to abandon H₀. Hypotheses are about the population, never about the sample you happen to hold.
- Choose a significance level, α, before you look at the data. Conventionally 0.05, sometimes 0.01 or 0.10, this is the probability of a false alarm you are willing to tolerate, fixed in advance so you cannot move the goalposts after seeing the result.
- Compute a test statistic: a single number built from your sample that measures how far the data sits from what H₀ predicts, in standardized units (standard errors, or a ratio of variances).
- Find the p-value or compare to a critical value. The p-value is the probability, assuming H₀ is true, of observing a test statistic at least as extreme as the one you computed. It is a statement about the data given the hypothesis, never a statement about the hypothesis given the data. (Flip that in your head and you have committed the single most common statistical error in finance; the Common Mistakes section returns to it.)
- Decide. Reject H₀ if the p-value is below α (equivalently, if the test statistic exceeds the critical value); otherwise, fail to reject. "Fail to reject" is not "prove H₀ true", absence of evidence is not evidence of absence, only an honest shrug.
A test is two-tailed when Hₐ simply says "different" (≠) and rejection can happen from either side; it is one-tailed when Hₐ has a direction ("greater than" or "less than") and the whole rejection region sits on one tail. Choosing one-tailed after seeing which way the data leans is a second classic error, the direction must be decided at step 1, from theory or prior conviction, not from a peek at the result.
Type I error, Type II error, and power
Two ways a decision can go wrong, and they trade off against each other by construction:
- Type I error: rejecting a true H₀ (a false alarm). Its probability is exactly α, the significance level you chose.
- Type II error: failing to reject a false H₀ (a missed real effect). Its probability is called β.
- Power = 1 − β = the probability of correctly rejecting a false H₀, the test's ability to detect a real effect of a given size.
Power rises with a larger true effect (an easier target to see), a larger sample size (less sampling noise), a smaller population variance, and a larger α (a more lenient bar, which is exactly why lowering α to cut false alarms simultaneously raises the miss rate; you cannot improve both at once without more data). Compute one concretely. Suppose you test H₀: μ = 0 against Hₐ: μ > 0 (one-tailed, α = 0.05) with a sample of n = 40, a known σ = 1.5, and you want the power to detect a true mean of μ₁ = 0.5. The standard error is 1.5/√40 = 0.2372. The critical sample mean is 0 + 1.6449 × 0.2372 = 0.3901 (1.6449 is the one-tailed 5% z critical value). If the true mean is really 0.5, the probability the sample mean clears 0.3901 is P(Z > (0.3901 − 0.5)/0.2372) = P(Z > −0.4633) = 0.678. A 68% chance of catching a real effect of this size at this sample size, decent, not great, and it tells you exactly how much a "we didn't find significance" result is worth here.
Run the same logic backward to size a study. Same setup, but now you want 80% power: solve n = [(z_α + z_β)·σ / (μ₁ − μ₀)]² = [(1.6449 + 0.8416) × 1.5 / 0.5]² = 55.6, round up to n = 56 (re-checking at n = 56 gives an achieved power of 0.802: confirmed). This is the calculation behind every "how many months of data do I need before I trust this backtest" question you will ever ask.
Comparing two means: independent samples vs. paired samples
Comparing two averages is the most common test in finance, and the single most common way to botch it is applying the wrong variant to the data. Independent samples are two genuinely separate groups (two different funds, two different companies) where no observation in one group is linked to a specific observation in the other. Paired (matched) samples are two measurements taken on the same units, a fund's return and its benchmark's return on the same trading days, a company's ratio before and after an event, where the two series move together for reasons that have nothing to do with the effect you are testing.
Independent two-sample t-test. With unequal, unknown variances (the safer, more general default. Welch, 1947), the test statistic is
t = (x̄₁ − x̄₂) / √(s₁²/n₁ + s₂²/n₂)
with an approximate ("Welch–Satterthwaite") degrees of freedom that need not be an integer. A simpler variant pools the two variances into one estimate when you are willing to assume σ₁ = σ₂; both exist in practice, and Welch's version is the safer default when you have not verified equal variances.
Paired t-test. Take the differences, dᵢ = x₁ᵢ − x₂ᵢ, for each of the n matched pairs, and run a one-sample t-test on those differences against zero:
t = d̄ / (s_d / √n), df = n − 1
where d̄ and s_d are the mean and standard deviation of the differences themselves, not built from s₁ and s₂ separately. Because the two series are correlated (they share the same market days, the same macro shocks), the variance of the difference is smaller than treating them as independent would suggest: Var(d) = s₁² + s₂² − 2ρs₁s₂, where ρ is the correlation between the paired series. A high positive ρ (typical for a fund tracked against its own benchmark) shrinks the denominator and makes the correct paired test more powerful than the independent-samples formula run on the same numbers, using the wrong one costs you real ability to detect a genuine effect, exactly the lesson Worked Example 1 computes end to end.
The chi-square test: variance and independence
The chi-square distribution (QM1.01) supports two genuinely different tests that share one symbol.
Testing a single variance. H₀: σ² = σ₀² against a stated alternative, using
χ² = (n − 1)s² / σ₀², df = n − 1
Toy check: a strategy's monthly tracking-error variance is claimed to be σ₀² = 150 (bps²); a sample of n = 25 months shows s² = 196. χ² = 24 × 196/150 = 31.36, df = 24, upper-tail p = 0.144 against a critical value of 36.42 at α = 0.05, not enough evidence to say the true variance exceeds the claimed 150, even though the sample variance ran higher.
Testing independence (a contingency table). For a table of counts cross-classifying two categorical variables, compute each cell's expected count under independence ((row total × column total) / grand total) then
χ² = Σ (Observed − Expected)² / Expected, df = (rows − 1)(columns − 1)
A large χ² says the two categorical variables are not independent; Worked Example 2 runs this in full on a real-shaped table. The same formula, with expected counts coming from a stated proportion rather than another variable's margins, is a goodness-of-fit test. Practice Problem 5 drills that variant.
The F-test: comparing two variances
To test H₀: σ₁² = σ₂² against Hₐ: σ₁² ≠ σ₂², form
F = s_larger² / s_smaller², df₁ = n_larger − 1 (numerator), df₂ = n_smaller − 1 (denominator)
putting the larger sample variance on top so F ≥ 1 by construction, and compare against the upper α/2 critical value of the F-distribution for a two-tailed test (since you have already forced the ratio above 1, only the upper tail can reject). The F-distribution reappears later in this module as the test for a regression's overall significance, same distribution, a different pair of variances being compared (explained variance vs. unexplained variance, rather than two samples' raw variances).
Correlation: testing whether a relationship is real
A sample correlation r is itself a random variable with its own sampling distribution. To test H₀: ρ = 0 (no linear relationship in the population):
t = r√(n − 2) / √(1 − r²), df = n − 2
This is the test EX2.03's CORREL and RSQ outputs are silently waiting for, a moderate-looking r on a small sample can be pure noise, and a small-looking r on a large sample can be a rock-solid, statistically undeniable relationship that is nonetheless too weak to trade on. Statistical significance (is ρ ≠ 0 at all) and economic significance (is the relationship big enough to matter) are two separate questions, and this module answers only the first, you supply the second from judgment. Worked Example 4 runs this test end to end.
{
"skill": "Choosing and setting up the right hypothesis test before running any numbers",
"use": "Describe your data and question to a chat assistant and have it name the correct test (independent vs paired t, chi-square variance vs independence, one- vs two-tailed) and state the hypotheses in words — then you compute the statistic yourself and check its reasoning against this module's framework before trusting it.",
"tools": ["Chat assistants — Claude, ChatGPT, Gemini", "A stats-aware notebook assistant once you reach DA1.05"],
"prompt": "I have <describe the two data series and how they were collected — same days/units, or genuinely separate groups>. What hypothesis test is appropriate, what are H0 and Ha stated precisely, and is this one-tailed or two-tailed? Do not compute the statistic yet — just name the test and justify the choice.",
"verify": "An assistant will confidently recommend an independent-samples test on paired data if you do not describe the pairing explicitly — this is the single most common error this module drills against. Re-derive the test statistic yourself from the stated formula and confirm the degrees of freedom before using any figure (Guardrail 1-5, especially #3 Recompute).",
"diy": "You must already be able to state H0/Ha and pick independent-vs-paired correctly from this section alone — that is the gated skill. AI can save you a reference lookup; it cannot replace knowing which test your data actually calls for.",
"market": "IN"
}
Simple linear regression: the inferential layer under the LINEST cell
EX2.03 gave you SLOPE and INTERCEPT; here is where those two numbers come from and what licenses you to trust them. The model is y = β₀ + β₁x + u, where u is an unobserved error term, and ordinary least squares (OLS) picks the line that minimizes the sum of squared vertical distances between the data and the fit:
slope b₁ = Sxy / Sxx = Σ(xᵢ − x̄)(yᵢ − ȳ) / Σ(xᵢ − x̄)²
intercept b₀ = ȳ − b₁x̄
This estimator is unbiased and, among all linear unbiased estimators, has the smallest variance (the Gauss–Markov theorem) provided a short list of assumptions hold: (1) the model is linear in its parameters; (2) x is not a constant and carries genuine variation; (3) the error term has zero mean conditional on x (exogeneity, x tells you nothing about the direction of the error); (4) the errors have constant variance (homoskedasticity); (5) errors are uncorrelated with each other (no serial correlation); and, for exact small-sample t- and F-tests (as opposed to large-sample approximations), (6) the errors are normally distributed. The back half of this module, the diagnostics section, is entirely about detecting when assumptions 4, 5, and their multiple-regression cousins fail, and what to do about it.
Once you have the slope, the standard error of the regression (SER) captures the typical size of a leftover error: SER = √(SSE/(n − 2)), where SSE is the sum of squared residuals. The standard error of the slope is
SE(b₁) = SER / √Sxx
and the hypothesis test that matters most in any regression, is this slope actually different from zero?, is exactly the one-sample t-test machinery from earlier in this module, applied to a coefficient:
t = b₁ / SE(b₁), df = n − 2
with a confidence interval b₁ ± t_crit × SE(b₁) built the identical way. For a simple regression (one predictor), this t-statistic and the model's overall F-statistic carry the same information: F = t² exactly, a useful internal check that costs nothing to run. Worked Example 5 computes every one of these quantities by hand, on a real paired dataset, and cross-checks each formula against the others.
Multiple regression
Multiple regression explains one outcome with several predictors at once, so each coefficient is a partial effect: the change in y for a one-unit change in that predictor, holding the others constant. Adjusted R² and the overall F-test judge the model as a whole, and the partial F-test judges a subset of predictors. Analysts use it to separate one variable's effect from the others and to check that added predictors earn their place.
4 min read, on its own page
Regression diagnostics
Regression diagnostics are the checks that show whether a fitted regression can be trusted beyond its R², by testing for four specific problems in the errors and the model. Each problem has its own test and fix, and none of them shows up in a clean-looking R². Analysts run them because wrong standard errors or biased coefficients can sit behind a regression that looks healthy.
7 min read, on its own page
Reading a full regression printout in one pass
Collect the whole toolkit into one habit. Given any regression output, read it in this order: (1) Do the coefficient signs and rough magnitudes make economic sense before you check a single p-value? (2) For each coefficient, is |t| large enough to reject β = 0 at your chosen α, and does the confidence interval exclude zero? (3) Does the overall F agree with the individual t-stats, and if the F is strong while several t-stats are weak, is multicollinearity the explanation (check VIF before concluding the predictors "don't matter")? (4) Is adjusted R², not raw R², what you compare across models with different numbers of predictors? (5) Have you actually run, not assumed, the four diagnostics appropriate to your data's structure, heteroskedasticity and misspecification always; serial correlation if the data is a time series; multicollinearity if you have more than one predictor? Worked Example 8 runs this exact five-step reading on a full multiple-regression capstone.
Common mistakes & how experts think differently
- "The p-value is the probability the null hypothesis is true." This is the single most common misstatement in applied statistics, and it inverts the actual definition. The p-value is P(data this extreme or more | H₀ true), a statement about the data given the hypothesis, not about the hypothesis given the data. The expert's fix: say the sentence out loud before quoting a p-value, "if there really were no effect, I'd see data like mine (or more extreme) with probability p", and notice how different that is from "there's a p chance nothing is going on."
- "Failing to reject H₀ proves H₀ is true." A non-significant result means the data did not provide enough evidence to overturn the null, it does not certify the null. A test with low power (small n, small effect, noisy data) will fail to reject almost anything. The expert always reports power alongside a null result, or at minimum flags the sample size, before treating "no significant effect" as "no effect."
- "I'll treat these paired, same-day return series as independent samples because that's the formula I remember." Worked Example 1 computes the cost of this exactly: the same numbers, run through the wrong test, understate the true evidence (or overstate it, depending on direction) because the correlation between paired series changes the standard error. The expert's first question on any two-sample comparison is "were these two series measured on the same units/days, or on genuinely separate ones?", before a single formula is chosen.
- "A high R² means the model is good; a low R² means it's useless." R² measures the share of variance explained in this sample, nothing about causation, nothing about whether the standard errors underneath it can be trusted, and nothing about whether the coefficients are even correctly signed. A model can have R² = 0.95 and be riddled with multicollinearity that makes every individual coefficient meaningless (Worked Example 8), or R² = 0.25 and be a perfectly well-specified, honestly diagnosed model of a genuinely noisy phenomenon. The expert reads R² last, after the diagnostics, never first.
- "The overall F is significant, so every coefficient in the model matters." A significant joint F only says at least one slope is non-zero, it says nothing about which one, and it is entirely compatible with several individually insignificant t-stats sitting on top of severe multicollinearity. The expert reads the joint test and the individual tests as answering two different questions, and reaches for VIF the moment they disagree.
- "Heteroskedasticity/serial correlation means the model is wrong and the coefficients are biased." Both diseases attack the standard errors, not the coefficients, the point estimates stay unbiased; only the inference (t-stats, p-values, confidence intervals) is compromised. This is precisely why the fix is a standard-error correction (White's robust SEs, Newey–West), not re-fitting the model from scratch. Misspecification, by contrast, genuinely biases the coefficients, conflating the four diagnostics' severity is a common and consequential error.
- "The AI ran the regression and reported clean diagnostics, so it's fine." This branch's highest-risk habit. An assistant will report an R² and move on unless explicitly told to run and interpret all four checks, and it has no reliable way to know your data is a time series (requiring DW) versus cross-sectional, or that two of your "control variables" are really the same underlying driver measured twice (VIF). The expert treats an unrequested diagnostic as an unrun one, full stop.
- "Statistically significant means it matters for the portfolio." A correlation of 0.15 on 10,000 daily observations can be statistically indistinguishable from zero-probability-of-chance and still be far too weak, in economic size, to build a strategy on after costs. Statistical significance is a floor (is this pattern distinguishable from noise at all?), never a ceiling (is this pattern big enough to trade?), the expert always states both numbers, the p-value and the economic magnitude, side by side.
The thread through all eight: the expert never lets a single summary statistic (a p-value, an R², an F, a clean-looking printout) stand in for the full checklist this module builds. Every number here answers one narrow question; reading the whole battery, in order, is the actual skill.
Worked examples
Worked example 1: Paired vs. independent two-sample tests: is a fund's edge real? (India, ₹)
A synthetic Indian large-cap active scheme, Konkan Bluechip Fund (synthetic), is compared against its benchmark over the most recently completed quarter (n = 63 trading days for each series). The fund averaged a daily return of 0.085%; the benchmark averaged 0.045%, a gap of 4 basis points a day. Daily return standard deviations: fund 1.10%, benchmark 0.95%. Because the fund holds roughly 85% of the same names as the index, its daily returns and the benchmark's daily returns carry a historical correlation of ρ = 0.99. Test, at α = 0.05, whether the fund's mean daily return statistically exceeds the benchmark's.
Solution. Step 1, the tempting, wrong approach. Treating the two return series as independent samples (ignoring that they were measured on the same 63 days) gives SE = √(1.10²/63 + 0.95²/63) = 0.18312, so t = (0.085 − 0.045)/0.18312 = 0.218, against a Welch-adjusted df ≈ 121.4 and a critical t of 1.980. Two-tailed p = 0.828. Verdict: nowhere close to significant: "no evidence of skill."
Step 2: name the error. These are not independent samples, the same 63 trading days produced both return series, and they are correlated at ρ = 0.99. The correct tool is a paired t-test on the daily differences, and treating correlated data as independent inflates the standard error, understating the true evidence.
Step 3, the correct paired test. The mean daily difference is d̄ = 0.085 − 0.045 = 0.0400. The variance of the difference series is Var(d) = s₁² + s₂² − 2ρs₁s₂ = 1.10² + 0.95² − 2(0.99)(1.10)(0.95) = 2.1125 − 2.0691 = 0.0434, so s_d = √0.0434 = 0.2083, far smaller than an independence assumption would suggest, exactly because the two series move together. SE(d̄) = 0.2083/√63 = 0.02625. t = 0.0400/0.02625 = 1.524, df = 62, critical t (two-tailed, 0.05) = 1.999, p = 0.133.
Step 4, read the contrast, not just the verdict. Both tests fail to reject at the 5% level, but the correct test's t-statistic (1.524) is nearly seven times larger than the incorrect one's (0.218), because respecting the pairing shrank the standard error from 0.183 to 0.026. A fund with a slightly larger, equally consistent daily edge, or a slightly longer sample, would flip the paired test into significance while the naive independent-samples version stayed asleep. The lesson is not "the fund has no edge"; it is that choosing the wrong test does not cost you a little precision, it can cost you the entire conclusion.
Worked example 2: Chi-square test of independence: sector and analyst rating actions (US, $)
Over one quarter, a synthetic panel of US analyst rating actions on 200 covered names is cross-tabulated by sector and action: Tech stocks received 40 upgrades, 50 holds, 10 downgrades (100 names); Industrials received 20 upgrades, 50 holds, 30 downgrades (100 names). Test, at α = 0.05, whether rating action is independent of sector.
Solution. Step 1: expected counts under independence. Row totals: Upgrade 60, Hold 100, Downgrade 40. Column totals: Tech 100, Industrials 100. Grand total 200. Expected(Tech, Upgrade) = 60×100/200 = 30; Expected(Tech, Hold) = 100×100/200 = 50; Expected(Tech, Downgrade) = 40×100/200 = 20; by symmetry the Industrials row has the same expected values (30, 50, 20).
Step 2, the chi-square statistic, cell by cell.
| Cell | O | E | (O−E)²/E |
|---|---|---|---|
| Tech–Upgrade | 40 | 30 | 3.333 |
| Tech–Hold | 50 | 50 | 0.000 |
| Tech–Downgrade | 10 | 20 | 5.000 |
| Industrials–Upgrade | 20 | 30 | 3.333 |
| Industrials–Hold | 50 | 50 | 0.000 |
| Industrials–Downgrade | 30 | 20 | 5.000 |
χ² = 3.333 + 0 + 5.000 + 3.333 + 0 + 5.000 = 16.667, df = (2−1)(3−1) = 2, critical χ² (α = 0.05) = 5.991, p = 0.00024.
Step 3, read it. χ² = 16.667 is far past the 5.991 critical value: reject independence. Tech names received disproportionately more upgrades and fewer downgrades than Industrials names during this quarter, a real, statistically overwhelming association, whatever its economic cause (a sector rotation, a macro shock hitting one sector harder). Note what the test does not tell you: causation, direction of any future move, or whether this pattern persists next quarter, it only says this quarter's pattern is not what independence would produce by chance.
Worked example 3: F-test for equal variances: two funds under one house (India, ₹)
Konkan Asset Management (synthetic) runs two schemes: Konkan Value Fund and Konkan Momentum Fund. Over the same 12 months, Konkan Value's monthly return standard deviation is 2.1%; Konkan Momentum's is 3.4%. An analyst wants to know whether the momentum scheme is statistically more volatile, or whether 12 months is too thin a sample to say so.
Solution. Step 1, set up the ratio with the larger variance on top. F = s²(Momentum)/s²(Value) = 3.4²/2.1² = 11.56/4.41 = 2.621, df₁ = 12 − 1 = 11 (Momentum, the numerator), df₂ = 12 − 1 = 11 (Value, the denominator).
Step 2, the critical value and decision. For a two-tailed test at α = 0.05, the relevant upper-tail critical value (α/2 = 0.025) is F(0.025, 11, 11) = 3.474. Since 2.621 < 3.474, fail to reject H₀: σ²(Value) = σ²(Momentum). Two-tailed p = 0.125.
Step 3, read it. The momentum scheme's realized volatility looks 62% higher, and it might genuinely run a riskier book, but with only 12 monthly observations per fund, sample variances are themselves noisy estimates, and a ratio this size is well within what chance alone could produce. The honest conclusion is "not enough evidence yet," not "these funds have the same risk", a longer track record (Practice Problem 6 revisits this with more months) is the only real fix, not a lower significance threshold.
Worked example 4: Correlation significance: a supplier and its customer (US, $)
Meridian Auto Components (synthetic), an auto-parts supplier, and Harrow Motors (synthetic), its largest OEM customer, show a sample correlation of monthly stock returns of r = 0.42 over n = 24 months. Test H₀: ρ = 0 at α = 0.05.
Solution. Step 1, the test statistic. t = r√(n−2)/√(1−r²) = 0.42 × √22 / √(1 − 0.1764) = 0.42 × 4.6904 / 0.9077 = 2.171, df = 22.
Step 2: decision. Critical t (two-tailed, 0.05, df = 22) = 2.074. Since 2.171 > 2.074, reject H₀ at the 5% level; p = 0.041.
Step 3, read it, both ways. The relationship is statistically real, plausible on its face, since a supplier's fortunes are economically tied to its major customer's order volumes, so this is not a spurious correlation in the EX2.03 sense (there is a mechanism, not just two coincidentally trending lines). But r = 0.42 means r² ≈ 0.176: only about 18% of the variance in one stock's monthly return co-moves with the other's. Statistically significant and economically modest are not a contradiction, they are two separate verdicts this module hands you, and a position-sizing or hedging decision needs both, not just the p-value.
Worked example 5: Simple regression: estimating a stock's beta, and checking its residuals (US, $)
Cascade Robotics (synthetic), a mid-cap industrial-technology company, is regressed against a synthetic market-index proxy over 24 months of paired monthly excess returns (%, illustrative, not the real historical series of any index):
| Month | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Market (x) | 2.10 | −1.40 | 3.00 | 0.50 | −2.80 | 1.90 | 4.20 | −0.60 | 1.10 | −3.50 | 2.60 | 0.20 |
| Cascade (y) | 4.03 | −1.97 | 5.55 | 3.92 | −4.05 | 2.30 | 9.03 | 0.92 | 0.75 | −3.44 | 2.78 | −0.46 |
| Month | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Market (x) | −1.90 | 3.40 | 1.00 | −0.80 | 2.20 | −2.10 | 0.60 | 1.70 | −1.20 | 2.90 | −0.40 | 1.30 |
| Cascade (y) | −1.88 | 0.96 | −1.90 | −2.00 | 1.14 | −2.01 | −0.81 | −0.33 | 1.51 | 3.66 | −0.20 | −0.89 |
Solution. Step 1, the building blocks. x̄ = 0.583, ȳ = 0.692. Sxy = Σ(xᵢ−x̄)(yᵢ−ȳ) = 113.170; Sxx = Σ(xᵢ−x̄)² = 98.173.
Step 2: slope, intercept, and beta. b₁ = 113.170/98.173 = 1.153 (Cascade's estimated beta, it moves about 15% more than the market); b₀ = 0.692 − 1.153×0.583 = 0.020.
Step 3, the fit's overall quality. SST = Σ(yᵢ−ȳ)² = 213.890; SSE (from the fitted residuals) = 83.433; SSR = SST − SSE = 130.457. R² = SSR/SST = 0.610; adjusted R² = 1 − (1−0.610)(23/22) = 0.592. About 61% of Cascade's monthly variance co-moves with the market, a realistic figure for a single stock against a broad index.
Step 4, is the slope statistically real? SER = √(SSE/22) = √(83.433/22) = 1.947. SE(b₁) = SER/√Sxx = 1.947/√98.173 = 0.197. t = 1.153/0.197 = 5.865, df = 22, p < 0.0001, the beta is overwhelmingly distinguishable from zero. 95% confidence interval: 1.153 ± 2.074×0.197 = (0.745, 1.560), so even the low end of the interval is a beta meaningfully above zero. Read the other end of that interval before you write the sentence, though, because it straddles 1.0: at the 5% level this stock is not statistically distinguishable from a beta-1 stock. Testing that restriction directly, t = (1.153 − 1)/0.197 = 0.777 on 22 degrees of freedom, two-tailed p = 0.445, nowhere near rejection. The point estimate is 1.153 and the honest statement is that 24 months of data cannot separate it from 1. Cross-check: F = t² = 5.865² = 34.40, matching the model's overall F-statistic exactly, as the simple-regression identity promises.
Step 5, check the residuals for serial correlation. This is a time-ordered series (24 consecutive months), so Durbin–Watson applies. Computing DW from the fitted residuals gives DW = 1.478, below 2, signaling mild positive autocorrelation, consistent with the residuals' own lag-1 correlation of ρ̂ ≈ 0.225 (recall DW ≈ 2(1−ρ̂): 2×(1−0.225) = 1.55, close to the exact 1.478). This is not a crisis (the coefficient estimates remain unbiased) but it means the true standard errors are somewhat larger than the 0.197 reported above, so a Newey–West correction would be the honest next step before quoting the t-statistic in a memo, not a reason to discard the beta itself.
Worked example 6: Diagnostic drill: detecting heteroskedasticity (India, ₹)
A sample of 16 INR corporate bond issues is used to model the pricing error (in basis points, actual minus model-implied yield) as a function of issue size (₹ crore):
| Issue size (₹ cr) | 100 | 150 | 200 | 260 | 320 | 400 | 470 | 560 | 650 | 760 | 880 | 1000 | 1140 | 1280 | 1430 | 1600 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Pricing error (bps) | 11.4 | 8.2 | 7.5 | −4.0 | 6.1 | 5.8 | 8.8 | 3.0 | 10.9 | 4.9 | −10.6 | 33.6 | 37.4 | 63.3 | 20.8 | 7.6 |
Solution. Step 1: fit the line. OLS gives error = 0.447 + 0.0185 × size, R² = 0.243 (a deliberately loose fit, this drill is about the residuals' behavior, not the fit's tightness). Step 2, look before you test. Plotted, the residuals visibly fan out: small, tight errors at low issue sizes (−4.0 to 11.4) and wildly larger swings at high issue sizes (20.8 to 63.3), the textbook signature of heteroskedasticity. Step 3: run Breusch–Pagan. Regressing the squared residuals on issue size (the auxiliary regression) and computing LM = n × R²(auxiliary) gives LM = 4.683, distributed chi-square with 1 df under H₀ of homoskedasticity; p = 0.030. Step 4, read it. Reject homoskedasticity at the 5% level: the error variance genuinely grows with issue size (larger, less frequently traded issues carry noisier pricing). The coefficients (0.447, 0.0185) are still unbiased, but any t-test or confidence interval built from the default standard errors understates the true uncertainty, and a White heteroskedasticity-robust standard error (not recomputed here, but the correct next step) is what a memo should actually quote.
Worked example 7: Diagnostic drill: catching misspecification with RESET (US, $)
Sixteen US companies are ranked into a firm-scale index (1 = smallest, 16 = largest in the sample) and their operating margins are recorded:
| Scale | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Op. margin (%) | 10.33 | 11.85 | 14.96 | 15.15 | 16.68 | 18.57 | 18.29 | 19.22 | 20.20 | 20.34 | 20.11 | 20.62 | 20.37 | 20.48 | 18.79 | 18.53 |
Solution. Step 1: fit a straight line. margin = 13.239 + 0.534 × scale, R² = 0.642, overall F = 25.11 (p = 0.0002), by the individual-coefficient reading alone, this looks like a solid, significant model. Step 2, look at the shape the fit is forced to ignore. Margin climbs steeply through the small-and-mid-scale firms, then visibly flattens and even dips at the largest scale, diminishing (and eventually negative) returns to scale, a curve, not a line. Step 3: run RESET (Ramsey, 1969). Add the squared fitted values from the linear model as an extra regressor and test its significance: F = 226.35, p < 0.0001, an overwhelming rejection of "the linear form is adequate." Step 4, read it. A strong R² and a significant overall F said nothing about whether the functional form was right: RESET is the one test in this section that checks that question directly, and here it screams that a straight line is the wrong shape entirely. Unlike heteroskedasticity or serial correlation, this is not a standard-error problem: the linear coefficients (13.239, 0.534) are themselves biased by the missing curvature, and no amount of extra data fixes that, only refitting with the right functional form (a quadratic or a log term in scale) does.
Worked example 8: Full multiple-regression capstone: pricing credit spreads (India, ₹)
A cross-section of 20 synthetic mid-market Indian corporate bond issuers is assembled: Debt/EBITDA (leverage), Interest Coverage Ratio, a PSU (public-sector undertaking) dummy (1 = PSU), and the credit spread over the matched-maturity G-Sec (basis points, all figures synthetic and internally Python-consistent).
| Issuer | Lev | Coverage | PSU | Spread | Issuer | Lev | Coverage | PSU | Spread | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1.8 | 7.7 | 0 | 171 | 11 | 2.7 | 5.3 | 0 | 196 | |
| 2 | 2.4 | 5.9 | 0 | 177 | 12 | 3.9 | 4.2 | 1 | 204 | |
| 3 | 3.1 | 5.1 | 1 | 192 | 13 | 5.6 | 3.1 | 1 | 310 | |
| 4 | 4.6 | 2.3 | 1 | 312 | 14 | 2.2 | 6.6 | 1 | 118 | |
| 5 | 2.0 | 6.5 | 0 | 178 | 15 | 4.4 | 3.3 | 1 | 252 | |
| 6 | 5.2 | 3.0 | 1 | 296 | 16 | 1.9 | 6.0 | 0 | 167 | |
| 7 | 3.6 | 4.5 | 0 | 265 | 17 | 3.3 | 5.5 | 0 | 232 | |
| 8 | 1.5 | 7.2 | 0 | 129 | 18 | 4.9 | 4.3 | 1 | 308 | |
| 9 | 4.1 | 4.5 | 1 | 220 | 19 | 2.6 | 5.9 | 0 | 157 | |
| 10 | 6.0 | 1.7 | 1 | 331 | 20 | 5.9 | 2.0 | 1 | 384 |
Solution. Step 1, the full regression, Spread on Lev, Coverage, and PSU.
| Term | Coefficient | SE | t | p | 95% CI |
|---|---|---|---|---|---|
| Intercept | 101.686 | 85.695 | 1.187 | 0.253 | (−79.98, 283.35) |
| Lev | 51.775 | 12.194 | 4.246 | 0.001 | (25.93, 77.62) |
| Coverage | −6.823 | 9.552 | −0.714 | 0.485 | (−27.07, 13.43) |
| PSU | −45.592 | 15.229 | −2.994 | 0.009 | (−77.88, −13.31) |
R² = 0.921, adjusted R² = 0.906, overall F = 62.14 (p < 0.0001, df = 3, 16).
Step 2, read the coefficients. Every one-turn increase in Debt/EBITDA is associated with 52 additional bps of spread, holding coverage and PSU status fixed: sensible in sign and size. Coverage carries the expected negative sign (more coverage, lower spread) but is not statistically significant (p = 0.485) despite a strong overall model. PSU status is worth a 46 bps discount, consistent with an implicit sovereign backing story, and is significant (p = 0.009).
Step 3: diagnose the Coverage puzzle: multicollinearity. corr(Lev, Coverage) = −0.950, leverage and coverage are telling the regression almost the same story from opposite directions, which is exactly why Coverage's individual t-stat is weak despite the model's strong overall fit. Computing VIF via the auxiliary-regression definition: regressing Lev on {Coverage, PSU} gives an auxiliary R² of 0.914, so VIF(Lev) = 1/(1−0.914) = 11.60; the symmetric calculation gives VIF(Coverage) = 10.30. Both comfortably clear the conventional 5–10 flag threshold. Coverage's insignificance is a multicollinearity symptom, not evidence that coverage genuinely does not matter to credit risk. (PSU's VIF is a much milder 2.24.)
Step 4, diagnose the PSU coefficient: omitted-variable bias. Drop PSU and refit on Lev and Coverage alone: Lev's coefficient falls from 51.775 to 39.542 (SE rises from 12.19 to 13.92; R² falls from 0.921 to 0.877). This is not noise, it is the omitted-variable-bias formula working exactly as predicted. Regressing PSU on Lev gives a slope of δ = 0.262 (PSU status correlates positively with higher leverage in this sample: PSU issuers here run somewhat more debt). The predicted bias is β(PSU) × δ = (−45.592)(0.262) = −11.95, closely matching the actual shift of 39.542 − 51.775 = −12.23. Because PSU status is negatively priced (lower spread) and positively correlated with leverage, omitting it makes leverage's own coefficient look artificially smaller than its true effect, exactly the sign and rough size the formula predicts, computed before you ever saw the "corrected" number.
Step 5, check the remaining diagnostics. Breusch–Pagan on the full model: LM = 1.778, p = 0.620, no evidence of heteroskedasticity here (this specification, unlike Worked Example 6's, passes cleanly). RESET: F = 0.393, p = 0.540, no evidence of missing curvature either (this specification, unlike Worked Example 7's, is not obviously mis-shaped). Note that passing a diagnostic is itself worth reporting, not just failing one, a full read states all four checks, whichever way each one lands.
Step 5b, the partial F, twice. Coverage's individual t-statistic is −0.714. Test the same restriction the other way. Refit on Lev and PSU alone: SSE_R = 8,450.26 against the full model's SSE_U = 8,189.08, so with q = 1 and 16 residual degrees of freedom,
F = [(8450.26 − 8189.08)/1] / [8189.08/16] = 261.18 / 511.82 = 0.5103
and t² = (−0.7144)² = 0.5103, identical, with the same p of 0.485. The R² route agrees: [(0.920960 − 0.918439)/1] / [(1 − 0.920960)/16] = 0.5103. Now the version no single t-statistic can give you. Drop both Coverage and PSU and refit on leverage alone: SSE_R = 13,056.68, q = 2, and
F = [(13056.68 − 8189.08)/2] / [8189.08/16] = 2433.80 / 511.82 = 4.755
on (2, 16) degrees of freedom, p = 0.0239, which rejects at the 5% level against a critical value near 3.63. Read the two results together, because they answer different questions. Coverage adds nothing detectable once leverage and PSU are already in. Coverage and PSU jointly add something the model would otherwise miss, and that joint verdict is carried by PSU, whose own t-statistic had already cleared the bar. Individual t-statistics answer one question at a time and cannot tell you whether a group of predictors earns its place, which is the whole reason the partial F exists.
Step 6, the verdict. Leverage drives spreads with a statistically and economically convincing effect; PSU status carries a real, significant discount; Coverage's theoretically-expected effect is present in sign but swamped by its overlap with Leverage, and only a longer panel or a differently-constructed coverage measure would separate the two cleanly. This is what a fully diagnosed multiple regression looks like, every one of the four diseases checked, named, and either cleared or flagged with its consequence stated.
Practice set
Work every problem before reading its solution. Every numeric answer below was computed in Python and is reproducible from the stated formula; tolerance ±2% unless the problem is a table lookup.
P1 (guided). State the framework. A quant claims a new factor "works." Write H₀ and Hₐ for testing whether the factor's mean long-short return is different from zero, state what a p-value of 0.03 actually means, and state what it does not mean.
Solution. H₀: μ = 0 (the factor's true mean return is zero); Hₐ: μ ≠ 0. A p-value of 0.03 means: if the true mean return were really zero, a sample this extreme or more extreme would occur with probability 3%. It does not mean there is a 3% chance the factor truly has no effect, and it does not mean the factor is economically large enough to trade, only that it is statistically distinguishable from noise at conventional thresholds.
P2 (guided). One-sample z-test. A large sample of n = 100 monthly returns has a mean of 1.2% and an assumed known population σ = 5%. Test H₀: μ = 0 at α = 0.05.
Solution. z = 1.2/(5/√100) = 1.2/0.5 = 2.400. Two-tailed p = 0.016. Since 2.400 > 1.96, reject H₀, the mean is statistically distinguishable from zero at the 5% level.
P3. One-sample t-test. A strategy's n = 16 monthly returns average 2.3% with s = 4.0%. Test H₀: μ = 0.
Solution. t = 2.3/(4.0/√16) = 2.3/1.0 = 2.300, df = 15. Critical t (two-tailed, 0.05) = 2.131; p = 0.036. Reject H₀, but note n = 16 is a thin sample, and the 95% CI (2.3 ± 2.131×1.0 = 0.17 to 4.43) is wide enough that "the true mean is close to zero" remains plausible even after rejecting exactly zero.
P4. Type I/II and power, conceptual. A regulator sets α = 0.01 instead of the usual 0.05 for flagging a fund as an outlier performer worth investigating. What happens to the Type I error rate, the Type II error rate, and power, and is this a free improvement?
Solution. Type I error rate falls to 1% by construction (fewer false alarms). Type II error rate rises and power falls, the stricter bar makes it harder to flag a genuinely unusual fund too, so real cases are missed more often. It is not a free improvement: the regulator has simply moved the trade-off, trading fewer false alarms for more missed real cases, and the only way to improve both simultaneously is a larger sample (more months of data per fund).
P5. Chi-square goodness-of-fit. A ratings model predicts 15%/35%/50% of a 50-bond sample should sit in three risk buckets; the observed counts are 8, 15, 27. Test the fit at α = 0.05.
Solution. Expected counts: 7.5, 17.5, 25.0. χ² = (8−7.5)²/7.5 + (15−17.5)²/17.5 + (27−25)²/25 = 0.033 + 0.357 + 0.160 = 0.550, df = 2, critical χ² = 5.991, p = 0.759. Fail to reject, the observed bucket counts are entirely consistent with the model's predicted proportions.
P6. F-test with a longer track record. Revisit Worked Example 3's two Konkan schemes, but suppose five years of monthly data (n = 60 each) produced the identical sample standard deviations (2.1% and 3.4%). Recompute the F-test and compare the conclusion to the 12-month version.
Solution. F is unchanged at 2.621 (it depends only on the variances, not directly on n), but df₁ = df₂ = 59, and the critical F(0.025, 59, 59) is much smaller, roughly 1.67, than the 12-month critical value of 3.474. Now reject H₀: the same variance ratio that was inconclusive at 12 months is decisive at 60, because a longer track record shrinks the sampling noise in the variance estimates themselves, even though the true variances never changed. This is the direct F-test analogue of the power lesson: more data does not change the truth, it changes your ability to detect it.
P7. Correlation test. Two macro series show r = 0.35 over n = 30 observations. Test H₀: ρ = 0.
Solution. t = 0.35√28/√(1−0.1225) = 0.35×5.2915/0.9368 = 1.977, df = 28, critical t = 2.048, p = 0.058. Fail to reject at the conventional 5% level (though only barely), a textbook illustration of a "nearly there" result that a good analyst reports honestly as inconclusive rather than rounding up to "significant."
P8. Regression slope inference from summary statistics. A regression reports a slope of 850 with a standard error of 210 on n = 22 observations. Test whether the slope is significantly different from zero and give a 95% confidence interval.
Solution. t = 850/210 = 4.048, df = 20, critical t = 2.086, p = 0.0006: highly significant. 95% CI: 850 ± 2.086×210 = 850 ± 438.05 = (411.9, 1288.1). Multiply the critical value by the standard error yourself rather than reading a half-width off a neighbouring line. Here 2.086 × 210 = 438.05. A half-width of 430.2 would imply a critical t of 2.049, which is the 28-degrees-of-freedom value rather than this problem's 20. Note how wide the interval still is even with a clearly significant slope, statistical significance tells you the effect is not zero, not that you know its size precisely.
P9. Multiple regression from summary statistics. A regression has SST = 4,200, SSE = 860, n = 25, and k = 4 predictors. Compute R², adjusted R², and the overall F-test.
Solution. R² = 1 − 860/4200 = 0.795. Adjusted R² = 1 − (1−0.795)(24/20) = 0.754. F = (0.795/4)/((1−0.795)/20) = 19.42, df = (4, 20), p < 0.0001, the model is jointly highly significant, and the modest gap between R² and adjusted R² (0.795 vs 0.754) says the four predictors are, on balance, earning their place.
P10. VIF from a stated correlation. Two predictors in a regression correlate at r = 0.85 with each other (and are the only two predictors). Compute the VIF for each.
Solution. With only two predictors, R²_j (predictor j regressed on the other) equals r² = 0.7225. VIF = 1/(1−0.7225) = 3.60 for both, below the conventional 5 flag, but worth watching; at r = 0.90 the same formula gives VIF ≈ 5.26, crossing the line.
P11. Heteroskedasticity consequence, conceptual. A colleague says, "Breusch–Pagan flagged heteroskedasticity, so I need to re-estimate the coefficients." Correct the statement.
Solution. Incorrect. Heteroskedasticity leaves the OLS coefficients unbiased, the point estimates do not need re-fitting. What breaks is the standard errors (and everything built on them: t-tests, p-values, confidence intervals). The fix is a heteroskedasticity-robust (White) standard-error correction applied to the existing coefficients, not a new regression.
P12. Durbin–Watson interpretation. A time-series regression reports DW = 1.15 with n = 40. Interpret the direction of any autocorrelation and estimate ρ̂.
Solution. DW = 1.15 is well below 2, indicating positive serial correlation in the residuals. Using the approximation ρ̂ ≈ 1 − DW/2 = 1 − 0.575 = 0.425, a fairly substantial lag-1 autocorrelation, meaning the reported standard errors are likely understating the true uncertainty; a Newey–West correction is called for before trusting any t-stat from this regression.
P13. Omitted-variable-bias direction. A regression of employee productivity on training hours omits "years of tenure." Tenure is positively correlated with training hours, and, on its own, tenure has a positive effect on productivity. Predict the direction of the bias on the training-hours coefficient if tenure is left out.
Solution. Bias = β(tenure) × δ(tenure on training hours). Both β(tenure) and δ are positive here, so the bias is positive, the short regression's training-hours coefficient will be inflated, appearing to have a larger effect on productivity than it truly does, because it is silently absorbing some of tenure's own (omitted) positive effect.
P14. Multicollinearity vs. omitted-variable bias, conceptual. Distinguish the two: which one biases the coefficients, and which one merely makes them imprecise?
Solution. Multicollinearity leaves coefficients unbiased in expectation but inflates their standard errors, a precision problem. Omitted-variable bias (a form of misspecification) genuinely biases the remaining coefficients, a correctness problem that more data alone cannot fix. Confusing the two leads to the wrong remedy: throwing more data at an omitted-variable problem does not help; only including the missing variable does.
P15. Sample-size calculation. At α = 0.01 (one-tailed), you want 90% power to detect a true mean difference of 0.4 against a population σ = 1.2. What sample size is required?
Solution. n = [(z_α + z_β)σ/Δ]² = [(2.326 + 1.282)×1.2/0.4]² = 117.15, round up to n = 118. Note how much more data a stricter α (0.01 vs the usual 0.05) and a higher target power (90% vs 80%) demand, both choices are legitimate, but each has a sample-size price tag that should be computed, not assumed.
P16. Read a full printout. A simple regression reports a slope of 3.8, SE = 1.1, n = 20, and R² = 0.55. Compute the t-stat, its p-value, the implied overall F, and adjusted R².
Solution. t = 3.8/1.1 = 3.455, df = 18, p = 0.0028: significant. Using the simple-regression identity F = t²: F = 11.93, matching what the model's overall F-test would report. Adjusted R² = 1 − (1−0.55)(19/18) = 0.525. All four numbers are internally consistent, cross-checking them against each other (as here) is a fast way to catch a transcription error in a real printout before you quote it.
P17. Choosing the right diagnostic, routing. For each situation, name the single diagnostic test that applies first: (a) monthly time-series regression of a stock's return on the market; (b) a cross-sectional regression with three predictors, two of which are both measures of company size; (c) a scatterplot of the residuals against fitted values that visibly curves; (d) a scatterplot of the residuals against a predictor that visibly fans out in width.
Solution. (a) Durbin–Watson (time-ordered data, check serial correlation first). (b) VIF (overlapping predictors, check multicollinearity). (c) RESET (a curved residual pattern is the visual signature of misspecification). (d) Breusch–Pagan (a fanning residual pattern is the visual signature of heteroskedasticity). Matching the visual or structural symptom to the right named test, before running any of them blind, is the actual diagnostic skill.
P18 (timed: 10 min). Full routing and interpretation. A junior analyst hands you a regression of corporate bond spreads on three predictors with R² = 0.93, an overall F that is highly significant, but only one of the three individual coefficients is statistically significant. They conclude "the other two predictors don't matter, drop them." Using this module's full toolkit, write the three questions you would ask before agreeing, and state what result on each question would change the conclusion.
Solution. (1) What is the VIF of each predictor? If the two "insignificant" predictors are highly correlated with each other or with the significant one (VIF > 5–10), their weak individual t-stats are a multicollinearity artifact, not evidence of irrelevance, dropping them without checking VIF risks losing genuinely relevant variables. (2) Does the sign and rough size of each "insignificant" coefficient still make economic sense? If yes, that supports "present but imprecisely estimated" over "truly zero." (3) Has RESET and Breusch–Pagan been run? A misspecified functional form or uncorrected heteroskedasticity can distort which individual coefficients look significant, independent of whether the variables genuinely belong in the model. Only after checking VIF, economic sign, and the two remaining diagnostics, and finding the predictors genuinely uncorrelated, wrong-signed or negligible in size, and the model otherwise clean, would dropping them be the right call; a high VIF alone would flip the recommendation to "keep both, the weak t-stats are multicollinearity, not irrelevance."
P19. Partial F from summary statistics. A four-predictor regression on n = 30 observations reports SSE = 1,240. Dropping two of the four predictors and refitting gives SSE = 1,520. Test at the 5% level the joint hypothesis that both dropped coefficients are zero. Then, given that one of those two carried an individual t-statistic of 1.85, state what SSE the restricted model would have shown had you dropped only that one.
Solution. Unrestricted degrees of freedom: n − k − 1 = 30 − 4 − 1 = 25, so the unrestricted mean squared error is 1,240/25 = 49.60. With q = 2 restrictions,
F = [(1520 − 1240)/2] / [1240/25] = 140 / 49.60 = 2.823
on (2, 25) degrees of freedom, against a 5% critical value of 3.385; p = 0.078, so the joint hypothesis is not rejected at 5%. For the single-restriction case, run the identity backwards. The partial F must equal t² = 1.85² = 3.423, so 3.423 = (SSE_R − 1240)/49.60, giving SSE_R = 1240 + 3.423 × 49.60 = 1,409.76. Two things are worth noticing. The single coefficient's own p of 0.076 and the joint p of 0.078 are close here only by coincidence; nothing forces a joint test and its components to agree, which is exactly why you run both. And a joint test that fails to reject is not a licence to drop the pair, because P18's multicollinearity question still has to be answered first.
Applied mini-project
The factor autopsy.
You are handed (or you construct, following R3's discipline) a synthetic cross-section of 15–20 securities with a candidate "factor" (any characteristic you choose, a size, quality, or valuation proxy) and a forward return. Run the full battery this module built, in order, and write it up as a one-page memo.
Do this, in order:
- Simple regression. Regress the forward return on the candidate factor alone. Report the slope, its standard error, t-stat, p-value, and R².
- Hypothesis test the slope. State H₀/Hₐ explicitly, report the decision at α = 0.05, and give the 95% confidence interval.
- Extend to multiple regression. Add at least one control variable (a second characteristic plausibly correlated with both the factor and the return). Report the full new printout (every coefficient, SE, t, p) and adjusted R².
- Run all four diagnostics. Heteroskedasticity (Breusch–Pagan) and misspecification (RESET) always; serial correlation (Durbin–Watson) if your data has a genuine time order; multicollinearity (VIF) because you now have more than one predictor. Report each test's statistic, its p-value or threshold comparison, and your read.
- Separate statistical from economic significance. State explicitly: is the factor's effect statistically distinguishable from zero? Is its size large enough to matter for a real position, before costs? These can have different answers, and your memo must give both.
- Verdict. One paragraph: does the factor survive the full autopsy, survive with caveats (name them), or fail? Name the single diagnostic that most changed your read of the raw regression output.
Self-check rubric (score yourself, pass at 8/10 with no zero on any item): 2 points, every number in steps 1–3 is arithmetically consistent (t = coefficient/SE, F = t² for the simple case, adjusted R² correctly penalizes the added predictor). 2 points, all four diagnostics from step 4 were actually run and correctly interpreted (not just named). 2 points, the omitted-variable-bias or multicollinearity direction (whichever applies) is explained with the formula, not just asserted. 2 points, statistical and economic significance are explicitly separated in step 5. 2 points, the verdict in step 6 correctly identifies which diagnostic, if any, changed the conclusion from what the raw R² alone would have suggested.
Reading & resources
Everything below deepens or formalizes what this module already taught by hand; none of it is required to pass the gate.
Core texts:
- Wooldridge, Introductory Econometrics: A Modern Approach: the standard reference for everything in this module's regression half, assumptions through diagnostics, in full rigor. [Paid] [Core/Intermediate]
- CFA Institute Quantitative Methods curriculum readings (hypothesis testing, correlation, and regression), the exam-aligned treatment of this exact syllabus. [Paid] [Core]
- Ruppert & Matteson, Statistics and Data Analysis for Financial Engineering, the same material with a finance-specific data lens. [Paid] [Advanced]
Free and beginner-friendly:
- StatQuest (Josh Starmer), short, visual explanations of p-values, t-tests, and R² that build the same intuition this module derives formally. [Free] [Beginner]
- Khan Academy, Statistics and Probability, hypothesis-testing and regression fundamentals from first principles. [Free] [Beginner]
- James, Witten, Hastie & Tibshirani, An Introduction to Statistical Learning (free PDF). Chapter 3 covers simple and multiple regression at exactly this module's depth, and is the direct bridge to DA1.05's in-code treatment. [Free] [Core]
The original papers (for when you want the source, not the summary):
- Welch, The Generalization of Student's Problem When Several Different Population Variances Are Involved (Biometrika, 1947), the unequal-variance two-sample t-test used throughout. [Paid/library] [Advanced]
- Durbin & Watson, Testing for Serial Correlation in Least Squares Regression (Biometrika, 1950/1951), the DW statistic. [Paid/library] [Advanced]
- Breusch & Pagan, A Simple Test for Heteroscedasticity and Random Coefficient Variation (Econometrica, 1979); White, A Heteroskedasticity-Consistent Covariance Matrix Estimator (Econometrica, 1980), the two heteroskedasticity tests/fixes named in this module. [Paid/library] [Advanced]
- Ramsey, Tests for Specification Errors in Classical Linear Least-Squares Regression Analysis (Journal of the Royal Statistical Society, 1969), the RESET test. [Paid/library] [Advanced]
Do this, not just read: take any regression printout you encounter this week, from a screener, a research note, or your own EX2.03 LINEST output, and run this module's five-step reading order on it before you believe a single coefficient.
Teach it back & journal
Feynman prompt. Explain to a colleague who has only ever read a regression printout, never built one, why a model can show R² = 0.93, a highly significant overall F, and still be one you should not trust yet. Walk them through all four diagnostics by name (heteroskedasticity, serial correlation, multicollinearity, misspecification) say in one sentence each what breaks and what doesn't, and finish with the omitted-variable-bias formula stated in words, not symbols. If your colleague can, unprompted, ask "did you check VIF?" the next time they see a strong F sitting on top of weak individual t-stats, you have installed the actual skill this module teaches.
Journal prompt. Take one regression, correlation claim, or "statistically significant" result you encounter this week (in your own analysis, a research note, or a screener output) and run it through this module's five-step reading order end to end: economic sign check, individual t-tests, the overall F vs. the individual t-stats, adjusted R² if predictors were compared, and all four diagnostics appropriate to the data's structure. Write down which single check, if any, changed your read of the headline number. Then answer honestly: before this module, would you have caught it? The gap between those two answers is exactly what QM1.02 was built to close, and it is also, per this branch's opening warning, exactly where an AI copilot will not catch it for you unless you already know to ask.
This module's flashcards and mastery quiz are wired into the app: see the node's Quiz and Reviews.