more typos

This commit is contained in:
2026-07-03 08:54:41 -04:00
parent 572fd0e47d
commit 4dd5a4c2cf
5 changed files with 16 additions and 17 deletions
@@ -20,7 +20,7 @@
"| Term | Meaning |\n",
"|------|---------|\n",
"| **Return** | Fractional price change: $r_{t} = p_t / p_{t-1} - 1$ |\n",
"| **Return panel** $\\mathbf{R}$ | The $T \\times N$ matrix of monthly returns — months (rows) × stocks (columns); the project's central object |\n",
"| **Return panel** $\\mathbf{R}$ | The $T \\times N$ matrix of monthly returns — months (rows) $\\times$ stocks (columns); the project's central object |\n",
"| **Cross-section** | A row of $\\mathbf{R}$ — all stocks at one date |\n",
"| **One stock's history** | A column of $\\mathbf{R}$ |\n",
"| **Universe** | The set of stocks (columns) we're allowed to hold — here the S&P 500 |\n",
@@ -372,7 +372,7 @@
"id": "5659b941",
"metadata": {},
"source": [
"Note that we added a sample size filter with `mask.sum() < 20`. The `mask` identifies stocks that have both a valid factor score and a valid forward return in a given month, and `mask.sum()` counts how many usable pairs you actually have. The `< 20` threshold prevents the code from computing a correlation on a tiny sample, which is statistically meaningless and numerically unstable (e.g., Spearman correlation on 2 stocks is always exactly ±1). If you don't gate this, early-history months, mass delistings, or data gaps inject garbage ±1.0 values into your IC time series, which then contaminate every downstream statistic like the mean IC, Information Ratio, and decay curves. Setting a floor of 20 filters out those degenerate months while retaining enough valid data to produce a reliable signal.\n",
"Note that we added a sample size filter with `mask.sum() < 20`. The `mask` identifies stocks that have both a valid factor score and a valid forward return in a given month, and `mask.sum()` counts how many usable pairs you actually have. The `< 20` threshold prevents the code from computing a correlation on a tiny sample, which is statistically meaningless and numerically unstable (e.g., Spearman correlation on 2 stocks is always exactly $\\pm$1). If you don't gate this, early-history months, mass delistings, or data gaps inject garbage $\\pm 1.0$ values into your IC time series, which then contaminate every downstream statistic like the mean IC, Information Ratio, and decay curves. Setting a floor of 20 filters out those degenerate months while retaining enough valid data to produce a reliable signal.\n",
"\n",
"We do this sort of masking throughout."
]
@@ -19,7 +19,7 @@
"\n",
"| Term | Meaning |\n",
"|------|---------|\n",
"| **Winsorization** | Clipping extreme values at ±$k$ standard deviations — a soft truncation to limit outlier influence |\n",
"| **Winsorization** | Clipping extreme values at $\\pm k$ standard deviations — a soft truncation to limit outlier influence |\n",
"| **Z-scoring** | Centering to mean 0 and scaling to std 1, so each factor vector lives on the same scale |\n",
"| **Neutralization** | Projecting out unwanted components (sector) — an orthogonal projection onto a complement subspace |\n",
"| **Composite signal** | A linear combination $c_t = \\sum_k w_k f_{k,\\perp}$ of neutralized factor vectors |\n",
@@ -125,7 +125,7 @@
"source": [
"## Winsorization and Z-Scoring\n",
"\n",
"**Winsorization** is a statistical technique for limiting the influence of extreme outliers in a dataset by capping them at a specified threshold rather than removing them entirely. Raw factor exposures can have extreme outliers — a stock that returned 500% in the trailing year, for instance. We **Winsorize** at ±3 standard deviations, so that we don't have to drop them.\n",
"**Winsorization** is a statistical technique for limiting the influence of extreme outliers in a dataset by capping them at a specified threshold rather than removing them entirely. Raw factor exposures can have extreme outliers — a stock that returned 500% in the trailing year, for instance. We **Winsorize** at $\\pm 3$ standard deviations, so that we don't have to drop them.\n",
"\n",
"After winsorization we **z-score** cross-sectionally: for each date $t$, the factor vector $f_t$ is transformed to\n",
"$$\\tilde{f}_t = (f_t - \\bar{f}_t) / \\text{std}(f_t),$$\n",
@@ -268,7 +268,7 @@
"id": "9740141a",
"metadata": {},
"source": [
"Much like in Notebook 02, we note that we added a sample size filter with `mask.sum() < 30`. The `mask` identifies stocks that have both a valid factor score and a valid forward return in a given month, and `mask.sum()` counts how many usable pairs you actually have. The `< 30` threshold prevents the code from computing a correlation on a tiny sample, which is statistically meaningless and numerically unstable (e.g., Spearman correlation on 2 stocks is always exactly ±1). If you don't gate this, early-history months, mass delistings, or data gaps inject garbage ±1.0 values into your IC time series, which then contaminate every downstream statistic like the mean IC, Information Ratio, and decay curves. Setting a floor of 30 filters out those degenerate months while retaining enough valid data to produce a reliable signal.\n",
"Much like in Notebook 02, we note that we added a sample size filter with `mask.sum() < 30`. The `mask` identifies stocks that have both a valid factor score and a valid forward return in a given month, and `mask.sum()` counts how many usable pairs you actually have. The `< 30` threshold prevents the code from computing a correlation on a tiny sample, which is statistically meaningless and numerically unstable (e.g., Spearman correlation on 2 stocks is always exactly $\\pm$1). If you don't gate this, early-history months, mass delistings, or data gaps inject garbage $\\pm 1.0$ values into your IC time series, which then contaminate every downstream statistic like the mean IC, Information Ratio, and decay curves. Setting a floor of 30 filters out those degenerate months while retaining enough valid data to produce a reliable signal.\n",
"\n",
"We do this sort of masking throughout."
]
+3 -3
View File
@@ -787,7 +787,7 @@
"\n",
"### When Sortino > Sharpe\n",
"\n",
"A strategy with occasional large positive surprises will have Sortino noticeably higher than Sharpe. A strategy with symmetric volatility (gains and losses of similar magnitude) will have Sortino Sharpe. Big gap between them tells you the return distribution is positively skewed.\n",
"A strategy with occasional large positive surprises will have Sortino noticeably higher than Sharpe. A strategy with symmetric volatility (gains and losses of similar magnitude) will have Sortino $\\approx$ Sharpe. Big gap between them tells you the return distribution is positively skewed.\n",
"\n",
"---\n",
"\n",
@@ -808,8 +808,8 @@
"$$V_t = \\prod_{s=1}^{t}(1 + r_{p,s}) = (1+r_1)(1+r_2)\\cdots(1+r_t)$$\n",
"\n",
"This is **compounding**. Start with $\\$1$. Each month, multiply by $(1 + r_s)$:\n",
"- Return $+5\\%$ multiply by $1.05$\n",
"- Return $-3\\%$ multiply by $0.97$\n",
"- Return $+5\\%$ $\\rightarrow$ multiply by $1.05$\n",
"- Return $-3\\%$ $\\rightarrow$ multiply by $0.97$\n",
"\n",
"$V_t$ is the value of your $\\$1$ at the end of month $t$. If $V_t = 1.50$, your $\\$1$ has grown to $\\$1.50$.\n",
"\n",