SPB Git

spb/wp17_uqo

Public

FIRC0002 Stage E exhibits (Agent 9): every table fragment fits the text block without scaling (34/34 in a hook-free width scan; 8 pt body for wide tables, 3-4 pt tabcolsep, two-line makecell headers, paragraph cells for long labels, abbreviated correlation headers, construct-validity table reduced to 7 columns); corpus macros renamed to letter-only names at source (code/n1, results/n1/corpus_macros.tex; macros_stageE.tex unchanged); clean build of main.pdf (0 errors, 0 undefined, 0 overfull > 5 pt, 92 pages)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Nov 5, 2026) parent a24cdc2 Browse files

39 changed files +280 −266

modified code/n1/n1_01_corpus_counts.py +1 −1
@@ -99,7 +99,7 @@ macros = [
99 99 f"\\newcommand{{\\mChunkShareFull}}{{{100*out['chunk_word_count']['share_eq512']:.1f}}}",
100 100 ]
101 101 for ft in ["10-K", "10-Q", "8-K"]:
102 − key = ft.replace("-", "")
102 + key = {"10-K": "TenK", "10-Q": "TenQ", "8-K": "EightK"}[ft] # letter-only macro names (LaTeX control sequences cannot contain digits)
103 103 if ft in forms:
104 104 macros.append(f"\\newcommand{{\\mnFilings{key}}}{{{fmt(forms[ft]['n'])}}}")
105 105 macros.append(f"\\newcommand{{\\mnParsed{key}}}{{{fmt(forms[ft]['parsed'])}}}")
modified paper/main.pdf +0 −0

Binary file not shown.

modified paper/tables/macros.tex +1 −0
@@ -4,6 +4,7 @@
4 4 % by a bare \input{tables/<name>}. \ExhibitFigure{label}{caption}{content} does the same for figures.
5 5 % Both wrappers record the label as placed, and \ExhibitOnce{label}{...} prints its argument only if the label has not been placed yet
6 6 % (used by tables/appendix_exhibits.tex as a safety net: an exhibit placed in the sections, in either convention, is not printed twice).
7 +\usepackage{makecell}
7 8 \makeatletter
8 9 \providecommand{\ExhibitTable}{}\renewcommand{\ExhibitTable}[4]{\global\@namedef{exh@done@#1}{}\ifx\@captype\@undefined\begin{table}[htbp]\centering #3\caption{#2}\label{#1}#4\end{table}\else #4\fi}
9 10 \providecommand{\ExhibitFigure}{}\renewcommand{\ExhibitFigure}[3]{\global\@namedef{exh@done@#1}{}\ifx\@captype\@undefined\begin{figure}[htbp]\centering #3\caption{#2}\label{#1}\end{figure}\else #3\fi}
modified paper/tables/tab_alpha.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (ls_alpha) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_alpha} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:alpha}{\textbf{Monthly long--short portfolios by signal and sub-period, Russell~3000 universe.} Companion to Table~\ref{tab:alphaboth}: equal-weighted Q5$-$Q1 monthly portfolios (annually selected in June, held July--June) for every signal, over the full sample, the pre-launch months (to June 2023) and the post-launch months (from July 2023). Mean and alphas in percent per year.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:alpha}{\textbf{Monthly long--short portfolios by signal and sub-period, Russell~3000 universe.} Companion to Table~\ref{tab:alphaboth}: equal-weighted Q5$-$Q1 monthly portfolios (annually selected in June, held July--June) for every signal, over the full sample, the pre-launch months (to June 2023) and the post-launch months (from July 2023). Mean and alphas in percent per year.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{llrrrrrrrr}
6 6 \toprule
7 7 Signal & Period & Months & Mean (\%/yr) & [HAC $t$] & [plain $t$] & Sharpe & CAPM $\alpha$ (\%/yr) & FF6 $\alpha$ (\%/yr) & [$t$] \\
@@ -44,7 +44,7 @@ Cybersecurity (placebo) & full & 180 & +1.33 & [0.84] & [0.82] & 0.21 & +0.10 &
44 44 \addlinespace
45 45 \bottomrule
46 46 \end{tabular}
47 −\begin{tablenotes}[flushleft]\footnotesize
47 +\begin{tablenotes}[flushleft]\scriptsize
48 48 \item \emph{Notes:} HAC = Newey--West (3 lags); plain = i.i.d. The post period has 36 months, so its alphas are imprecise; the AI disruption-risk facet is the only signal whose post FF6 alpha has $|t| > 2$ (Table~\ref{tab:robust}). Factor data: Ken French daily FF5 + momentum, compounded to months. Splice months set to missing.
49 49 \end{tablenotes}
50 50 \end{threeparttable}}
modified paper/tables/tab_alpha_both.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (samples.*.ls), results2.json (mht.deflated_sharpe) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_alpha_both} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:alphaboth}{\textbf{Monthly long--short portfolios on AI language: mean return, Sharpe ratio and factor alphas.} Equal-weighted Q5$-$Q1 portfolios selected every June from the cohort quintiles and held July--June (monthly returns, annualized). Mean and alphas in percent per year; $t$-statistics in brackets use Newey--West (HAC, 3 lags) standard errors. FF6 = Fama--French five factors plus momentum (Ken French daily factors aggregated to months). Post = months from July 2023, the first holding year that follows the ChatGPT launch cohort.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:alphaboth}{\textbf{Monthly long--short portfolios on AI language: mean return, Sharpe ratio and factor alphas.} Equal-weighted Q5$-$Q1 portfolios selected every June from the cohort quintiles and held July--June (monthly returns, annualized). Mean and alphas in percent per year; $t$-statistics in brackets use Newey--West (HAC, 3 lags) standard errors. FF6 = Fama--French five factors plus momentum (Ken French daily factors aggregated to months). Post = months from July 2023, the first holding year that follows the ChatGPT launch cohort.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{llrrrrrrrrr}
6 6 \toprule
7 7 Signal & Universe & Months & Mean (\%/yr) & [HAC $t$] & Sharpe & FF6 $\alpha$ (\%/yr) & [$t$] & Post months & Post FF6 $\alpha$ & [$t$] \\
@@ -23,7 +23,7 @@ PC1 of three facets & Russell 3000 & 180 & +4.77 & [2.00] & 0.55 & +3.96 & [2.76
23 23 \addlinespace
24 24 \bottomrule
25 25 \end{tabular}
26 −\begin{tablenotes}[flushleft]\footnotesize
26 +\begin{tablenotes}[flushleft]\scriptsize
27 27 \item \emph{Notes:} Deflated Sharpe ratio of the Russell~3000 composite long--short (Bailey and L\'opez de Prado 2014; trials = 93 long--short series tried in this study, benchmark SR 0.55): full sample 0.35, pre 0.46, post 0.29 (probability that the true Sharpe ratio exceeds the multiple-testing hurdle; values below 0.95 do not clear it). Economic magnitude: the composite earns +3.43\% per year over 180 months in the Russell~3000, a Sharpe ratio of 0.45. Splice months (Table~\ref{tab:hygiene}) are set to missing. All signals and sub-periods: Table~\ref{tab:alpha}.
28 28 \end{tablenotes}
29 29 \end{threeparttable}}
modified paper/tables/tab_attrition.tex +11 −11
@@ -1,11 +1,11 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results_surv.json (attrition, then_members_present, ew_vs_index, bounding), iwv_holdings_manifest.json -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_attrition} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:attrition}{\textbf{Survivorship diagnostics on the current-membership universe, Russell~3000.} Panel A: for each of the 17 dated IWV holdings files captured by the Internet Archive, the share of then-constituents no longer held on 28 August 2025 (absent = ISIN/CUSIP not in the 2025 holdings and ticker not in the 2026 universe), by market-value tercile within the snapshot, the implied annualised exit rates of the small and large terciles, and the share of then-constituents present in the estimation panel. Panel B: the composite spread of each cohort computed on all panel firms and on the firms that were IWV members at formation. Panel C: the equal-weighted panel return against the index total return, and the exit-rate difference between the bottom and top AI quintiles that survivorship would need to generate the entire observed spread.}{\footnotesize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{4pt}
3 +\ExhibitTable{tab:attrition}{\textbf{Survivorship diagnostics on the current-membership universe, Russell~3000.} Panel A: for each of the 17 dated IWV holdings files captured by the Internet Archive, the share of then-constituents no longer held on 28 August 2025 (absent = ISIN/CUSIP not in the 2025 holdings and ticker not in the 2026 universe), by market-value tercile within the snapshot, the implied annualised exit rates of the small and large terciles, and the share of then-constituents present in the estimation panel. Panel B: the composite spread of each cohort computed on all panel firms and on the firms that were IWV members at formation. Panel C: the equal-weighted panel return against the index total return, and the exit-rate difference between the bottom and top AI quintiles that survivorship would need to generate the entire observed spread.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{lrrrrrr}
6 6 \toprule
7 7 \multicolumn{7}{@{}l}{\textit{Panel A: share of then-IWV constituents absent from the 28 August 2025 holdings, by market-value tercile within the snapshot}} \\
8 −IWV holdings as of & Small & Mid & Large & All & Annualised exit, small / large & Then-members in the panel \\
8 +\makecell[b]{IWV holdings \\ {as of}} & Small & Mid & Large & All & \makecell[b]{Annualised exit, \\ {small / large}} & \makecell[b]{Then-members \\ {in the panel}} \\
9 9 \midrule
10 10 2006-09-29 & 77.7\% & 65.3\% & 47.2\% & 63.4\% & 7.6 / 3.3\% & 32.3\% \\
11 11 2019-05-31 & 61.2\% & 31.1\% & 16.3\% & 36.2\% & 14.1 / 2.8\% & 55.5\% \\
@@ -26,7 +26,7 @@ IWV holdings as of & Small & Mid & Large & All & Annualised exit, small / large
26 26 2025-08-28 & 0.1\% & 0.0\% & 0.0\% & 0.0\% & -- / --\% & 85.8\% \\
27 27 \midrule
28 28 \multicolumn{7}{@{}l}{\textit{Panel B: composite Q5$-$Q1 spread (wins., pp) for all panel firms vs the firms that were IWV members at formation}} \\
29 −Cohort & Snapshot & Members then & Spread, all & Spread, members & Mean return, members & Mean return, non-members \\
29 +Cohort & Snapshot & Members then & Spread, all & Spread, members & \makecell[b]{Mean return, \\ {members}} & \makecell[b]{Mean return, \\ {non-members}} \\
30 30 \midrule
31 31 2018 & 2019-05 & 86\% & +19.0 & +20.4 & -2.9\% & +8.5\% \\
32 32 2019 & 2020-12 & 88\% & +1.4 & +4.2 & +70.7\% & +169.6\% \\
@@ -37,15 +37,15 @@ Cohort & Snapshot & Members then & Spread, all & Spread, members & Mean return,
37 37 2024 & 2025-08 & 94\% & +19.9 & +16.4 & +39.1\% & +188.4\% \\
38 38 \midrule
39 39 \multicolumn{7}{@{}l}{\textit{Panel C: survivor signature at the level and bounding of the spread (pp per year)}} \\
40 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.52\textwidth}}{EW panel return minus IWV total return: all firms, raw / wins.\ / median} & \multicolumn{6}{l}{+5.7 / +3.6 / -3.1} \\
41 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.52\textwidth}}{\quad largest 1,000 minus IWV / remaining minus IWM / S\&P members minus IWV} & \multicolumn{6}{l}{-0.1 / +14.5 / +4.3} \\
42 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.52\textwidth}}{\quad pre-launch cohorts / post-launch cohorts} & \multicolumn{6}{l}{+5.0 / +8.4} \\
43 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.52\textwidth}}{Q1 $-$ Q5 exit-rate difference needed to generate the whole spread (+3.9 pp, wins.), exit return $-$30 / $-$50 / $-$70 / $-$100\%} & \multicolumn{6}{l}{8.1 / 5.7 / 4.4 / 3.3 pp/yr} \\
44 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.52\textwidth}}{Measured small-minus-large annualised exit rate, largest gap across snapshots} & \multicolumn{6}{l}{14.0 pp/yr} \\
45 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.52\textwidth}}{Forward-volatility gradient of the composite sort, Q5 $-$ Q1 (annualized SD)} & \multicolumn{6}{l}{+4.6 pp} \\
40 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{EW panel return minus IWV total return: all firms, raw / wins.\ / median} & \multicolumn{6}{l}{+5.7 / +3.6 / -3.1} \\
41 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{\quad largest 1,000 minus IWV / remaining minus IWM / S\&P members minus IWV} & \multicolumn{6}{l}{-0.1 / +14.5 / +4.3} \\
42 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{\quad pre-launch cohorts / post-launch cohorts} & \multicolumn{6}{l}{+5.0 / +8.4} \\
43 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Q1 $-$ Q5 exit-rate difference needed to generate the whole spread (+3.9 pp, wins.), exit return $-$30 / $-$50 / $-$70 / $-$100\%} & \multicolumn{6}{l}{8.1 / 5.7 / 4.4 / 3.3 pp/yr} \\
44 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Measured small-minus-large annualised exit rate, largest gap across snapshots} & \multicolumn{6}{l}{14.0 pp/yr} \\
45 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Forward-volatility gradient of the composite sort, Q5 $-$ Q1 (annualized SD)} & \multicolumn{6}{l}{+4.6 pp} \\
46 46 \bottomrule
47 47 \end{tabular}
48 −\begin{tablenotes}[flushleft]\footnotesize
48 +\begin{tablenotes}[flushleft]\scriptsize
49 49 \item \emph{Notes:} No capture exists between 2007 and May 2019, so the then-member comparison covers cohorts 2018--2024 only; for 2010--2017 the entry-side checks of Table~\ref{tab:robust} are the only executable diagnostics. Delisted firms have no AI scores in any artefact, so attrition by AI quintile (the test the editor asked for) cannot be computed on this corpus; the small-tercile exit rate is two to four times the large-tercile rate, and the forward-volatility gradient shows that Q5 firms are riskier, so the small-firm pre-launch premium is reported as conditional on survival to October 2026. Bounding logic: if exiting firms earn $r_x$ and are dropped, the survivor spread overstates the true spread by $(e_1 - e_5)(\bar r_{\text{surv}} - r_x)$. Source: results/r3k\_v2/results\_surv.json; captures listed in iwv\_holdings\_manifest.json.
50 50 \end{tablenotes}
51 51 \end{threeparttable}}
modified paper/tables/tab_break.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (structural_break, subperiod_spread) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_break} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:break}{\textbf{Pooled test of a post-launch change in the signal slope, by signal, Russell~3000.} Pooled regression of the within-year winsorized forward return on the signal, a post-launch cohort dummy, their interaction, size and momentum (pp per SD). Pre slope with its two-way clustered $t$; the interaction (post-launch change of the slope) with firm-clustered and two-way $t$, the firm-clustered 95\% CI and the Webb wild-cluster bootstrap $p$ by cohort; the last two columns repeat the cohort-level pre and post winsorized spreads of Table~\ref{tab:prepostboth}.}{\footnotesize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{4pt}
3 +\ExhibitTable{tab:break}{\textbf{Pooled test of a post-launch change in the signal slope, by signal, Russell~3000.} Pooled regression of the within-year winsorized forward return on the signal, a post-launch cohort dummy, their interaction, size and momentum (pp per SD). Pre slope with its two-way clustered $t$; the interaction (post-launch change of the slope) with firm-clustered and two-way $t$, the firm-clustered 95\% CI and the Webb wild-cluster bootstrap $p$ by cohort; the last two columns repeat the cohort-level pre and post winsorized spreads of Table~\ref{tab:prepostboth}.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{lrrrrrrrrr}
6 6 \toprule
7 7 Signal & Pre slope & [$t$ two-way] & Slope $\times$ post & [$t$ firm] & [$t$ two-way] & 95\% CI & wild $p$ & Pre Q5$-$Q1 & Post Q5$-$Q1 \\
@@ -15,7 +15,7 @@ Equal-form composite & +2.84 & [2.27] & +2.67 & [2.62] & [0.96] & [+0.67, +4.67]
15 15 SPID tech projects & +0.49 & [0.74] & -1.79 & [-1.80] & [-0.95] & [-3.74, +0.16] & 0.545 & +1.8 & -0.5 \\
16 16 \bottomrule
17 17 \end{tabular}
18 −\begin{tablenotes}[flushleft]\footnotesize
18 +\begin{tablenotes}[flushleft]\scriptsize
19 19 \item \emph{Notes:} $N$ = 26{,}933 firm-years, 15 cohort clusters, 9,999 bootstrap draws. None of the interactions is significant once clustering by cohort or the wild bootstrap is used; the firm-clustered $t$ overstates precision for a regressor that varies at the cohort level. Source: results/r3k\_v2/results.json (structural\_break).
20 20 \end{tablenotes}
21 21 \end{threeparttable}}
modified paper/tables/tab_cohorts.tex +7 −7
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (cohorts*, placebo_breaks), results_surv.json (then_members_present) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_cohorts} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:cohorts}{\textbf{Cohort-by-cohort spreads of the AI composite and tests of a 2022 break, Russell~3000.} Panel A: equal-weighted Q5$-$Q1 forward-return spread of the composite for each formation cohort (raw, within-year winsorized, median difference), the same spread restricted to firms that were IWV constituents at formation (Wayback captures exist from 2019 only), and the pre- and post-launch means with 95\% $t$-intervals and leave-one-out post means. Panel B: an exact permutation test of the 2022--24 block against every three-cohort subset, the contiguous-block comparison, the rank of 2022 among the 10 candidate break years, and the Andrews sup-Wald test for a mean shift in the cohort series (simulated finite-sample $p$).}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:cohorts}{\textbf{Cohort-by-cohort spreads of the AI composite and tests of a 2022 break, Russell~3000.} Panel A: equal-weighted Q5$-$Q1 forward-return spread of the composite for each formation cohort (raw, within-year winsorized, median difference), the same spread restricted to firms that were IWV constituents at formation (Wayback captures exist from 2019 only), and the pre- and post-launch means with 95\% $t$-intervals and leave-one-out post means. Panel B: an exact permutation test of the 2022--24 block against every three-cohort subset, the contiguous-block comparison, the rank of 2022 among the 10 candidate break years, and the Andrews sup-Wald test for a mean shift in the cohort series (simulated finite-sample $p$).}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{lrrrl}
6 6 \toprule
7 7 \multicolumn{5}{@{}l}{\textit{Panel A: equal-weighted Q5$-$Q1 spread of the composite by formation cohort (pp)}} \\
@@ -30,13 +30,13 @@ Post mean leaving out 2022 / 2023 / 2024 & +16.0 / +6.8 / +2.6 & +11.5 / +7.5 /
30 30 \multicolumn{5}{@{}l}{\textit{Panel B: is the 2022--24 block unusual? (composite)}} \\
31 31 Test & \multicolumn{2}{l}{raw} & \multicolumn{2}{l}{wins.} \\
32 32 \midrule
33 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.4\textwidth}}{Permutation $p$ (one-sided), 2022--24 vs all 455 three-cohort subsets (rank)} & \multicolumn{2}{l}{0.28 (rank 126)} & \multicolumn{2}{l}{0.31 (rank 141)} \\
34 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.4\textwidth}}{Contiguous three-cohort blocks with a higher mean than 2022--24} & \multicolumn{2}{l}{3 of 12} & \multicolumn{2}{l}{2 of 12} \\
35 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.4\textwidth}}{Rank of 2022 among 10 candidate break years (post $-$ pre mean)} & \multicolumn{2}{l}{8 of 10} & \multicolumn{2}{l}{8 of 10} \\
36 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.4\textwidth}}{sup-Wald mean-shift statistic, Andrews (1993), 15\% trim (simulated $p$)} & \multicolumn{2}{l}{3.43 (0.43)} & \multicolumn{2}{l}{2.57 (0.59)} \\
33 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Permutation $p$ (one-sided), 2022--24 vs all 455 three-cohort subsets (rank)} & \multicolumn{2}{l}{0.28 (rank 126)} & \multicolumn{2}{l}{0.31 (rank 141)} \\
34 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Contiguous three-cohort blocks with a higher mean than 2022--24} & \multicolumn{2}{l}{3 of 12} & \multicolumn{2}{l}{2 of 12} \\
35 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Rank of 2022 among 10 candidate break years (post $-$ pre mean)} & \multicolumn{2}{l}{8 of 10} & \multicolumn{2}{l}{8 of 10} \\
36 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{sup-Wald mean-shift statistic, Andrews (1993), 15\% trim (simulated $p$)} & \multicolumn{2}{l}{3.43 (0.43)} & \multicolumn{2}{l}{2.57 (0.59)} \\
37 37 \bottomrule
38 38 \end{tabular}
39 −\begin{tablenotes}[flushleft]\footnotesize
39 +\begin{tablenotes}[flushleft]\scriptsize
40 40 \item \emph{Notes:} Inference: NW $t$ = Newey--West (Bartlett kernel, 3 lags) $t$-statistic of the mean of the annual cohort series; plain $t$ = i.i.d. $t$ over cohorts; 95\% CI = $t$-interval over cohorts (the post period has 3 cohorts, so its CIs are wide by construction). Returns are the look-ahead-free twelve-month forward returns (July $Y{+}1$--June $Y{+}2$); `wins.' = 1/99 winsorized within the formation year; `median' = median spread within cohort; `raw' = unwinsorized. Rebuilt panel: $N$ = 27{,}354 firm-years, 2{,}375 firms, keyed on CIK $\times$ year, cleaned returns, corrected market capitalization. No significance stars are used. Then-members-only spreads use the IWV holdings capture nearest the formation month (results/r3k\_v2/results\_surv.json). The permutation $p$ is the share of the 455 three-cohort subsets whose mean spread is at least the 2022--24 mean; the sup-Wald $p$ is from 20,000 simulated series of length 15. Economic reading: the post mean leaving out 2024 (wins.\ -0.9 pp) is at the pre mean (+3.4); none of the break tests rejects at conventional levels.
41 41 \end{tablenotes}
42 42 \end{threeparttable}}
modified paper/tables/tab_construct_validity.tex +22 −22
@@ -1,33 +1,33 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results_construct.json, results/n1/tokenizer_audit.json, results/n1/keyword_baseline.json -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_construct_validity} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:constructvalidity}{\textbf{Construct validity of the semantic AI score: keyword baseline, stripped anchors, sector composition and encoder truncation.} Panel A: the composite and five alternative measures scored on the same firm-years: Spearman correlation with the composite, equal-weighted Q5$-$Q1 spreads (within-year winsorized, pp per year; [NW $t$] [plain $t$] and 95\% CI over cohorts; pre and post means) and Fama--MacBeth slopes with controls (pp per SD, [NW $t$]) on winsorized and raw returns. The stripped anchors re-score the stored chunk embeddings against anchor texts without the cybersecurity and automation vocabulary (no corpus re-embedding). Panel B: horse races. Panel C: what the encoder actually reads and how much of the score is lexical.}{\scriptsize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{3.5pt}
5 −\begin{tabular}{lrrrrrrrr}
3 +\ExhibitTable{tab:constructvalidity}{\textbf{Construct validity of the semantic AI score: keyword baseline, stripped anchors, sector composition and encoder truncation.} Panel A: the composite and five alternative measures scored on the same firm-years: Spearman correlation with the composite, equal-weighted full-sample Q5$-$Q1 spreads (within-year winsorized, pp per year; [NW $t$] [plain $t$] and 95\% CI over cohorts) and Fama--MacBeth slopes with controls (pp per SD, [NW $t$]) on winsorized and raw returns. The stripped anchors re-score the stored chunk embeddings against anchor texts without the cybersecurity and automation vocabulary (no corpus re-embedding). Panel B: horse races. Panel C: what the encoder actually reads and how much of the score is lexical.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 +\begin{tabular}{lrrrrrr}
6 6 \toprule
7 −Signal & $\rho$ with composite & Full Q5$-$Q1 & [NW $t$] [plain $t$] & 95\% CI & Pre & Post & FM slope, wins. & FM slope, raw \\
7 +Signal & $\rho$ with composite & \makecell[b]{Full Q5$-$Q1, \\ {wins.}} & \makecell[b]{[NW $t$] \\ {[plain $t$]}} & 95\% CI & \makecell[b]{FM slope, \\ {wins. [NW $t$]}} & \makecell[b]{FM slope, \\ {raw [NW $t$]}} \\
8 8 \midrule
9 −\multicolumn{9}{@{}l}{\textit{Panel A: alternative measures of AI language (same panel, same return)}} \\
10 −AI composite (baseline) & 1.00 & +4.1 & [2.08] [1.84] & [-0.7, +8.8] & +3.6 & +6.0 & +1.87 [2.41] & +2.75 [2.45] \\
11 −Keyword baseline (core AI terms per 1,000 words) & 0.13 & +4.7 & [2.30] [1.82] & [-0.9, +10.3] & +3.1 & +11.1 & +0.61 [1.25] & +0.51 [1.03] \\
12 −Keyword baseline, $\log(1 + x)$ & 0.14 & +4.7 & [2.30] [1.82] & [-0.9, +10.3] & +3.1 & +11.1 & +0.81 [1.95] & +0.77 [2.08] \\
13 −Stripped-anchor composite & 0.98 & +4.1 & [2.33] [2.13] & [-0.0, +8.3] & +4.1 & +4.0 & +1.79 [2.70] & +2.62 [2.65] \\
14 −Core-AI adoption anchor & 0.80 & +4.8 & [2.69] [1.99] & [-0.4, +10.0] & +4.7 & +5.2 & +1.74 [3.02] & +2.26 [3.15] \\
15 −Cyber anchor stripped of AI terms & 0.35 & +1.9 & [0.97] [1.12] & [-1.7, +5.5] & +0.1 & +8.8 & +0.92 [1.49] & +0.90 [1.07] \\
16 −Composite ex Utilities and Energy ($N$ = 25{,}420) & -- & +4.6 & [2.16] [1.84] & [-0.8, +9.9] & +4.1 & +6.6 & +2.06 [2.46] & +3.02 [2.47] \\
9 +\multicolumn{7}{@{}l}{\textit{Panel A: alternative measures of AI language (same panel, same return)}} \\
10 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{AI composite (baseline)} & 1.00 & +4.1 & [2.08] [1.84] & [-0.7, +8.8] & +1.87 [2.41] & +2.75 [2.45] \\
11 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Keyword baseline (core AI terms per 1,000 words)} & 0.13 & +4.7 & [2.30] [1.82] & [-0.9, +10.3] & +0.61 [1.25] & +0.51 [1.03] \\
12 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Keyword baseline, $\log(1 + x)$} & 0.14 & +4.7 & [2.30] [1.82] & [-0.9, +10.3] & +0.81 [1.95] & +0.77 [2.08] \\
13 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Stripped-anchor composite} & 0.98 & +4.1 & [2.33] [2.13] & [-0.0, +8.3] & +1.79 [2.70] & +2.62 [2.65] \\
14 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Core-AI adoption anchor} & 0.80 & +4.8 & [2.69] [1.99] & [-0.4, +10.0] & +1.74 [3.02] & +2.26 [3.15] \\
15 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Cyber anchor stripped of AI terms} & 0.35 & +1.9 & [0.97] [1.12] & [-1.7, +5.5] & +0.92 [1.49] & +0.90 [1.07] \\
16 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Composite ex Utilities and Energy ($N$ = 25{,}420)} & -- & +4.6 & [2.16] [1.84] & [-0.8, +9.9] & +2.06 [2.46] & +3.02 [2.47] \\
17 17 \midrule
18 −\multicolumn{9}{@{}l}{\textit{Panel B: Fama--MacBeth horse races (wins., pp per SD [NW $t$])}} \\
19 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Composite vs keyword baseline} & \multicolumn{8}{l}{composite +1.85 [2.37]; keyword +0.36 [0.68]} \\
20 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Composite vs stripped-anchor composite} & \multicolumn{8}{l}{composite +0.15 [0.06]; stripped +1.66 [0.79]} \\
18 +\multicolumn{7}{@{}l}{\textit{Panel B: Fama--MacBeth horse races (wins., pp per SD [NW $t$])}} \\
19 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Composite vs keyword baseline} & \multicolumn{6}{l}{composite +1.85 [2.37]; keyword +0.36 [0.68]} \\
20 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Composite vs stripped-anchor composite} & \multicolumn{6}{l}{composite +0.15 [0.06]; stripped +1.66 [0.79]} \\
21 21 \midrule
22 −\multicolumn{9}{@{}l}{\textit{Panel C: encoder truncation and lexical content of the score (node audit of the stored chunks and embeddings)}} \\
23 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.5\textwidth}}{Encoder window (tokens) / chunk length (words) / median tokens per chunk} & \multicolumn{8}{l}{256 / 512 / 634} \\
24 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.5\textwidth}}{Chunks truncated (frame K, $n$ = 10{,}000) / median words read / share of token mass dropped} & \multicolumn{8}{l}{99.8\% / 205 / 60\%} \\
25 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.5\textwidth}}{AI keyword occurrences beyond the encoder window} & \multicolumn{8}{l}{61\% of 40{,}522} \\
26 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.5\textwidth}}{Spearman correlation of the keyword baseline with the composite / firm-years with zero core AI hits} & \multicolumn{8}{l}{0.13 / 84\%} \\
27 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.5\textwidth}}{Utilities: share of top-quintile firm-years vs share of the sample} & \multicolumn{8}{l}{6.5\% vs 3.2\%} \\
22 +\multicolumn{7}{@{}l}{\textit{Panel C: encoder truncation and lexical content of the score (node audit of the stored chunks and embeddings)}} \\
23 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Encoder window (tokens) / chunk length (words) / median tokens per chunk} & \multicolumn{6}{l}{256 / 512 / 634} \\
24 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Chunks truncated (frame K, $n$ = 10{,}000) / median words read / share of token mass dropped} & \multicolumn{6}{l}{99.8\% / 205 / 60\%} \\
25 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{AI keyword occurrences beyond the encoder window} & \multicolumn{6}{l}{61\% of 40{,}522} \\
26 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Spearman correlation of the keyword baseline with the composite / firm-years with zero core AI hits} & \multicolumn{6}{l}{0.13 / 84\%} \\
27 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.28\textwidth}}{Utilities: share of top-quintile firm-years vs share of the sample} & \multicolumn{6}{l}{6.5\% vs 3.2\%} \\
28 28 \bottomrule
29 29 \end{tabular}
30 −\begin{tablenotes}[flushleft]\footnotesize
30 +\begin{tablenotes}[flushleft]\scriptsize
31 31 \item \emph{Notes:} Keyword baseline = core AI terms (published AI lexicons) per 1,000 words of the section texts, computed on the node audit (code/n1); the keyword and semantic measures agree weakly, and the keyword measure carries a similar sort spread but a weaker regression slope. The encoder reads roughly the first 200 words of each 512-word chunk, so the score is a function of chunk openings; re-chunking to the encoder window (X4) was not executed and the consequences for the premium are unknown. No human- or LLM-labelled validation sample exists: the 1,700-chunk coding frames and codebook were delivered without labels (results/n1/validation\_*), so precision and recall of the score are not measured. $N$ = 27{,}399 firm-years in Panel A. Source: results/r3k\_v2/results\_construct.json, results/n1/tokenizer\_audit.json, keyword\_baseline.json.
32 32 \end{tablenotes}
33 33 \end{threeparttable}}
modified paper/tables/tab_contrasts.tex +7 −7
@@ -1,10 +1,10 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (contrasts) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_contrasts} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:contrasts}{\textbf{Formal tests of the large-versus-small and member-versus-non-member post-launch differences.} Panel A: pooled regressions of the forward return of Q1 and Q5 firm-years on a top-quintile indicator (hi), a post-launch dummy, the group indicator and all interactions, with cohort fixed effects. The triple interaction is the post-launch change of the spread in the group relative to the reference group. $t$-statistics in brackets from firm-clustered and two-way (firm $\times$ cohort) standard errors; 95\% CI from the firm-clustered SE; wild $p$ from the restricted wild-cluster bootstrap by cohort (Rademacher / Webb weights, 9,999 draws, 15 clusters); MDE = minimum detectable effect at 80\% power (2.8 $\times$ firm-clustered SE). Panel B: the difference of the post $-$ pre changes of the cohort-level spreads with a 95\% cohort-bootstrap interval (12 pre and 3 post cohorts resampled, 9,999 draws).}{\footnotesize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{4pt}
3 +\ExhibitTable{tab:contrasts}{\textbf{Formal tests of the large-versus-small and member-versus-non-member post-launch differences.} Panel A: pooled regressions of the forward return of Q1 and Q5 firm-years on a top-quintile indicator (hi), a post-launch dummy, the group indicator and all interactions, with cohort fixed effects. The triple interaction is the post-launch change of the spread in the group relative to the reference group. $t$-statistics in brackets from firm-clustered and two-way (firm $\times$ cohort) standard errors; 95\% CI from the firm-clustered SE; wild $p$ from the restricted wild-cluster bootstrap by cohort (Rademacher / Webb weights, 9,999 draws, 15 clusters); MDE = minimum detectable effect at 80\% power (2.8 $\times$ firm-clustered SE). Panel B: the difference of the post $-$ pre changes of the cohort-level spreads with a 95\% cohort-bootstrap interval (12 pre and 3 post cohorts resampled, 9,999 draws).}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{llrrrrrr}
6 6 \toprule
7 −Term & Returns & Coefficient (pp) & [$t$ firm] & [$t$ firm$\times$cohort] & 95\% CI & wild $p$ (Rad.\ / Webb) & MDE (pp) \\
7 +Term & Returns & \makecell[b]{Coefficient \\ {(pp)}} & [$t$ firm] & [$t$ firm$\times$cohort] & 95\% CI & \makecell[b]{wild $p$ \\ {(Rad.\ / Webb)}} & MDE (pp) \\
8 8 \midrule
9 9 \multicolumn{8}{@{}l}{\textit{Panel A: pooled firm-level interactions (Q1/Q5 firm-years, cohort fixed effects)}} \\
10 10 hi $\times$ post (reference group) & wins. & -1.23 & [-0.25] & [-0.12] & [-11.0, +8.5] & -- / -- & 13.9 \\
@@ -29,12 +29,12 @@ hi $\times$ post $\times$ S\&P member & raw & +8.53 & [1.03] & [0.67] & [-7.7, +
29 29 \addlinespace
30 30 \midrule
31 31 \multicolumn{8}{@{}l}{\textit{Panel B: difference of cohort-level post $-$ pre changes, cohort bootstrap}} \\
32 −(post $-$ pre)$_{\text{largest 1,000}}$ $-$ (post $-$ pre)$_{\text{remaining}}$ & wins. & +9.96 & & & [-4.0, +22.0] & & \\
33 −same, raw returns & raw & +11.40 & & & [-14.9, +31.7] & & \\
34 −(post $-$ pre)$_{\text{S\&P}}$ $-$ (post $-$ pre)$_{\text{non-members}}$ & wins. & +9.08 & & & [-13.2, +24.1] & & \\
32 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{(post $-$ pre)$_{\text{largest 1,000}}$ $-$ (post $-$ pre)$_{\text{remaining}}$} & wins. & +9.96 & & & [-4.0, +22.0] & & \\
33 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{same, raw returns} & raw & +11.40 & & & [-14.9, +31.7] & & \\
34 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{(post $-$ pre)$_{\text{S\&P}}$ $-$ (post $-$ pre)$_{\text{non-members}}$} & wins. & +9.08 & & & [-13.2, +24.1] & & \\
35 35 \bottomrule
36 36 \end{tabular}
37 −\begin{tablenotes}[flushleft]\footnotesize
37 +\begin{tablenotes}[flushleft]\scriptsize
38 38 \item \emph{Notes:} Economic reading: the point estimate of the large-cap post-launch increase relative to small caps is +10.8 pp per year, but its MDE is 16.5 pp and the wild-bootstrap $p$ is 0.22, so the difference between the two size groups is not statistically established; the cohort-bootstrap interval in Panel B covers zero. The S\&P-member contrast is weaker still. Returns winsorized within the formation year unless marked raw. Source: results/r3k\_v2/results.json (contrasts).
39 39 \end{tablenotes}
40 40 \end{threeparttable}}
modified paper/tables/tab_corpus.tex +2 −2
@@ -1,10 +1,10 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from data/raw_russell3000/filings, results/n1/corpus_counts.json -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_corpus} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 3 \ExhibitTable{tab:corpus}{\textbf{Corpus composition by form.} Filings of the 2{,}499 issuers of the universe (S\&P~500 constituents and iShares Russell~3000 holdings) indexed in the EDGAR Research Database for 2010--2026, the number parsed into sections and 512-word chunks, and the share of the 27{,}354 estimation firm-years whose signal includes at least one scored filing of that form.}{\footnotesize}{%
4 −\begin{threeparttable}
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lrrrr}
6 6 \toprule
7 −Form & Filings 2010--2026 & Issuers & Parsed & Firm-years with a scored filing \\
7 +Form & \makecell[b]{Filings \\ {2010--2026}} & Issuers & Parsed & \makecell[b]{Firm-years with \\ {a scored filing}} \\
8 8 \midrule
9 9 10-K & 31{,}775 & 2{,}468 & 31{,}772 & 96.8\% \\
10 10 10-Q & 95{,}167 & 2{,}494 & 95{,}155 & 99.6\% \\
modified paper/tables/tab_corr.tex +5 −5
@@ -1,10 +1,10 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/t1b_correlations.csv -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_corr} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:corr}{\textbf{Correlations of the within-year standardized variables.} Pearson correlations over the 27{,}354 firm-years of the estimation sample; signals and controls standardized within formation year; the forward return is the raw twelve-month return.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:corr}{\textbf{Correlations of the within-year standardized variables.} Pearson correlations over the 27{,}354 firm-years of the estimation sample; signals and controls standardized within formation year; the forward return is the raw twelve-month return.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{lrrrrrrrrr}
6 6 \toprule
7 − & AI adoption & AI infrastructure & AI disruption risk & PC1 & SPID tech projects & Cybersecurity & Size & Momentum & Forward return \\
7 + & Adopt & Infra & Risk & PC1 & SPID & Cyber & Size & Mom & Fwd ret \\
8 8 \midrule
9 9 AI adoption & 1.00 & & & & & & & & \\
10 10 AI infrastructure & 0.79 & 1.00 & & & & & & & \\
@@ -17,7 +17,7 @@ Momentum & 0.03 & 0.02 & 0.02 & 0.02 & -0.01 & 0.01 & 0.14 & 1.00 & \\
17 17 Forward return & 0.02 & 0.03 & 0.05 & 0.04 & 0.00 & 0.01 & -0.11 & -0.04 & 1.00 \\
18 18 \bottomrule
19 19 \end{tabular}
20 −\begin{tablenotes}[flushleft]\footnotesize
21 −\item \emph{Notes:} The three AI facets are highly correlated with each other (and with PC1) and weakly with the SPID project count, which is a count variable with a zero median. Source: results/r3k\_v2/t1b\_correlations.csv.
20 +\begin{tablenotes}[flushleft]\scriptsize
21 +\item \emph{Notes:} Column headers abbreviate the row labels (Adopt = AI adoption, Infra = AI infrastructure, Risk = AI disruption risk, SPID = SPID tech projects, Mom = momentum, Fwd ret = forward return). The three AI facets are highly correlated with each other (and with PC1) and weakly with the SPID project count, which is a count variable with a zero median. Source: results/r3k\_v2/t1b\_correlations.csv.
22 22 \end{tablenotes}
23 23 \end{threeparttable}}
modified paper/tables/tab_coverage.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (coverage) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_coverage} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:coverage}{\textbf{Estimation sample by formation cohort: firms, size groups and text coverage.} Number of firms with a valid forward return in each formation cohort, the size-group counts under the two partitions (largest 1,000 at formation on the corrected capitalization; largest 42\% within cohort), the firm-years without a capitalization, the S\&P~500 members, and the median number of scored filings and text chunks per firm-year.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:coverage}{\textbf{Estimation sample by formation cohort: firms, size groups and text coverage.} Number of firms with a valid forward return in each formation cohort, the size-group counts under the two partitions (largest 1,000 at formation on the corrected capitalization; largest 42\% within cohort), the firm-years without a capitalization, the S\&P~500 members, and the median number of scored filings and text chunks per firm-year.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lrrrrrrrr}
6 6 \toprule
7 7 Cohort & Firms & Largest 1,000 & Remaining & No cap & Largest 42\% & S\&P 500 & Median filings & Median chunks \\
@@ -23,7 +23,7 @@ Cohort & Firms & Largest 1,000 & Remaining & No cap & Largest 42\% & S\&P 500 &
23 23 2024 & 2{,}374 & 1{,}000 & 1{,}345 & 29 & 984 & 487 & 14 & 303 \\
24 24 \bottomrule
25 25 \end{tabular}
26 −\begin{tablenotes}[flushleft]\footnotesize
26 +\begin{tablenotes}[flushleft]\scriptsize
27 27 \item \emph{Notes:} The panel grows from 1{,}342 firms in 2010 to 2{,}374 in 2024 because the universe is the October 2026 membership: early cohorts contain only the firms that survived to 2026 (Table~\ref{tab:attrition}). Under the top-1,000 partition the `remaining' group has 328 firms in 2010 (quintiles of about 65 firms); the 42\% partition keeps the group shares constant. Rank autocorrelation of the composite: lag 1 0.87, lag 5 0.72. Source: results/r3k\_v2/results2.json (coverage).
28 28 \end{tablenotes}
29 29 \end{threeparttable}}
modified paper/tables/tab_did_spid.tex +8 −8
@@ -1,15 +1,15 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (did, spid), t17_refit.json -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_did_spid} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:didspid}{\textbf{Difference-in-differences on pre-determined exposure and the SPID project signal, Russell~3000.} Panel A: forward return (within-year winsorized, pp) on the interaction of pre-determined AI exposure (firm mean of the composite over filing years 2019--2021, binary above-median or continuous) with the post-launch dummy, with firm and year fixed effects and two-way clustered $t$ (brackets); the event-time version with the reference year at zero is in Figure~\ref{fig:eventtime} and Table~\ref{tab:eventtime}. Panel B: pooled regressions with the explicit terms signal, post, signal $\times$ post, composite, composite $\times$ post, size and momentum (pp per SD, or pp per unit of the indicator); $t$-statistics clustered by firm and two-way by firm and cohort; 95\% CI from the firm-clustered SE.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:didspid}{\textbf{Difference-in-differences on pre-determined exposure and the SPID project signal, Russell~3000.} Panel A: forward return (within-year winsorized, pp) on the interaction of pre-determined AI exposure (firm mean of the composite over filing years 2019--2021, binary above-median or continuous) with the post-launch dummy, with firm and year fixed effects and two-way clustered $t$ (brackets); the event-time version with the reference year at zero is in Figure~\ref{fig:eventtime} and Table~\ref{tab:eventtime}. Panel B: pooled regressions with the explicit terms signal, post, signal $\times$ post, composite, composite $\times$ post, size and momentum (pp per SD, or pp per unit of the indicator); $t$-statistics clustered by firm and two-way by firm and cohort; 95\% CI from the firm-clustered SE.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lrrrr}
6 6 \toprule
7 −Specification & Coefficient (pp) & [$t$ firm] & [$t$ firm$\times$cohort] & 95\% CI (firm) \\
7 +Specification & \makecell[b]{Coefficient \\ {(pp)}} & [$t$ firm] & [$t$ firm$\times$cohort] & 95\% CI (firm) \\
8 8 \midrule
9 9 \multicolumn{5}{@{}l}{\textit{Panel A: difference-in-differences with firm and year fixed effects (treatment = pre-determined 2019--21 exposure)}} \\
10 10 Treated (above-median exposure) $\times$ post & +4.71 & -- & [1.28] & -- \\
11 11 Continuous exposure ($z$) $\times$ post & +2.79 & -- & [1.28] & -- \\
12 −\quad $N$ = 26{,}664; firm + year FE; two-way clustered & & & & \\
12 +\multicolumn{5}{@{}l}{\quad $N$ = 26{,}664; firm + year FE; two-way clustered} \\
13 13 \midrule
14 14 \multicolumn{5}{@{}l}{\textit{Panel B: pooled regressions of the forward return on the SPID project signal, the composite and their post-launch interactions}} \\
15 15 SPID technology projects ($z$) & +0.40 & [1.21] & [0.60] & [-0.25, +1.04] \\
@@ -17,25 +17,25 @@ SPID technology projects ($z$) $\times$ post & -1.93 & [-1.93] & [-0.96] & [-3.8
17 17 AI composite ($z$) & +2.00 & [5.78] & [2.24] & [+1.32, +2.68] \\
18 18 AI composite $\times$ post & +1.77 & [1.63] & [0.82] & [-0.36, +3.91] \\
19 19 Post-launch cohorts & +9.54 & [9.91] & [0.85] & [+7.65, +11.43] \\
20 −\quad $N$ = 26{,}933; design rank 8 of 8; condition number 2.8 & & & & \\
20 +\multicolumn{5}{@{}l}{\quad $N$ = 26{,}933; design rank 8 of 8; condition number 2.8} \\
21 21 \addlinespace
22 22 Any AI-initiative project (0/1) & +0.73 & [0.18] & [0.07] & [-7.01, +8.46] \\
23 23 Any AI-initiative project (0/1) $\times$ post & +4.20 & [0.62] & [0.32] & [-9.00, +17.39] \\
24 24 AI composite ($z$) & +2.02 & [5.89] & [2.31] & [+1.34, +2.69] \\
25 25 AI composite $\times$ post & +1.49 & [1.36] & [0.69] & [-0.65, +3.63] \\
26 26 Post-launch cohorts & +9.34 & [9.59] & [0.83] & [+7.43, +11.25] \\
27 −\quad $N$ = 26{,}933; design rank 8 of 8; condition number 18.5 & & & & \\
27 +\multicolumn{5}{@{}l}{\quad $N$ = 26{,}933; design rank 8 of 8; condition number 18.5} \\
28 28 \addlinespace
29 29 Any technology project (0/1) & +1.41 & [1.76] & [0.62] & [-0.16, +2.98] \\
30 30 Any technology project (0/1) $\times$ post & -4.52 & [-2.02] & [-0.89] & [-8.90, -0.14] \\
31 31 AI composite ($z$) & +1.99 & [5.74] & [2.22] & [+1.31, +2.67] \\
32 32 AI composite $\times$ post & +1.75 & [1.61] & [0.82] & [-0.38, +3.88] \\
33 33 Post-launch cohorts & +10.70 & [9.49] & [0.91] & [+8.49, +12.91] \\
34 −\quad $N$ = 26{,}933; design rank 8 of 8; condition number 6.2 & & & & \\
34 +\multicolumn{5}{@{}l}{\quad $N$ = 26{,}933; design rank 8 of 8; condition number 6.2} \\
35 35 \addlinespace
36 36 \bottomrule
37 37 \end{tabular}
38 −\begin{tablenotes}[flushleft]\footnotesize
38 +\begin{tablenotes}[flushleft]\scriptsize
39 39 \item \emph{Notes:} The committed v2.0 exhibit printed $t$ = 0.00 in every row of Panel B from a rank-deficient fit; the refit of the committed panel (design rank 8 of 8, condition number 2.82, $N$ = 25{,}135) gives SPID $\times$ post -1.57 pp [$t$ -1.72 firm / -0.88 two-way], and the rebuilt panel above gives -1.93 [-1.93 / -0.96]. The parallel-trends condition of Panel A is not satisfied (Table~\ref{tab:eventtime}), so the DiD coefficients are descriptive, not causal. The SPID measure is sparse (any-AI prevalence 2.0\% of firm-years) and unvalidated; its minimum detectable effects are in Table~\ref{tab:spidbinary}. Source: results/r3k\_v2/results2.json (did, spid), t17\_refit.json.
40 40 \end{tablenotes}
41 41 \end{threeparttable}}
modified paper/tables/tab_doublesort.tex +1 −1
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (double_sort_*) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_doublesort} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 3 \ExhibitTable{tab:doublesort}{\textbf{AI language $\times$ size double sort, Russell~3000.} Mean forward twelve-month return (percent) by tercile of the AI composite within tercile of the corrected market capitalization (both formed within cohort on ranks), for the pre- and post-launch cohorts and for the within-year winsorized and raw returns, with the High$-$Low difference and the number of firm-years per size tercile.}{\footnotesize}{%
4 −\begin{threeparttable}
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lllrrrrr}
6 6 \toprule
7 7 Period & Returns & Size tercile & Low AI & Mid & High AI & High$-$Low & Firm-years \\
modified paper/tables/tab_event.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results_event.json (by_benchmark.mm_2022, welch_reference, tercile_characteristics) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_event} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:event}{\textbf{ChatGPT event study: cumulative abnormal returns by pre-launch AI tercile under the IWV market model, Russell~3000.} Market-model cumulative abnormal returns (percent) of the high and low terciles of 2021-cohort AI exposure (2{,}215 firms; terciles on ranks), the High$-$Low difference and three $t$-statistics: CDA = the dependence-robust crude-dependence-adjustment statistic of the daily High$-$Low portfolio (CAR divided by the estimation-window SD of the portfolio $\times \sqrt{\text{days}}$), event-SD = the same with the event-window SD, BMP = Boehmer--Musumeci--Poulsen standardized-CAR difference, which treats firms as independent. Market model estimated on the iShares Russell~3000 ETF (IWV) over 2022-01-03..2022-10-31 (209 days); the pre-launch block is reported separately from the event window.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:event}{\textbf{ChatGPT event study: cumulative abnormal returns by pre-launch AI tercile under the IWV market model, Russell~3000.} Market-model cumulative abnormal returns (percent) of the high and low terciles of 2021-cohort AI exposure (2{,}215 firms; terciles on ranks), the High$-$Low difference and three $t$-statistics: CDA = the dependence-robust crude-dependence-adjustment statistic of the daily High$-$Low portfolio (CAR divided by the estimation-window SD of the portfolio $\times \sqrt{\text{days}}$), event-SD = the same with the event-window SD, BMP = Boehmer--Musumeci--Poulsen standardized-CAR difference, which treats firms as independent. Market model estimated on the iShares Russell~3000 ETF (IWV) over 2022-01-03..2022-10-31 (209 days); the pre-launch block is reported separately from the event window.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{lrrrrrrr}
6 6 \toprule
7 7 Horizon & Days & High (\%) & Low (\%) & High$-$Low (pp) & CDA $t$ & event-SD $t$ & BMP $t$ \\
@@ -25,7 +25,7 @@ S\&P 500 members ($n$ = 212 + 111) & 250 & -3.50 & -15.56 & +12.06 & 1.96 & 2.24
25 25 Non-members ($n$ = 529 + 627) & 250 & -4.07 & -18.55 & +14.48 & 1.85 & 2.25 & 4.42 \\
26 26 \bottomrule
27 27 \end{tabular}
28 −\begin{tablenotes}[flushleft]\footnotesize
28 +\begin{tablenotes}[flushleft]\scriptsize
29 29 \item \emph{Notes:} The CDA $t$ is the statistic the text relies on; the BMP $t$ is independence-based and overstates significance under a common event date (the Kolari--Pynn\"onen factor for $\bar\rho$ = 0.0374 is 0.131; it deflates the firm-level $t$, whereas the common component nets out of the High$-$Low portfolio, which is why the two differ). The Welch $t$ reported in v2.0 (independence-based) was: full 3.92, largest 1,000 5.29, remaining 2.04, S\&P 1.96, non-S\&P 3.29. Tercile characteristics (estimation window): Low $\beta$ 0.99, log cap 21.47, share large 39\%; High $\beta$ 1.17, log cap 22.09, share large 53\% --- the terciles differ in beta and size, so Table~\ref{tab:eventcda} re-estimates the one-year gradient under five benchmarks. Levels drift negative because the model was estimated in the 2022 bear market; only differences between terciles are interpretable. Source: results/r3k\_v2/results\_event.json.
30 30 \end{tablenotes}
31 31 \end{threeparttable}}
modified paper/tables/tab_event_cda.tex +4 −4
@@ -1,10 +1,10 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results_event.json (by_benchmark, ff6_calendar_time, placebo_launches, placebo_summary, mht_event) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_event_cda} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:eventcda}{\textbf{Benchmark dependence of the one-year event-study gradient and placebo launch dates.} Panel A: the one-year High$-$Low abnormal return of the pre-launch AI terciles and its dependence-robust CDA $t$ under six benchmarks: the IWV market model of Table~\ref{tab:event}, a beta-only adjustment, the market-adjusted return, a market model estimated over calendar 2021, a size $\times$ momentum matched benchmark (5 $\times$ 5 cells of the 2021-cohort panel) and a Fama--French five-factor-plus-momentum calendar-time regression of the daily High$-$Low portfolio (alpha $\times$ 250 days, HAC $t$). Panel B: the same design re-run with a fictitious launch on 30 November of 2015--2021. Every cell is dependence-robust (daily High$-$Low portfolio).}{\footnotesize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{4pt}
3 +\ExhibitTable{tab:eventcda}{\textbf{Benchmark dependence of the one-year event-study gradient and placebo launch dates.} Panel A: the one-year High$-$Low abnormal return of the pre-launch AI terciles and its dependence-robust CDA $t$ under six benchmarks: the IWV market model of Table~\ref{tab:event}, a beta-only adjustment, the market-adjusted return, a market model estimated over calendar 2021, a size $\times$ momentum matched benchmark (5 $\times$ 5 cells of the 2021-cohort panel) and a Fama--French five-factor-plus-momentum calendar-time regression of the daily High$-$Low portfolio (alpha $\times$ 250 days, HAC $t$). Panel B: the same design re-run with a fictitious launch on 30 November of 2015--2021. Every cell is dependence-robust (daily High$-$Low portfolio).}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{llrrrrrr}
6 6 \toprule
7 −Benchmark & Statistic & Full & Largest 1,000 & Remaining & S\&P 500 & Non-S\&P & Within-size large / small \\
7 +Benchmark & Statistic & Full & Largest 1,000 & Remaining & S\&P 500 & Non-S\&P & \makecell[b]{Within-size \\ {large / small}} \\
8 8 \midrule
9 9 \multicolumn{8}{@{}l}{\textit{Panel A: one-year High$-$Low abnormal return (pp) and CDA $t$ by benchmark and sub-sample}} \\
10 10 (a) IWV market model, est.\ Jan--Oct 2022 & H$-$L (pp) & +14.20 & +20.03 & +12.23 & +12.06 & +14.48 & 20.70 / 11.66 \\
@@ -38,7 +38,7 @@ Launch year & Firms & \multicolumn{2}{l}{Full: H$-$L (pp) / CDA $t$} & \multicol
38 38 2022 (ChatGPT) & 2{,}215 & \multicolumn{2}{l}{+14.2 / 2.23} & \multicolumn{2}{l}{+20.0 / 3.02} & \multicolumn{2}{l}{+12.2 / 1.51} \\
39 39 \bottomrule
40 40 \end{tabular}
41 −\begin{tablenotes}[flushleft]\footnotesize
41 +\begin{tablenotes}[flushleft]\scriptsize
42 42 \item \emph{Notes:} The largest-1,000 gradient is significant only under the market models (a) and (d); under (b), (c), (e) and (f) its CDA $t$ is below 2, so the event-study evidence for a large-cap re-rating is benchmark-dependent and is reported as such. Holm-adjusted $p$ over the 35 sub-sample $\times$ horizon CDA statistics of benchmark (a): smallest 0.088 (BH: 0.036). The 2022 launch ranks 1 of 8 by full-sample H$-$L and 1 by CDA $t$ among the eight launch dates; the placebo $t$'s range over -1.11 to 1.61. A book-to-market match was not run (book equity not in the panel). Source: results/r3k\_v2/results\_event.json.
43 43 \end{tablenotes}
44 44 \end{threeparttable}}
modified paper/tables/tab_eventtime.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (did_eventtime*) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_eventtime} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:eventtime}{\textbf{Event-time profile of the premium on pre-determined AI exposure, Russell~3000.} Slope of the forward return (within-year winsorized, pp per SD) on pre-determined AI exposure by outcome cohort, with firm-clustered standard errors in parentheses. The first pair of columns reproduces the committed coding (interaction without a main effect, which estimates one absolute slope per cohort); the second pair restores the main effect so that the coefficients are differences from the 2021 reference cohort (zero by construction); the third pair replaces the 2019--21 exposure by the mean composite over the three years before each outcome year.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:eventtime}{\textbf{Event-time profile of the premium on pre-determined AI exposure, Russell~3000.} Slope of the forward return (within-year winsorized, pp per SD) on pre-determined AI exposure by outcome cohort, with firm-clustered standard errors in parentheses. The first pair of columns reproduces the committed coding (interaction without a main effect, which estimates one absolute slope per cohort); the second pair restores the main effect so that the coefficients are differences from the 2021 reference cohort (zero by construction); the third pair replaces the 2019--21 exposure by the mean composite over the three years before each outcome year.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lrrrrrr}
6 6 \toprule
7 7 Outcome cohort & \multicolumn{2}{c}{Committed coding: absolute slope} & \multicolumn{2}{c}{Difference from reference} & \multicolumn{2}{c}{Trailing exposure: difference} \\
@@ -20,7 +20,7 @@ Outcome cohort & \multicolumn{2}{c}{Committed coding: absolute slope} & \multico
20 20 2024 & +7.6 & (2.4) & +1.7 & (2.7) & +1.7 & (2.7) \\
21 21 \bottomrule
22 22 \end{tabular}
23 −\begin{tablenotes}[flushleft]\footnotesize
23 +\begin{tablenotes}[flushleft]\scriptsize
24 24 \item \emph{Notes:} Reference-cohort slope with the main effect restored: +5.9 pp/SD ($t$ 5.95); $N$ = 21{,}111 (trailing: 20{,}600). With the 2019--21 exposure, cohorts before 2019 interact future language with past outcomes (look-back selection, not a pre-trend test). The pre-launch differences are not zero, so the parallel-trends condition behind Table~\ref{tab:didspid} Panel A fails and the post-launch coefficients are relative to a reference year that itself carried the largest slope. Plotted with 95\% CIs in Figure~\ref{fig:eventtime}. Source: results/r3k\_v2/results2.json (did\_eventtime, did\_eventtime\_trailing).
25 25 \end{tablenotes}
26 26 \end{threeparttable}}
modified paper/tables/tab_filing_type.tex +4 −4
@@ -1,10 +1,10 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (filing_type, mht.forms_fm_w) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_filing_type} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:filingtype}{\textbf{Form-specific AI composites, Russell~3000.} Panel A: the composite rebuilt from the filing-level scores of one form at a time: share of estimation firm-years with at least one scored filing of that form, correlation with the baseline composite, equal-weighted Q5$-$Q1 spreads (within-year winsorized, pp per year; full sample with 95\% CI over cohorts, pre and post), and the Fama--MacBeth slope with controls (pp per SD; [NW $t$; plain $t$]). Panel B: the three form composites entered jointly, with a HAC Wald test of equal slopes. Panel C: how much of the 2022 cohort's text post-dates the launch and whether it changes the cohort spread.}{\footnotesize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{4pt}
3 +\ExhibitTable{tab:filingtype}{\textbf{Form-specific AI composites, Russell~3000.} Panel A: the composite rebuilt from the filing-level scores of one form at a time: share of estimation firm-years with at least one scored filing of that form, correlation with the baseline composite, equal-weighted Q5$-$Q1 spreads (within-year winsorized, pp per year; full sample with 95\% CI over cohorts, pre and post), and the Fama--MacBeth slope with controls (pp per SD; [NW $t$; plain $t$]). Panel B: the three form composites entered jointly, with a HAC Wald test of equal slopes. Panel C: how much of the 2022 cohort's text post-dates the launch and whether it changes the cohort spread.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{lrrrrrrr}
6 6 \toprule
7 −Signal built from & Firm-years covered & Corr.\ with baseline & Full Q5$-$Q1 & 95\% CI & Pre & Post & FM slope (pp/SD) \\
7 +\makecell[b]{Signal \\ {built from}} & \makecell[b]{Firm-years \\ {covered}} & \makecell[b]{Corr.\ with \\ {baseline}} & Full Q5$-$Q1 & 95\% CI & Pre & Post & \makecell[b]{FM slope \\ {(pp/SD)}} \\
8 8 \midrule
9 9 \multicolumn{8}{@{}l}{\textit{Panel A: one form at a time}} \\
10 10 Form 10-K only & 96.8\% & 0.62 & +6.2 & [-0.8, +13.2] & +4.9 & +11.6 & +2.67 [2.09; 2.36] \\
@@ -23,7 +23,7 @@ raw & +3.29 [1.95] & -0.07 [-0.11] & +1.25 [2.26] & \multicolumn{4}{l}{2.90 (0.2
23 23 \multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{Cohort spread, pre-launch filings only vs full-year text (2{,}265 firms, wins., pp)} & \multicolumn{7}{l}{-5.2 vs -5.0; rank correlation of the two signals 0.99} \\
24 24 \bottomrule
25 25 \end{tabular}
26 −\begin{tablenotes}[flushleft]\footnotesize
26 +\begin{tablenotes}[flushleft]\scriptsize
27 27 \item \emph{Notes:} Form composites = $\tfrac12[z(\text{adoption}) + z(\text{infrastructure})]$ from the filings of that form only; the equal-form composite averages the three form $z$-scores. The Wald test rejects equality at 5\% on winsorized returns but not on raw returns (wins.\ $p$ = 0.016, raw 0.234); Romano--Wolf $p$ over the three single-form slopes: 10-K: 0.05, 10-Q: 0.07, 8-K: 0.05. The claim that annual reports carry the strongest premium is therefore not statistically distinguishable from the other forms. Equation (3) aggregation reproduced from filing-level scores for 100.00\% of firm-years. Source: results/r3k\_v2/results2.json (filing\_type).
28 28 \end{tablenotes}
29 29 \end{threeparttable}}
modified paper/tables/tab_fm.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (fama_macbeth) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_fm} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:fm}{\textbf{Fama--MacBeth regressions, all specifications, Russell~3000 universe.} Companion to Table~\ref{tab:fmboth}: time-series mean of the 15 annual cross-sectional slopes (pp per SD, or pp per unit for the 0/1 indicator) of the forward return on each signal with size, momentum and volatility controls, for the within-year winsorized and the raw return.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:fm}{\textbf{Fama--MacBeth regressions, all specifications, Russell~3000 universe.} Companion to Table~\ref{tab:fmboth}: time-series mean of the 15 annual cross-sectional slopes (pp per SD, or pp per unit for the 0/1 indicator) of the forward return on each signal with size, momentum and volatility controls, for the within-year winsorized and the raw return.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{llrrrr}
6 6 \toprule
7 7 Regressor & Returns & Slope (pp/SD) & [NW $t$] & [plain $t$] & 95\% CI \\
@@ -52,7 +52,7 @@ Volatility & wins. & +4.60 & [1.79] & [1.58] & [-1.63, +10.83] \\
52 52 Cohorts & & 15 & \multicolumn{3}{l}{mean cross-section 1{,}795 firms} \\
53 53 \bottomrule
54 54 \end{tabular}
55 −\begin{tablenotes}[flushleft]\footnotesize
55 +\begin{tablenotes}[flushleft]\scriptsize
56 56 \item \emph{Notes:} NW $t$ uses 3 Bartlett lags; fixed-$b$ 5\% critical value 2.71 (simulated); plain = i.i.d.\ $t$ over the annual slopes; CI = 95\% $t$-interval over the annual slopes. The SPID $z$-score is $\log(1 + \text{mentions})$ standardized within year; `Any AI project' is the 0/1 indicator (Table~\ref{tab:spidbinary} for its minimum detectable effect).
57 57 \end{tablenotes}
58 58 \end{threeparttable}}
modified paper/tables/tab_fm_both.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (samples.*.fm, fama_macbeth) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_fm_both} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:fmboth}{\textbf{Fama--MacBeth regressions of the forward return on AI language, Russell~3000 and S\&P~500.} Time-series average of 15 annual cross-sectional slopes of the forward twelve-month return on the standardized signal with size, momentum and volatility controls, in percentage points per standard deviation. The headline row of each regressor uses the within-year winsorized return; the raw row shows the tail sensitivity. $t$-statistics in brackets: NW = Newey--West (3 lags) on the series of annual slopes, plain = i.i.d.; the 95\% CI is the $t$-interval over the annual slopes.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:fmboth}{\textbf{Fama--MacBeth regressions of the forward return on AI language, Russell~3000 and S\&P~500.} Time-series average of 15 annual cross-sectional slopes of the forward twelve-month return on the standardized signal with size, momentum and volatility controls, in percentage points per standard deviation. The headline row of each regressor uses the within-year winsorized return; the raw row shows the tail sensitivity. $t$-statistics in brackets: NW = Newey--West (3 lags) on the series of annual slopes, plain = i.i.d.; the 95\% CI is the $t$-interval over the annual slopes.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{llrrrrrrr}
6 6 \toprule
7 7 Regressor & Returns & \multicolumn{4}{c}{Russell 3000} & \multicolumn{3}{c}{S\&P 500 members} \\
@@ -42,7 +42,7 @@ Cohorts (annual regressions) & & 15 & & & & 15 & & \\
42 42 Mean firms per cross-section & & 1{,}795 & & & & 448 & & \\
43 43 \bottomrule
44 44 \end{tabular}
45 −\begin{tablenotes}[flushleft]\footnotesize
45 +\begin{tablenotes}[flushleft]\scriptsize
46 46 \item \emph{Notes:} Joint = the three facets enter one regression. The Kiefer--Vogelsang fixed-$b$ 5\% critical value for a Newey--West $t$ with 3 Bartlett lags and $T$ = 15 is 2.71 (simulated), so NW $t$-statistics between 1.96 and 2.71 are not significant at 5\% under fixed-$b$ asymptotics; the plain $t$ is the conservative reference. Economic magnitude: the Russell~3000 composite slope of +1.88 pp per SD implies a +3.8 pp difference between firms one SD above and one SD below their same-year peers. Signals re-standardized within each panel (`zz'); all controls standardized within year, size from the within-year winsorized corrected log capitalization. Year-by-year slopes: Figure~\ref{fig:fmyear}; all specifications: Table~\ref{tab:fm}.
47 47 \end{tablenotes}
48 48 \end{threeparttable}}
modified paper/tables/tab_groups.tex +5 −5
@@ -1,12 +1,12 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (groups, size_neutral, contrasts) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_groups} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 3 \ExhibitTable{tab:groups}{\textbf{AI-composite spreads by size group and index membership, Russell~3000.} Equal-weighted Q5$-$Q1 spreads of the composite with quintiles formed within each sub-sample and cohort: full-sample spread with its Newey--West $t$ and 95\% CI over cohorts, pre- (2010--21) and post-launch (2022--24) means, the post mean leaving out each post cohort in turn, and the pooled firm-level post spread for 2022--23 only (firm-clustered $t$). Size groups are assigned each June on the corrected capitalization: the largest 1,000 firms (Russell~1000 proxy) versus the rest, and a fixed within-cohort percentile partition (largest 42\%) that keeps the group shares constant as the panel grows. The size-neutral rows form quintiles within size group and cohort over all firms.}{\scriptsize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{3.5pt}
4 +\begin{threeparttable}\setlength{\tabcolsep}{2pt}
5 5 \begin{tabular}{llrrrrrrrr}
6 6 \toprule
7 −Sample & Returns & Firm-years & Full Q5$-$Q1 & [NW $t$] & 95\% CI & Pre & Post ($n$ = 3) & Post leaving out 2022 / 2023 / 2024 & Post 2022--23 pooled [$t$] \\
7 +Sample & Returns & Firm-years & Full Q5$-$Q1 & [NW $t$] & 95\% CI & Pre & Post ($n$ = 3) & \makecell[b]{Post leaving out \\ {2022 / 2023 / 2024}} & \makecell[b]{Post 2022--23 \\ {pooled [$t$]}} \\
8 8 \midrule
9 −Largest 1,000 by capitalization & wins. & 14{,}998 & +5.0 & [2.09] & [-0.5, +10.6] & +3.1 & +12.7 & +16.0 / +18.8 / +3.3 & +3.3 [1.18] \\
9 +Largest 1,000 (corrected cap) & wins. & 14{,}998 & +5.0 & [2.09] & [-0.5, +10.6] & +3.1 & +12.7 & +16.0 / +18.8 / +3.3 & +3.3 [1.18] \\
10 10 & raw & & +5.3 & [2.06] & [-0.6, +11.2] & +3.1 & +13.8 & +17.5 / +20.4 / +3.4 & +3.4 [1.19] \\
11 11 \addlinespace
12 12 Remaining firms & wins. & 12{,}048 & +3.9 & [1.19] & [-3.0, +10.7] & +4.0 & +3.5 & +11.3 / +2.5 / -3.1 & -3.0 [-0.77] \\
@@ -24,11 +24,11 @@ S\&P 500 members & wins. & 6{,}719 & +6.5 & [2.52] & [-0.1, +13.1] & +4.4 & +14.
24 24 Non-members & wins. & 20{,}635 & +3.0 & [1.40] & [-2.1, +8.1] & +2.8 & +4.0 & +10.8 / +3.1 / -2.1 & -2.0 [-0.67] \\
25 25 & raw & & +5.1 & [1.91] & [-1.1, +11.3] & +4.8 & +6.4 & +15.7 / +1.4 / +2.2 & +2.4 [0.36] \\
26 26 \addlinespace
27 −Size-neutral quintiles, all firms & wins. & 27{,}354 & +4.9 & [2.19] & [-0.1, +9.8] & +4.2 & +7.5 & -- & -- \\
27 +Size-neutral quintiles (all) & wins. & 27{,}354 & +4.9 & [2.19] & [-0.1, +9.8] & +4.2 & +7.5 & -- & -- \\
28 28 & raw & & +6.6 & [2.54] & [+1.1, +12.2] & +5.8 & +9.9 & -- & -- \\
29 29 \bottomrule
30 30 \end{tabular}
31 −\begin{tablenotes}[flushleft]\footnotesize
31 +\begin{tablenotes}[flushleft]\scriptsize
32 32 \item \emph{Notes:} Inference: NW $t$ = Newey--West (Bartlett kernel, 3 lags) $t$-statistic of the mean of the annual cohort series; plain $t$ = i.i.d. $t$ over cohorts; 95\% CI = $t$-interval over cohorts (the post period has 3 cohorts, so its CIs are wide by construction). Returns are the look-ahead-free twelve-month forward returns (July $Y{+}1$--June $Y{+}2$); `wins.' = 1/99 winsorized within the formation year; `median' = median spread within cohort; `raw' = unwinsorized. Rebuilt panel: $N$ = 27{,}354 firm-years, 2{,}375 firms, keyed on CIK $\times$ year, cleaned returns, corrected market capitalization. No significance stars are used. Firm-years without a capitalization (308) belong to no size group; 7.6\% of firm-years change group relative to the committed v2.0 capitalization. The post-launch CIs over three cohorts are wide (largest 1,000, wins.: [-28.4, +53.7]; remaining: [-32.7, +39.8]; Figure~\ref{fig:sizegroups}). The large-versus-small post-launch difference is tested in Table~\ref{tab:contrasts}: hi $\times$ post $\times$ largest-1,000 = +10.8 pp (firm $t$ 1.83, two-way 1.55, wild $p$ 0.22, MDE 16.5 pp); hi $\times$ post $\times$ member = +8.6 pp ($t$ 1.39 / 1.07). Post FF6 alphas of the sub-sample monthly long--shorts (\%/yr, [$t$]): largest 1,000 +1.85 [0.59], remaining +2.89 [0.49], S\&P members +1.15 [0.26]. Firms per group and cohort: Table~\ref{tab:coverage}.
33 33 \end{tablenotes}
34 34 \end{threeparttable}}
modified paper/tables/tab_hygiene.tex +16 −16
@@ -25,24 +25,24 @@ QUBT & 2018-01-31 & +650\% & -- & 2018-07-12 & series break \\
25 25 \multicolumn{6}{@{}l}{\textit{Panel B: headline statistics before (committed v2.0, HEAD 3cf7560) and after the corrections}} \\
26 26 Statistic & \multicolumn{2}{l}{BEFORE (committed v2.0)} & \multicolumn{3}{l}{AFTER (rebuilt panel): raw $\rightarrow$ winsorized / robust} \\
27 27 \midrule
28 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Panel: firm-years / firms / no capitalization} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{27{,}468 / 2{,}379 / 2{,}168} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{27{,}354 / 2{,}375 / 308} \\
29 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{log capitalization range (min, max)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{[$-\infty$, 37.4]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{[15.5, 29.0]} \\
30 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{AAPL capitalization, June 2011 (USD bn; rank)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{9.3 (rank 166)} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{310 (rank 2)} \\
31 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Max single-firm VW weight in a cohort $\times$ quintile; cells $>$ 25\%} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{100.0\%; 548} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{36\%; 18} \\
32 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{EW composite Q5$-$Q1, full (pp) [NW $t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{+5.5 [2.41]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+5.5 [2.40] $\rightarrow$ +3.9 [2.00; plain 1.78], CI [-0.8, +8.6]; median +0.5 [0.29]} \\
33 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{VW composite: Q1 / Q5 / Q5$-$Q1 [NW $t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{+0.4 / +14.3 / +13.9 [2.59]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+12.1 / +19.4 / +7.4 [2.69] $\rightarrow$ wins.\ +7.3 [2.68]} \\
34 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Fama--MacBeth composite slope (pp/SD) [NW $t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{+3.07 [2.80]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+2.77 [2.44] $\rightarrow$ +1.88 [2.41; plain 2.51], CI [+0.27, +3.49]} \\
35 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Pre / post composite spread (pp)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{+4.9 [2.00] / +7.9 [1.34, $n$ = 3]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+4.8 / +8.5 $\rightarrow$ wins.\ +3.4 [-1.6, +8.4] / +6.0 [-25.5, +37.6]} \\
36 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Pooled post Q5 vs Q1 (pp) [$t$ firm / two-way]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{+8.2 [1.80 / --]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+8.7 [1.95 / 1.10] $\rightarrow$ wins.\ +6.2 [2.14 / 0.84], wild $p$ 0.631} \\
37 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Largest 1,000: pre / post spread (pp)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{+2.9 / +12.8} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+3.1 / +13.8 $\rightarrow$ wins.\ +3.1 / +12.7; ex-2024 pooled +3.3 [1.18]} \\
38 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Remaining firms: pre / post spread (pp)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{+9.6 / +8.4} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+7.8 / +7.0 $\rightarrow$ wins.\ +4.0 / +3.5} \\
39 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Large-vs-small post-launch contrast (pp) [$t$ firm / two-way; wild $p$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{not tested} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+10.8 [1.83 / 1.55; 0.22], MDE 16.5} \\
40 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Within-sector FM slope, full (pp/SD) [NW $t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{+1.46 [4.38]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+1.54 [3.48; plain 2.99] $\rightarrow$ wins.\ +0.88 [2.80; plain 2.74]; sector-neutral sort +1.4 [1.61]} \\
41 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Event study, 1-year H$-$L: full / largest 1,000 / remaining (pp) [$t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{+14.0 [Welch 3.94; CDA 2.21] / +19.5 [Welch 5.09] / +9.9 [Welch 1.55]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{+14.2 [CDA 2.23] / +20.0 [CDA 3.02; beta-only 1.12; FF6 0.52] / +12.2 [CDA 1.51]} \\
42 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{SPID $\times$ post (pp) [$t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.2\textwidth}}{-1.66 [-0.00] (degenerate fit; post coefficient $-6.7 \times 10^{12}$)} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{-1.57 [-1.72 / -0.88] (committed panel refit) $\rightarrow$ -1.93 [-1.93 / -0.96]} \\
28 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Panel: firm-years / firms / no capitalization} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{27{,}468 / 2{,}379 / 2{,}168} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{27{,}354 / 2{,}375 / 308} \\
29 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{log capitalization range (min, max)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{[$-\infty$, 37.4]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{[15.5, 29.0]} \\
30 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{AAPL capitalization, June 2011 (USD bn; rank)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{9.3 (rank 166)} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{310 (rank 2)} \\
31 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Max single-firm VW weight in a cohort $\times$ quintile; cells $>$ 25\%} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{100.0\%; 548} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{36\%; 18} \\
32 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{EW composite Q5$-$Q1, full (pp) [NW $t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{+5.5 [2.41]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+5.5 [2.40] $\rightarrow$ +3.9 [2.00; plain 1.78], CI [-0.8, +8.6]; median +0.5 [0.29]} \\
33 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{VW composite: Q1 / Q5 / Q5$-$Q1 [NW $t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{+0.4 / +14.3 / +13.9 [2.59]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+12.1 / +19.4 / +7.4 [2.69] $\rightarrow$ wins.\ +7.3 [2.68]} \\
34 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Fama--MacBeth composite slope (pp/SD) [NW $t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{+3.07 [2.80]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+2.77 [2.44] $\rightarrow$ +1.88 [2.41; plain 2.51], CI [+0.27, +3.49]} \\
35 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Pre / post composite spread (pp)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{+4.9 [2.00] / +7.9 [1.34, $n$ = 3]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+4.8 / +8.5 $\rightarrow$ wins.\ +3.4 [-1.6, +8.4] / +6.0 [-25.5, +37.6]} \\
36 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Pooled post Q5 vs Q1 (pp) [$t$ firm / two-way]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{+8.2 [1.80 / --]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+8.7 [1.95 / 1.10] $\rightarrow$ wins.\ +6.2 [2.14 / 0.84], wild $p$ 0.631} \\
37 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Largest 1,000: pre / post spread (pp)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{+2.9 / +12.8} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+3.1 / +13.8 $\rightarrow$ wins.\ +3.1 / +12.7; ex-2024 pooled +3.3 [1.18]} \\
38 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Remaining firms: pre / post spread (pp)} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{+9.6 / +8.4} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+7.8 / +7.0 $\rightarrow$ wins.\ +4.0 / +3.5} \\
39 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Large-vs-small post-launch contrast (pp) [$t$ firm / two-way; wild $p$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{not tested} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+10.8 [1.83 / 1.55; 0.22], MDE 16.5} \\
40 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Within-sector FM slope, full (pp/SD) [NW $t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{+1.46 [4.38]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+1.54 [3.48; plain 2.99] $\rightarrow$ wins.\ +0.88 [2.80; plain 2.74]; sector-neutral sort +1.4 [1.61]} \\
41 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{Event study, 1-year H$-$L: full / largest 1,000 / remaining (pp) [$t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{+14.0 [Welch 3.94; CDA 2.21] / +19.5 [Welch 5.09] / +9.9 [Welch 1.55]} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{+14.2 [CDA 2.23] / +20.0 [CDA 3.02; beta-only 1.12; FF6 0.52] / +12.2 [CDA 1.51]} \\
42 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.25\textwidth}}{SPID $\times$ post (pp) [$t$]} & \multicolumn{2}{>{\raggedright\arraybackslash}p{0.19\textwidth}}{-1.66 [-0.00] (degenerate fit; post coefficient $-6.7 \times 10^{12}$)} & \multicolumn{3}{>{\raggedright\arraybackslash}p{0.39\textwidth}}{-1.57 [-1.72 / -0.88] (committed panel refit) $\rightarrow$ -1.93 [-1.93 / -0.96]} \\
43 43 \bottomrule
44 44 \end{tabular}
45 −\begin{tablenotes}[flushleft]\footnotesize
45 +\begin{tablenotes}[flushleft]\scriptsize
46 46 \item \emph{Notes:} Verification rule: series\_break if FinData history starts inside the window or has no bar at a window end; discrepancy if |yahoo-findata| > max(0.5, 0.25|findata|); else confirmed. Second source: FinData OS daily bars (FirstRate), read-only query of 2026-11-05. BEFORE values are the committed v2.0 statistics (raw returns, split-adjusted close $\times$ as-reported shares, Welch event-study $t$'s, Newey--West on three post cohorts, interaction without main effect) and appear nowhere else in the paper; the 2022/2024 event-time BEFORE values are absolute slopes from a model without a main effect and are not comparable to the AFTER differences.
47 47 \end{tablenotes}
48 48 \end{threeparttable}}
modified paper/tables/tab_mht.tex +8 −8
@@ -1,10 +1,10 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (mht, spec_curve), results_event.json (mht_event) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_mht} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:mht}{\textbf{Multiple-testing adjustments by family of tests.} For each family of tests reported in the paper: the family size, the smallest unadjusted $p$, the smallest Holm (family-wise) and Benjamini--Hochberg (false-discovery-rate) adjusted $p$, the smallest Romano--Wolf step-down $p$ (max-$t$ on shared bootstrap draws), the number of members with $|t| > 3$, and the unadjusted / Romano--Wolf $p$ of the headline member (the EW composite spread or the baseline row). The deflated Sharpe ratio and the specification curve summarize the search over long--short series and specifications.}{\footnotesize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{4pt}
3 +\ExhibitTable{tab:mht}{\textbf{Multiple-testing adjustments by family of tests.} For each family of tests reported in the paper: the family size, the smallest unadjusted $p$, the smallest Holm (family-wise) and Benjamini--Hochberg (false-discovery-rate) adjusted $p$, the smallest Romano--Wolf step-down $p$ (max-$t$ on shared bootstrap draws), the number of members with $|t| > 3$, and the unadjusted / Romano--Wolf $p$ of the headline member (the EW composite spread or the baseline row). The deflated Sharpe ratio and the specification curve summarize the search over long--short series and specifications.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{lrrrrrrr}
6 6 \toprule
7 −Family & Size & min $p$ & min Holm & min BH & min RW & $|t| > 3$ & Headline $p$ / RW $p$ \\
7 +Family & Size & min $p$ & min Holm & min BH & min RW & $|t| > 3$ & \makecell[b]{Headline $p$ \\ {/ RW $p$}} \\
8 8 \midrule
9 9 \multicolumn{1}{>{\raggedright\arraybackslash}p{0.36\textwidth}}{Full-sample spreads, Table~\ref{tab:sortsboth} (EW and VW, five signals; wins.)} & 10 & 0.018 & 0.176 & 0.135 & 0.147 & 0 & 0.10 / 0.32 \\
10 10 \multicolumn{1}{>{\raggedright\arraybackslash}p{0.36\textwidth}}{Pre-launch spreads, same family} & 10 & 0.063 & 0.633 & 0.267 & 0.305 & 0 & 0.16 / 0.49 \\
@@ -16,13 +16,13 @@ Family & Size & min $p$ & min Holm & min BH & min RW & $|t| > 3$ & Headline $p$
16 16 \multicolumn{1}{>{\raggedright\arraybackslash}p{0.36\textwidth}}{Candidate break years, Table~\ref{tab:cohorts} (bootstrap $p$)} & 10 & 0.065 & -- & -- & 0.268 & -- & 0.72 / 0.91 (2022) \\
17 17 \multicolumn{1}{>{\raggedright\arraybackslash}p{0.36\textwidth}}{Event-study CDA statistics, Table~\ref{tab:eventcda}, benchmark (a)} & 35 & 0.003 & 0.088 & 0.036 & -- & -- & -- \\
18 18 \midrule
19 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.6\textwidth}}{Deflated Sharpe ratio of the composite long--short (93 trials, SR hurdle 0.55): full / pre / post} & \multicolumn{7}{l}{0.35 / 0.46 / 0.29} \\
20 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.6\textwidth}}{Specification curve, 1,152 specifications (Figure~\ref{fig:speccurve}): positive / positive and NW-significant (plain) / negative and significant} & \multicolumn{7}{l}{84\% / 39\% (35\%) / 1.5\%} \\
21 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.6\textwidth}}{Specification curve: median spread (pp) and interquartile range} & \multicolumn{7}{l}{+3.9 [+0.7, +8.5]} \\
22 −\multicolumn{1}{>{\raggedright\arraybackslash}p{0.6\textwidth}}{Statistics meeting the Harvey--Liu--Zhu $|t| > 3$ hurdle across the cohort families} & \multicolumn{7}{l}{1 of 57} \\
19 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.36\textwidth}}{Deflated Sharpe ratio of the composite long--short (93 trials, SR hurdle 0.55): full / pre / post} & \multicolumn{7}{l}{0.35 / 0.46 / 0.29} \\
20 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.36\textwidth}}{Specification curve, 1,152 specifications (Figure~\ref{fig:speccurve}): positive / positive and NW-significant (plain) / negative and significant} & \multicolumn{7}{l}{84\% / 39\% (35\%) / 1.5\%} \\
21 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.36\textwidth}}{Specification curve: median spread (pp) and interquartile range} & \multicolumn{7}{l}{+3.9 [+0.7, +8.5]} \\
22 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.36\textwidth}}{Statistics meeting the Harvey--Liu--Zhu $|t| > 3$ hurdle across the cohort families} & \multicolumn{7}{l}{1 of 57} \\
23 23 \bottomrule
24 24 \end{tabular}
25 −\begin{tablenotes}[flushleft]\footnotesize
25 +\begin{tablenotes}[flushleft]\scriptsize
26 26 \item \emph{Notes:} Cohort families: shared cohort-resampling bootstrap (9,999 draws) with recentred $t$-statistics; interaction family: shared Webb wild-cluster draws by cohort; event family: Holm and BH on the CDA $p$-values. Reading: no family contains a result that survives the Romano--Wolf adjustment except the cybersecurity interaction (Table~\ref{tab:placebo}); the headline composite spread has a Romano--Wolf $p$ of 0.32 within its ten-member family. Member-level detail: Tables~\ref{tab:mhtfull} and \ref{tab:mhtfullb}. Source: results/r3k\_v2/results2.json (mht, spec\_curve), results\_event.json (mht\_event).
27 27 \end{tablenotes}
28 28 \end{threeparttable}}
modified paper/tables/tab_mht_full_a.tex +2 −2
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (mht) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_mht_full_a} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 3 \ExhibitTable{tab:mhtfull}{\textbf{Member-level multiple-testing adjustments, part A: portfolio-sort and form families.} Companion to Table~\ref{tab:mht}: for every member of the sort and form families, the bootstrap $t$, the unadjusted $p$ and the Holm, Benjamini--Hochberg and Romano--Wolf adjusted $p$-values (shared cohort-resampling bootstrap, 9,999 draws, recentred statistics).}{\scriptsize}{%
4 −\begin{threeparttable}
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lrrrrr}
6 6 \toprule
7 7 Member & $t$ & $p$ & Holm & BH & Romano--Wolf \\
@@ -37,7 +37,7 @@ SPID tech VW & -0.35 & 0.759 & 1.000 & 0.844 & 0.774 \\
37 37 \addlinespace
38 38 \bottomrule
39 39 \end{tabular}
40 −\begin{tablenotes}[flushleft]\footnotesize
40 +\begin{tablenotes}[flushleft]\scriptsize
41 41 \item \emph{Notes:} Winsorized returns throughout. Source: results/r3k\_v2/results2.json (mht).
42 42 \end{tablenotes}
43 43 \end{threeparttable}}
modified paper/tables/tab_mht_full_b.tex +2 −2
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (mht) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_mht_full_b} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 3 \ExhibitTable{tab:mhtfullb}{\textbf{Member-level multiple-testing adjustments, part B: robustness rows, placebo interactions and break years.} Companion to Table~\ref{tab:mht}: member-level unadjusted and adjusted $p$-values for the robustness families, the eight factor $\times$ post interactions (shared Webb wild-cluster draws by cohort) and the ten candidate break years (cohort bootstrap).}{\scriptsize}{%
4 −\begin{threeparttable}
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lrrrrr}
6 6 \toprule
7 7 Member & $t$ & $p$ & Holm & BH & Romano--Wolf \\
@@ -57,7 +57,7 @@ Macro risk & -0.93 & 0.602 & 1.000 & 0.759 & 0.816 \\
57 57 2022 (+2.6 pp) & 0.37 & 0.722 & -- & -- & 0.906 \\
58 58 \bottomrule
59 59 \end{tabular}
60 −\begin{tablenotes}[flushleft]\footnotesize
60 +\begin{tablenotes}[flushleft]\scriptsize
61 61 \item \emph{Notes:} Winsorized returns throughout. Source: results/r3k\_v2/results2.json (mht).
62 62 \end{tablenotes}
63 63 \end{threeparttable}}
modified paper/tables/tab_panel.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (panel_fe) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_panel} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:panel}{\textbf{Two-way fixed-effects panel regressions of the forward return on AI language, Russell~3000.} Dependent variable: forward twelve-month return winsorized at 1/99 within the formation year (percentage points). Regressors are standardized within year, so a coefficient is the change in the forward return (pp) for a one-standard-deviation change in the signal relative to same-year peers. Firm and year fixed effects in every column; $t$-statistics in brackets from standard errors clustered two-way by firm and year.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:panel}{\textbf{Two-way fixed-effects panel regressions of the forward return on AI language, Russell~3000.} Dependent variable: forward twelve-month return winsorized at 1/99 within the formation year (percentage points). Regressors are standardized within year, so a coefficient is the change in the forward return (pp) for a one-standard-deviation change in the signal relative to same-year peers. Firm and year fixed effects in every column; $t$-statistics in brackets from standard errors clustered two-way by firm and year.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lrrrrrrrr}
6 6 \toprule
7 7 & (1) & (2) & (3) & (4) & (5) & (6) & (7) & (8) \\
@@ -30,7 +30,7 @@ Clusters (firms / years) & 2{,}375 / 15 & 2{,}375 / 15 & 2{,}375 / 15 & 2{,}375
30 30 Within $R^2$ & 0.0000 & 0.0537 & 0.0537 & 0.0540 & 0.0544 & 0.0537 & 0.0537 & 0.0537 \\
31 31 \bottomrule
32 32 \end{tabular}
33 −\begin{tablenotes}[flushleft]\footnotesize
33 +\begin{tablenotes}[flushleft]\scriptsize
34 34 \item \emph{Notes:} Columns: (1) adoption alone; (2)--(4) one facet with size, momentum and volatility; (5) three facets jointly; (6) SPID projects; (7) all signals; (8) composite alone. Within-firm identification removes the firm's average AI language, so the coefficients measure the return response to within-firm changes in language, which the Fama--MacBeth cross-sectional slopes of Table~\ref{tab:fmboth} do not. Economic magnitude: column (7) composite = -0.07 pp per SD against a sample mean forward return of +18.5\%. Controls winsorized within year; the size control uses the corrected capitalization. Source: results/r3k\_v2/results.json (panel\_fe), linearmodels PanelOLS.
35 35 \end{tablenotes}
36 36 \end{threeparttable}}
modified paper/tables/tab_placebo.tex +1 −1
@@ -16,7 +16,7 @@ Automation/labor & +4.3 & [-0.4, +8.9] & +4.6 & +2.9 & -0.54 & [-0.59] & [-0.36]
16 16 Macro risk & -4.4 & [-11.0, +2.2] & -1.9 & -14.5 & -3.49 & [-3.65] & [-0.94] & 0.602 & 0.82 / 1.00 \\
17 17 \bottomrule
18 18 \end{tabular}
19 −\begin{tablenotes}[flushleft]\footnotesize
19 +\begin{tablenotes}[flushleft]\scriptsize
20 20 \item \emph{Notes:} Family size 8. Two placebo anchors (cybersecurity, automation/labor) mention AI terms, so the placebo separates AI language from generic technology vocabulary only partially (Table~\ref{tab:constructvalidity} reports the stripped-anchor variants). The cybersecurity interaction is the only one that survives the Romano--Wolf adjustment; a priced cyber-risk measure of the same construction is documented in the literature (Celeny and Mar\'echal). Post-period spreads average three cohorts. Source: results/r3k\_v2/results2.json (placebo, mht.placebo\_interactions\_yearcl).
21 21 \end{tablenotes}
22 22 \end{threeparttable}}
modified paper/tables/tab_prepost_both.tex +4 −4
@@ -1,10 +1,10 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (samples.*.sub, pooled, samples.sp500.pooled_post_w) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_prepost_both} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 3 \ExhibitTable{tab:prepostboth}{\textbf{AI-language spreads before and after the ChatGPT launch, Russell~3000 and S\&P~500.} Panel A: equal-weighted Q5$-$Q1 spreads averaged over the pre-launch cohorts (12, formation years 2010--2021) and the post-launch cohorts (3, 2022--2024), with 95\% $t$-intervals over cohorts and the three post-launch cohort spreads. Panel B: firm-level regressions of the forward return of top- and bottom-quintile firm-years on a top-quintile indicator (and its interaction with a post-launch dummy) with cohort fixed effects: $t$-statistics clustered by firm and two-way by firm and cohort, wild-cluster bootstrap $p$ by cohort, and the minimum detectable effect (MDE) at 80\% power.}{\scriptsize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{4pt}
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{lllrrrrr}
6 6 \toprule
7 −Signal & Universe & Returns & Pre Q5$-$Q1 & 95\% CI & Post Q5$-$Q1 & 95\% CI & Post cohorts 2022 / 2023 / 2024 \\
7 +Signal & Universe & Returns & Pre Q5$-$Q1 & 95\% CI & Post Q5$-$Q1 & 95\% CI & \makecell[b]{Post cohorts 2022 \\ {/ 2023 / 2024}} \\
8 8 \midrule
9 9 \multicolumn{8}{@{}l}{\textit{Panel A: cohort-level spreads (equal-weighted Q5$-$Q1, pp per year)}} \\
10 10 AI adoption & Russell 3000 & wins. & +4.1 & [-1.0, +9.2] & +2.8 & [-18.2, +23.8] & -5.5 / +2.6 / +11.4 \\
@@ -26,7 +26,7 @@ AI composite & Russell 3000 & wins. & +3.4 & [-1.6, +8.4] & +6.0 & [-25.5, +37.6
26 26 PC1 of three facets & Russell 3000 & wins. & +3.8 & [-2.4, +10.1] & +8.6 & [-35.0, +52.2] & -5.0 / +2.5 / +28.4 \\
27 27 & S\&P 500 & wins. & +4.2 & [-1.7, +10.0] & +11.5 & [-31.7, +54.7] & +12.9 / -6.6 / +28.1 \\
28 28 \addlinespace
29 −SPID tech projects (legacy quintiles) & Russell 3000 & wins. & +1.8 & [-4.0, +7.5] & -0.5 & [-22.4, +21.3] & -2.4 / +9.0 / -8.2 \\
29 +SPID projects (legacy quintiles) & Russell 3000 & wins. & +1.8 & [-4.0, +7.5] & -0.5 & [-22.4, +21.3] & -2.4 / +9.0 / -8.2 \\
30 30 & S\&P 500 & wins. & +2.5 & [-1.1, +6.0] & -7.3 & [-64.2, +49.6] & +7.5 / +4.3 / -33.7 \\
31 31 \addlinespace
32 32 \midrule
@@ -42,7 +42,7 @@ Post $-$ pre (hi $\times$ post) & Russell 3000 & wins. & +2.4 & [0.78] & [0.36]
42 42 Post 2022--23 only, Q5 vs Q1 & Russell 3000 & wins. & -0.9 & [-0.36] & [-0.23] & 0.777 & $N$ = 1{,}834 \\
43 43 \bottomrule
44 44 \end{tabular}
45 −\begin{tablenotes}[flushleft]\footnotesize
45 +\begin{tablenotes}[flushleft]\scriptsize
46 46 \item \emph{Notes:} Inference: NW $t$ = Newey--West (Bartlett kernel, 3 lags) $t$-statistic of the mean of the annual cohort series; plain $t$ = i.i.d. $t$ over cohorts; 95\% CI = $t$-interval over cohorts (the post period has 3 cohorts, so its CIs are wide by construction). Returns are the look-ahead-free twelve-month forward returns (July $Y{+}1$--June $Y{+}2$); `wins.' = 1/99 winsorized within the formation year; `median' = median spread within cohort; `raw' = unwinsorized. Rebuilt panel: $N$ = 27{,}354 firm-years, 2{,}375 firms, keyed on CIK $\times$ year, cleaned returns, corrected market capitalization. No significance stars are used. A Newey--West $t$ on three post-launch cohorts has no useful sampling distribution and is not printed; the post-period evidence rests on the cohort CIs and on the pooled firm-level tests of Panel B. Wild $p$ = restricted wild-cluster bootstrap by cohort (Webb six-point weights, 9,999 draws; only 15 clusters, 3 in the post period, so the bootstrap distribution is coarse). MDE = 2.8 $\times$ firm-clustered SE. Economic magnitude: the winsorized post $-$ pre difference of +2.4 pp is smaller than its MDE of 8.5 pp, so a post-launch increase of the size reported for the S\&P~500 in v1.1 could not be detected in this design.
47 47 \end{tablenotes}
48 48 \end{threeparttable}}
modified paper/tables/tab_reversal.tex +14 −14
@@ -1,29 +1,29 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (cluster_k) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_reversal} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:reversal}{\textbf{Reversal tests and the cybersecurity-vocabulary check, Russell~3000.} Panel A: if AI language without projects were `AI washing', high-language firms without disclosed projects should earn less than those with projects, or the premium should reverse in the second year. Mean differences in forward returns (pp) with Newey--West and plain $t$ in brackets and 95\% $t$-intervals over cohorts; the month 13--24 return is $(1 + r_{24}) / (1 + r_{12}) - 1$. Panel B: the composite sorted within terciles of the cybersecurity placebo score and a Fama--MacBeth regression with the cybersecurity score as a control.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:reversal}{\textbf{Reversal tests and the cybersecurity-vocabulary check, Russell~3000.} Panel A: if AI language without projects were `AI washing', high-language firms without disclosed projects should earn less than those with projects, or the premium should reverse in the second year. Mean differences in forward returns (pp) with Newey--West and plain $t$ in brackets and 95\% $t$-intervals over cohorts; the month 13--24 return is $(1 + r_{24}) / (1 + r_{12}) - 1$. Panel B: the composite sorted within terciles of the cybersecurity placebo score and a Fama--MacBeth regression with the cybersecurity score as a control.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lrrrr}
6 6 \toprule
7 −Test & Estimate (pp) & [NW $t$] [plain $t$] & 95\% CI & $n$ cohorts \\
7 +Test & Estimate (pp) & \makecell[b]{[NW $t$] \\ {[plain $t$]}} & 95\% CI & $n$ cohorts \\
8 8 \midrule
9 9 \multicolumn{5}{@{}l}{\textit{Panel A: reversal tests (AI-washing alternative)}} \\
10 −High-language firms with vs without disclosed tech projects, months 1--12 (wins.) & -1.4 & [-0.91] [-0.82] & [-5.1, +2.3] & 14 \\
11 −same, months 13--24 (wins.) & +1.4 & [0.62] [0.55] & [-4.0, +6.7] & 14 \\
12 −same, months 1--24 (raw) & +4.8 & [0.89] [0.91] & [-6.5, +16.1] & 14 \\
13 −Composite Q5$-$Q1, months 13--24 (wins., cohorts $\leq$ 2023) & +5.4 & [3.13] [2.74] & [+1.1, +9.7] & 14 \\
14 −same, raw & +8.2 & [3.09] [3.09] & [+2.5, +13.9] & 14 \\
15 −same, pre-launch cohorts (wins.) & +4.8 & [2.47] [2.19] & [-0.0, +9.7] & 12 \\
16 −same, post-launch cohorts 2022--23 (wins.) & +9.1 & -- [1.86] & [-53.1, +71.4] & 2 \\
10 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{High-language firms with vs without disclosed tech projects, months 1--12 (wins.)} & -1.4 & [-0.91] [-0.82] & [-5.1, +2.3] & 14 \\
11 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{same, months 13--24 (wins.)} & +1.4 & [0.62] [0.55] & [-4.0, +6.7] & 14 \\
12 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{same, months 1--24 (raw)} & +4.8 & [0.89] [0.91] & [-6.5, +16.1] & 14 \\
13 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{Composite Q5$-$Q1, months 13--24 (wins., cohorts $\leq$ 2023)} & +5.4 & [3.13] [2.74] & [+1.1, +9.7] & 14 \\
14 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{same, raw} & +8.2 & [3.09] [3.09] & [+2.5, +13.9] & 14 \\
15 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{same, pre-launch cohorts (wins.)} & +4.8 & [2.47] [2.19] & [-0.0, +9.7] & 12 \\
16 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{same, post-launch cohorts 2022--23 (wins.)} & +9.1 & -- [1.86] & [-53.1, +71.4] & 2 \\
17 17 Composite Q5$-$Q1, months 1--24 (wins.) & +10.0 & [2.50] [2.48] & [+1.3, +18.8] & 14 \\
18 18 \midrule
19 19 \multicolumn{5}{@{}l}{\textit{Panel B: cybersecurity vocabulary}} \\
20 −Correlation of the cybersecurity and composite $z$-scores & 0.40 & & & \\
21 −Cyber-neutral composite Q5$-$Q1 (quintiles within cybersecurity tercile), full (wins.) & +2.9 & [1.98] [1.65] & [-0.9, +6.8] & 15 \\
20 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{Correlation of the cybersecurity and composite $z$-scores} & 0.40 & & & \\
21 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{Cyber-neutral composite Q5$-$Q1 (quintiles within cybersecurity tercile), full (wins.)} & +2.9 & [1.98] [1.65] & [-0.9, +6.8] & 15 \\
22 22 Cybersecurity Q5$-$Q1, full (wins.) [pre / post: +0.2 / +8.9] & +1.9 & [1.02] & [-1.5, +5.3] & 15 \\
23 −Fama--MacBeth, composite with cybersecurity control (wins.): composite / cyber (pp/SD) & +1.72 / +0.32 & [2.22] [0.52] & & 15 \\
23 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{Fama--MacBeth, composite with cybersecurity control (wins.): composite / cyber (pp/SD)} & +1.72 / +0.32 & [2.22] [0.52] & & 15 \\
24 24 \bottomrule
25 25 \end{tabular}
26 −\begin{tablenotes}[flushleft]\footnotesize
26 +\begin{tablenotes}[flushleft]\scriptsize
27 27 \item \emph{Notes:} High-language = top quintile of the composite within cohort; `with projects' = SPID technology-project mentions $>$ 0 (1{,}288 of 5{,}001 high-language firm-years). No reversal is detected, but the tests are low-powered (CIs span $\pm$5 pp or more). Source: results/r3k\_v2/results2.json (cluster\_k).
28 28 \end{tablenotes}
29 29 \end{threeparttable}}
modified paper/tables/tab_robust.tex +6 −6
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (subperiod_spread, sector_neutral, residual_sort, mag7, alt_*, entrants, breaks, cluster_k), results_surv.json (conditional_spreads), results.json -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_robust} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:robust}{\textbf{Construction, horizon, benchmark, universe and survivorship checks on the composite spread, Russell~3000.} Equal-weighted Q5$-$Q1 composite spreads (pp per year) before (2010--21) and after (2022--24) the launch under alternative constructions of the signal, outcome, horizon, universe and break date. Headline columns use the within-year winsorized return with the Newey--West $t$ (brackets) and the 95\% $t$-interval over cohorts; the last two columns repeat the pre and post means on raw returns.}{\footnotesize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{4pt}
3 +\ExhibitTable{tab:robust}{\textbf{Construction, horizon, benchmark, universe and survivorship checks on the composite spread, Russell~3000.} Equal-weighted Q5$-$Q1 composite spreads (pp per year) before (2010--21) and after (2022--24) the launch under alternative constructions of the signal, outcome, horizon, universe and break date. Headline columns use the within-year winsorized return with the Newey--West $t$ (brackets) and the 95\% $t$-interval over cohorts; the last two columns repeat the pre and post means on raw returns.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{lrrrrrrr}
6 6 \toprule
7 7 Specification & Pre, wins. & [NW $t$] & 95\% CI & Post, wins. & 95\% CI & Pre, raw & Post, raw \\
@@ -10,7 +10,7 @@ Baseline (EW quintiles, composite) & +3.4 & [1.65] & [-1.6, +8.4] & +6.0 & [-25.
10 10 Baseline, strict 12 valid months & -- & -- & -- & -- & -- & +4.8 & +8.5 \\
11 11 Baseline, median spread & -- & -- & -- & -- & -- & +1.4 & -2.7 \\
12 12 Sector-neutral composite & +1.8 & [2.04] & [-0.7, +4.4] & -0.5 & [-8.8, +7.9] & +2.1 & +1.9 \\
13 −Residual sort (sector $\times$ cohort FE + controls) & +2.4 & [2.34] & [+0.1, +4.8] & -1.3 & [-3.4, +0.7] & -- & -- \\
13 +Residual sort (sector $\times$ cohort FE, controls) & +2.4 & [2.34] & [+0.1, +4.8] & -1.3 & [-3.4, +0.7] & -- & -- \\
14 14 Excluding the Magnificent 7 & +3.1 & [1.49] & [-1.8, +8.0] & +6.0 & [-25.8, +37.8] & +4.6 & +8.4 \\
15 15 Excluding the 500 largest firms & +3.8 & [1.37] & [-2.2, +9.7] & +4.5 & [-28.4, +37.4] & +5.9 & +7.2 \\
16 16 Signal: unweighted chunk mean & +3.1 & [1.51] & [-1.9, +8.2] & +5.6 & [-26.0, +37.1] & +4.5 & +7.9 \\
@@ -22,16 +22,16 @@ PCA first component & +3.8 & [1.61] & [-2.4, +10.1] & +8.6 & [-35.0, +52.2] & +6
22 22 AI disruption-risk facet & +5.0 & [2.01] & [-2.8, +12.9] & +16.2 & [-43.4, +75.9] & +9.6 & +23.2 \\
23 23 Equal-form composite & +4.3 & [1.40] & [-2.8, +11.4] & +12.2 & [-27.8, +52.2] & +6.3 & +16.5 \\
24 24 10-K composite & +4.9 & [1.36] & [-3.1, +12.9] & +11.6 & [-23.0, +46.2] & +6.8 & +16.7 \\
25 −Cyber-neutral composite (quintiles within cybersecurity tercile) & +3.4 & [1.82] & [-1.2, +7.9] & +1.4 & [-16.3, +19.0] & -- & -- \\
25 +Cyber-neutral composite (within cyber tercile) & +3.4 & [1.82] & [-1.2, +7.9] & +1.4 & [-16.3, +19.0] & -- & -- \\
26 26 Seasoned firms (listed before July 2009) & +3.2 & [1.63] & [-2.1, +8.6] & +8.3 & [-33.5, +50.0] & +4.2 & +12.5 \\
27 27 Listed $\geq$ 36 months at formation & +4.4 & [2.24] & [-0.9, +9.7] & +6.0 & [-21.4, +33.5] & +6.1 & +9.3 \\
28 28 Split at 2021 (pre 2010--20 / post 2021--24) & +2.6 & [1.13] & [-2.6, +7.8] & +7.5 & [-9.7, +24.7] & +4.1 & +9.5 \\
29 29 Size-group $\times$ cohort demeaned returns & +4.3 & [1.71] & [-1.0, +9.5] & +8.5 & [-30.3, +47.3] & -- & -- \\
30 30 Below-median forward volatility & +3.1 & [2.16] & [-1.9, +8.2] & -0.2 & [-13.5, +13.0] & -- & -- \\
31 −Below the cohort's 99th return percentile (raw) & -- & -- & -- & -- & -- & +2.7 & +4.0 \\
31 +Below the cohort's 99th percentile (raw) & -- & -- & -- & -- & -- & +2.7 & +4.0 \\
32 32 \bottomrule
33 33 \end{tabular}
34 −\begin{tablenotes}[flushleft]\footnotesize
34 +\begin{tablenotes}[flushleft]\scriptsize
35 35 \item \emph{Notes:} Inference: NW $t$ = Newey--West (Bartlett kernel, 3 lags) $t$-statistic of the mean of the annual cohort series; plain $t$ = i.i.d. $t$ over cohorts; 95\% CI = $t$-interval over cohorts (the post period has 3 cohorts, so its CIs are wide by construction). Returns are the look-ahead-free twelve-month forward returns (July $Y{+}1$--June $Y{+}2$); `wins.' = 1/99 winsorized within the formation year; `median' = median spread within cohort; `raw' = unwinsorized. Rebuilt panel: $N$ = 27{,}354 firm-years, 2{,}375 firms, keyed on CIK $\times$ year, cleaned returns, corrected market capitalization. No significance stars are used. Pooled firm-clustered post $-$ pre tests (wins.): split at 2022 +2.4 pp [$t$ 0.78 firm / 0.36 two-way], split at 2021 +4.8 pp [1.91 / 0.88]. Romano--Wolf adjusted $p$ over the 12 robustness rows (wins.): smallest pre 0.38, smallest post 0.50 (Table~\ref{tab:mht}). The seasoned and listed-36-months rows condition on entry only; survival to October 2026 is addressed in Table~\ref{tab:attrition}. Source: results/r3k\_v2/results2.json, results\_surv.json (conditional\_spreads).
36 36 \end{tablenotes}
37 37 \end{threeparttable}}
modified paper/tables/tab_sector_tech.tex +14 −14
@@ -1,31 +1,31 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (sector_controls, sector_neutral, residual_sort, monthly_ls) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_sector_tech} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:sectortech}{\textbf{Within-sector estimates of the AI-language premium and technology-factor spanning, Russell~3000.} Panel A: three estimators of the premium net of sector: Fama--MacBeth slopes of the forward return on the composite with and without GICS-sector dummies (pp per SD; brackets: [NW $t$; plain $t$] over the annual slopes), pooled OLS with cohort or sector $\times$ cohort fixed effects (brackets: [firm-clustered $t$; two-way $t$; wild-cluster $p$ by cohort]), and the sector-neutral quintile sort (quintiles formed within sector and cohort) and residual sort (pp; brackets: NW $t$). Panel B: the monthly equal-weighted composite long--short and its alpha with and without TECH, the equal-weighted return of the panel's Information Technology constituents minus the equal-weighted return of all constituents (HAC $t$, 3 lags).}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:sectortech}{\textbf{Within-sector estimates of the AI-language premium and technology-factor spanning, Russell~3000.} Panel A: three estimators of the premium net of sector: Fama--MacBeth slopes of the forward return on the composite with and without GICS-sector dummies (pp per SD; brackets: [NW $t$; plain $t$] over the annual slopes), pooled OLS with cohort or sector $\times$ cohort fixed effects (brackets: [firm-clustered $t$; two-way $t$; wild-cluster $p$ by cohort]), and the sector-neutral quintile sort (quintiles formed within sector and cohort) and residual sort (pp; brackets: NW $t$). Panel B: the monthly equal-weighted composite long--short and its alpha with and without TECH, the equal-weighted return of the panel's Information Technology constituents minus the equal-weighted return of all constituents (HAC $t$, 3 lags).}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{llrrr}
6 6 \toprule
7 −Estimator & Returns / sample & Pre (2010--21) & Post (2022--24) & Full \\
7 +Estimator & \makecell[b]{Returns \\ {/ sample}} & Pre (2010--21) & Post (2022--24) & Full \\
8 8 \midrule
9 9 \multicolumn{5}{@{}l}{\textit{Panel A: three within-sector estimators of the composite premium (pp per SD or pp)}} \\
10 −FM slope, no sector dummies & wins., all sectors & +1.62 [1.84; 2.03] & +2.89 [1.86; 1.31] & +1.88 [2.41; 2.51] \\
11 −FM slope, GICS-sector dummies & wins., all sectors & +1.03 [2.86; 2.65] & +0.31 [1.81; 0.86] & +0.88 [2.80; 2.74] \\
12 −FM slope, no sector dummies & raw, all sectors & +2.21 [1.79; 2.16] & +4.98 [2.54; 1.63] & +2.77 [2.44; 2.75] \\
13 −FM slope, GICS-sector dummies & raw, all sectors & +1.56 [2.83; 3.00] & +1.46 [1.94; 0.80] & +1.54 [3.48; 2.99] \\
10 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{FM slope, no sector dummies} & wins., all sectors & +1.62 [1.84; 2.03] & +2.89 [1.86; 1.31] & +1.88 [2.41; 2.51] \\
11 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{FM slope, GICS-sector dummies} & wins., all sectors & +1.03 [2.86; 2.65] & +0.31 [1.81; 0.86] & +0.88 [2.80; 2.74] \\
12 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{FM slope, no sector dummies} & raw, all sectors & +2.21 [1.79; 2.16] & +4.98 [2.54; 1.63] & +2.77 [2.44; 2.75] \\
13 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{FM slope, GICS-sector dummies} & raw, all sectors & +1.56 [2.83; 3.00] & +1.46 [1.94; 0.80] & +1.54 [3.48; 2.99] \\
14 14 Pooled OLS, cohort FE & wins., all sectors & +1.52 [4.74; 1.95; 0.080] & +3.39 [3.34; 1.41; 0.382] & +1.92 [5.49; 2.46; 0.028] \\
15 15 Pooled OLS, sector $\times$ cohort FE & wins., all sectors & +0.88 [2.46; 2.14; 0.067] & +0.46 [0.43; --; 0.180] & +0.75 [2.04; 2.78; 0.024] \\
16 16 \addlinespace
17 −FM slope, no sector dummies & wins., ex-Energy & +1.66 [1.87; 2.07] & +3.08 [1.98; 1.39] & +1.95 [2.44; 2.58] \\
18 −FM slope, GICS-sector dummies & wins., ex-Energy & +0.97 [2.48; 2.36] & +0.39 [1.85; 1.04] & +0.86 [2.57; 2.53] \\
19 −FM slope, no sector dummies & raw, ex-Energy & +2.33 [1.82; 2.24] & +5.29 [2.67; 1.70] & +2.92 [2.48; 2.84] \\
20 −FM slope, GICS-sector dummies & raw, ex-Energy & +1.53 [2.63; 2.91] & +1.64 [2.10; 0.87] & +1.56 [3.32; 2.96] \\
17 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{FM slope, no sector dummies} & wins., ex-Energy & +1.66 [1.87; 2.07] & +3.08 [1.98; 1.39] & +1.95 [2.44; 2.58] \\
18 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{FM slope, GICS-sector dummies} & wins., ex-Energy & +0.97 [2.48; 2.36] & +0.39 [1.85; 1.04] & +0.86 [2.57; 2.53] \\
19 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{FM slope, no sector dummies} & raw, ex-Energy & +2.33 [1.82; 2.24] & +5.29 [2.67; 1.70] & +2.92 [2.48; 2.84] \\
20 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{FM slope, GICS-sector dummies} & raw, ex-Energy & +1.53 [2.63; 2.91] & +1.64 [2.10; 0.87] & +1.56 [3.32; 2.96] \\
21 21 Pooled OLS, cohort FE & wins., ex-Energy & +1.57 [4.86; 1.89; --] & +3.58 [3.42; 1.48; --] & +1.99 [5.62; 2.47; --] \\
22 22 Pooled OLS, sector $\times$ cohort FE & wins., ex-Energy & +0.81 [2.24; 1.66; --] & +0.55 [0.50; --; --] & +0.73 [1.93; 2.24; --] \\
23 23 \addlinespace
24 −Sector-neutral quintile sort, Q5$-$Q1 (pp) & wins. & +1.8 [2.04] & -0.5 [-0.42] & +1.4 [1.61] \\
24 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Sector-neutral quintile sort, Q5$-$Q1 (pp)} & wins. & +1.8 [2.04] & -0.5 [-0.42] & +1.4 [1.61] \\
25 25 & raw & +2.1 [2.79] & +1.9 [0.89] & +2.1 [2.98] \\
26 26 & median & & & +1.0 [0.98] \\
27 27 & wins., ex-Energy & & & +1.3 [1.26] \\
28 −Residual sort (returns net of sector $\times$ cohort FE and controls) & wins. & +2.4 [2.34] & -1.3 [-6.81] & +1.7 [1.54] \\
28 +\multicolumn{1}{>{\raggedright\arraybackslash}p{0.27\textwidth}}{Residual sort (returns net of sector $\times$ cohort FE and controls)} & wins. & +2.4 [2.34] & -1.3 [-6.81] & +1.7 [1.54] \\
29 29 \midrule
30 30 \multicolumn{5}{@{}l}{\textit{Panel B: monthly composite long--short and the TECH factor}} \\
31 31 Mean (\%/yr) & monthly & +3.76 & +2.10 & +3.43 \\
@@ -37,7 +37,7 @@ $\beta_{\text{TECH}}$ [$t$] & monthly & +0.525 [11.43] & +0.366 [5.02] & +0.448
37 37 Months & & 144 & 36 & 180 \\
38 38 \bottomrule
39 39 \end{tabular}
40 −\begin{tablenotes}[flushleft]\footnotesize
40 +\begin{tablenotes}[flushleft]\scriptsize
41 41 \item \emph{Notes:} NW $t$ on 15 (pre: 12; post: 3) annual slopes with 3 Bartlett lags; the fixed-$b$ 5\% critical value is 2.71, and the post-period NW $t$ on three slopes is reported for completeness only. $N$ (pooled, full sample, all sectors) = 26{,}933; ex-Energy drops the GICS Energy sector. The three estimators do not agree: the FM slope with sector dummies and the sector $\times$ cohort FE regression keep a positive within-sector slope while the sector-neutral sort does not, so the within-sector premium is estimator-dependent. Economic magnitude: the full-sample sector $\times$ cohort FE slope of +0.75 pp per SD is 39\% of the slope without sector effects (+1.92). Source: results/r3k\_v2/results2.json (sector\_controls, sector\_neutral, residual\_sort, monthly\_ls).
42 42 \end{tablenotes}
43 43 \end{threeparttable}}
modified paper/tables/tab_sorts.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (sorts, vw_diag) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_sorts} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 3 \ExhibitTable{tab:sorts}{\textbf{Quintile sorts on every signal and weighting, Russell~3000 universe.} Companion to Table~\ref{tab:sortsboth}: mean forward twelve-month return (percent per year) by within-cohort quintile for all eight signals, equal-weighted (winsorized, raw, median) and value-weighted on the corrected capitalization (unrestricted and with single-firm weights capped at 10\%), averaged over the 15 cohorts 2010--2024 ($N$ = 27{,}354 firm-years).}{\scriptsize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{3.5pt}
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{llrrrrrrrrr}
6 6 \toprule
7 7 Signal & Portfolio & Q1 (low) & Q2 & Q3 & Q4 & Q5 (high) & Q5$-$Q1 & NW $t$ & plain $t$ & 95\% CI \\
@@ -48,7 +48,7 @@ Equal-form composite & EW, wins. & +14.8 & +17.4 & +18.2 & +18.5 & +20.7 & +5.9
48 48 & VW, wins. & +11.7 & +12.2 & +12.8 & +13.2 & +18.6 & +6.9 & 1.99 & 1.91 & [-0.8, +14.7] \\
49 49 & VW, 10\% cap, wins. & +11.8 & +12.2 & +12.8 & +13.2 & +19.0 & +7.2 & 2.14 & 2.00 & [-0.5, +14.9] \\
50 50 \addlinespace
51 −SPID tech projects (legacy quintiles) & EW, wins. & +16.9 & +17.7 & +18.7 & +18.7 & +18.2 & +1.3 & 1.02 & 0.58 & [-3.5, +6.1] \\
51 +SPID projects (legacy quintiles) & EW, wins. & +16.9 & +17.7 & +18.7 & +18.7 & +18.2 & +1.3 & 1.02 & 0.58 & [-3.5, +6.1] \\
52 52 & EW, raw & +17.3 & +19.3 & +21.7 & +20.9 & +21.5 & +4.1 & 1.80 & 1.08 & [-4.1, +12.3] \\
53 53 & EW, median & +12.6 & +11.9 & +11.1 & +10.3 & +9.6 & -3.0 & -1.68 & -1.81 & [-6.5, +0.6] \\
54 54 & VW, wins. & +15.3 & +15.9 & +15.9 & +14.4 & +13.8 & -1.6 & -0.63 & -0.44 & [-9.1, +6.0] \\
@@ -56,7 +56,7 @@ SPID tech projects (legacy quintiles) & EW, wins. & +16.9 & +17.7 & +18.7 & +18.
56 56 \addlinespace
57 57 \bottomrule
58 58 \end{tabular}
59 −\begin{tablenotes}[flushleft]\footnotesize
59 +\begin{tablenotes}[flushleft]\scriptsize
60 60 \item \emph{Notes:} Inference: NW $t$ = Newey--West (Bartlett kernel, 3 lags) $t$-statistic of the mean of the annual cohort series; plain $t$ = i.i.d. $t$ over cohorts; 95\% CI = $t$-interval over cohorts (the post period has 3 cohorts, so its CIs are wide by construction). Returns are the look-ahead-free twelve-month forward returns (July $Y{+}1$--June $Y{+}2$); `wins.' = 1/99 winsorized within the formation year; `median' = median spread within cohort; `raw' = unwinsorized. Rebuilt panel: $N$ = 27{,}354 firm-years, 2{,}375 firms, keyed on CIK $\times$ year, cleaned returns, corrected market capitalization. No significance stars are used. The SPID legacy quintiles sort a variable whose median and 75th percentile are both zero, so quintiles 1--4 are tie-broken by row order (Table~\ref{tab:spidbinary} reports the binary contrasts and their minimum detectable effects instead). VW weights use the corrected capitalization (unadjusted close $\times$ point-in-time shares); maximum single-firm weight 36\%.
61 61 \end{tablenotes}
62 62 \end{threeparttable}}
modified paper/tables/tab_sorts_both.tex +2 −2
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results.json (samples.*.sorts, vw_diag), results2.json (mht) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_sorts_both} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 3 \ExhibitTable{tab:sortsboth}{\textbf{Quintile sorts on AI language in the Russell~3000 universe and among S\&P~500 members.} Mean forward twelve-month return (percent per year) of the within-cohort quintiles of each signal, averaged over the 15 formation cohorts 2010--2024, with the Q5$-$Q1 spread (percentage points), its Newey--West and i.i.d.\ $t$-statistics and the 95\% confidence interval over cohorts. EW = equal-weighted; VW = value-weighted on the corrected capitalization. The headline row of each signal is the within-year winsorized return; for the composite the raw and median versions show the sensitivity of the sort to the return tail.}{\scriptsize}{%
4 −\begin{threeparttable}\setlength{\tabcolsep}{3.5pt}
4 +\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 5 \begin{tabular}{llrrrrrrrrr}
6 6 \toprule
7 7 Signal & Portfolio & Q1 (low) & Q2 & Q3 & Q4 & Q5 (high) & Q5$-$Q1 & NW $t$ & plain $t$ & 95\% CI \\
@@ -35,7 +35,7 @@ PC1 of three facets & EW, wins. & +16.1 & +16.3 & +17.5 & +19.1 & +21.7 & +5.7 &
35 35 & VW, wins. & +12.9 & +13.3 & +12.2 & +16.1 & +20.1 & +7.2 & 2.36 & 1.83 & [-1.2, +15.5] \\
36 36 \bottomrule
37 37 \end{tabular}
38 −\begin{tablenotes}[flushleft]\footnotesize
38 +\begin{tablenotes}[flushleft]\scriptsize
39 39 \item \emph{Notes:} Inference: NW $t$ = Newey--West (Bartlett kernel, 3 lags) $t$-statistic of the mean of the annual cohort series; plain $t$ = i.i.d. $t$ over cohorts; 95\% CI = $t$-interval over cohorts (the post period has 3 cohorts, so its CIs are wide by construction). Returns are the look-ahead-free twelve-month forward returns (July $Y{+}1$--June $Y{+}2$); `wins.' = 1/99 winsorized within the formation year; `median' = median spread within cohort; `raw' = unwinsorized. Rebuilt panel: $N$ = 27{,}354 firm-years, 2{,}375 firms, keyed on CIK $\times$ year, cleaned returns, corrected market capitalization. No significance stars are used. Signals are standardized within year and within panel. Economic magnitude: the composite EW wins.\ spread of +3.9 pp per year compares with a Q1 mean of +16.4\% per year; the top 1\% of returns contribute +2.5 pp of the raw spread. VW diagnostic: maximum single-firm weight in any cohort $\times$ quintile cell 36\% (committed v2.0 capitalization: 100.0\%); cells above 25\%: 18 (v2.0: 548); the 10\%-capped VW composite spread is +7.2 pp (NW $t$ 2.62). Romano--Wolf adjusted $p$ of the composite EW wins.\ spread within the ten-member family of this table: 0.32 (Table~\ref{tab:mht}). All signals and weightings: Table~\ref{tab:sorts}.
40 40 \end{tablenotes}
41 41 \end{threeparttable}}
modified paper/tables/tab_spid_binary.tex +10 −10
@@ -1,31 +1,31 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/results2.json (spid.binary_contrasts, spid.tercile_nonzero_w), results.json (spid) -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_spid_binary} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:spidbinary}{\textbf{Binary contrasts on the SPID project signal with minimum detectable effects, Russell~3000.} Difference in the forward return (within-year winsorized, pp per year) between firm-years with and without a disclosed project, at the cohort level (mean of the cohort differences, plain $t$ and 95\% $t$-interval over cohorts; cohorts enter only with at least 15 treated firms) and at the firm level (pooled regression with cohort fixed effects, size and momentum; firm-clustered $t$ and CI). MDE = minimum detectable effect at 80\% power. Any-AI projects are present in 2.0\% of firm-years (4.2\% after the launch).}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:spidbinary}{\textbf{Binary contrasts on the SPID project signal with minimum detectable effects, Russell~3000.} Difference in the forward return (within-year winsorized, pp per year) between firm-years with and without a disclosed project, at the cohort level (mean of the cohort differences, plain $t$ and 95\% $t$-interval over cohorts; cohorts enter only with at least 15 treated firms) and at the firm level (pooled regression with cohort fixed effects, size and momentum; firm-clustered $t$ and CI). MDE = minimum detectable effect at 80\% power. Any-AI projects are present in 2.0\% of firm-years (4.2\% after the launch).}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{2.5pt}
5 5 \begin{tabular}{llrrrrr}
6 6 \toprule
7 −Contrast & Period & Estimate (pp) & [$t$] & 95\% CI & MDE (pp) & $n$ \\
7 +Contrast & Period & Estimate (pp) & [$t$] & 95\% CI & MDE (pp) & \makecell[b]{Cohorts or \\ {treated / $N$}} \\
8 8 \midrule
9 9 \multicolumn{7}{@{}l}{\textit{Any AI-initiative project vs none}} \\
10 10 Cohort level: mean of cohort differences & full & +1.5 & [0.33] & [-9.2, +12.2] & 12.7 & 8 cohorts \\
11 11 & pre & -0.9 & [-0.19] & [-14.4, +12.5] & 13.6 & 5 cohorts \\
12 12 & post & +5.5 & [0.55] & [-37.6, +48.7] & 28.1 & 3 cohorts \\
13 −Firm level: cohort FE, size, momentum & full & +2.8 & [0.77] & [-4.3, +9.9] & 10.1 & 529 treated / 26{,}933 \\
14 − & pre & -1.2 & [-0.33] & [-8.6, +6.1] & 10.5 & 241 treated / 20{,}080 \\
15 − & post & +6.6 & [1.19] & [-4.3, +17.6] & 15.7 & 288 treated / 6{,}853 \\
13 +Firm level: cohort FE, size, momentum & full & +2.8 & [0.77] & [-4.3, +9.9] & 10.1 & 529 / 26{,}933 \\
14 + & pre & -1.2 & [-0.33] & [-8.6, +6.1] & 10.5 & 241 / 20{,}080 \\
15 + & post & +6.6 & [1.19] & [-4.3, +17.6] & 15.7 & 288 / 6{,}853 \\
16 16 \addlinespace
17 17 \multicolumn{7}{@{}l}{\textit{Any technology project vs none}} \\
18 18 Cohort level: mean of cohort differences & full & -0.5 & [-0.40] & [-3.1, +2.1] & 3.5 & 15 cohorts \\
19 19 & pre & +0.0 & [0.04] & [-2.4, +2.4] & 3.0 & 12 cohorts \\
20 20 & post & -2.6 & [-0.54] & [-23.8, +18.5] & 13.8 & 3 cohorts \\
21 −Firm level: cohort FE, size, momentum & full & +0.1 & [0.12] & [-1.5, +1.6] & 2.2 & 6{,}379 treated / 26{,}933 \\
22 − & pre & +0.8 & [1.11] & [-0.6, +2.2] & 2.0 & 4{,}518 treated / 20{,}080 \\
23 − & post & -1.9 & [-0.93] & [-6.0, +2.1] & 5.8 & 1{,}861 treated / 6{,}853 \\
21 +Firm level: cohort FE, size, momentum & full & +0.1 & [0.12] & [-1.5, +1.6] & 2.2 & 6{,}379 / 26{,}933 \\
22 + & pre & +0.8 & [1.11] & [-0.6, +2.2] & 2.0 & 4{,}518 / 20{,}080 \\
23 + & post & -1.9 & [-0.93] & [-6.0, +2.1] & 5.8 & 1{,}861 / 6{,}853 \\
24 24 \addlinespace
25 25 T3 $-$ T1 of project counts among firms with $>$ 0 technology projects & full & +1.5 & [0.70] & [-3.0, +6.0] & -- & 15 cohorts \\
26 26 \bottomrule
27 27 \end{tabular}
28 −\begin{tablenotes}[flushleft]\footnotesize
28 +\begin{tablenotes}[flushleft]\scriptsize
29 29 \item \emph{Notes:} Reading: every estimate is small relative to its MDE, so the design cannot distinguish a zero project premium from a premium of the size of the language premium (Table~\ref{tab:sortsboth}); `no detectable premium' is the supportable statement. The legacy quintile sort on a variable whose median and P75 are zero (MDE 10.7 pp at the cohort level) is kept only in Table~\ref{tab:sorts}. Extractor provenance: gpt-4o-mini (FIRC-0001 pipeline snapshot), run 2026-10-27/28; a 200-mention human precision frame with source text was built (results/r3k\_v2/validation/spid\_sample.csv) but no human or LLM labels exist, so precision and the attenuation-corrected slope are not available. Source: results/r3k\_v2/results2.json (spid.binary\_contrasts).
30 30 \end{tablenotes}
31 31 \end{threeparttable}}
modified paper/tables/tab_summary.tex +3 −3
@@ -1,7 +1,7 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from results/r3k_v2/t1_summary_stats.csv, panel_meta_v2.json, mktcap_diag.json, hygiene_summary.json -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: main. \input{tables/tab_summary} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 −\ExhibitTable{tab:summ}{\textbf{Summary statistics of the estimation sample.} Firm-years with a valid twelve-month forward return, formation cohorts 2010--2024 ($N$ = 27{,}354 firm-years, 2{,}375 firms; iShares Russell~3000 holdings of October 2026 plus the S\&P~500). Semantic scores are section-weighted mean cosine similarities of the firm-year's filing chunks to the anchor concept; returns are simple buy-and-hold fractions.}{\footnotesize}{%
4 −\begin{threeparttable}
3 +\ExhibitTable{tab:summ}{\textbf{Summary statistics of the estimation sample.} Firm-years with a valid twelve-month forward return, formation cohorts 2010--2024 ($N$ = 27{,}354 firm-years, 2{,}375 firms; iShares Russell~3000 holdings of October 2026 plus the S\&P~500). Semantic scores are section-weighted mean cosine similarities of the firm-year's filing chunks to the anchor concept; returns are simple buy-and-hold fractions.}{\scriptsize}{%
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lrrrrrrrr}
6 6 \toprule
7 7 Variable & $N$ & Mean & SD & Min & P1 & Median & P99 & Max \\
@@ -20,7 +20,7 @@ log market capitalization (corrected, USD) & 27{,}046 & 21.72 & 1.82 & 15.46 & 1
20 20 Text chunks per firm-year (count) & 27{,}354 & 330 & 154 & 1 & 68 & 306 & 866 & 2183 \\
21 21 \bottomrule
22 22 \end{tabular}
23 −\begin{tablenotes}[flushleft]\footnotesize
23 +\begin{tablenotes}[flushleft]\scriptsize
24 24 \item \emph{Notes:} Market capitalization = unadjusted FinData OS close $\times$ point-in-time SEC cover-page shares (log range [15.5, 29.0]); 308 firm-years (1.1\%) have no capitalization and enter the equal-weighted sorts only (the committed v2.0 panel had 2{,}168). Return hygiene: 48 monthly returns above 300\% and 104 firm-year forward returns above 500\% were checked against FinData OS daily bars; 11 monthly and 3 firm-year observations were price splices and are set to missing (Table~\ref{tab:hygiene}), the others are confirmed. The winsorized return is the dependent variable of every regression and of the headline sorts; the raw return is reported beside it. Source: data/processed\_r3k\_v2/analysis\_panel\_v2.parquet, results/r3k\_v2/t1\_summary\_stats.csv.
25 25 \end{tablenotes}
26 26 \end{threeparttable}}
modified paper/tables/tab_topfirms.tex +2 −2
@@ -1,10 +1,10 @@
1 1 % Generated by scripts/r3k_20_tables_v2.py from data/processed_r3k_v2/analysis_panel_v2.parquet -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).
2 2 % Placement decided at Stage E: appendix. \input{tables/tab_topfirms} on its own prints the whole float; inside an existing float wrapper only the body is printed.
3 3 \ExhibitTable{tab:topfirms}{\textbf{Firms with the highest average AI composite.} Mean within-year standardized composite over the firm's formation cohorts, for firms with at least five cohorts; the twelve highest of the 2{,}375 firms.}{\footnotesize}{%
4 −\begin{threeparttable}
4 +\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 5 \begin{tabular}{lllrr}
6 6 \toprule
7 −Ticker & Company & GICS sector & Mean composite ($z$) & Cohorts \\
7 +Ticker & Company & GICS sector & \makecell[b]{Mean composite \\ {($z$)}} & Cohorts \\
8 8 \midrule
9 9 NET & Cloudflare Class A & Information Technology & 3.45 & 6 \\
10 10 HPE & Hewlett Packard Enterprise & Information Technology & 3.34 & 10 \\
modified results/n1/corpus_macros.tex +9 −9
@@ -8,12 +8,12 @@
8 8 \newcommand{\mChunkWordsMedian}{512}
9 9 \newcommand{\mChunkWordsMean}{480}
10 10 \newcommand{\mChunkShareFull}{84.2}
11 −\newcommand{\mnFilings10K}{31{,}775}
12 −\newcommand{\mnParsed10K}{31{,}772}
13 −\newcommand{\mnChunks10K}{4{,}380{,}094}
14 −\newcommand{\mnFilings10Q}{95{,}167}
15 −\newcommand{\mnParsed10Q}{95{,}155}
16 −\newcommand{\mnChunks10Q}{5{,}492{,}676}
17 −\newcommand{\mnFilings8K}{400{,}606}
18 −\newcommand{\mnParsed8K}{400{,}605}
19 −\newcommand{\mnChunks8K}{848{,}120}
11 +\newcommand{\mnFilingsTenK}{31{,}775}
12 +\newcommand{\mnParsedTenK}{31{,}772}
13 +\newcommand{\mnChunksTenK}{4{,}380{,}094}
14 +\newcommand{\mnFilingsTenQ}{95{,}167}
15 +\newcommand{\mnParsedTenQ}{95{,}155}
16 +\newcommand{\mnChunksTenQ}{5{,}492{,}676}
17 +\newcommand{\mnFilingsEightK}{400{,}606}
18 +\newcommand{\mnParsedEightK}{400{,}605}
19 +\newcommand{\mnChunksEightK}{848{,}120}
modified scripts/r3k_20_tables_v2.py +79 −66
@@ -41,8 +41,20 @@ TABLE_NOTE_SE = ("Inference: NW $t$ = Newey--West (Bartlett kernel, 3 lags) $t$-
41 41 "95\\% CI = $t$-interval over cohorts (the post period has 3 cohorts, so its CIs are wide by construction). Returns are the look-ahead-free twelve-month forward returns "
42 42 "(July $Y{+}1$--June $Y{+}2$); `wins.' = 1/99 winsorized within the formation year; `median' = median spread within cohort; `raw' = unwinsorized. "
43 43 f"Rebuilt panel: $N$ = {n(R['n_obs'])} firm-years, {n(R['n_firms'])} firms, keyed on CIK $\\times$ year, cleaned returns, corrected market capitalization. No significance stars are used.")
44 −def table(name, label, title, caption, colspec, header, body, notes, size="\\footnotesize", colsep=None, placement="main", sources="", notesize="\\footnotesize"):
45 − """Write paper/tables/<name>.tex as a self-contained float. header = list of header-row strings (without the final \\\\)."""
44 +def H(cell, maxlen=15):
45 + """Break a long header cell into two lines (\\makecell) at the space nearest the middle, never inside $...$."""
46 + c = cell.strip()
47 + if "\\multicolumn" in c or "\\cmidrule" in c or "\\makecell" in c or len(re.sub(r"\\[a-zA-Z]+|[{}$]", "", c)) <= maxlen: return c
48 + depth = 0; cands = []
49 + for i, ch in enumerate(c):
50 + if ch == "$": depth ^= 1
51 + elif ch == " " and depth == 0: cands.append(i)
52 + if not cands: return c
53 + k = min(cands, key=lambda i: abs(i - len(c) / 2)); return f"\\makecell[b]{{{c[:k]} \\\\ {{{c[k + 1:]}}}}}"
54 +def table(name, label, title, caption, colspec, header, body, notes, size="\\footnotesize", colsep="4pt", placement="main", sources="", notesize=None):
55 + """Write paper/tables/<name>.tex as a self-contained float. header = list of header-row strings (without the final \\\\); long header cells are wrapped on two lines."""
56 + header = [" & ".join(H(c) for c in h.split(" & ")) if "\\cmidrule" not in h else h for h in header]
57 + notesize = notesize or ("\\scriptsize" if size == "\\scriptsize" else "\\footnotesize")
46 58 hdr = "".join(h + " \\\\\n" for h in header); mid = "\\midrule\n" if header else ""
47 59 pre = (f"\\setlength{{\\tabcolsep}}{{{colsep}}}" if colsep else "")
48 60 out = (f"% Generated by {SCRIPT} from {sources or 'results/r3k_v2/'} -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).\n"
@@ -65,9 +77,9 @@ table("tab_summary", "tab:summ", "Summary statistics of the estimation sample.",
65 77 f"Market capitalization = unadjusted FinData OS close $\\times$ point-in-time SEC cover-page shares (log range [{MD['log_cap_min_max_v2'][0]:.1f}, {MD['log_cap_min_max_v2'][1]:.1f}]); {n(META['n_est_without_cap'])} firm-years ({MD['share_est_without_cap_v2'] * 100:.1f}\\%) have no capitalization and enter the equal-weighted sorts only (the committed v2.0 panel had {n(META['n_est_without_cap_v1'])}). "
66 78 f"Return hygiene: {HY['n_flagged_monthly']} monthly returns above 300\\% and {HY['n_flagged_firm_years']} firm-year forward returns above 500\\% were checked against FinData OS daily bars; {HY['verdicts_monthly'].get('series_break', 0)} monthly and {HY['verdicts_firm_year'].get('series_break', 0)} firm-year observations were price splices and are set to missing (Table~\\ref{{tab:hygiene}}), the others are confirmed. "
67 79 f"The winsorized return is the dependent variable of every regression and of the headline sorts; the raw return is reported beside it. Source: data/processed\\_r3k\\_v2/analysis\\_panel\\_v2.parquet, results/r3k\\_v2/t1\\_summary\\_stats.csv.",
68 − placement="main", sources="results/r3k_v2/t1_summary_stats.csv, panel_meta_v2.json, mktcap_diag.json, hygiene_summary.json")
80 + size="\\scriptsize", placement="main", sources="results/r3k_v2/t1_summary_stats.csv, panel_meta_v2.json, mktcap_diag.json, hygiene_summary.json")
69 81 # ================================================================ T5 quintile sorts, both universes (main) ====
70 −SIGL = [("AI_ADOPT", "AI adoption"), ("AI_INFRA", "AI infrastructure"), ("AI_RISK", "AI disruption risk"), ("AI_COMPOS", "AI composite"), ("AI_PC1", "PC1 of three facets"), ("AI_formw", "Equal-form composite"), ("AI_10k", "10-K composite"), ("SPID_TECH", "SPID tech projects (legacy quintiles)")]
82 +SIGL = [("AI_ADOPT", "AI adoption"), ("AI_INFRA", "AI infrastructure"), ("AI_RISK", "AI disruption risk"), ("AI_COMPOS", "AI composite"), ("AI_PC1", "PC1 of three facets"), ("AI_formw", "Equal-form composite"), ("AI_10k", "10-K composite"), ("SPID_TECH", "SPID projects (legacy quintiles)")]
71 83 WL = {"EW_w": "EW, wins.", "EW": "EW, raw", "EW_med": "EW, median", "VW_w": "VW, wins.", "VW": "VW, raw", "VWcap10_w": "VW, 10\\% cap, wins.", "VWcap10": "VW, 10\\% cap, raw"}
72 84 def sort_row(S, k, l, sfx, first):
73 85 key = f"{k}_{sfx}"
@@ -88,7 +100,7 @@ table("tab_sorts_both", "tab:sortsboth", "Quintile sorts on AI language in the R
88 100 TABLE_NOTE_SE + f" Signals are standardized within year and within panel. Economic magnitude: the composite EW wins.\\ spread of {pp(R['samples']['r3k']['sorts']['AI_COMPOS_EW_w']['Q5_minus_Q1'])} pp per year compares with a Q1 mean of {pp(R['samples']['r3k']['sorts']['AI_COMPOS_EW_w']['Q1'])}\\% per year; the top 1\\% of returns contribute {pp(R['sorts']['AI_COMPOS_EW']['top1pct_contribution'])} pp of the raw spread. "
89 101 f"VW diagnostic: maximum single-firm weight in any cohort $\\times$ quintile cell {VD['max_single_firm_weight_v2'] * 100:.0f}\\% (committed v2.0 capitalization: {VD['max_single_firm_weight_v1'] * 100:.1f}\\%); cells above 25\\%: {VD['n_cells_above_25pct_v2']} (v2.0: {VD['n_cells_above_25pct_v1']}); the 10\\%-capped VW composite spread is {pp(R['sorts']['AI_COMPOS_VWcap10_w']['Q5_minus_Q1'])} pp (NW $t$ {tv(R['sorts']['AI_COMPOS_VWcap10_w']['t_stat'])}). "
90 102 f"Romano--Wolf adjusted $p$ of the composite EW wins.\\ spread within the ten-member family of this table: {dict(zip(R2['mht']['sorts_full_w']['members'], R2['mht']['sorts_full_w']['p_romano_wolf']))['AI_COMPOS_EW']:.2f} (Table~\\ref{{tab:mht}}). All signals and weightings: Table~\\ref{{tab:sorts}}.",
91 − size="\\scriptsize", colsep="3.5pt", placement="main", sources="results/r3k_v2/results.json (samples.*.sorts, vw_diag), results2.json (mht)")
103 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results.json (samples.*.sorts, vw_diag), results2.json (mht)")
92 104 # ================================================================ appendix: full sorts (all signals / weightings, Russell 3000) ====
93 105 body = ""
94 106 for k, l in SIGL:
@@ -98,7 +110,7 @@ table("tab_sorts", "tab:sorts", "Quintile sorts on every signal and weighting, R
98 110 f"Companion to Table~\\ref{{tab:sortsboth}}: mean forward twelve-month return (percent per year) by within-cohort quintile for all eight signals, equal-weighted (winsorized, raw, median) and value-weighted on the corrected capitalization (unrestricted and with single-firm weights capped at 10\\%), averaged over the {R['sorts']['AI_COMPOS_EW']['n_years']} cohorts {YRS} ($N$ = {NOBS} firm-years).",
99 111 "llrrrrrrrrr", HDR5, body,
100 112 TABLE_NOTE_SE + f" The SPID legacy quintiles sort a variable whose median and 75th percentile are both zero, so quintiles 1--4 are tie-broken by row order (Table~\\ref{{tab:spidbinary}} reports the binary contrasts and their minimum detectable effects instead). VW weights use the corrected capitalization (unadjusted close $\\times$ point-in-time shares); maximum single-firm weight {VD['max_single_firm_weight_v2'] * 100:.0f}\\%.",
101 − size="\\scriptsize", colsep="3.5pt", placement="appendix", sources="results/r3k_v2/results.json (sorts, vw_diag)")
113 + size="\\scriptsize", colsep="3pt", placement="appendix", sources="results/r3k_v2/results.json (sorts, vw_diag)")
102 114 # ================================================================ T6 monthly long-short alphas, both universes (main) ====
103 115 body = ""
104 116 for k, l in SIGL[:5]:
@@ -112,7 +124,7 @@ table("tab_alpha_both", "tab:alphaboth", "Monthly long--short portfolios on AI l
112 124 "llrrrrrrrrr", ["Signal & Universe & Months & Mean (\\%/yr) & [HAC $t$] & Sharpe & FF6 $\\alpha$ (\\%/yr) & [$t$] & Post months & Post FF6 $\\alpha$ & [$t$]"], body,
113 125 f"Deflated Sharpe ratio of the Russell~3000 composite long--short (Bailey and L\\'opez de Prado 2014; trials = {DS['n_trials']} long--short series tried in this study, benchmark SR {DS['full']['sr0_ann']:.2f}): full sample {DS['full']['dsr_prob']:.2f}, pre {DS['pre']['dsr_prob']:.2f}, post {DS['post']['dsr_prob']:.2f} (probability that the true Sharpe ratio exceeds the multiple-testing hurdle; values below 0.95 do not clear it). "
114 126 f"Economic magnitude: the composite earns {R['samples']['r3k']['ls']['AI_COMPOS']['full']['mean_ls_ann_pct']:+.2f}\\% per year over {R['samples']['r3k']['ls']['AI_COMPOS']['full']['n_months']} months in the Russell~3000, a Sharpe ratio of {R['samples']['r3k']['ls']['AI_COMPOS']['full']['sharpe']:.2f}. Splice months (Table~\\ref{{tab:hygiene}}) are set to missing. All signals and sub-periods: Table~\\ref{{tab:alpha}}.",
115 − placement="main", sources="results/r3k_v2/results.json (samples.*.ls), results2.json (mht.deflated_sharpe)")
127 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results.json (samples.*.ls), results2.json (mht.deflated_sharpe)")
116 128 # ================================================================ appendix: full alphas ====
117 129 body = ""
118 130 for k, l in [("AI_COMPOS", "AI composite"), ("AI_ADOPT", "AI adoption"), ("AI_INFRA", "AI infrastructure"), ("AI_RISK", "AI disruption risk"), ("AI_PC1", "PC1"), ("AI_formw", "Equal-form composite"), ("AI_10k", "10-K composite"), ("SPID_TECH", "SPID tech projects"), ("CYBER", "Cybersecurity (placebo)")]:
@@ -127,7 +139,7 @@ table("tab_alpha", "tab:alpha", "Monthly long--short portfolios by signal and su
127 139 "Companion to Table~\\ref{tab:alphaboth}: equal-weighted Q5$-$Q1 monthly portfolios (annually selected in June, held July--June) for every signal, over the full sample, the pre-launch months (to June 2023) and the post-launch months (from July 2023). Mean and alphas in percent per year.",
128 140 "llrrrrrrrr", ["Signal & Period & Months & Mean (\\%/yr) & [HAC $t$] & [plain $t$] & Sharpe & CAPM $\\alpha$ (\\%/yr) & FF6 $\\alpha$ (\\%/yr) & [$t$]"], body,
129 141 "HAC = Newey--West (3 lags); plain = i.i.d. The post period has 36 months, so its alphas are imprecise; the AI disruption-risk facet is the only signal whose post FF6 alpha has $|t| > 2$ (Table~\\ref{tab:robust}). Factor data: Ken French daily FF5 + momentum, compounded to months. Splice months set to missing.",
130 − placement="appendix", sources="results/r3k_v2/results.json (ls_alpha)")
142 + size="\\scriptsize", colsep="3pt", placement="appendix", sources="results/r3k_v2/results.json (ls_alpha)")
131 143 # ================================================================ T8 two-way FE panel (main) ====
132 144 PF = R["panel_fe"]; vl = {"z_AI_ADOPT": "AI adoption ($z$)", "z_AI_INFRA": "AI infrastructure ($z$)", "z_AI_RISK": "AI disruption risk ($z$)", "z_AI_COMPOS": "AI composite ($z$)", "z_SPID_TECH": "SPID tech projects ($z$)", "z_size": "Size ($z$, log cap)", "z_mom": "Momentum ($z$)", "z_vol": "Volatility ($z$)"}
133 145 specs = list(PF); body = ""
@@ -140,7 +152,7 @@ table("tab_panel", "tab:panel", "Two-way fixed-effects panel regressions of the
140 152 "Dependent variable: forward twelve-month return winsorized at 1/99 within the formation year (percentage points). Regressors are standardized within year, so a coefficient is the change in the forward return (pp) for a one-standard-deviation change in the signal relative to same-year peers. Firm and year fixed effects in every column; $t$-statistics in brackets from standard errors clustered two-way by firm and year.",
141 153 "l" + "r" * len(specs), [" & " + " & ".join(f"({i + 1})" for i in range(len(specs)))], body,
142 154 f"Columns: (1) adoption alone; (2)--(4) one facet with size, momentum and volatility; (5) three facets jointly; (6) SPID projects; (7) all signals; (8) composite alone. Within-firm identification removes the firm's average AI language, so the coefficients measure the return response to within-firm changes in language, which the Fama--MacBeth cross-sectional slopes of Table~\\ref{{tab:fmboth}} do not. Economic magnitude: column (7) composite = {PF['M7_all_spid']['coefs']['z_AI_COMPOS']['coef'] * 100:+.2f} pp per SD against a sample mean forward return of {pp(s.loc['fwd_w', 'mean'])}\\%. Controls winsorized within year; the size control uses the corrected capitalization. Source: results/r3k\\_v2/results.json (panel\\_fe), linearmodels PanelOLS.",
143 − placement="main", sources="results/r3k_v2/results.json (panel_fe)")
155 + size="\\scriptsize", placement="main", sources="results/r3k_v2/results.json (panel_fe)")
144 156 # ================================================================ T7 Fama-MacBeth, both universes (main) ====
145 157 FM = R["fama_macbeth"]; FB = FM["compos"]["z_AI_COMPOS"]["fixed_b_cv05"]
146 158 body = ""
@@ -154,7 +166,7 @@ table("tab_fm_both", "tab:fmboth", "Fama--MacBeth regressions of the forward ret
154 166 f"Time-series average of {FM['compos']['n_years']} annual cross-sectional slopes of the forward twelve-month return on the standardized signal with size, momentum and volatility controls, in percentage points per standard deviation. The headline row of each regressor uses the within-year winsorized return; the raw row shows the tail sensitivity. $t$-statistics in brackets: NW = Newey--West (3 lags) on the series of annual slopes, plain = i.i.d.; the 95\\% CI is the $t$-interval over the annual slopes.",
155 167 "llrrrrrrr", ["Regressor & Returns & \\multicolumn{4}{c}{Russell 3000} & \\multicolumn{3}{c}{S\\&P 500 members}", "\\cmidrule(lr){3-6}\\cmidrule(lr){7-9} & & Slope (pp/SD) & [NW $t$] & [plain $t$] & 95\\% CI & Slope (pp/SD) & [NW $t$] & 95\\% CI"], body,
156 168 f"Joint = the three facets enter one regression. The Kiefer--Vogelsang fixed-$b$ 5\\% critical value for a Newey--West $t$ with 3 Bartlett lags and $T$ = {FM['compos']['n_years']} is {FB:.2f} (simulated), so NW $t$-statistics between 1.96 and {FB:.2f} are not significant at 5\\% under fixed-$b$ asymptotics; the plain $t$ is the conservative reference. Economic magnitude: the Russell~3000 composite slope of {R['samples']['r3k']['fm']['compos_w']['zz_AI_COMPOS']['mean_coef'] * 100:+.2f} pp per SD implies a {R['samples']['r3k']['fm']['compos_w']['zz_AI_COMPOS']['mean_coef'] * 100 * 2:+.1f} pp difference between firms one SD above and one SD below their same-year peers. Signals re-standardized within each panel (`zz'); all controls standardized within year, size from the within-year winsorized corrected log capitalization. Year-by-year slopes: Figure~\\ref{{fig:fmyear}}; all specifications: Table~\\ref{{tab:fm}}.",
157 − placement="main", sources="results/r3k_v2/results.json (samples.*.fm, fama_macbeth)")
169 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results.json (samples.*.fm, fama_macbeth)")
158 170 # ================================================================ appendix: full FM ====
159 171 def fm_cell(blk, v): c = blk[v]; return f"{c['mean_coef'] * 100:+.2f} & {br(c['t'])} & {br(c['t_plain'])} & {ci(c['ci95'], 2)}"
160 172 body = ""
@@ -167,7 +179,7 @@ table("tab_fm", "tab:fm", "Fama--MacBeth regressions, all specifications, Russel
167 179 f"Companion to Table~\\ref{{tab:fmboth}}: time-series mean of the {FM['compos']['n_years']} annual cross-sectional slopes (pp per SD, or pp per unit for the 0/1 indicator) of the forward return on each signal with size, momentum and volatility controls, for the within-year winsorized and the raw return.",
168 180 "llrrrr", ["Regressor & Returns & Slope (pp/SD) & [NW $t$] & [plain $t$] & 95\\% CI"], body,
169 181 f"NW $t$ uses 3 Bartlett lags; fixed-$b$ 5\\% critical value {FB:.2f} (simulated); plain = i.i.d.\\ $t$ over the annual slopes; CI = 95\\% $t$-interval over the annual slopes. The SPID $z$-score is $\\log(1 + \\text{{mentions}})$ standardized within year; `Any AI project' is the 0/1 indicator (Table~\\ref{{tab:spidbinary}} for its minimum detectable effect).",
170 − placement="appendix", sources="results/r3k_v2/results.json (fama_macbeth)")
182 + size="\\scriptsize", placement="appendix", sources="results/r3k_v2/results.json (fama_macbeth)")
171 183 # ================================================================ T9 before / after ChatGPT, both universes (main) ====
172 184 SP = R["subperiod_spread"]; PO = R["pooled"]
173 185 body = panel(8, "Panel A: cohort-level spreads (equal-weighted Q5$-$Q1, pp per year)")
@@ -188,7 +200,7 @@ table("tab_prepost_both", "tab:prepostboth", "AI-language spreads before and aft
188 200 "lllrrrrr", ["Signal & Universe & Returns & Pre Q5$-$Q1 & 95\\% CI & Post Q5$-$Q1 & 95\\% CI & Post cohorts 2022 / 2023 / 2024"], body,
189 201 TABLE_NOTE_SE + " A Newey--West $t$ on three post-launch cohorts has no useful sampling distribution and is not printed; the post-period evidence rests on the cohort CIs and on the pooled firm-level tests of Panel B. Wild $p$ = restricted wild-cluster bootstrap by cohort (Webb six-point weights, 9,999 draws; only 15 clusters, 3 in the post period, so the bootstrap distribution is coarse). MDE = 2.8 $\\times$ firm-clustered SE. "
190 202 f"Economic magnitude: the winsorized post $-$ pre difference of {PO['diff_w']['coef_pct']:+.1f} pp is smaller than its MDE of {PO['diff_w']['mde_pct_firm']:.1f} pp, so a post-launch increase of the size reported for the S\\&P~500 in v1.1 could not be detected in this design.",
191 − size="\\scriptsize", colsep="4pt", placement="main", sources="results/r3k_v2/results.json (samples.*.sub, pooled, samples.sp500.pooled_post_w)")
203 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results.json (samples.*.sub, pooled, samples.sp500.pooled_post_w)")
192 204 # ================================================================ T10 cohorts (main) ====
193 205 C, Cw, Cm = R2["cohorts"], R2["cohorts_w"], R2["cohorts_med"]; PB = R2["placebo_breaks"]; TM = RS["then_members_present"]
194 206 body = panel(5, "Panel A: equal-weighted Q5$-$Q1 spread of the composite by formation cohort (pp)") + "Cohort & raw & wins. & median & Then-IWV-members only (wins.) \\\\\n\\midrule\n"
@@ -198,27 +210,27 @@ body += f"\\midrule\nPre mean (2010--21), 95\\% CI & {C['pre_mean_pct']:+.1f} {c
198 210 body += "Post mean leaving out 2022 / 2023 / 2024 & " + " / ".join(f"{v:+.1f}" for v in C["post_loo_pct"].values()) + " & " + " / ".join(f"{v:+.1f}" for v in Cw["post_loo_pct"].values()) + " & " + " / ".join(f"{v:+.1f}" for v in Cm["post_loo_pct"].values()) + " & \\\\\n"
199 211 body += "\\midrule\n" + panel(5, "Panel B: is the 2022--24 block unusual? (composite)") + "Test & \\multicolumn{2}{l}{raw} & \\multicolumn{2}{l}{wins.} \\\\\n\\midrule\n"
200 212 PBw = PB["winsorized"]
201 −body += f"{pcell(1, 0.4, f"Permutation $p$ (one-sided), 2022--24 vs all {PB['permutation']['n_subsets']} three-cohort subsets (rank)")} & \\multicolumn{{2}}{{l}}{{{PB['permutation']['p_one_sided']:.2f} (rank {PB['permutation']['rank_among_subsets']})}} & \\multicolumn{{2}}{{l}}{{{PBw['permutation']['p_one_sided']:.2f} (rank {PBw['permutation']['rank_among_subsets']})}} \\\\\n"
202 −body += f"{pcell(1, 0.4, 'Contiguous three-cohort blocks with a higher mean than 2022--24')} & \\multicolumn{{2}}{{l}}{{{PB['permutation']['rank_among_contiguous'] - 1} of 12}} & \\multicolumn{{2}}{{l}}{{{PBw['permutation']['rank_among_contiguous'] - 1} of 12}} \\\\\n"
203 −body += f"{pcell(1, 0.4, f"Rank of 2022 among {PB['n_candidates']} candidate break years (post $-$ pre mean)")} & \\multicolumn{{2}}{{l}}{{{PB['rank_of_2022']} of {PB['n_candidates']}}} & \\multicolumn{{2}}{{l}}{{{PBw['rank_of_2022']} of {PBw['n_candidates']}}} \\\\\n"
204 −body += f"{pcell(1, 0.4, 'sup-Wald mean-shift statistic, Andrews (1993), 15\\% trim (simulated $p$)')} & \\multicolumn{{2}}{{l}}{{{PB['sup_wald']['sup_wald']:.2f} ({PB['sup_wald']['p_simulated']:.2f})}} & \\multicolumn{{2}}{{l}}{{{PBw['sup_wald']['sup_wald']:.2f} ({PBw['sup_wald']['p_simulated']:.2f})}} \\\\\n"
213 +body += f"{pcell(1, 0.3, f"Permutation $p$ (one-sided), 2022--24 vs all {PB['permutation']['n_subsets']} three-cohort subsets (rank)")} & \\multicolumn{{2}}{{l}}{{{PB['permutation']['p_one_sided']:.2f} (rank {PB['permutation']['rank_among_subsets']})}} & \\multicolumn{{2}}{{l}}{{{PBw['permutation']['p_one_sided']:.2f} (rank {PBw['permutation']['rank_among_subsets']})}} \\\\\n"
214 +body += f"{pcell(1, 0.3, 'Contiguous three-cohort blocks with a higher mean than 2022--24')} & \\multicolumn{{2}}{{l}}{{{PB['permutation']['rank_among_contiguous'] - 1} of 12}} & \\multicolumn{{2}}{{l}}{{{PBw['permutation']['rank_among_contiguous'] - 1} of 12}} \\\\\n"
215 +body += f"{pcell(1, 0.3, f"Rank of 2022 among {PB['n_candidates']} candidate break years (post $-$ pre mean)")} & \\multicolumn{{2}}{{l}}{{{PB['rank_of_2022']} of {PB['n_candidates']}}} & \\multicolumn{{2}}{{l}}{{{PBw['rank_of_2022']} of {PBw['n_candidates']}}} \\\\\n"
216 +body += f"{pcell(1, 0.3, 'sup-Wald mean-shift statistic, Andrews (1993), 15\\% trim (simulated $p$)')} & \\multicolumn{{2}}{{l}}{{{PB['sup_wald']['sup_wald']:.2f} ({PB['sup_wald']['p_simulated']:.2f})}} & \\multicolumn{{2}}{{l}}{{{PBw['sup_wald']['sup_wald']:.2f} ({PBw['sup_wald']['p_simulated']:.2f})}} \\\\\n"
205 217 table("tab_cohorts", "tab:cohorts", "Cohort-by-cohort spreads of the AI composite and tests of a 2022 break, Russell~3000.",
206 218 f"Panel A: equal-weighted Q5$-$Q1 forward-return spread of the composite for each formation cohort (raw, within-year winsorized, median difference), the same spread restricted to firms that were IWV constituents at formation (Wayback captures exist from 2019 only), and the pre- and post-launch means with 95\\% $t$-intervals and leave-one-out post means. Panel B: an exact permutation test of the 2022--24 block against every three-cohort subset, the contiguous-block comparison, the rank of 2022 among the {PB['n_candidates']} candidate break years, and the Andrews sup-Wald test for a mean shift in the cohort series (simulated finite-sample $p$).",
207 219 "lrrrl", [], body,
208 220 TABLE_NOTE_SE + f" Then-members-only spreads use the IWV holdings capture nearest the formation month (results/r3k\\_v2/results\\_surv.json). The permutation $p$ is the share of the {PB['permutation']['n_subsets']} three-cohort subsets whose mean spread is at least the 2022--24 mean; the sup-Wald $p$ is from {PB['sup_wald']['nsim']:,} simulated series of length {PB['sup_wald']['T']}. "
209 221 f"Economic reading: the post mean leaving out 2024 (wins.\\ {Cw['post_loo_pct']['2024']:+.1f} pp) is at the pre mean ({Cw['pre_mean_pct']:+.1f}); none of the break tests rejects at conventional levels.",
210 − placement="main", sources="results/r3k_v2/results2.json (cohorts*, placebo_breaks), results_surv.json (then_members_present)")
222 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results2.json (cohorts*, placebo_breaks), results_surv.json (then_members_present)")
211 223 # ================================================================ T11 size groups (main) ====
212 224 G = R["groups"]; sn = R["size_neutral"]; CT = R["contrasts"]
213 225 body = ""
214 −for g, l in [("large_top1000", "Largest 1,000 by capitalization"), ("small_rest", "Remaining firms"), ("large_pct42", "Largest 42\\% within cohort"), ("small_pct42", "Remaining 58\\%"), ("sp500", "S\\&P 500 members"), ("non_sp500", "Non-members")]:
226 +for g, l in [("large_top1000", "Largest 1,000 (corrected cap)"), ("small_rest", "Remaining firms"), ("large_pct42", "Largest 42\\% within cohort"), ("small_pct42", "Remaining 58\\%"), ("sp500", "S\\&P 500 members"), ("non_sp500", "Non-members")]:
215 227 r = G[g]
216 228 for sfx, rl in [("_w", "wins."), ("", "raw")]:
217 229 loo = " / ".join(f"{v * 100:+.1f}" for v in r["post_loo" + sfx].values()); ex24 = f"{r['pooled_post_excl_2024' + sfx]['coef_pct']:+.1f} {br(r['pooled_post_excl_2024' + sfx]['t_firm'])}" if r.get("pooled_post_excl_2024" + sfx) else "--"
218 230 body += f"{l if sfx == '_w' else ''} & {rl} & {n(r['n']) if sfx == '_w' else ''} & {pp(r['sort_EW' + sfx]['Q5_minus_Q1'])} & {br(r['sort_EW' + sfx]['t_stat'])} & {ci(r['sort_EW' + sfx]['ci95'])} & {pp(r['pre' + sfx]['mean'])} & {pp(r['post' + sfx]['mean'])} & {loo} & {ex24} \\\\\n"
219 231 body += "\\addlinespace\n"
220 232 for sfx, rl in [("_w", "wins."), ("", "raw")]:
221 − body += f"{'Size-neutral quintiles, all firms' if sfx == '_w' else ''} & {rl} & {NOBS if sfx == '_w' else ''} & {pp(sn['full' + sfx]['Q5_minus_Q1'])} & {br(sn['full' + sfx]['t_stat'])} & {ci(sn['full' + sfx]['ci95'])} & {pp(sn['pre' + sfx]['mean'])} & {pp(sn['post' + sfx]['mean'])} & -- & -- \\\\\n"
233 + body += f"{'Size-neutral quintiles (all)' if sfx == '_w' else ''} & {rl} & {NOBS if sfx == '_w' else ''} & {pp(sn['full' + sfx]['Q5_minus_Q1'])} & {br(sn['full' + sfx]['t_stat'])} & {ci(sn['full' + sfx]['ci95'])} & {pp(sn['pre' + sfx]['mean'])} & {pp(sn['post' + sfx]['mean'])} & -- & -- \\\\\n"
222 234 cl = CT["large_vs_small_w"]["hi_x_post_x_group"]; cm_ = CT["member_vs_non_w"]["hi_x_post_x_group"]
223 235 table("tab_groups", "tab:groups", "AI-composite spreads by size group and index membership, Russell~3000.",
224 236 f"Equal-weighted Q5$-$Q1 spreads of the composite with quintiles formed within each sub-sample and cohort: full-sample spread with its Newey--West $t$ and 95\\% CI over cohorts, pre- (2010--21) and post-launch (2022--24) means, the post mean leaving out each post cohort in turn, and the pooled firm-level post spread for 2022--23 only (firm-clustered $t$). Size groups are assigned each June on the corrected capitalization: the largest 1,000 firms (Russell~1000 proxy) versus the rest, and a fixed within-cohort percentile partition (largest 42\\%) that keeps the group shares constant as the panel grows. The size-neutral rows form quintiles within size group and cohort over all firms.",
@@ -226,7 +238,7 @@ table("tab_groups", "tab:groups", "AI-composite spreads by size group and index
226 238 TABLE_NOTE_SE + f" Firm-years without a capitalization ({n(META['n_est_without_cap'])}) belong to no size group; {MD['share_firm_years_changing_size_group'] * 100:.1f}\\% of firm-years change group relative to the committed v2.0 capitalization. "
227 239 f"The post-launch CIs over three cohorts are wide (largest 1,000, wins.: {ci(G['large_top1000']['post_w']['ci95'])}; remaining: {ci(G['small_rest']['post_w']['ci95'])}; Figure~\\ref{{fig:sizegroups}}). The large-versus-small post-launch difference is tested in Table~\\ref{{tab:contrasts}}: hi $\\times$ post $\\times$ largest-1,000 = {cl['coef_pct']:+.1f} pp (firm $t$ {cl['t_firm']:.2f}, two-way {tv(cl['t_twoway'])}, wild $p$ {cl['p_wild_webb']:.2f}, MDE {cl['mde_pct_firm']:.1f} pp); hi $\\times$ post $\\times$ member = {cm_['coef_pct']:+.1f} pp ($t$ {cm_['t_firm']:.2f} / {tv(cm_['t_twoway'])}). "
228 240 f"Post FF6 alphas of the sub-sample monthly long--shorts (\\%/yr, [$t$]): largest 1,000 {G['large_top1000']['ls']['post']['ff6_alpha_ann_pct']:+.2f} {br(G['large_top1000']['ls']['post']['ff6_alpha_t'])}, remaining {G['small_rest']['ls']['post']['ff6_alpha_ann_pct']:+.2f} {br(G['small_rest']['ls']['post']['ff6_alpha_t'])}, S\\&P members {G['sp500']['ls']['post']['ff6_alpha_ann_pct']:+.2f} {br(G['sp500']['ls']['post']['ff6_alpha_t'])}. Firms per group and cohort: Table~\\ref{{tab:coverage}}.",
229 − size="\\scriptsize", colsep="3.5pt", placement="main", sources="results/r3k_v2/results.json (groups, size_neutral, contrasts)")
241 + size="\\scriptsize", colsep="2pt", placement="main", sources="results/r3k_v2/results.json (groups, size_neutral, contrasts)")
230 242 # ================================================================ contrasts (main, new) ====
231 243 body = panel(8, "Panel A: pooled firm-level interactions (Q1/Q5 firm-years, cohort fixed effects)")
232 244 for key, l in [("large_vs_small_w", "hi $\\times$ post $\\times$ largest-1,000"), ("large_vs_small_raw", "hi $\\times$ post $\\times$ largest-1,000"), ("member_vs_non_w", "hi $\\times$ post $\\times$ S\\&P member"), ("member_vs_non_raw", "hi $\\times$ post $\\times$ S\\&P member")]:
@@ -236,12 +248,12 @@ for key, l in [("large_vs_small_w", "hi $\\times$ post $\\times$ largest-1,000")
236 248 body += f"\\quad $N$ = {n(c['n'])} & & & & & & & \\\\\n\\addlinespace\n"
237 249 body += "\\midrule\n" + panel(8, "Panel B: difference of cohort-level post $-$ pre changes, cohort bootstrap")
238 250 for key, l in [("large_minus_small_postpre_boot_w", "(post $-$ pre)$_{\\text{largest 1,000}}$ $-$ (post $-$ pre)$_{\\text{remaining}}$"), ("large_minus_small_postpre_boot_raw", "same, raw returns"), ("member_minus_non_postpre_boot_w", "(post $-$ pre)$_{\\text{S\\&P}}$ $-$ (post $-$ pre)$_{\\text{non-members}}$")]:
239 − c = CT[key]; body += f"{l} & {'raw' if key.endswith('_raw') else 'wins.'} & {c['diff_in_diff_pct']:+.2f} & & & {cip(c['ci95_boot_pct'])} & & \\\\\n"
251 + c = CT[key]; body += f"{pcell(1, 0.3, l)} & {'raw' if key.endswith('_raw') else 'wins.'} & {c['diff_in_diff_pct']:+.2f} & & & {cip(c['ci95_boot_pct'])} & & \\\\\n"
240 252 table("tab_contrasts", "tab:contrasts", "Formal tests of the large-versus-small and member-versus-non-member post-launch differences.",
241 253 "Panel A: pooled regressions of the forward return of Q1 and Q5 firm-years on a top-quintile indicator (hi), a post-launch dummy, the group indicator and all interactions, with cohort fixed effects. The triple interaction is the post-launch change of the spread in the group relative to the reference group. $t$-statistics in brackets from firm-clustered and two-way (firm $\\times$ cohort) standard errors; 95\\% CI from the firm-clustered SE; wild $p$ from the restricted wild-cluster bootstrap by cohort (Rademacher / Webb weights, 9,999 draws, 15 clusters); MDE = minimum detectable effect at 80\\% power (2.8 $\\times$ firm-clustered SE). Panel B: the difference of the post $-$ pre changes of the cohort-level spreads with a 95\\% cohort-bootstrap interval (12 pre and 3 post cohorts resampled, 9,999 draws).",
242 254 "llrrrrrr", ["Term & Returns & Coefficient (pp) & [$t$ firm] & [$t$ firm$\\times$cohort] & 95\\% CI & wild $p$ (Rad.\\ / Webb) & MDE (pp)"], body,
243 255 f"Economic reading: the point estimate of the large-cap post-launch increase relative to small caps is {cl['coef_pct']:+.1f} pp per year, but its MDE is {cl['mde_pct_firm']:.1f} pp and the wild-bootstrap $p$ is {cl['p_wild_webb']:.2f}, so the difference between the two size groups is not statistically established; the cohort-bootstrap interval in Panel B covers zero. The S\\&P-member contrast is weaker still. Returns winsorized within the formation year unless marked raw. Source: results/r3k\\_v2/results.json (contrasts).",
244 − size="\\footnotesize", colsep="4pt", placement="main", sources="results/r3k_v2/results.json (contrasts)")
256 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results.json (contrasts)")
245 257 # ================================================================ T12 double sort (appendix) ====
246 258 body = ""
247 259 for per, key in [("Pre-ChatGPT (2010--2021)", "double_sort_pre"), ("Post-ChatGPT (2022--2024)", "double_sort_post")]:
@@ -264,12 +276,12 @@ for samp, sl in [("all", "all sectors"), ("ex_energy", "ex-Energy")]:
264 276 cells = []
265 277 for per in ["pre", "post", "full"]:
266 278 x = Lc[f"fm_{samp}_{tag}_{st}_{per}"]; cells.append(f"{x['slope_pct']:+.2f} [{tv(x['t_nw'])}; {tv(x['t_plain'])}]")
267 − body += f"{stl} & {rl}, {sl} & " + " & ".join(cells) + " \\\\\n"
279 + body += f"{pcell(1, 0.27, stl)} & {rl}, {sl} & " + " & ".join(cells) + " \\\\\n"
268 280 for per_lbl, key in [("Pooled OLS, cohort FE", "year_fe"), ("Pooled OLS, sector $\\times$ cohort FE", "sector_year_fe")]:
269 281 cells = [f"{Lc[f'pooled_{samp}_{per}'][key]['coef_pct']:+.2f} [{tv(Lc[f'pooled_{samp}_{per}'][key]['t_firm'])}; {tv(Lc[f'pooled_{samp}_{per}'][key]['t_twoway'])}; {pv(Lc[f'pooled_{samp}_{per}'][key].get('p_wild_webb'))}]" for per in ["pre", "post", "full"]]; body += f"{per_lbl} & wins., {sl} & " + " & ".join(cells) + " \\\\\n"
270 282 body += "\\addlinespace\n"
271 −body += f"Sector-neutral quintile sort, Q5$-$Q1 (pp) & wins. & {pp(SN['pre_w']['mean'])} [{tv(SN['pre_w']['t'])}] & {pp(SN['post_w']['mean'])} [{tv(SN['post_w']['t'])}] & {pp(SN['full_w']['mean'])} [{tv(SN['full_w']['t'])}] \\\\\n & raw & {pp(SN['pre']['mean'])} [{tv(SN['pre']['t'])}] & {pp(SN['post']['mean'])} [{tv(SN['post']['t'])}] & {pp(SN['full']['mean'])} [{tv(SN['full']['t'])}] \\\\\n & median & & & {pp(SN['full_med']['mean'])} [{tv(SN['full_med']['t'])}] \\\\\n & wins., ex-Energy & & & {pp(SN['full_ex_energy_w']['mean'])} [{tv(SN['full_ex_energy_w']['t'])}] \\\\\n"
272 −body += f"Residual sort (returns net of sector $\\times$ cohort FE and controls) & wins. & {pp(RSd['pre_w']['mean'])} [{tv(RSd['pre_w']['t'])}] & {pp(RSd['post_w']['mean'])} [{tv(RSd['post_w']['t'])}] & {pp(RSd['full_w']['mean'])} [{tv(RSd['full_w']['t'])}] \\\\\n\\midrule\n" + panel(5, "Panel B: monthly composite long--short and the TECH factor")
283 +LRS = "Residual sort (returns net of sector $\\times$ cohort FE and controls)"; body += f"{pcell(1, 0.27, 'Sector-neutral quintile sort, Q5$-$Q1 (pp)')} & wins. & {pp(SN['pre_w']['mean'])} [{tv(SN['pre_w']['t'])}] & {pp(SN['post_w']['mean'])} [{tv(SN['post_w']['t'])}] & {pp(SN['full_w']['mean'])} [{tv(SN['full_w']['t'])}] \\\\\n & raw & {pp(SN['pre']['mean'])} [{tv(SN['pre']['t'])}] & {pp(SN['post']['mean'])} [{tv(SN['post']['t'])}] & {pp(SN['full']['mean'])} [{tv(SN['full']['t'])}] \\\\\n & median & & & {pp(SN['full_med']['mean'])} [{tv(SN['full_med']['t'])}] \\\\\n & wins., ex-Energy & & & {pp(SN['full_ex_energy_w']['mean'])} [{tv(SN['full_ex_energy_w']['t'])}] \\\\\n"
284 +body += f"{pcell(1, 0.27, LRS)} & wins. & {pp(RSd['pre_w']['mean'])} [{tv(RSd['pre_w']['t'])}] & {pp(RSd['post_w']['mean'])} [{tv(RSd['post_w']['t'])}] & {pp(RSd['full_w']['mean'])} [{tv(RSd['full_w']['t'])}] \\\\\n\\midrule\n" + panel(5, "Panel B: monthly composite long--short and the TECH factor")
273 285 for lab_, key, d in [("Mean (\\%/yr)", "mean_ann_pct", 2), ("HAC $t$", "hac_t", 2), ("Sharpe ratio", "sharpe", 2), ("FF6 $\\alpha$ (\\%/yr) [$t$]", "ff6_alpha_pct", 2), ("FF6 + TECH $\\alpha$ (\\%/yr) [$t$]", "ff6_tech_alpha_pct", 2), ("$\\beta_{\\text{TECH}}$ [$t$]", "tech_beta", 3)]:
274 286 cells = []
275 287 for p_ in ["pre", "post", "full"]:
@@ -281,7 +293,7 @@ table("tab_sector_tech", "tab:sectortech", "Within-sector estimates of the AI-la
281 293 f"Panel A: three estimators of the premium net of sector: Fama--MacBeth slopes of the forward return on the composite with and without GICS-sector dummies (pp per SD; brackets: [NW $t$; plain $t$] over the annual slopes), pooled OLS with cohort or sector $\\times$ cohort fixed effects (brackets: [firm-clustered $t$; two-way $t$; wild-cluster $p$ by cohort]), and the sector-neutral quintile sort (quintiles formed within sector and cohort) and residual sort (pp; brackets: NW $t$). Panel B: the monthly equal-weighted composite long--short and its alpha with and without TECH, the equal-weighted return of the panel's Information Technology constituents minus the equal-weighted return of all constituents (HAC $t$, 3 lags).",
282 294 "llrrr", ["Estimator & Returns / sample & Pre (2010--21) & Post (2022--24) & Full"], body,
283 295 f"NW $t$ on {FM['compos']['n_years']} (pre: 12; post: 3) annual slopes with 3 Bartlett lags; the fixed-$b$ 5\\% critical value is {FB:.2f}, and the post-period NW $t$ on three slopes is reported for completeness only. $N$ (pooled, full sample, all sectors) = {n(Lc['pooled_all_full']['n'])}; ex-Energy drops the GICS Energy sector. The three estimators do not agree: the FM slope with sector dummies and the sector $\\times$ cohort FE regression keep a positive within-sector slope while the sector-neutral sort does not, so the within-sector premium is estimator-dependent. Economic magnitude: the full-sample sector $\\times$ cohort FE slope of {Lc['pooled_all_full']['sector_year_fe']['coef_pct']:+.2f} pp per SD is {Lc['pooled_all_full']['sector_year_fe']['coef_pct'] / Lc['pooled_all_full']['year_fe']['coef_pct'] * 100:.0f}\\% of the slope without sector effects ({Lc['pooled_all_full']['year_fe']['coef_pct']:+.2f}). Source: results/r3k\\_v2/results2.json (sector\\_controls, sector\\_neutral, residual\\_sort, monthly\\_ls).",
284 − size="\\footnotesize", placement="main", sources="results/r3k_v2/results2.json (sector_controls, sector_neutral, residual_sort, monthly_ls)")
296 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results2.json (sector_controls, sector_neutral, residual_sort, monthly_ls)")
285 297 # ================================================================ T14 placebo factors (appendix) ====
286 298 PL = R2["placebo"]; MH = R2["mht"]["placebo_interactions_yearcl"]; rw = dict(zip(MH["members"], MH["p_romano_wolf"])); hb = dict(zip(MH["members"], MH["p_holm_on_wild"]))
287 299 body = ""
@@ -295,13 +307,13 @@ table("tab_placebo", "tab:placebo", "Placebo across eight semantic factors score
295 307 rows = []; M7 = R2["mag7"]; AS = R2["alt_signal"]; AH = R2["alt_horizon"]; AB = R2["alt_benchmark"]; EN = R2["entrants"]; BR = R2["breaks"]; CS = RS["conditional_spreads"]; CK = R2["cluster_k"]
296 308 def add(l, pre_w, post_w, pre=None, post=None): rows.append((l, pp(pre_w["mean"]) if pre_w else "--", br(pre_w["t"]) if pre_w else "--", ci(pre_w["ci95"]) if pre_w else "--", pp(post_w["mean"]) if post_w else "--", ci(post_w["ci95"]) if post_w else "--", pp(pre["mean"]) if pre else "--", pp(post["mean"]) if post else "--"))
297 309 add("Baseline (EW quintiles, composite)", SP["AI_COMPOS"]["pre_w"], SP["AI_COMPOS"]["post_w"], SP["AI_COMPOS"]["pre"], SP["AI_COMPOS"]["post"]); add("Baseline, strict 12 valid months", None, None, SP["AI_COMPOS"]["pre_strict"], SP["AI_COMPOS"]["post_strict"]); add("Baseline, median spread", None, None, SP["AI_COMPOS"]["pre_med"], SP["AI_COMPOS"]["post_med"])
298 −add("Sector-neutral composite", SN["pre_w"], SN["post_w"], SN["pre"], SN["post"]); add("Residual sort (sector $\\times$ cohort FE + controls)", RSd["pre_w"], RSd["post_w"]); add("Excluding the Magnificent 7", M7["ex_mag7_pre_w"], M7["ex_mag7_post_w"], M7["ex_mag7_pre"], M7["ex_mag7_post"]); add("Excluding the 500 largest firms", M7["ex_top500_pre_w"], M7["ex_top500_post_w"], M7["ex_top500_pre"], M7["ex_top500_post"])
310 +add("Sector-neutral composite", SN["pre_w"], SN["post_w"], SN["pre"], SN["post"]); add("Residual sort (sector $\\times$ cohort FE, controls)", RSd["pre_w"], RSd["post_w"]); add("Excluding the Magnificent 7", M7["ex_mag7_pre_w"], M7["ex_mag7_post_w"], M7["ex_mag7_pre"], M7["ex_mag7_post"]); add("Excluding the 500 largest firms", M7["ex_top500_pre_w"], M7["ex_top500_post_w"], M7["ex_top500_pre"], M7["ex_top500_post"])
299 311 for s_, l in [("mean", "Signal: unweighted chunk mean"), ("top5pct", "Signal: top-5\\% chunks")]: add(l, AS[s_]["pre_w"], AS[s_]["post_w"], AS[s_]["pre"], AS[s_]["post"])
300 312 add("Outcome: IWV-adjusted return", AB["iwv_adj"]["pre_w"], AB["iwv_adj"]["post_w"], AB["iwv_adj"]["pre"], AB["iwv_adj"]["post"]); add("Horizon 6 months", AH["6m"]["pre_w"], AH["6m"]["post_w"], AH["6m"]["pre"], AH["6m"]["post"]); add("Horizon 24 months (post = 2022--23)", AH["24m"]["pre_w"], AH["24m"]["post_w"], AH["24m"]["pre"], AH["24m"]["post"])
301 313 add("PCA first component", SP["AI_PC1"]["pre_w"], SP["AI_PC1"]["post_w"], SP["AI_PC1"]["pre"], SP["AI_PC1"]["post"]); add("AI disruption-risk facet", SP["AI_RISK"]["pre_w"], SP["AI_RISK"]["post_w"], SP["AI_RISK"]["pre"], SP["AI_RISK"]["post"]); add("Equal-form composite", SP["AI_formw"]["pre_w"], SP["AI_formw"]["post_w"], SP["AI_formw"]["pre"], SP["AI_formw"]["post"]); add("10-K composite", SP["AI_10k"]["pre_w"], SP["AI_10k"]["post_w"], SP["AI_10k"]["pre"], SP["AI_10k"]["post"])
302 −add("Cyber-neutral composite (quintiles within cybersecurity tercile)", CK["cyber"]["cyberneutral_sort"]["pre_w"], CK["cyber"]["cyberneutral_sort"]["post_w"]); add("Seasoned firms (listed before July 2009)", EN["seasoned"]["pre_w"], EN["seasoned"]["post_w"], EN["seasoned"]["pre"], EN["seasoned"]["post"]); add("Listed $\\geq$ 36 months at formation", EN["listed36"]["pre_w"], EN["listed36"]["post_w"], EN["listed36"]["pre"], EN["listed36"]["post"])
314 +add("Cyber-neutral composite (within cyber tercile)", CK["cyber"]["cyberneutral_sort"]["pre_w"], CK["cyber"]["cyberneutral_sort"]["post_w"]); add("Seasoned firms (listed before July 2009)", EN["seasoned"]["pre_w"], EN["seasoned"]["post_w"], EN["seasoned"]["pre"], EN["seasoned"]["post"]); add("Listed $\\geq$ 36 months at formation", EN["listed36"]["pre_w"], EN["listed36"]["post_w"], EN["listed36"]["pre"], EN["listed36"]["post"])
303 315 add("Split at 2021 (pre 2010--20 / post 2021--24)", BR["split_2021"]["pre_w"], BR["split_2021"]["post_w"], BR["split_2021"]["pre"], BR["split_2021"]["post"])
304 −add("Size-group $\\times$ cohort demeaned returns", CS["size_demeaned_w"]["pre"], CS["size_demeaned_w"]["post"]); add("Below-median forward volatility", CS["low_fwd_vol_w"]["pre"], CS["low_fwd_vol_w"]["post"]); add("Below the cohort's 99th return percentile (raw)", None, None, CS["below_p99_raw"]["pre"], CS["below_p99_raw"]["post"])
316 +add("Size-group $\\times$ cohort demeaned returns", CS["size_demeaned_w"]["pre"], CS["size_demeaned_w"]["post"]); add("Below-median forward volatility", CS["low_fwd_vol_w"]["pre"], CS["low_fwd_vol_w"]["post"]); add("Below the cohort's 99th percentile (raw)", None, None, CS["below_p99_raw"]["pre"], CS["below_p99_raw"]["post"])
305 317 body = "".join(f"{a} & {b} & {c} & {d} & {e} & {f} & {g} & {h} \\\\\n" for a, b, c, d, e, f, g, h in rows)
306 318 MR = R2["mht"]
307 319 table("tab_robust", "tab:robust", "Construction, horizon, benchmark, universe and survivorship checks on the composite spread, Russell~3000.",
@@ -309,7 +321,7 @@ table("tab_robust", "tab:robust", "Construction, horizon, benchmark, universe an
309 321 "lrrrrrrr", ["Specification & Pre, wins. & [NW $t$] & 95\\% CI & Post, wins. & 95\\% CI & Pre, raw & Post, raw"], body,
310 322 TABLE_NOTE_SE + f" Pooled firm-clustered post $-$ pre tests (wins.): split at 2022 {BR['split_2022']['pooled_diff_w']['coef_pct']:+.1f} pp [$t$ {BR['split_2022']['pooled_diff_w']['t_firm']:.2f} firm / {tv(BR['split_2022']['pooled_diff_w']['t_twoway'])} two-way], split at 2021 {BR['split_2021']['pooled_diff_w']['coef_pct']:+.1f} pp [{BR['split_2021']['pooled_diff_w']['t_firm']:.2f} / {tv(BR['split_2021']['pooled_diff_w']['t_twoway'])}]. Romano--Wolf adjusted $p$ over the {MR['robustness_pre_w']['family_size']} robustness rows (wins.): smallest pre {min(MR['robustness_pre_w']['p_romano_wolf']):.2f}, smallest post {min(MR['robustness_post_w']['p_romano_wolf']):.2f} (Table~\\ref{{tab:mht}}). "
311 323 "The seasoned and listed-36-months rows condition on entry only; survival to October 2026 is addressed in Table~\\ref{tab:attrition}. Source: results/r3k\\_v2/results2.json, results\\_surv.json (conditional\\_spreads).",
312 − size="\\footnotesize", colsep="4pt", placement="main", sources="results/r3k_v2/results2.json (subperiod_spread, sector_neutral, residual_sort, mag7, alt_*, entrants, breaks, cluster_k), results_surv.json (conditional_spreads), results.json")
324 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results2.json (subperiod_spread, sector_neutral, residual_sort, mag7, alt_*, entrants, breaks, cluster_k), results_surv.json (conditional_spreads), results.json")
313 325 # ================================================================ T18 filing type (appendix) ====
314 326 N = R2["filing_type"]; hr = N["fm_forms_w"]["horse_race"]; wd = N["fm_forms_w"]["wald_equality"]; hr0 = N["fm_forms_raw"]["horse_race"]; wd0 = N["fm_forms_raw"]["wald_equality"]; c22 = N["cohort2022"]
315 327 body = panel(8, "Panel A: one form at a time")
@@ -327,7 +339,7 @@ table("tab_filing_type", "tab:filingtype", "Form-specific AI composites, Russell
327 339 "Panel A: the composite rebuilt from the filing-level scores of one form at a time: share of estimation firm-years with at least one scored filing of that form, correlation with the baseline composite, equal-weighted Q5$-$Q1 spreads (within-year winsorized, pp per year; full sample with 95\\% CI over cohorts, pre and post), and the Fama--MacBeth slope with controls (pp per SD; [NW $t$; plain $t$]). Panel B: the three form composites entered jointly, with a HAC Wald test of equal slopes. Panel C: how much of the 2022 cohort's text post-dates the launch and whether it changes the cohort spread.",
328 340 "lrrrrrrr", ["Signal built from & Firm-years covered & Corr.\\ with baseline & Full Q5$-$Q1 & 95\\% CI & Pre & Post & FM slope (pp/SD)"], body,
329 341 f"Form composites = $\\tfrac12[z(\\text{{adoption}}) + z(\\text{{infrastructure}})]$ from the filings of that form only; the equal-form composite averages the three form $z$-scores. The Wald test rejects equality at 5\\% on winsorized returns but not on raw returns (wins.\\ $p$ = {wd['p']:.3f}, raw {wd0['p']:.3f}); Romano--Wolf $p$ over the three single-form slopes: " + ", ".join(f"{m.replace('z_AI_', '').replace('10k', '10-K').replace('10q', '10-Q').replace('8k', '8-K')}: {p:.2f}" for m, p in zip(R2["mht"]["forms_fm_w"]["members"], R2["mht"]["forms_fm_w"]["p_romano_wolf"])) + f". The claim that annual reports carry the strongest premium is therefore not statistically distinguishable from the other forms. Equation (3) aggregation reproduced from filing-level scores for {c22['aggregation_reproduced_share_1e6'] * 100:.2f}\\% of firm-years. Source: results/r3k\\_v2/results2.json (filing\\_type).",
330 − size="\\footnotesize", colsep="4pt", placement="appendix", sources="results/r3k_v2/results2.json (filing_type, mht.forms_fm_w)")
342 + size="\\scriptsize", colsep="3pt", placement="appendix", sources="results/r3k_v2/results2.json (filing_type, mht.forms_fm_w)")
331 343 # ================================================================ T15 event study (main) ====
332 344 EB = RE["by_benchmark"]; base = EB["mm_2022"]; HL = [("pre_m20_m1", "Pre-launch block [$-$20, $-$1] (1--29 Nov 2022)"), ("car_m1_p1", "Days [$-$1, $+$1]"), ("car_0_5", "Days [0, $+$5]"), ("car_0_20", "Days [0, $+$20]"), ("car_60d", "60 trading days"), ("car_6m", "125 days (6 months)"), ("car_1y", "250 days (1 year)"), ("car_18m", "395 days (18 months)")]
333 345 body = panel(8, "Panel A: full sample by horizon (day 0 = 1 December 2022)")
@@ -344,7 +356,7 @@ table("tab_event", "tab:event", "ChatGPT event study: cumulative abnormal return
344 356 "lrrrrrrr", ["Horizon & Days & High (\\%) & Low (\\%) & High$-$Low (pp) & CDA $t$ & event-SD $t$ & BMP $t$"], body,
345 357 f"The CDA $t$ is the statistic the text relies on; the BMP $t$ is independence-based and overstates significance under a common event date (the Kolari--Pynn\\\"onen factor for $\\bar\\rho$ = {base['full']['rho_bar']:.4f} is {base['full']['kp_factor']:.3f}; it deflates the firm-level $t$, whereas the common component nets out of the High$-$Low portfolio, which is why the two differ). The Welch $t$ reported in v2.0 (independence-based) was: full {WR['full']['t_welch']:.2f}, largest 1,000 {WR['large']['t_welch']:.2f}, remaining {WR['small']['t_welch']:.2f}, S\\&P {WR['sp500']['t_welch']:.2f}, non-S\\&P {WR['non_sp500']['t_welch']:.2f}. "
346 358 f"Tercile characteristics (estimation window): Low $\\beta$ {TC['Low']['beta']:.2f}, log cap {TC['Low']['log_mktcap']:.2f}, share large {TC['Low']['share_large'] * 100:.0f}\\%; High $\\beta$ {TC['High']['beta']:.2f}, log cap {TC['High']['log_mktcap']:.2f}, share large {TC['High']['share_large'] * 100:.0f}\\% --- the terciles differ in beta and size, so Table~\\ref{{tab:eventcda}} re-estimates the one-year gradient under five benchmarks. Levels drift negative because the model was estimated in the 2022 bear market; only differences between terciles are interpretable. Source: results/r3k\\_v2/results\\_event.json.",
347 − size="\\footnotesize", placement="main", sources="results/r3k_v2/results_event.json (by_benchmark.mm_2022, welch_reference, tercile_characteristics)")
359 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results_event.json (by_benchmark.mm_2022, welch_reference, tercile_characteristics)")
348 360 # ================================================================ T16 event CDA by benchmark + placebo launches (main) ====
349 361 body = panel(8, "Panel A: one-year High$-$Low abnormal return (pp) and CDA $t$ by benchmark and sub-sample")
350 362 for b_, l in [("mm_2022", "(a) IWV market model, est.\\ Jan--Oct 2022"), ("beta_only", "(b) Beta-only, $r - \\hat\\beta m$"), ("market_adjusted", "(c) Market-adjusted, $r - m$"), ("mm_est2021", "(d) Market model estimated over 2021"), ("size_mom_matched", "(e) Size $\\times$ momentum matched (5 $\\times$ 5)")]:
@@ -365,17 +377,17 @@ table("tab_event_cda", "tab:eventcda", "Benchmark dependence of the one-year eve
365 377 f"Panel A: the one-year High$-$Low abnormal return of the pre-launch AI terciles and its dependence-robust CDA $t$ under six benchmarks: the IWV market model of Table~\\ref{{tab:event}}, a beta-only adjustment, the market-adjusted return, a market model estimated over calendar 2021, a size $\\times$ momentum matched benchmark (5 $\\times$ 5 cells of the 2021-cohort panel) and a Fama--French five-factor-plus-momentum calendar-time regression of the daily High$-$Low portfolio (alpha $\\times$ 250 days, HAC $t$). Panel B: the same design re-run with a fictitious launch on 30 November of 2015--2021. Every cell is dependence-robust (daily High$-$Low portfolio).",
366 378 "llrrrrrr", ["Benchmark & Statistic & Full & Largest 1,000 & Remaining & S\\&P 500 & Non-S\\&P & Within-size large / small"], body,
367 379 f"The largest-1,000 gradient is significant only under the market models (a) and (d); under (b), (c), (e) and (f) its CDA $t$ is below 2, so the event-study evidence for a large-cap re-rating is benchmark-dependent and is reported as such. Holm-adjusted $p$ over the {ME['family_size']} sub-sample $\\times$ horizon CDA statistics of benchmark (a): smallest {min(ME['p_holm']):.3f} (BH: {min(ME['p_bh']):.3f}). The 2022 launch ranks {PS['rank_2022_by_HL']} of {PS['n_launches']} by full-sample H$-$L and {PS['rank_2022_by_t']} by CDA $t$ among the eight launch dates; the placebo $t$'s range over {min(PS['t_cda_by_launch'][y] for y in PS['t_cda_by_launch'] if y != '2022'):.2f} to {max(PS['t_cda_by_launch'][y] for y in PS['t_cda_by_launch'] if y != '2022'):.2f}. A book-to-market match was not run (book equity not in the panel). Source: results/r3k\\_v2/results\\_event.json.",
368 − size="\\footnotesize", colsep="4pt", placement="main", sources="results/r3k_v2/results_event.json (by_benchmark, ff6_calendar_time, placebo_launches, placebo_summary, mht_event)")
380 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results_event.json (by_benchmark, ff6_calendar_time, placebo_launches, placebo_summary, mht_event)")
369 381 # ================================================================ T17 DiD + SPID (main) ====
370 382 Dd = R2["did"]; Pp = R2["spid"]
371 383 body = panel(5, "Panel A: difference-in-differences with firm and year fixed effects (treatment = pre-determined 2019--21 exposure)")
372 −body += f"Treated (above-median exposure) $\\times$ post & {Dd['binary']['coef'] * 100:+.2f} & -- & {br(Dd['binary']['t'])} & -- \\\\\nContinuous exposure ($z$) $\\times$ post & {Dd['continuous']['coef'] * 100:+.2f} & -- & {br(Dd['continuous']['t'])} & -- \\\\\n\\quad $N$ = {n(Dd['binary']['n'])}; firm + year FE; two-way clustered & & & & \\\\\n\\midrule\n"
384 +body += f"Treated (above-median exposure) $\\times$ post & {Dd['binary']['coef'] * 100:+.2f} & -- & {br(Dd['binary']['t'])} & -- \\\\\nContinuous exposure ($z$) $\\times$ post & {Dd['continuous']['coef'] * 100:+.2f} & -- & {br(Dd['continuous']['t'])} & -- \\\\\n\\multicolumn{{5}}{{@{{}}l}}{{\\quad $N$ = {n(Dd['binary']['n'])}; firm + year FE; two-way clustered}} \\\\\n\\midrule\n"
373 385 body += panel(5, "Panel B: pooled regressions of the forward return on the SPID project signal, the composite and their post-launch interactions")
374 386 for k, l in [("z_SPID_TECH", "SPID technology projects ($z$)"), ("spid_ai_any", "Any AI-initiative project (0/1)"), ("spid_tech_any", "Any technology project (0/1)")]:
375 387 for v, vl_ in [(k, l), (f"{k}:post", l + " $\\times$ post"), ("z_AI_COMPOS", "AI composite ($z$)"), ("z_AI_COMPOS:post", "AI composite $\\times$ post"), ("post", "Post-launch cohorts")]:
376 388 c = Pp[k]["terms"].get(v)
377 389 if c: body += f"{vl_} & {c['coef_pct']:+.2f} & {br(c['t_firm'])} & {br(c['t_twoway'])} & {cip(c['ci95_firm_pct'], 2)} \\\\\n"
378 − body += f"\\quad $N$ = {n(Pp[k]['n'])}; design rank {Pp[k]['rank']} of {Pp[k]['rank']}; condition number {Pp[k]['cond']:.1f} & & & & \\\\\n\\addlinespace\n"
390 + body += f"\\multicolumn{{5}}{{@{{}}l}}{{\\quad $N$ = {n(Pp[k]['n'])}; design rank {Pp[k]['rank']} of {Pp[k]['rank']}; condition number {Pp[k]['cond']:.1f}}} \\\\\n\\addlinespace\n"
379 391 t17b = T17["spid_tech"]["base"]["coef"]["z_SPID_TECH:post"] if T17 else None
380 392 table("tab_did_spid", "tab:didspid", "Difference-in-differences on pre-determined exposure and the SPID project signal, Russell~3000.",
381 393 "Panel A: forward return (within-year winsorized, pp) on the interaction of pre-determined AI exposure (firm mean of the composite over filing years 2019--2021, binary above-median or continuous) with the post-launch dummy, with firm and year fixed effects and two-way clustered $t$ (brackets); the event-time version with the reference year at zero is in Figure~\\ref{fig:eventtime} and Table~\\ref{tab:eventtime}. Panel B: pooled regressions with the explicit terms signal, post, signal $\\times$ post, composite, composite $\\times$ post, size and momentum (pp per SD, or pp per unit of the indicator); $t$-statistics clustered by firm and two-way by firm and cohort; 95\\% CI from the firm-clustered SE.",
@@ -383,7 +395,7 @@ table("tab_did_spid", "tab:didspid", "Difference-in-differences on pre-determine
383 395 ("The committed v2.0 exhibit printed $t$ = 0.00 in every row of Panel B from a rank-deficient fit; " + (f"the refit of the committed panel (design rank {T17['spid_tech']['base']['rank']} of {T17['spid_tech']['base']['k']}, condition number {T17['spid_tech']['base']['cond']:.2f}, $N$ = {n(T17['spid_tech']['base']['n'])}) gives SPID $\\times$ post {t17b['coef_pct']:+.2f} pp [$t$ {t17b['t_firm']:.2f} firm / {t17b['t_twoway']:.2f} two-way]" if t17b else "the refit of the committed panel is in results/r3k\\_v2/t17\\_refit.json") +
384 396 f", and the rebuilt panel above gives {Pp['z_SPID_TECH']['terms']['z_SPID_TECH:post']['coef_pct']:+.2f} [{Pp['z_SPID_TECH']['terms']['z_SPID_TECH:post']['t_firm']:.2f} / {Pp['z_SPID_TECH']['terms']['z_SPID_TECH:post']['t_twoway']:.2f}]. The parallel-trends condition of Panel A is not satisfied (Table~\\ref{{tab:eventtime}}), so the DiD coefficients are descriptive, not causal. "
385 397 f"The SPID measure is sparse (any-AI prevalence {R['spid']['share_firm_years_any_ai'] * 100:.1f}\\% of firm-years) and unvalidated; its minimum detectable effects are in Table~\\ref{{tab:spidbinary}}. Source: results/r3k\\_v2/results2.json (did, spid), t17\\_refit.json."),
386 − placement="main", sources="results/r3k_v2/results2.json (did, spid), t17_refit.json")
398 + size="\\scriptsize", placement="main", sources="results/r3k_v2/results2.json (did, spid), t17_refit.json")
387 399 # ================================================================ SPID binary contrasts (main, new) ====
388 400 SB = Pp["binary_contrasts"]; body = ""
389 401 for flag, l in [("spid_ai_any", "Any AI-initiative project vs none"), ("spid_tech_any", "Any technology project vs none")]:
@@ -391,29 +403,29 @@ for flag, l in [("spid_ai_any", "Any AI-initiative project vs none"), ("spid_tec
391 403 for per in ["full", "pre", "post"]:
392 404 c = SB[flag][per]["cohort_w"]; body += f"{'Cohort level: mean of cohort differences' if per == 'full' else ''} & {per} & {f1(c['mean_pct'])} & {br(c['t_plain'])} & {cip(c['ci95_pct'])} & {c['mde_pct']:.1f} & {c['n_cohorts']} cohorts \\\\\n"
393 405 for per in ["full", "pre", "post"]:
394 − f_ = SB[flag][per]["firm_w"]; body += f"{'Firm level: cohort FE, size, momentum' if per == 'full' else ''} & {per} & {f1(f_['coef_pct'])} & {br(f_['t_firm'])} & {cip(f_['ci95_pct'])} & {f_['mde_pct']:.1f} & {n(f_['n_treated'])} treated / {n(f_['n'])} \\\\\n"
406 + f_ = SB[flag][per]["firm_w"]; body += f"{'Firm level: cohort FE, size, momentum' if per == 'full' else ''} & {per} & {f1(f_['coef_pct'])} & {br(f_['t_firm'])} & {cip(f_['ci95_pct'])} & {f_['mde_pct']:.1f} & {n(f_['n_treated'])} / {n(f_['n'])} \\\\\n"
395 407 body += "\\addlinespace\n"
396 408 tc = Pp["tercile_nonzero_w"]; body += f"T3 $-$ T1 of project counts among firms with $>$ 0 technology projects & full & {f1(tc['mean_pct'])} & {br(tc['t_plain'])} & {cip(tc['ci95_pct'])} & -- & {tc['n_cohorts']} cohorts \\\\\n"
397 409 table("tab_spid_binary", "tab:spidbinary", "Binary contrasts on the SPID project signal with minimum detectable effects, Russell~3000.",
398 410 f"Difference in the forward return (within-year winsorized, pp per year) between firm-years with and without a disclosed project, at the cohort level (mean of the cohort differences, plain $t$ and 95\\% $t$-interval over cohorts; cohorts enter only with at least 15 treated firms) and at the firm level (pooled regression with cohort fixed effects, size and momentum; firm-clustered $t$ and CI). MDE = minimum detectable effect at 80\\% power. Any-AI projects are present in {R['spid']['share_firm_years_any_ai'] * 100:.1f}\\% of firm-years ({R['spid']['share_post_any_ai'] * 100:.1f}\\% after the launch).",
399 − "llrrrrr", ["Contrast & Period & Estimate (pp) & [$t$] & 95\\% CI & MDE (pp) & $n$"], body,
411 + "llrrrrr", ["Contrast & Period & Estimate (pp) & [$t$] & 95\\% CI & MDE (pp) & Cohorts or treated / $N$"], body,
400 412 f"Reading: every estimate is small relative to its MDE, so the design cannot distinguish a zero project premium from a premium of the size of the language premium (Table~\\ref{{tab:sortsboth}}); `no detectable premium' is the supportable statement. The legacy quintile sort on a variable whose median and P75 are zero (MDE {R['spid']['legacy_quintile_full_mde_pct']:.1f} pp at the cohort level) is kept only in Table~\\ref{{tab:sorts}}. Extractor provenance: gpt-4o-mini (FIRC-0001 pipeline snapshot), run 2026-10-27/28; a 200-mention human precision frame with source text was built (results/r3k\\_v2/validation/spid\\_sample.csv) but no human or LLM labels exist, so precision and the attenuation-corrected slope are not available. Source: results/r3k\\_v2/results2.json (spid.binary\\_contrasts).",
401 − size="\\footnotesize", placement="main", sources="results/r3k_v2/results2.json (spid.binary_contrasts, spid.tercile_nonzero_w), results.json (spid)")
413 + size="\\scriptsize", colsep="2.5pt", placement="main", sources="results/r3k_v2/results2.json (spid.binary_contrasts, spid.tercile_nonzero_w), results.json (spid)")
402 414 # ================================================================ reversal + cyber (appendix, new) ====
403 415 RV = CK["reversal"]; CY = CK["cyber"]; body = panel(5, "Panel A: reversal tests (AI-washing alternative)")
404 416 for key, l in [("month_1_12_w", "High-language firms with vs without disclosed tech projects, months 1--12 (wins.)"), ("month_13_24_w", "same, months 13--24 (wins.)"), ("month_1_24_raw", "same, months 1--24 (raw)")]:
405 − c = RV["high_language_with_vs_without_projects"][key]; body += f"{l} & {f1(c['mean_pct'])} & {br(c['t'])} {br(c['t_plain'])} & {cip(c['ci95_pct'])} & {c['n_cohorts']} \\\\\n"
417 + c = RV["high_language_with_vs_without_projects"][key]; body += f"{pcell(1, 0.42, l)} & {f1(c['mean_pct'])} & {br(c['t'])} {br(c['t_plain'])} & {cip(c['ci95_pct'])} & {c['n_cohorts']} \\\\\n"
406 418 for key, l in [("w", "Composite Q5$-$Q1, months 13--24 (wins., cohorts $\\leq$ 2023)"), ("raw", "same, raw"), ("pre_w", "same, pre-launch cohorts (wins.)"), ("post_w", "same, post-launch cohorts 2022--23 (wins.)")]:
407 − c = RV["Q5_minus_Q1_month_13_24"][key]; body += f"{l} & {pp(c['mean'])} & {br(c['t'])} {br(c['t_plain'])} & {ci(c['ci95'])} & {c['n']} \\\\\n"
419 + c = RV["Q5_minus_Q1_month_13_24"][key]; body += f"{pcell(1, 0.42, l)} & {pp(c['mean'])} & {br(c['t'])} {br(c['t_plain'])} & {ci(c['ci95'])} & {c['n']} \\\\\n"
408 420 c = RV["Q5_minus_Q1_month_1_24"]["w"]; body += f"Composite Q5$-$Q1, months 1--24 (wins.) & {pp(c['mean'])} & {br(c['t'])} {br(c['t_plain'])} & {ci(c['ci95'])} & {c['n']} \\\\\n\\midrule\n" + panel(5, "Panel B: cybersecurity vocabulary")
409 −body += f"Correlation of the cybersecurity and composite $z$-scores & {CY['corr_cyber_composite']:.2f} & & & \\\\\nCyber-neutral composite Q5$-$Q1 (quintiles within cybersecurity tercile), full (wins.) & {pp(CY['cyberneutral_sort']['full_w']['mean'])} & {br(CY['cyberneutral_sort']['full_w']['t'])} {br(CY['cyberneutral_sort']['full_w']['t_plain'])} & {ci(CY['cyberneutral_sort']['full_w']['ci95'])} & {CY['cyberneutral_sort']['full_w']['n']} \\\\\n"
421 +LCN = "Cyber-neutral composite Q5$-$Q1 (quintiles within cybersecurity tercile), full (wins.)"; body += f"{pcell(1, 0.42, 'Correlation of the cybersecurity and composite $z$-scores')} & {CY['corr_cyber_composite']:.2f} & & & \\\\\n{pcell(1, 0.42, LCN)} & {pp(CY['cyberneutral_sort']['full_w']['mean'])} & {br(CY['cyberneutral_sort']['full_w']['t'])} {br(CY['cyberneutral_sort']['full_w']['t_plain'])} & {ci(CY['cyberneutral_sort']['full_w']['ci95'])} & {CY['cyberneutral_sort']['full_w']['n']} \\\\\n"
410 422 body += f"Cybersecurity Q5$-$Q1, full (wins.) [pre / post: {pp(CY['cyber_sort']['pre_w']['mean'])} / {pp(CY['cyber_sort']['post_w']['mean'])}] & {pp(CY['cyber_sort']['full_w']['mean'])} & {br(CY['cyber_sort']['full_w']['t'])} & {ci(CY['cyber_sort']['full_w']['ci95'])} & {CY['cyber_sort']['full_w']['n']} \\\\\n"
411 −fc = CY["fm_compos_with_cyber_w"]; body += f"Fama--MacBeth, composite with cybersecurity control (wins.): composite / cyber (pp/SD) & {fc['z_AI_COMPOS']['mean_coef'] * 100:+.2f} / {fc['z_CYBER']['mean_coef'] * 100:+.2f} & {br(fc['z_AI_COMPOS']['t'])} {br(fc['z_CYBER']['t'])} & & {fc['n_years']} \\\\\n"
423 +fc = CY["fm_compos_with_cyber_w"]; LFC = "Fama--MacBeth, composite with cybersecurity control (wins.): composite / cyber (pp/SD)"; body += f"{pcell(1, 0.42, LFC)} & {fc['z_AI_COMPOS']['mean_coef'] * 100:+.2f} / {fc['z_CYBER']['mean_coef'] * 100:+.2f} & {br(fc['z_AI_COMPOS']['t'])} {br(fc['z_CYBER']['t'])} & & {fc['n_years']} \\\\\n"
412 424 table("tab_reversal", "tab:reversal", "Reversal tests and the cybersecurity-vocabulary check, Russell~3000.",
413 425 "Panel A: if AI language without projects were `AI washing', high-language firms without disclosed projects should earn less than those with projects, or the premium should reverse in the second year. Mean differences in forward returns (pp) with Newey--West and plain $t$ in brackets and 95\\% $t$-intervals over cohorts; the month 13--24 return is $(1 + r_{24}) / (1 + r_{12}) - 1$. Panel B: the composite sorted within terciles of the cybersecurity placebo score and a Fama--MacBeth regression with the cybersecurity score as a control.",
414 426 "lrrrr", ["Test & Estimate (pp) & [NW $t$] [plain $t$] & 95\\% CI & $n$ cohorts"], body,
415 427 f"High-language = top quintile of the composite within cohort; `with projects' = SPID technology-project mentions $>$ 0 ({n(RV['high_language_with_vs_without_projects']['n_high_language_with_projects'])} of {n(RV['high_language_with_vs_without_projects']['n_high_language'])} high-language firm-years). No reversal is detected, but the tests are low-powered (CIs span $\\pm$5 pp or more). Source: results/r3k\\_v2/results2.json (cluster\\_k).",
416 − size="\\footnotesize", placement="appendix", sources="results/r3k_v2/results2.json (cluster_k)")
428 + size="\\scriptsize", placement="appendix", sources="results/r3k_v2/results2.json (cluster_k)")
417 429 # ================================================================ MHT summary (main) + full (appendix, two parts) ====
418 430 FAM = [("sorts_full_w", "Full-sample spreads, Table~\\ref{tab:sortsboth} (EW and VW, five signals; wins.)"), ("sorts_pre_w", "Pre-launch spreads, same family"), ("sorts_post_w", "Post-launch spreads, same family"), ("forms_fm_w", "Form Fama--MacBeth slopes, Table~\\ref{tab:filingtype}"), ("robustness_pre_w", "Robustness rows, pre, Table~\\ref{tab:robust}"), ("robustness_post_w", "Robustness rows, post, Table~\\ref{tab:robust}")]
419 431 body = ""
@@ -426,7 +438,7 @@ LP = "Factor $\\times$ post interactions, Table~\\ref{tab:placebo} (wild $p$)";
426 438 LB = "Candidate break years, Table~\\ref{tab:cohorts} (bootstrap $p$)"; f_ = MR["break_dates_w"]; i22 = f_["members"].index("2022"); body += f"{pcell(1, 0.36, LB)} & {f_['family_size']} & {min(f_['p_boot']):.3f} & -- & -- & {min(f_['p_romano_wolf']):.3f} & -- & {f_['p_boot'][i22]:.2f} / {f_['p_romano_wolf'][i22]:.2f} (2022) \\\\\n"
427 439 LE = "Event-study CDA statistics, Table~\\ref{tab:eventcda}, benchmark (a)"; body += f"{pcell(1, 0.36, LE)} & {ME['family_size']} & {min(ME['p']):.3f} & {min(ME['p_holm']):.3f} & {min(ME['p_bh']):.3f} & -- & -- & -- \\\\\n"
428 440 SCv = R2["spec_curve"]
429 −def mrow(l, v): return f"{pcell(1, 0.6, l)} & \\multicolumn{{7}}{{l}}{{{v}}} \\\\\n"
441 +def mrow(l, v): return f"{pcell(1, 0.36, l)} & \\multicolumn{{7}}{{l}}{{{v}}} \\\\\n"
430 442 body += "\\midrule\n" + mrow(f"Deflated Sharpe ratio of the composite long--short ({DS['n_trials']} trials, SR hurdle {DS['full']['sr0_ann']:.2f}): full / pre / post", f"{DS['full']['dsr_prob']:.2f} / {DS['pre']['dsr_prob']:.2f} / {DS['post']['dsr_prob']:.2f}")
431 443 body += mrow(f"Specification curve, {SCv['n_specs']:,} specifications (Figure~\\ref{{fig:speccurve}}): positive / positive and NW-significant (plain) / negative and significant", f"{SCv['share_positive'] * 100:.0f}\\% / {SCv['share_positive_sig_nw'] * 100:.0f}\\% ({SCv['share_positive_sig_plain'] * 100:.0f}\\%) / {SCv['share_negative_sig_nw'] * 100:.1f}\\%")
432 444 body += mrow("Specification curve: median spread (pp) and interquartile range", f"{SCv['median_spread_pct']:+.1f} [{SCv['iqr_spread_pct'][0]:+.1f}, {SCv['iqr_spread_pct'][1]:+.1f}]")
@@ -436,7 +448,7 @@ table("tab_mht", "tab:mht", "Multiple-testing adjustments by family of tests.",
436 448 "For each family of tests reported in the paper: the family size, the smallest unadjusted $p$, the smallest Holm (family-wise) and Benjamini--Hochberg (false-discovery-rate) adjusted $p$, the smallest Romano--Wolf step-down $p$ (max-$t$ on shared bootstrap draws), the number of members with $|t| > 3$, and the unadjusted / Romano--Wolf $p$ of the headline member (the EW composite spread or the baseline row). The deflated Sharpe ratio and the specification curve summarize the search over long--short series and specifications.",
437 449 "lrrrrrrr", ["Family & Size & min $p$ & min Holm & min BH & min RW & $|t| > 3$ & Headline $p$ / RW $p$"], body,
438 450 "Cohort families: shared cohort-resampling bootstrap (9,999 draws) with recentred $t$-statistics; interaction family: shared Webb wild-cluster draws by cohort; event family: Holm and BH on the CDA $p$-values. Reading: no family contains a result that survives the Romano--Wolf adjustment except the cybersecurity interaction (Table~\\ref{tab:placebo}); the headline composite spread has a Romano--Wolf $p$ of " + f"{dict(zip(MR['sorts_full_w']['members'], MR['sorts_full_w']['p_romano_wolf']))['AI_COMPOS_EW']:.2f}" + " within its ten-member family. Member-level detail: Tables~\\ref{tab:mhtfull} and \\ref{tab:mhtfullb}. Source: results/r3k\\_v2/results2.json (mht, spec\\_curve), results\\_event.json (mht\\_event).",
439 − size="\\footnotesize", colsep="4pt", placement="main", sources="results/r3k_v2/results2.json (mht, spec_curve), results_event.json (mht_event)")
451 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results2.json (mht, spec_curve), results_event.json (mht_event)")
440 452 def member_label(m_): return m_.replace("z_AI_", "").replace("AI_", "AI ").replace("SPID_TECH", "SPID tech").replace("_EW", " EW").replace("_VW", " VW").replace("COMPOS", "composite").replace("ADOPT", "adoption").replace("INFRA", "infrastructure").replace("RISK", "disruption risk").replace("10k", "10-K").replace("10q", "10-Q").replace("8k", "8-K").replace("_", " ")
441 453 body = ""
442 454 for fam, fl in [("sorts_full_w", "Full-sample spreads, wins."), ("sorts_post_w", "Post-launch spreads, wins."), ("forms_fm_w", "Form FM slopes, wins.")]:
@@ -465,16 +477,16 @@ table("tab_eventtime", "tab:eventtime", "Event-time profile of the premium on pr
465 477 f"Slope of the forward return (within-year winsorized, pp per SD) on pre-determined AI exposure by outcome cohort, with firm-clustered standard errors in parentheses. The first pair of columns reproduces the committed coding (interaction without a main effect, which estimates one absolute slope per cohort); the second pair restores the main effect so that the coefficients are differences from the {R2['did_eventtime']['ref']} reference cohort (zero by construction); the third pair replaces the 2019--21 exposure by the mean composite over the three years before each outcome year.",
466 478 "lrrrrrr", ["Outcome cohort & \\multicolumn{2}{c}{Committed coding: absolute slope} & \\multicolumn{2}{c}{Difference from reference} & \\multicolumn{2}{c}{Trailing exposure: difference}", "\\cmidrule(lr){2-3}\\cmidrule(lr){4-5}\\cmidrule(lr){6-7} & (pp/SD) & (SE) & (pp/SD) & (SE) & (pp/SD) & (SE)"], body,
467 479 f"Reference-cohort slope with the main effect restored: {R2['did_eventtime']['base_slope_ref_year'] * 100:+.1f} pp/SD ($t$ {R2['did_eventtime']['base_t']:.2f}); $N$ = {n(R2['did_eventtime']['n'])} (trailing: {n(R2['did_eventtime_trailing']['n'])}). With the 2019--21 exposure, cohorts before 2019 interact future language with past outcomes (look-back selection, not a pre-trend test). The pre-launch differences are not zero, so the parallel-trends condition behind Table~\\ref{{tab:didspid}} Panel A fails and the post-launch coefficients are relative to a reference year that itself carried the largest slope. Plotted with 95\\% CIs in Figure~\\ref{{fig:eventtime}}. Source: results/r3k\\_v2/results2.json (did\\_eventtime, did\\_eventtime\\_trailing).",
468 − size="\\footnotesize", placement="appendix", sources="results/r3k_v2/results2.json (did_eventtime*)")
480 + size="\\scriptsize", placement="appendix", sources="results/r3k_v2/results2.json (did_eventtime*)")
469 481 # ================================================================ attrition / survivorship (main, new) ====
470 482 AP = RS["attrition_pivot_absent_share"]; AE = RS["annualised_exit_rate"]; att = pd.DataFrame(RS["attrition"]); allrow = att[att.tercile == "all"].set_index("asof")
471 483 body = panel(7, "Panel A: share of then-IWV constituents absent from the 28 August 2025 holdings, by market-value tercile within the snapshot")
472 −body += "IWV holdings as of & Small & Mid & Large & All & Annualised exit, small / large & Then-members in the panel \\\\\n\\midrule\n"
484 +body += " & ".join(H(c_) for c_ in ["IWV holdings as of", "Small", "Mid", "Large", "All", "Annualised exit, small / large", "Then-members in the panel"]) + " \\\\\n\\midrule\n"
473 485 for a in sorted(AP): body += f"{a[:4]}-{a[4:6]}-{a[6:]} & {AP[a]['small'] * 100:.1f}\\% & {AP[a]['mid'] * 100:.1f}\\% & {AP[a]['large'] * 100:.1f}\\% & {allrow.loc[a, 'absent_2026_share'] * 100:.1f}\\% & {(f'{AE[a]['small'] * 100:.1f}' if a in AE and AE[a].get('small') is not None else '--')} / {(f'{AE[a]['large'] * 100:.1f}' if a in AE and AE[a].get('large') is not None else '--')}\\% & {allrow.loc[a, 'in_panel_share'] * 100:.1f}\\% \\\\\n"
474 −body += "\\midrule\n" + panel(7, "Panel B: composite Q5$-$Q1 spread (wins., pp) for all panel firms vs the firms that were IWV members at formation") + "Cohort & Snapshot & Members then & Spread, all & Spread, members & Mean return, members & Mean return, non-members \\\\\n\\midrule\n"
486 +body += "\\midrule\n" + panel(7, "Panel B: composite Q5$-$Q1 spread (wins., pp) for all panel firms vs the firms that were IWV members at formation") + " & ".join(H(c_) for c_ in ["Cohort", "Snapshot", "Members then", "Spread, all", "Spread, members", "Mean return, members", "Mean return, non-members"]) + " \\\\\n\\midrule\n"
475 487 for y, v in TM.items(): body += f"{y} & {v['snapshot'][:4]}-{v['snapshot'][4:6]} & {v['share_member_then'] * 100:.0f}\\% & {pp(v['spread_all_w'])} & {pp(v['spread_members_w'])} & {pp(v['mean_fwd_members'])}\\% & {pp(v['mean_fwd_nonmembers']) if v['mean_fwd_nonmembers'] is not None else '--'}\\% \\\\\n"
476 488 EI = RS["ew_vs_index"]; BD = RS["bounding"]; body += "\\midrule\n" + panel(7, "Panel C: survivor signature at the level and bounding of the spread (pp per year)")
477 −def crow(l, v): return f"{pcell(1, 0.52, l)} & \\multicolumn{{6}}{{l}}{{{v}}} \\\\\n"
489 +def crow(l, v): return f"{pcell(1, 0.3, l)} & \\multicolumn{{6}}{{l}}{{{v}}} \\\\\n"
478 490 body += crow("EW panel return minus IWV total return: all firms, raw / wins.\\ / median", f"{EI['mean_gap_all_minus_iwv_pp']:+.1f} / {EI['mean_gap_all_w_minus_iwv_pp']:+.1f} / {EI['mean_gap_median_minus_iwv_pp']:+.1f}")
479 491 body += crow("\\quad largest 1,000 minus IWV / remaining minus IWM / S\\&P members minus IWV", f"{EI['mean_gap_large_minus_iwv_pp']:+.1f} / {EI['mean_gap_small_minus_iwm_pp']:+.1f} / {EI['mean_gap_sp500_minus_iwv_pp']:+.1f}") + crow("\\quad pre-launch cohorts / post-launch cohorts", f"{EI['mean_gap_pre_pp']:+.1f} / {EI['mean_gap_post_pp']:+.1f}")
480 492 body += crow(f"Q1 $-$ Q5 exit-rate difference needed to generate the whole spread ({BD['observed_full_spread_w'] * 100:+.1f} pp, wins.), exit return $-$30 / $-$50 / $-$70 / $-$100\\%", " / ".join(f"{v * 100:.1f}" for v in BD["required_exit_rate_difference_e1_minus_e5"].values()) + " pp/yr")
@@ -483,17 +495,17 @@ table("tab_attrition", "tab:attrition", "Survivorship diagnostics on the current
483 495 f"Panel A: for each of the {len(RS['snapshots'])} dated IWV holdings files captured by the Internet Archive, the share of then-constituents no longer held on 28 August 2025 (absent = ISIN/CUSIP not in the 2025 holdings and ticker not in the 2026 universe), by market-value tercile within the snapshot, the implied annualised exit rates of the small and large terciles, and the share of then-constituents present in the estimation panel. Panel B: the composite spread of each cohort computed on all panel firms and on the firms that were IWV members at formation. Panel C: the equal-weighted panel return against the index total return, and the exit-rate difference between the bottom and top AI quintiles that survivorship would need to generate the entire observed spread.",
484 496 "lrrrrrr", [], body,
485 497 "No capture exists between 2007 and May 2019, so the then-member comparison covers cohorts 2018--2024 only; for 2010--2017 the entry-side checks of Table~\\ref{tab:robust} are the only executable diagnostics. Delisted firms have no AI scores in any artefact, so attrition by AI quintile (the test the editor asked for) cannot be computed on this corpus; the small-tercile exit rate is two to four times the large-tercile rate, and the forward-volatility gradient shows that Q5 firms are riskier, so the small-firm pre-launch premium is reported as conditional on survival to October 2026. Bounding logic: if exiting firms earn $r_x$ and are dropped, the survivor spread overstates the true spread by $(e_1 - e_5)(\\bar r_{\\text{surv}} - r_x)$. Source: results/r3k\\_v2/results\\_surv.json; captures listed in iwv\\_holdings\\_manifest.json.",
486 − size="\\footnotesize", colsep="4pt", placement="main", sources="results/r3k_v2/results_surv.json (attrition, then_members_present, ew_vs_index, bounding), iwv_holdings_manifest.json")
498 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results_surv.json (attrition, then_members_present, ew_vs_index, bounding), iwv_holdings_manifest.json")
487 499 # ================================================================ construct validity (main, new) ====
488 500 if RC:
489 − sg = RC["signals"]; body = panel(9, "Panel A: alternative measures of AI language (same panel, same return)")
501 + sg = RC["signals"]; body = panel(7, "Panel A: alternative measures of AI language (same panel, same return)")
490 502 for key, l in [("z_AI_COMPOS", "AI composite (baseline)"), ("z_KW", "Keyword baseline (core AI terms per 1,000 words)"), ("z_KWlog", "Keyword baseline, $\\log(1 + x)$"), ("z_ALT", "Stripped-anchor composite"), ("z_ALTcore", "Core-AI adoption anchor"), ("z_CYBERstrip", "Cyber anchor stripped of AI terms")]:
491 − v = sg[key]; body += f"{l} & {v['spearman_with_composite']:.2f} & {pp(v['full_w']['mean'])} & {br(v['full_w']['t'])} {br(v['full_w']['t_plain'])} & {ci(v['full_w']['ci95'])} & {pp(v['pre_w']['mean'])} & {pp(v['post_w']['mean'])} & {v['fm_w']['slope_pct']:+.2f} {br(v['fm_w']['t'])} & {v['fm']['slope_pct']:+.2f} {br(v['fm']['t'])} \\\\\n"
492 − ux = RC["ex_utilities_energy"]; body += f"Composite ex Utilities and Energy ($N$ = {n(ux['n'])}) & -- & {pp(ux['full_w']['mean'])} & {br(ux['full_w']['t'])} {br(ux['full_w']['t_plain'])} & {ci(ux['full_w']['ci95'])} & {pp(ux['pre_w']['mean'])} & {pp(ux['post_w']['mean'])} & {ux['fm_w']['slope_pct']:+.2f} {br(ux['fm_w']['t'])} & {ux['fm']['slope_pct']:+.2f} {br(ux['fm']['t'])} \\\\\n"
493 − hw = RC["horse_race_w"]; body += "\\midrule\n" + panel(9, "Panel B: Fama--MacBeth horse races (wins., pp per SD [NW $t$])")
494 − body += f"{pcell(1, 0.3, 'Composite vs keyword baseline')} & \\multicolumn{{8}}{{l}}{{composite {hw['composite_vs_keyword']['z_AI_COMPOS']['slope_pct']:+.2f} {br(hw['composite_vs_keyword']['z_AI_COMPOS']['t'])}; keyword {hw['composite_vs_keyword']['z_KW']['slope_pct']:+.2f} {br(hw['composite_vs_keyword']['z_KW']['t'])}}} \\\\\n{pcell(1, 0.3, 'Composite vs stripped-anchor composite')} & \\multicolumn{{8}}{{l}}{{composite {hw['composite_vs_stripped']['z_AI_COMPOS']['slope_pct']:+.2f} {br(hw['composite_vs_stripped']['z_AI_COMPOS']['t'])}; stripped {hw['composite_vs_stripped']['z_ALT']['slope_pct']:+.2f} {br(hw['composite_vs_stripped']['z_ALT']['t'])}}} \\\\\n"
495 − body += "\\midrule\n" + panel(9, "Panel C: encoder truncation and lexical content of the score (node audit of the stored chunks and embeddings)")
496 − def vrow(l, v): return f"{pcell(1, 0.5, l)} & \\multicolumn{{8}}{{l}}{{{v}}} \\\\\n"
503 + v = sg[key]; body += f"{pcell(1, 0.28, l)} & {v['spearman_with_composite']:.2f} & {pp(v['full_w']['mean'])} & {br(v['full_w']['t'])} {br(v['full_w']['t_plain'])} & {ci(v['full_w']['ci95'])} & {v['fm_w']['slope_pct']:+.2f} {br(v['fm_w']['t'])} & {v['fm']['slope_pct']:+.2f} {br(v['fm']['t'])} \\\\\n"
504 + ux = RC["ex_utilities_energy"]; LUX = f"Composite ex Utilities and Energy ($N$ = {n(ux['n'])})"; body += f"{pcell(1, 0.28, LUX)} & -- & {pp(ux['full_w']['mean'])} & {br(ux['full_w']['t'])} {br(ux['full_w']['t_plain'])} & {ci(ux['full_w']['ci95'])} & {ux['fm_w']['slope_pct']:+.2f} {br(ux['fm_w']['t'])} & {ux['fm']['slope_pct']:+.2f} {br(ux['fm']['t'])} \\\\\n"
505 + hw = RC["horse_race_w"]; body += "\\midrule\n" + panel(7, "Panel B: Fama--MacBeth horse races (wins., pp per SD [NW $t$])")
506 + body += f"{pcell(1, 0.3, 'Composite vs keyword baseline')} & \\multicolumn{{6}}{{l}}{{composite {hw['composite_vs_keyword']['z_AI_COMPOS']['slope_pct']:+.2f} {br(hw['composite_vs_keyword']['z_AI_COMPOS']['t'])}; keyword {hw['composite_vs_keyword']['z_KW']['slope_pct']:+.2f} {br(hw['composite_vs_keyword']['z_KW']['t'])}}} \\\\\n{pcell(1, 0.3, 'Composite vs stripped-anchor composite')} & \\multicolumn{{6}}{{l}}{{composite {hw['composite_vs_stripped']['z_AI_COMPOS']['slope_pct']:+.2f} {br(hw['composite_vs_stripped']['z_AI_COMPOS']['t'])}; stripped {hw['composite_vs_stripped']['z_ALT']['slope_pct']:+.2f} {br(hw['composite_vs_stripped']['z_ALT']['t'])}}} \\\\\n"
507 + body += "\\midrule\n" + panel(7, "Panel C: encoder truncation and lexical content of the score (node audit of the stored chunks and embeddings)")
508 + def vrow(l, v): return f"{pcell(1, 0.28, l)} & \\multicolumn{{6}}{{l}}{{{v}}} \\\\\n"
497 509 if TA:
498 510 fr = TA["frames"]; fk = max(fr, key=lambda k_: fr[k_]["n"]); f0 = fr[fk]
499 511 body += vrow("Encoder window (tokens) / chunk length (words) / median tokens per chunk", f"{TA['max_seq_length']} / 512 / {f0['tokens_median']:.0f}")
@@ -502,16 +514,16 @@ if RC:
502 514 body += vrow("Spearman correlation of the keyword baseline with the composite / firm-years with zero core AI hits", f"{sg['z_KW']['spearman_with_composite']:.2f} / {sg['z_KW']['share_zero'] * 100:.0f}\\%")
503 515 body += vrow("Utilities: share of top-quintile firm-years vs share of the sample", f"{RC['utilities_share_q5_vs_all'][0] * 100:.1f}\\% vs {RC['utilities_share_q5_vs_all'][1] * 100:.1f}\\%")
504 516 table("tab_construct_validity", "tab:constructvalidity", "Construct validity of the semantic AI score: keyword baseline, stripped anchors, sector composition and encoder truncation.",
505 − "Panel A: the composite and five alternative measures scored on the same firm-years: Spearman correlation with the composite, equal-weighted Q5$-$Q1 spreads (within-year winsorized, pp per year; [NW $t$] [plain $t$] and 95\\% CI over cohorts; pre and post means) and Fama--MacBeth slopes with controls (pp per SD, [NW $t$]) on winsorized and raw returns. The stripped anchors re-score the stored chunk embeddings against anchor texts without the cybersecurity and automation vocabulary (no corpus re-embedding). Panel B: horse races. Panel C: what the encoder actually reads and how much of the score is lexical.",
506 − "lrrrrrrrr", ["Signal & $\\rho$ with composite & Full Q5$-$Q1 & [NW $t$] [plain $t$] & 95\\% CI & Pre & Post & FM slope, wins. & FM slope, raw"], body,
517 + "Panel A: the composite and five alternative measures scored on the same firm-years: Spearman correlation with the composite, equal-weighted full-sample Q5$-$Q1 spreads (within-year winsorized, pp per year; [NW $t$] [plain $t$] and 95\\% CI over cohorts) and Fama--MacBeth slopes with controls (pp per SD, [NW $t$]) on winsorized and raw returns. The stripped anchors re-score the stored chunk embeddings against anchor texts without the cybersecurity and automation vocabulary (no corpus re-embedding). Panel B: horse races. Panel C: what the encoder actually reads and how much of the score is lexical.",
518 + "lrrrrrr", ["Signal & $\\rho$ with composite & Full Q5$-$Q1, wins. & [NW $t$] [plain $t$] & 95\\% CI & FM slope, wins. [NW $t$] & FM slope, raw [NW $t$]"], body,
507 519 "Keyword baseline = core AI terms (published AI lexicons) per 1,000 words of the section texts, computed on the node audit (code/n1); the keyword and semantic measures agree weakly, and the keyword measure carries a similar sort spread but a weaker regression slope. The encoder reads roughly the first 200 words of each 512-word chunk, so the score is a function of chunk openings; re-chunking to the encoder window (X4) was not executed and the consequences for the premium are unknown. No human- or LLM-labelled validation sample exists: the 1,700-chunk coding frames and codebook were delivered without labels (results/n1/validation\\_*), so precision and recall of the score are not measured. $N$ = " + n(sg["z_AI_COMPOS"]["n"]) + " firm-years in Panel A. Source: results/r3k\\_v2/results\\_construct.json, results/n1/tokenizer\\_audit.json, keyword\\_baseline.json.",
508 − size="\\scriptsize", colsep="3.5pt", placement="main", sources="results/r3k_v2/results_construct.json, results/n1/tokenizer_audit.json, results/n1/keyword_baseline.json")
520 + size="\\scriptsize", colsep="3pt", placement="main", sources="results/r3k_v2/results_construct.json, results/n1/tokenizer_audit.json, results/n1/keyword_baseline.json")
509 521 # ================================================================ corr, top firms, coverage, corpus (appendix / main) ====
510 522 c = pd.read_csv(f"{T}/t1b_correlations.csv", index_col=0); lab2 = {"z_AI_ADOPT": "AI adoption", "z_AI_INFRA": "AI infrastructure", "z_AI_RISK": "AI disruption risk", "z_AI_PC1": "PC1", "z_SPID_TECH": "SPID tech projects", "z_CYBER": "Cybersecurity", "z_size": "Size", "z_mom": "Momentum", "fwd_ret": "Forward return"}
511 −cols_ = list(c.columns); body = ""
523 +lab2s = {"z_AI_ADOPT": "Adopt", "z_AI_INFRA": "Infra", "z_AI_RISK": "Risk", "z_AI_PC1": "PC1", "z_SPID_TECH": "SPID", "z_CYBER": "Cyber", "z_size": "Size", "z_mom": "Mom", "fwd_ret": "Fwd ret"}; cols_ = list(c.columns); body = ""
512 524 for i_, rname in enumerate(c.index): body += lab2[rname] + " & " + " & ".join(f"{c.loc[rname, cc]:.2f}" if j_ <= i_ else "" for j_, cc in enumerate(cols_)) + " \\\\\n"
513 525 table("tab_corr", "tab:corr", "Correlations of the within-year standardized variables.", f"Pearson correlations over the {NOBS} firm-years of the estimation sample; signals and controls standardized within formation year; the forward return is the raw twelve-month return.",
514 − "l" + "r" * len(cols_), [" & " + " & ".join(lab2[x] for x in cols_)], body, "The three AI facets are highly correlated with each other (and with PC1) and weakly with the SPID project count, which is a count variable with a zero median. Source: results/r3k\\_v2/t1b\\_correlations.csv.", placement="appendix", sources="results/r3k_v2/t1b_correlations.csv")
526 + "l" + "r" * len(cols_), [" & " + " & ".join(lab2s[x] for x in cols_)], body, "Column headers abbreviate the row labels (Adopt = AI adoption, Infra = AI infrastructure, Risk = AI disruption risk, SPID = SPID tech projects, Mom = momentum, Fwd ret = forward return). The three AI facets are highly correlated with each other (and with PC1) and weakly with the SPID project count, which is a count variable with a zero median. Source: results/r3k\\_v2/t1b\\_correlations.csv.", size="\\scriptsize", colsep="3pt", placement="appendix", sources="results/r3k_v2/t1b_correlations.csv")
515 527 def company_case(s_):
516 528 s_ = str(s_); t_ = s_.title() if s_.isupper() else s_; return " ".join(w.upper() if w.upper() in ("IBM", "HPE", "AI", "C3", "AI,", "C3.AI", "LLC", "INC", "INC.", "PLC") else w for w in t_.split())
517 529 tf = df.groupby(["ticker", "company_name", "sector"]).agg(z=("z_AI_COMPOS", "mean"), yrs=("fiscal_year", "count")).reset_index(); tf = tf[tf.yrs >= 5].nlargest(12, "z"); body = ""
@@ -523,7 +535,7 @@ for y in cv["firms_per_cohort"]: body += f"{y} & {n(cv['firms_per_cohort'][y])}
523 535 table("tab_coverage", "tab:coverage", "Estimation sample by formation cohort: firms, size groups and text coverage.", "Number of firms with a valid forward return in each formation cohort, the size-group counts under the two partitions (largest 1,000 at formation on the corrected capitalization; largest 42\\% within cohort), the firm-years without a capitalization, the S\\&P~500 members, and the median number of scored filings and text chunks per firm-year.",
524 536 "lrrrrrrrr", ["Cohort & Firms & Largest 1,000 & Remaining & No cap & Largest 42\\% & S\\&P 500 & Median filings & Median chunks"], body,
525 537 f"The panel grows from {n(cv['firms_per_cohort'][min(cv['firms_per_cohort'])])} firms in {min(cv['firms_per_cohort'])} to {n(cv['firms_per_cohort'][max(cv['firms_per_cohort'])])} in {max(cv['firms_per_cohort'])} because the universe is the October 2026 membership: early cohorts contain only the firms that survived to 2026 (Table~\\ref{{tab:attrition}}). Under the top-1,000 partition the `remaining' group has {n(cv['n_small'][min(cv['n_small'])])} firms in {min(cv['n_small'])} (quintiles of about {int(cv['n_small'][min(cv['n_small'])]) // 5} firms); the 42\\% partition keeps the group shares constant. Rank autocorrelation of the composite: lag 1 {cv['rank_autocorr_lag1']:.2f}, lag 5 {cv['rank_autocorr_lag5']:.2f}. Source: results/r3k\\_v2/results2.json (coverage).",
526 − placement="appendix", sources="results/r3k_v2/results2.json (coverage)")
538 + size="\\scriptsize", placement="appendix", sources="results/r3k_v2/results2.json (coverage)")
527 539 fl = pd.read_parquet("data/raw_russell3000/filings"); body = ""
528 540 for fm_ in ["10-K", "10-Q", "8-K"]:
529 541 sub = fl[fl.form_type == fm_]; tag = {"10-K": "n_10k", "10-Q": "n_10q", "8-K": "n_8k"}[fm_]; body += f"{fm_} & {n(len(sub))} & {n(sub.cik.nunique())} & {n((sub.parse_status == 'complete').sum())} & {df[tag].notna().mean() * 100:.1f}\\% \\\\\n"
@@ -538,7 +550,7 @@ body += "Ticker & Window & Yahoo return & FinData return & FinData first bar & V
538 550 for r_ in hl[hl.verdict != "confirmed"].sort_values(["kind", "ticker"]).itertuples(): body += f"{r_.ticker} & {r_.date} & {r_.yahoo_ret * 100:+.0f}\\% & {('--' if pd.isna(r_.findata_ret) else f'{r_.findata_ret * 100:+.0f}\\%')} & {r_.findata_first_bar if isinstance(r_.findata_first_bar, str) else '--'} & {r_.verdict.replace('_', ' ')} \\\\\n"
539 551 body += "\\midrule\n" + panel(6, f"Panel B: headline statistics before (committed v2.0, HEAD {BASELINE}) and after the corrections") + "Statistic & \\multicolumn{2}{l}{BEFORE (committed v2.0)} & \\multicolumn{3}{l}{AFTER (rebuilt panel): raw $\\rightarrow$ winsorized / robust} \\\\\n\\midrule\n"
540 552 S = R["sorts"]; S0 = RB["sorts"] if RB else None; FM0 = RB["fama_macbeth"]["compos"]["z_AI_COMPOS"] if RB else None; SP0 = RB["subperiod_spread"]["AI_COMPOS"] if RB else None; G0 = RB["groups"] if RB else None
541 −def ba(l, before, after): return f"{pcell(1, 0.27, l)} & {pcell(2, 0.2, before)} & {pcell(3, 0.42, after)} \\\\\n"
553 +def ba(l, before, after): return f"{pcell(1, 0.25, l)} & {pcell(2, 0.19, before)} & {pcell(3, 0.39, after)} \\\\\n"
542 554 if RB:
543 555 body += ba("Panel: firm-years / firms / no capitalization", f"{n(META['n_estimation_sample_v1'])} / {n(RB['n_firms'])} / {n(META['n_est_without_cap_v1'])}", f"{NOBS} / {NFIRMS} / {n(META['n_est_without_cap'])}")
544 556 def lr(v): return "$-\\infty$" if v is None or (isinstance(v, float) and np.isinf(v)) else f"{v:.1f}"
@@ -572,7 +584,7 @@ table("tab_break", "tab:break", "Pooled test of a post-launch change in the sign
572 584 "Pooled regression of the within-year winsorized forward return on the signal, a post-launch cohort dummy, their interaction, size and momentum (pp per SD). Pre slope with its two-way clustered $t$; the interaction (post-launch change of the slope) with firm-clustered and two-way $t$, the firm-clustered 95\\% CI and the Webb wild-cluster bootstrap $p$ by cohort; the last two columns repeat the cohort-level pre and post winsorized spreads of Table~\\ref{tab:prepostboth}.",
573 585 "lrrrrrrrrr", ["Signal & Pre slope & [$t$ two-way] & Slope $\\times$ post & [$t$ firm] & [$t$ two-way] & 95\\% CI & wild $p$ & Pre Q5$-$Q1 & Post Q5$-$Q1"], body,
574 586 f"$N$ = {n(B['AI_COMPOS']['n'])} firm-years, {B['AI_COMPOS']['G_years']} cohort clusters, 9,999 bootstrap draws. None of the interactions is significant once clustering by cohort or the wild bootstrap is used; the firm-clustered $t$ overstates precision for a regressor that varies at the cohort level. Source: results/r3k\\_v2/results.json (structural\\_break).",
575 − size="\\footnotesize", colsep="4pt", placement="appendix", sources="results/r3k_v2/results.json (structural_break, subperiod_spread)")
587 + size="\\scriptsize", colsep="3pt", placement="appendix", sources="results/r3k_v2/results.json (structural_break, subperiod_spread)")
576 588 # ================================================================ appendix exhibits block + exhibit map ====
577 589 FIGS_APPENDIX = [("fig1_quintiles", "fig:quintiles"), ("fig2_cumulative_ls", "fig:cumls"), ("fig17_attrition", "fig:attrition")]
578 590 FIGS_MAIN_FALLBACK = [] # fig15 / fig16 are placed in the sections by the writing agent (its own figure wrappers do not set the placement flag, so no fallback copy)
@@ -648,6 +660,7 @@ PREAMBLE = r"""% ---- Exhibit wrappers (Stage E, Agent 9). Each generated table/
648 660 % by a bare \input{tables/<name>}. \ExhibitFigure{label}{caption}{content} does the same for figures.
649 661 % Both wrappers record the label as placed, and \ExhibitOnce{label}{...} prints its argument only if the label has not been placed yet
650 662 % (used by tables/appendix_exhibits.tex as a safety net: an exhibit placed in the sections, in either convention, is not printed twice).
663 +\usepackage{makecell}
651 664 \makeatletter
652 665 \providecommand{\ExhibitTable}{}\renewcommand{\ExhibitTable}[4]{\global\@namedef{exh@done@#1}{}\ifx\@captype\@undefined\begin{table}[htbp]\centering #3\caption{#2}\label{#1}#4\end{table}\else #4\fi}
653 666 \providecommand{\ExhibitFigure}{}\renewcommand{\ExhibitFigure}[3]{\global\@namedef{exh@done@#1}{}\ifx\@captype\@undefined\begin{figure}[htbp]\centering #3\caption{#2}\label{#1}\end{figure}\else #3\fi}
654 667
Menu

Theme