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 f"\\newcommand{{\\mChunkShareFull}}{{{100*out['chunk_word_count']['share_eq512']:.1f}}}", 99 f"\\newcommand{{\\mChunkShareFull}}{{{100*out['chunk_word_count']['share_eq512']:.1f}}}",
100 ] 100 ]
101 for ft in ["10-K", "10-Q", "8-K"]: 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 if ft in forms: 103 if ft in forms:
104 macros.append(f"\\newcommand{{\\mnFilings{key}}}{{{fmt(forms[ft]['n'])}}}") 104 macros.append(f"\\newcommand{{\\mnFilings{key}}}{{{fmt(forms[ft]['n'])}}}")
105 macros.append(f"\\newcommand{{\\mnParsed{key}}}{{{fmt(forms[ft]['parsed'])}}}") 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 % by a bare \input{tables/<name>}. \ExhibitFigure{label}{caption}{content} does the same for figures. 4 % by a bare \input{tables/<name>}. \ExhibitFigure{label}{caption}{content} does the same for figures.
5 % Both wrappers record the label as placed, and \ExhibitOnce{label}{...} prints its argument only if the label has not been placed yet 5 % Both wrappers record the label as placed, and \ExhibitOnce{label}{...} prints its argument only if the label has not been placed yet
6 % (used by tables/appendix_exhibits.tex as a safety net: an exhibit placed in the sections, in either convention, is not printed twice). 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 \makeatletter 8 \makeatletter
8 \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 \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 \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} 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 % 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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{llrrrrrrrr} 5 \begin{tabular}{llrrrrrrrr}
6 \toprule 6 \toprule
7 Signal & Period & Months & Mean (\%/yr) & [HAC $t$] & [plain $t$] & Sharpe & CAPM $\alpha$ (\%/yr) & FF6 $\alpha$ (\%/yr) & [$t$] \\ 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 \addlinespace 44 \addlinespace
45 \bottomrule 45 \bottomrule
46 \end{tabular} 46 \end{tabular}
47−\begin{tablenotes}[flushleft]\footnotesize 47+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 49 \end{tablenotes}
50 \end{threeparttable}} 50 \end{threeparttable}}
modified paper/tables/tab_alpha_both.tex +3 −3
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{llrrrrrrrrr} 5 \begin{tabular}{llrrrrrrrrr}
6 \toprule 6 \toprule
7 Signal & Universe & Months & Mean (\%/yr) & [HAC $t$] & Sharpe & FF6 $\alpha$ (\%/yr) & [$t$] & Post months & Post FF6 $\alpha$ & [$t$] \\ 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 \addlinespace 23 \addlinespace
24 \bottomrule 24 \bottomrule
25 \end{tabular} 25 \end{tabular}
26−\begin{tablenotes}[flushleft]\footnotesize 26+\begin{tablenotes}[flushleft]\scriptsize
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}. 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 \end{tablenotes} 28 \end{tablenotes}
29 \end{threeparttable}} 29 \end{threeparttable}}
modified paper/tables/tab_attrition.tex +11 −11
@@ -1,11 +1,11 @@
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). 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 % 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. 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}{% 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}{4pt} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{lrrrrrr} 5 \begin{tabular}{lrrrrrr}
6 \toprule 6 \toprule
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}} \\ 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 \midrule 9 \midrule
10 2006-09-29 & 77.7\% & 65.3\% & 47.2\% & 63.4\% & 7.6 / 3.3\% & 32.3\% \\ 10 2006-09-29 & 77.7\% & 65.3\% & 47.2\% & 63.4\% & 7.6 / 3.3\% & 32.3\% \\
11 2019-05-31 & 61.2\% & 31.1\% & 16.3\% & 36.2\% & 14.1 / 2.8\% & 55.5\% \\ 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 2025-08-28 & 0.1\% & 0.0\% & 0.0\% & 0.0\% & -- / --\% & 85.8\% \\ 26 2025-08-28 & 0.1\% & 0.0\% & 0.0\% & 0.0\% & -- / --\% & 85.8\% \\
27 \midrule 27 \midrule
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}} \\ 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 \midrule 30 \midrule
31 2018 & 2019-05 & 86\% & +19.0 & +20.4 & -2.9\% & +8.5\% \\ 31 2018 & 2019-05 & 86\% & +19.0 & +20.4 & -2.9\% & +8.5\% \\
32 2019 & 2020-12 & 88\% & +1.4 & +4.2 & +70.7\% & +169.6\% \\ 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 2024 & 2025-08 & 94\% & +19.9 & +16.4 & +39.1\% & +188.4\% \\ 37 2024 & 2025-08 & 94\% & +19.9 & +16.4 & +39.1\% & +188.4\% \\
38 \midrule 38 \midrule
39 \multicolumn{7}{@{}l}{\textit{Panel C: survivor signature at the level and bounding of the spread (pp per year)}} \\ 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} \\ 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.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} \\ 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.52\textwidth}}{\quad pre-launch cohorts / post-launch cohorts} & \multicolumn{6}{l}{+5.0 / +8.4} \\ 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.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} \\ 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.52\textwidth}}{Measured small-minus-large annualised exit rate, largest gap across snapshots} & \multicolumn{6}{l}{14.0 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.52\textwidth}}{Forward-volatility gradient of the composite sort, Q5 $-$ Q1 (annualized SD)} & \multicolumn{6}{l}{+4.6 pp} \\ 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 \bottomrule 46 \bottomrule
47 \end{tabular} 47 \end{tabular}
48−\begin{tablenotes}[flushleft]\footnotesize 48+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 50 \end{tablenotes}
51 \end{threeparttable}} 51 \end{threeparttable}}
modified paper/tables/tab_break.tex +3 −3
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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}{4pt} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{lrrrrrrrrr} 5 \begin{tabular}{lrrrrrrrrr}
6 \toprule 6 \toprule
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 \\ 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 SPID tech projects & +0.49 & [0.74] & -1.79 & [-1.80] & [-0.95] & [-3.74, +0.16] & 0.545 & +1.8 & -0.5 \\ 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 \bottomrule 16 \bottomrule
17 \end{tabular} 17 \end{tabular}
18−\begin{tablenotes}[flushleft]\footnotesize 18+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 20 \end{tablenotes}
21 \end{threeparttable}} 21 \end{threeparttable}}
modified paper/tables/tab_cohorts.tex +7 −7
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{lrrrl} 5 \begin{tabular}{lrrrl}
6 \toprule 6 \toprule
7 \multicolumn{5}{@{}l}{\textit{Panel A: equal-weighted Q5$-$Q1 spread of the composite by formation cohort (pp)}} \\ 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 \multicolumn{5}{@{}l}{\textit{Panel B: is the 2022--24 block unusual? (composite)}} \\ 30 \multicolumn{5}{@{}l}{\textit{Panel B: is the 2022--24 block unusual? (composite)}} \\
31 Test & \multicolumn{2}{l}{raw} & \multicolumn{2}{l}{wins.} \\ 31 Test & \multicolumn{2}{l}{raw} & \multicolumn{2}{l}{wins.} \\
32 \midrule 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)} \\ 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.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} \\ 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.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} \\ 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.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)} \\ 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 \bottomrule 37 \bottomrule
38 \end{tabular} 38 \end{tabular}
39−\begin{tablenotes}[flushleft]\footnotesize 39+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 41 \end{tablenotes}
42 \end{threeparttable}} 42 \end{threeparttable}}
modified paper/tables/tab_construct_validity.tex +22 −22
@@ -1,33 +1,33 @@
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). 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 % 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. 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}{% 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}{3.5pt} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5−\begin{tabular}{lrrrrrrrr} 5+\begin{tabular}{lrrrrrr}
6 \toprule 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 \midrule 8 \midrule
9−\multicolumn{9}{@{}l}{\textit{Panel A: alternative measures of AI language (same panel, same return)}} \\ 9+\multicolumn{7}{@{}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] \\ 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−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] \\ 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−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] \\ 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−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] \\ 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−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] \\ 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−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] \\ 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−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] \\ 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 \midrule 17 \midrule
18−\multicolumn{9}{@{}l}{\textit{Panel B: Fama--MacBeth horse races (wins., pp per SD [NW $t$])}} \\ 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{8}{l}{composite +1.85 [2.37]; keyword +0.36 [0.68]} \\ 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{8}{l}{composite +0.15 [0.06]; stripped +1.66 [0.79]} \\ 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 \midrule 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)}} \\ 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.5\textwidth}}{Encoder window (tokens) / chunk length (words) / median tokens per chunk} & \multicolumn{8}{l}{256 / 512 / 634} \\ 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.5\textwidth}}{Chunks truncated (frame K, $n$ = 10{,}000) / median words read / share of token mass dropped} & \multicolumn{8}{l}{99.8\% / 205 / 60\%} \\ 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.5\textwidth}}{AI keyword occurrences beyond the encoder window} & \multicolumn{8}{l}{61\% of 40{,}522} \\ 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.5\textwidth}}{Spearman correlation of the keyword baseline with the composite / firm-years with zero core AI hits} & \multicolumn{8}{l}{0.13 / 84\%} \\ 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.5\textwidth}}{Utilities: share of top-quintile firm-years vs share of the sample} & \multicolumn{8}{l}{6.5\% vs 3.2\%} \\ 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 \bottomrule 28 \bottomrule
29 \end{tabular} 29 \end{tabular}
30−\begin{tablenotes}[flushleft]\footnotesize 30+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 32 \end{tablenotes}
33 \end{threeparttable}} 33 \end{threeparttable}}
modified paper/tables/tab_contrasts.tex +7 −7
@@ -1,10 +1,10 @@
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). 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 % 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. 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}{% 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}{4pt} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{llrrrrrr} 5 \begin{tabular}{llrrrrrr}
6 \toprule 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 \midrule 8 \midrule
9 \multicolumn{8}{@{}l}{\textit{Panel A: pooled firm-level interactions (Q1/Q5 firm-years, cohort fixed effects)}} \\ 9 \multicolumn{8}{@{}l}{\textit{Panel A: pooled firm-level interactions (Q1/Q5 firm-years, cohort fixed effects)}} \\
10 hi $\times$ post (reference group) & wins. & -1.23 & [-0.25] & [-0.12] & [-11.0, +8.5] & -- / -- & 13.9 \\ 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 \addlinespace 29 \addlinespace
30 \midrule 30 \midrule
31 \multicolumn{8}{@{}l}{\textit{Panel B: difference of cohort-level post $-$ pre changes, cohort bootstrap}} \\ 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] & & \\ 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−same, raw returns & raw & +11.40 & & & [-14.9, +31.7] & & \\ 33+\multicolumn{1}{>{\raggedright\arraybackslash}p{0.3\textwidth}}{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] & & \\ 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 \bottomrule 35 \bottomrule
36 \end{tabular} 36 \end{tabular}
37−\begin{tablenotes}[flushleft]\footnotesize 37+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 39 \end{tablenotes}
40 \end{threeparttable}} 40 \end{threeparttable}}
modified paper/tables/tab_corpus.tex +2 −2
@@ -1,10 +1,10 @@
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). 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 % 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. 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 \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}{% 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 \begin{tabular}{lrrrr} 5 \begin{tabular}{lrrrr}
6 \toprule 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 \midrule 8 \midrule
9 10-K & 31{,}775 & 2{,}468 & 31{,}772 & 96.8\% \\ 9 10-K & 31{,}775 & 2{,}468 & 31{,}772 & 96.8\% \\
10 10-Q & 95{,}167 & 2{,}494 & 95{,}155 & 99.6\% \\ 10 10-Q & 95{,}167 & 2{,}494 & 95{,}155 & 99.6\% \\
modified paper/tables/tab_corr.tex +5 −5
@@ -1,10 +1,10 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{lrrrrrrrrr} 5 \begin{tabular}{lrrrrrrrrr}
6 \toprule 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 \midrule 8 \midrule
9 AI adoption & 1.00 & & & & & & & & \\ 9 AI adoption & 1.00 & & & & & & & & \\
10 AI infrastructure & 0.79 & 1.00 & & & & & & & \\ 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 Forward return & 0.02 & 0.03 & 0.05 & 0.04 & 0.00 & 0.01 & -0.11 & -0.04 & 1.00 \\ 17 Forward return & 0.02 & 0.03 & 0.05 & 0.04 & 0.00 & 0.01 & -0.11 & -0.04 & 1.00 \\
18 \bottomrule 18 \bottomrule
19 \end{tabular} 19 \end{tabular}
20−\begin{tablenotes}[flushleft]\footnotesize 20+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 22 \end{tablenotes}
23 \end{threeparttable}} 23 \end{threeparttable}}
modified paper/tables/tab_coverage.tex +3 −3
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 \begin{tabular}{lrrrrrrrr} 5 \begin{tabular}{lrrrrrrrr}
6 \toprule 6 \toprule
7 Cohort & Firms & Largest 1,000 & Remaining & No cap & Largest 42\% & S\&P 500 & Median filings & Median chunks \\ 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 2024 & 2{,}374 & 1{,}000 & 1{,}345 & 29 & 984 & 487 & 14 & 303 \\ 23 2024 & 2{,}374 & 1{,}000 & 1{,}345 & 29 & 984 & 487 & 14 & 303 \\
24 \bottomrule 24 \bottomrule
25 \end{tabular} 25 \end{tabular}
26−\begin{tablenotes}[flushleft]\footnotesize 26+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 28 \end{tablenotes}
29 \end{threeparttable}} 29 \end{threeparttable}}
modified paper/tables/tab_did_spid.tex +8 −8
@@ -1,15 +1,15 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 \begin{tabular}{lrrrr} 5 \begin{tabular}{lrrrr}
6 \toprule 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 \midrule 8 \midrule
9 \multicolumn{5}{@{}l}{\textit{Panel A: difference-in-differences with firm and year fixed effects (treatment = pre-determined 2019--21 exposure)}} \\ 9 \multicolumn{5}{@{}l}{\textit{Panel A: difference-in-differences with firm and year fixed effects (treatment = pre-determined 2019--21 exposure)}} \\
10 Treated (above-median exposure) $\times$ post & +4.71 & -- & [1.28] & -- \\ 10 Treated (above-median exposure) $\times$ post & +4.71 & -- & [1.28] & -- \\
11 Continuous exposure ($z$) $\times$ post & +2.79 & -- & [1.28] & -- \\ 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 \midrule 13 \midrule
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}} \\ 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 SPID technology projects ($z$) & +0.40 & [1.21] & [0.60] & [-0.25, +1.04] \\ 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 AI composite ($z$) & +2.00 & [5.78] & [2.24] & [+1.32, +2.68] \\ 17 AI composite ($z$) & +2.00 & [5.78] & [2.24] & [+1.32, +2.68] \\
18 AI composite $\times$ post & +1.77 & [1.63] & [0.82] & [-0.36, +3.91] \\ 18 AI composite $\times$ post & +1.77 & [1.63] & [0.82] & [-0.36, +3.91] \\
19 Post-launch cohorts & +9.54 & [9.91] & [0.85] & [+7.65, +11.43] \\ 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 \addlinespace 21 \addlinespace
22 Any AI-initiative project (0/1) & +0.73 & [0.18] & [0.07] & [-7.01, +8.46] \\ 22 Any AI-initiative project (0/1) & +0.73 & [0.18] & [0.07] & [-7.01, +8.46] \\
23 Any AI-initiative project (0/1) $\times$ post & +4.20 & [0.62] & [0.32] & [-9.00, +17.39] \\ 23 Any AI-initiative project (0/1) $\times$ post & +4.20 & [0.62] & [0.32] & [-9.00, +17.39] \\
24 AI composite ($z$) & +2.02 & [5.89] & [2.31] & [+1.34, +2.69] \\ 24 AI composite ($z$) & +2.02 & [5.89] & [2.31] & [+1.34, +2.69] \\
25 AI composite $\times$ post & +1.49 & [1.36] & [0.69] & [-0.65, +3.63] \\ 25 AI composite $\times$ post & +1.49 & [1.36] & [0.69] & [-0.65, +3.63] \\
26 Post-launch cohorts & +9.34 & [9.59] & [0.83] & [+7.43, +11.25] \\ 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 \addlinespace 28 \addlinespace
29 Any technology project (0/1) & +1.41 & [1.76] & [0.62] & [-0.16, +2.98] \\ 29 Any technology project (0/1) & +1.41 & [1.76] & [0.62] & [-0.16, +2.98] \\
30 Any technology project (0/1) $\times$ post & -4.52 & [-2.02] & [-0.89] & [-8.90, -0.14] \\ 30 Any technology project (0/1) $\times$ post & -4.52 & [-2.02] & [-0.89] & [-8.90, -0.14] \\
31 AI composite ($z$) & +1.99 & [5.74] & [2.22] & [+1.31, +2.67] \\ 31 AI composite ($z$) & +1.99 & [5.74] & [2.22] & [+1.31, +2.67] \\
32 AI composite $\times$ post & +1.75 & [1.61] & [0.82] & [-0.38, +3.88] \\ 32 AI composite $\times$ post & +1.75 & [1.61] & [0.82] & [-0.38, +3.88] \\
33 Post-launch cohorts & +10.70 & [9.49] & [0.91] & [+8.49, +12.91] \\ 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 \addlinespace 35 \addlinespace
36 \bottomrule 36 \bottomrule
37 \end{tabular} 37 \end{tabular}
38−\begin{tablenotes}[flushleft]\footnotesize 38+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 40 \end{tablenotes}
41 \end{threeparttable}} 41 \end{threeparttable}}
modified paper/tables/tab_doublesort.tex +1 −1
@@ -1,7 +1,7 @@
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). 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 % 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. 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 \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}{% 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 \begin{tabular}{lllrrrrr} 5 \begin{tabular}{lllrrrrr}
6 \toprule 6 \toprule
7 Period & Returns & Size tercile & Low AI & Mid & High AI & High$-$Low & Firm-years \\ 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 % 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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{lrrrrrrr} 5 \begin{tabular}{lrrrrrrr}
6 \toprule 6 \toprule
7 Horizon & Days & High (\%) & Low (\%) & High$-$Low (pp) & CDA $t$ & event-SD $t$ & BMP $t$ \\ 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 Non-members ($n$ = 529 + 627) & 250 & -4.07 & -18.55 & +14.48 & 1.85 & 2.25 & 4.42 \\ 25 Non-members ($n$ = 529 + 627) & 250 & -4.07 & -18.55 & +14.48 & 1.85 & 2.25 & 4.42 \\
26 \bottomrule 26 \bottomrule
27 \end{tabular} 27 \end{tabular}
28−\begin{tablenotes}[flushleft]\footnotesize 28+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 30 \end{tablenotes}
31 \end{threeparttable}} 31 \end{threeparttable}}
modified paper/tables/tab_event_cda.tex +4 −4
@@ -1,10 +1,10 @@
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). 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 % 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. 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}{% 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}{4pt} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{llrrrrrr} 5 \begin{tabular}{llrrrrrr}
6 \toprule 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 \midrule 8 \midrule
9 \multicolumn{8}{@{}l}{\textit{Panel A: one-year High$-$Low abnormal return (pp) and CDA $t$ by benchmark and sub-sample}} \\ 9 \multicolumn{8}{@{}l}{\textit{Panel A: one-year High$-$Low abnormal return (pp) and CDA $t$ by benchmark and sub-sample}} \\
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 \\ 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 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} \\ 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 \bottomrule 39 \bottomrule
40 \end{tabular} 40 \end{tabular}
41−\begin{tablenotes}[flushleft]\footnotesize 41+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 43 \end{tablenotes}
44 \end{threeparttable}} 44 \end{threeparttable}}
modified paper/tables/tab_eventtime.tex +3 −3
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 \begin{tabular}{lrrrrrr} 5 \begin{tabular}{lrrrrrr}
6 \toprule 6 \toprule
7 Outcome cohort & \multicolumn{2}{c}{Committed coding: absolute slope} & \multicolumn{2}{c}{Difference from reference} & \multicolumn{2}{c}{Trailing exposure: difference} \\ 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 2024 & +7.6 & (2.4) & +1.7 & (2.7) & +1.7 & (2.7) \\ 20 2024 & +7.6 & (2.4) & +1.7 & (2.7) & +1.7 & (2.7) \\
21 \bottomrule 21 \bottomrule
22 \end{tabular} 22 \end{tabular}
23−\begin{tablenotes}[flushleft]\footnotesize 23+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 25 \end{tablenotes}
26 \end{threeparttable}} 26 \end{threeparttable}}
modified paper/tables/tab_filing_type.tex +4 −4
@@ -1,10 +1,10 @@
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). 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 % 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. 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}{% 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}{4pt} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{lrrrrrrr} 5 \begin{tabular}{lrrrrrrr}
6 \toprule 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 \midrule 8 \midrule
9 \multicolumn{8}{@{}l}{\textit{Panel A: one form at a time}} \\ 9 \multicolumn{8}{@{}l}{\textit{Panel A: one form at a time}} \\
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] \\ 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 \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} \\ 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 \bottomrule 24 \bottomrule
25 \end{tabular} 25 \end{tabular}
26−\begin{tablenotes}[flushleft]\footnotesize 26+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 28 \end{tablenotes}
29 \end{threeparttable}} 29 \end{threeparttable}}
modified paper/tables/tab_fm.tex +3 −3
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 \begin{tabular}{llrrrr} 5 \begin{tabular}{llrrrr}
6 \toprule 6 \toprule
7 Regressor & Returns & Slope (pp/SD) & [NW $t$] & [plain $t$] & 95\% CI \\ 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 Cohorts & & 15 & \multicolumn{3}{l}{mean cross-section 1{,}795 firms} \\ 52 Cohorts & & 15 & \multicolumn{3}{l}{mean cross-section 1{,}795 firms} \\
53 \bottomrule 53 \bottomrule
54 \end{tabular} 54 \end{tabular}
55−\begin{tablenotes}[flushleft]\footnotesize 55+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 57 \end{tablenotes}
58 \end{threeparttable}} 58 \end{threeparttable}}
modified paper/tables/tab_fm_both.tex +3 −3
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{llrrrrrrr} 5 \begin{tabular}{llrrrrrrr}
6 \toprule 6 \toprule
7 Regressor & Returns & \multicolumn{4}{c}{Russell 3000} & \multicolumn{3}{c}{S\&P 500 members} \\ 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 Mean firms per cross-section & & 1{,}795 & & & & 448 & & \\ 42 Mean firms per cross-section & & 1{,}795 & & & & 448 & & \\
43 \bottomrule 43 \bottomrule
44 \end{tabular} 44 \end{tabular}
45−\begin{tablenotes}[flushleft]\footnotesize 45+\begin{tablenotes}[flushleft]\scriptsize
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}. 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 \end{tablenotes} 47 \end{tablenotes}
48 \end{threeparttable}} 48 \end{threeparttable}}
modified paper/tables/tab_groups.tex +5 −5
@@ -1,12 +1,12 @@
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). 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 % 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. 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 \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}{% 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 \begin{tabular}{llrrrrrrrr} 5 \begin{tabular}{llrrrrrrrr}
6 \toprule 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 \midrule 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 & raw & & +5.3 & [2.06] & [-0.6, +11.2] & +3.1 & +13.8 & +17.5 / +20.4 / +3.4 & +3.4 [1.19] \\ 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 \addlinespace 11 \addlinespace
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] \\ 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 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] \\ 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 & raw & & +5.1 & [1.91] & [-1.1, +11.3] & +4.8 & +6.4 & +15.7 / +1.4 / +2.2 & +2.4 [0.36] \\ 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 \addlinespace 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 & raw & & +6.6 & [2.54] & [+1.1, +12.2] & +5.8 & +9.9 & -- & -- \\ 28 & raw & & +6.6 & [2.54] & [+1.1, +12.2] & +5.8 & +9.9 & -- & -- \\
29 \bottomrule 29 \bottomrule
30 \end{tabular} 30 \end{tabular}
31−\begin{tablenotes}[flushleft]\footnotesize 31+\begin{tablenotes}[flushleft]\scriptsize
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}. 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 \end{tablenotes} 33 \end{tablenotes}
34 \end{threeparttable}} 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 \multicolumn{6}{@{}l}{\textit{Panel B: headline statistics before (committed v2.0, HEAD 3cf7560) and after the corrections}} \\ 25 \multicolumn{6}{@{}l}{\textit{Panel B: headline statistics before (committed v2.0, HEAD 3cf7560) and after the corrections}} \\
26 Statistic & \multicolumn{2}{l}{BEFORE (committed v2.0)} & \multicolumn{3}{l}{AFTER (rebuilt panel): raw $\rightarrow$ winsorized / robust} \\ 26 Statistic & \multicolumn{2}{l}{BEFORE (committed v2.0)} & \multicolumn{3}{l}{AFTER (rebuilt panel): raw $\rightarrow$ winsorized / robust} \\
27 \midrule 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} \\ 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.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]} \\ 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.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)} \\ 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.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} \\ 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.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]} \\ 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.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]} \\ 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.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]} \\ 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.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]} \\ 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.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} \\ 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.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]} \\ 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.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} \\ 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.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} \\ 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.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]} \\ 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.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]} \\ 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.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]} \\ 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 \bottomrule 43 \bottomrule
44 \end{tabular} 44 \end{tabular}
45−\begin{tablenotes}[flushleft]\footnotesize 45+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 47 \end{tablenotes}
48 \end{threeparttable}} 48 \end{threeparttable}}
modified paper/tables/tab_mht.tex +8 −8
@@ -1,10 +1,10 @@
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). 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 % 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. 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}{% 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}{4pt} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{lrrrrrrr} 5 \begin{tabular}{lrrrrrrr}
6 \toprule 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 \midrule 8 \midrule
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 \\ 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 \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 \\ 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 \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) \\ 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 \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 & -- & -- & -- \\ 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 \midrule 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} \\ 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.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\%} \\ 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.6\textwidth}}{Specification curve: median spread (pp) and interquartile range} & \multicolumn{7}{l}{+3.9 [+0.7, +8.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.6\textwidth}}{Statistics meeting the Harvey--Liu--Zhu $|t| > 3$ hurdle across the cohort families} & \multicolumn{7}{l}{1 of 57} \\ 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 \bottomrule 23 \bottomrule
24 \end{tabular} 24 \end{tabular}
25−\begin{tablenotes}[flushleft]\footnotesize 25+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 27 \end{tablenotes}
28 \end{threeparttable}} 28 \end{threeparttable}}
modified paper/tables/tab_mht_full_a.tex +2 −2
@@ -1,7 +1,7 @@
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). 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 % 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. 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 \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}{% 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 \begin{tabular}{lrrrrr} 5 \begin{tabular}{lrrrrr}
6 \toprule 6 \toprule
7 Member & $t$ & $p$ & Holm & BH & Romano--Wolf \\ 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 \addlinespace 37 \addlinespace
38 \bottomrule 38 \bottomrule
39 \end{tabular} 39 \end{tabular}
40−\begin{tablenotes}[flushleft]\footnotesize 40+\begin{tablenotes}[flushleft]\scriptsize
41 \item \emph{Notes:} Winsorized returns throughout. Source: results/r3k\_v2/results2.json (mht). 41 \item \emph{Notes:} Winsorized returns throughout. Source: results/r3k\_v2/results2.json (mht).
42 \end{tablenotes} 42 \end{tablenotes}
43 \end{threeparttable}} 43 \end{threeparttable}}
modified paper/tables/tab_mht_full_b.tex +2 −2
@@ -1,7 +1,7 @@
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). 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 % 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. 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 \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}{% 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 \begin{tabular}{lrrrrr} 5 \begin{tabular}{lrrrrr}
6 \toprule 6 \toprule
7 Member & $t$ & $p$ & Holm & BH & Romano--Wolf \\ 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 2022 (+2.6 pp) & 0.37 & 0.722 & -- & -- & 0.906 \\ 57 2022 (+2.6 pp) & 0.37 & 0.722 & -- & -- & 0.906 \\
58 \bottomrule 58 \bottomrule
59 \end{tabular} 59 \end{tabular}
60−\begin{tablenotes}[flushleft]\footnotesize 60+\begin{tablenotes}[flushleft]\scriptsize
61 \item \emph{Notes:} Winsorized returns throughout. Source: results/r3k\_v2/results2.json (mht). 61 \item \emph{Notes:} Winsorized returns throughout. Source: results/r3k\_v2/results2.json (mht).
62 \end{tablenotes} 62 \end{tablenotes}
63 \end{threeparttable}} 63 \end{threeparttable}}
modified paper/tables/tab_panel.tex +3 −3
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 \begin{tabular}{lrrrrrrrr} 5 \begin{tabular}{lrrrrrrrr}
6 \toprule 6 \toprule
7 & (1) & (2) & (3) & (4) & (5) & (6) & (7) & (8) \\ 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 Within $R^2$ & 0.0000 & 0.0537 & 0.0537 & 0.0540 & 0.0544 & 0.0537 & 0.0537 & 0.0537 \\ 30 Within $R^2$ & 0.0000 & 0.0537 & 0.0537 & 0.0540 & 0.0544 & 0.0537 & 0.0537 & 0.0537 \\
31 \bottomrule 31 \bottomrule
32 \end{tabular} 32 \end{tabular}
33−\begin{tablenotes}[flushleft]\footnotesize 33+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 35 \end{tablenotes}
36 \end{threeparttable}} 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 Macro risk & -4.4 & [-11.0, +2.2] & -1.9 & -14.5 & -3.49 & [-3.65] & [-0.94] & 0.602 & 0.82 / 1.00 \\ 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 \bottomrule 17 \bottomrule
18 \end{tabular} 18 \end{tabular}
19−\begin{tablenotes}[flushleft]\footnotesize 19+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 21 \end{tablenotes}
22 \end{threeparttable}} 22 \end{threeparttable}}
modified paper/tables/tab_prepost_both.tex +4 −4
@@ -1,10 +1,10 @@
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). 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 % 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. 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 \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}{% 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 \begin{tabular}{lllrrrrr} 5 \begin{tabular}{lllrrrrr}
6 \toprule 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 \midrule 8 \midrule
9 \multicolumn{8}{@{}l}{\textit{Panel A: cohort-level spreads (equal-weighted Q5$-$Q1, pp per year)}} \\ 9 \multicolumn{8}{@{}l}{\textit{Panel A: cohort-level spreads (equal-weighted Q5$-$Q1, pp per year)}} \\
10 AI adoption & Russell 3000 & wins. & +4.1 & [-1.0, +9.2] & +2.8 & [-18.2, +23.8] & -5.5 / +2.6 / +11.4 \\ 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 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 \\ 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 & S\&P 500 & wins. & +4.2 & [-1.7, +10.0] & +11.5 & [-31.7, +54.7] & +12.9 / -6.6 / +28.1 \\ 27 & S\&P 500 & wins. & +4.2 & [-1.7, +10.0] & +11.5 & [-31.7, +54.7] & +12.9 / -6.6 / +28.1 \\
28 \addlinespace 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 & S\&P 500 & wins. & +2.5 & [-1.1, +6.0] & -7.3 & [-64.2, +49.6] & +7.5 / +4.3 / -33.7 \\ 30 & S\&P 500 & wins. & +2.5 & [-1.1, +6.0] & -7.3 & [-64.2, +49.6] & +7.5 / +4.3 / -33.7 \\
31 \addlinespace 31 \addlinespace
32 \midrule 32 \midrule
@@ -42,7 +42,7 @@ Post $-$ pre (hi $\times$ post) & Russell 3000 & wins. & +2.4 & [0.78] & [0.36]
42 Post 2022--23 only, Q5 vs Q1 & Russell 3000 & wins. & -0.9 & [-0.36] & [-0.23] & 0.777 & $N$ = 1{,}834 \\ 42 Post 2022--23 only, Q5 vs Q1 & Russell 3000 & wins. & -0.9 & [-0.36] & [-0.23] & 0.777 & $N$ = 1{,}834 \\
43 \bottomrule 43 \bottomrule
44 \end{tabular} 44 \end{tabular}
45−\begin{tablenotes}[flushleft]\footnotesize 45+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 47 \end{tablenotes}
48 \end{threeparttable}} 48 \end{threeparttable}}
modified paper/tables/tab_reversal.tex +14 −14
@@ -1,29 +1,29 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 \begin{tabular}{lrrrr} 5 \begin{tabular}{lrrrr}
6 \toprule 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 \midrule 8 \midrule
9 \multicolumn{5}{@{}l}{\textit{Panel A: reversal tests (AI-washing alternative)}} \\ 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 \\ 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−same, months 13--24 (wins.) & +1.4 & [0.62] [0.55] & [-4.0, +6.7] & 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−same, months 1--24 (raw) & +4.8 & [0.89] [0.91] & [-6.5, +16.1] & 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−Composite Q5$-$Q1, months 13--24 (wins., cohorts $\leq$ 2023) & +5.4 & [3.13] [2.74] & [+1.1, +9.7] & 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−same, raw & +8.2 & [3.09] [3.09] & [+2.5, +13.9] & 14 \\ 14+\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{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 \\ 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−same, post-launch cohorts 2022--23 (wins.) & +9.1 & -- [1.86] & [-53.1, +71.4] & 2 \\ 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 Composite Q5$-$Q1, months 1--24 (wins.) & +10.0 & [2.50] [2.48] & [+1.3, +18.8] & 14 \\ 17 Composite Q5$-$Q1, months 1--24 (wins.) & +10.0 & [2.50] [2.48] & [+1.3, +18.8] & 14 \\
18 \midrule 18 \midrule
19 \multicolumn{5}{@{}l}{\textit{Panel B: cybersecurity vocabulary}} \\ 19 \multicolumn{5}{@{}l}{\textit{Panel B: cybersecurity vocabulary}} \\
20−Correlation of the cybersecurity and composite $z$-scores & 0.40 & & & \\ 20+\multicolumn{1}{>{\raggedright\arraybackslash}p{0.42\textwidth}}{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 \\ 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 Cybersecurity Q5$-$Q1, full (wins.) [pre / post: +0.2 / +8.9] & +1.9 & [1.02] & [-1.5, +5.3] & 15 \\ 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 \bottomrule 24 \bottomrule
25 \end{tabular} 25 \end{tabular}
26−\begin{tablenotes}[flushleft]\footnotesize 26+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 28 \end{tablenotes}
29 \end{threeparttable}} 29 \end{threeparttable}}
modified paper/tables/tab_robust.tex +6 −6
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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}{4pt} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{lrrrrrrr} 5 \begin{tabular}{lrrrrrrr}
6 \toprule 6 \toprule
7 Specification & Pre, wins. & [NW $t$] & 95\% CI & Post, wins. & 95\% CI & Pre, raw & Post, raw \\ 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 Baseline, strict 12 valid months & -- & -- & -- & -- & -- & +4.8 & +8.5 \\ 10 Baseline, strict 12 valid months & -- & -- & -- & -- & -- & +4.8 & +8.5 \\
11 Baseline, median spread & -- & -- & -- & -- & -- & +1.4 & -2.7 \\ 11 Baseline, median spread & -- & -- & -- & -- & -- & +1.4 & -2.7 \\
12 Sector-neutral composite & +1.8 & [2.04] & [-0.7, +4.4] & -0.5 & [-8.8, +7.9] & +2.1 & +1.9 \\ 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 Excluding the Magnificent 7 & +3.1 & [1.49] & [-1.8, +8.0] & +6.0 & [-25.8, +37.8] & +4.6 & +8.4 \\ 14 Excluding the Magnificent 7 & +3.1 & [1.49] & [-1.8, +8.0] & +6.0 & [-25.8, +37.8] & +4.6 & +8.4 \\
15 Excluding the 500 largest firms & +3.8 & [1.37] & [-2.2, +9.7] & +4.5 & [-28.4, +37.4] & +5.9 & +7.2 \\ 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 Signal: unweighted chunk mean & +3.1 & [1.51] & [-1.9, +8.2] & +5.6 & [-26.0, +37.1] & +4.5 & +7.9 \\ 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 AI disruption-risk facet & +5.0 & [2.01] & [-2.8, +12.9] & +16.2 & [-43.4, +75.9] & +9.6 & +23.2 \\ 22 AI disruption-risk facet & +5.0 & [2.01] & [-2.8, +12.9] & +16.2 & [-43.4, +75.9] & +9.6 & +23.2 \\
23 Equal-form composite & +4.3 & [1.40] & [-2.8, +11.4] & +12.2 & [-27.8, +52.2] & +6.3 & +16.5 \\ 23 Equal-form composite & +4.3 & [1.40] & [-2.8, +11.4] & +12.2 & [-27.8, +52.2] & +6.3 & +16.5 \\
24 10-K composite & +4.9 & [1.36] & [-3.1, +12.9] & +11.6 & [-23.0, +46.2] & +6.8 & +16.7 \\ 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 Seasoned firms (listed before July 2009) & +3.2 & [1.63] & [-2.1, +8.6] & +8.3 & [-33.5, +50.0] & +4.2 & +12.5 \\ 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 Listed $\geq$ 36 months at formation & +4.4 & [2.24] & [-0.9, +9.7] & +6.0 & [-21.4, +33.5] & +6.1 & +9.3 \\ 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 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 \\ 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 Size-group $\times$ cohort demeaned returns & +4.3 & [1.71] & [-1.0, +9.5] & +8.5 & [-30.3, +47.3] & -- & -- \\ 29 Size-group $\times$ cohort demeaned returns & +4.3 & [1.71] & [-1.0, +9.5] & +8.5 & [-30.3, +47.3] & -- & -- \\
30 Below-median forward volatility & +3.1 & [2.16] & [-1.9, +8.2] & -0.2 & [-13.5, +13.0] & -- & -- \\ 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 \bottomrule 32 \bottomrule
33 \end{tabular} 33 \end{tabular}
34−\begin{tablenotes}[flushleft]\footnotesize 34+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 36 \end{tablenotes}
37 \end{threeparttable}} 37 \end{threeparttable}}
modified paper/tables/tab_sector_tech.tex +14 −14
@@ -1,31 +1,31 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{3pt}
5 \begin{tabular}{llrrr} 5 \begin{tabular}{llrrr}
6 \toprule 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 \midrule 8 \midrule
9 \multicolumn{5}{@{}l}{\textit{Panel A: three within-sector estimators of the composite premium (pp per SD or pp)}} \\ 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] \\ 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−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] \\ 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−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] \\ 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−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] \\ 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 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] \\ 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 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] \\ 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 \addlinespace 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] \\ 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−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] \\ 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−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] \\ 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−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] \\ 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 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; --] \\ 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 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; --] \\ 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 \addlinespace 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 & raw & +2.1 [2.79] & +1.9 [0.89] & +2.1 [2.98] \\ 25 & raw & +2.1 [2.79] & +1.9 [0.89] & +2.1 [2.98] \\
26 & median & & & +1.0 [0.98] \\ 26 & median & & & +1.0 [0.98] \\
27 & wins., ex-Energy & & & +1.3 [1.26] \\ 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 \midrule 29 \midrule
30 \multicolumn{5}{@{}l}{\textit{Panel B: monthly composite long--short and the TECH factor}} \\ 30 \multicolumn{5}{@{}l}{\textit{Panel B: monthly composite long--short and the TECH factor}} \\
31 Mean (\%/yr) & monthly & +3.76 & +2.10 & +3.43 \\ 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 Months & & 144 & 36 & 180 \\ 37 Months & & 144 & 36 & 180 \\
38 \bottomrule 38 \bottomrule
39 \end{tabular} 39 \end{tabular}
40−\begin{tablenotes}[flushleft]\footnotesize 40+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 42 \end{tablenotes}
43 \end{threeparttable}} 43 \end{threeparttable}}
modified paper/tables/tab_sorts.tex +3 −3
@@ -1,7 +1,7 @@
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). 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 % 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. 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 \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}{% 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 \begin{tabular}{llrrrrrrrrr} 5 \begin{tabular}{llrrrrrrrrr}
6 \toprule 6 \toprule
7 Signal & Portfolio & Q1 (low) & Q2 & Q3 & Q4 & Q5 (high) & Q5$-$Q1 & NW $t$ & plain $t$ & 95\% CI \\ 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 & VW, wins. & +11.7 & +12.2 & +12.8 & +13.2 & +18.6 & +6.9 & 1.99 & 1.91 & [-0.8, +14.7] \\ 48 & VW, wins. & +11.7 & +12.2 & +12.8 & +13.2 & +18.6 & +6.9 & 1.99 & 1.91 & [-0.8, +14.7] \\
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] \\ 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 \addlinespace 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 & EW, raw & +17.3 & +19.3 & +21.7 & +20.9 & +21.5 & +4.1 & 1.80 & 1.08 & [-4.1, +12.3] \\ 52 & EW, raw & +17.3 & +19.3 & +21.7 & +20.9 & +21.5 & +4.1 & 1.80 & 1.08 & [-4.1, +12.3] \\
53 & EW, median & +12.6 & +11.9 & +11.1 & +10.3 & +9.6 & -3.0 & -1.68 & -1.81 & [-6.5, +0.6] \\ 53 & EW, median & +12.6 & +11.9 & +11.1 & +10.3 & +9.6 & -3.0 & -1.68 & -1.81 & [-6.5, +0.6] \\
54 & VW, wins. & +15.3 & +15.9 & +15.9 & +14.4 & +13.8 & -1.6 & -0.63 & -0.44 & [-9.1, +6.0] \\ 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 \addlinespace 56 \addlinespace
57 \bottomrule 57 \bottomrule
58 \end{tabular} 58 \end{tabular}
59−\begin{tablenotes}[flushleft]\footnotesize 59+\begin{tablenotes}[flushleft]\scriptsize
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\%. 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 \end{tablenotes} 61 \end{tablenotes}
62 \end{threeparttable}} 62 \end{threeparttable}}
modified paper/tables/tab_sorts_both.tex +2 −2
@@ -1,7 +1,7 @@
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). 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 % 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. 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 \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}{% 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 \begin{tabular}{llrrrrrrrrr} 5 \begin{tabular}{llrrrrrrrrr}
6 \toprule 6 \toprule
7 Signal & Portfolio & Q1 (low) & Q2 & Q3 & Q4 & Q5 (high) & Q5$-$Q1 & NW $t$ & plain $t$ & 95\% CI \\ 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 & VW, wins. & +12.9 & +13.3 & +12.2 & +16.1 & +20.1 & +7.2 & 2.36 & 1.83 & [-1.2, +15.5] \\ 35 & VW, wins. & +12.9 & +13.3 & +12.2 & +16.1 & +20.1 & +7.2 & 2.36 & 1.83 & [-1.2, +15.5] \\
36 \bottomrule 36 \bottomrule
37 \end{tabular} 37 \end{tabular}
38−\begin{tablenotes}[flushleft]\footnotesize 38+\begin{tablenotes}[flushleft]\scriptsize
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}. 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 \end{tablenotes} 40 \end{tablenotes}
41 \end{threeparttable}} 41 \end{threeparttable}}
modified paper/tables/tab_spid_binary.tex +10 −10
@@ -1,31 +1,31 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{2.5pt}
5 \begin{tabular}{llrrrrr} 5 \begin{tabular}{llrrrrr}
6 \toprule 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 \midrule 8 \midrule
9 \multicolumn{7}{@{}l}{\textit{Any AI-initiative project vs none}} \\ 9 \multicolumn{7}{@{}l}{\textit{Any AI-initiative project vs none}} \\
10 Cohort level: mean of cohort differences & full & +1.5 & [0.33] & [-9.2, +12.2] & 12.7 & 8 cohorts \\ 10 Cohort level: mean of cohort differences & full & +1.5 & [0.33] & [-9.2, +12.2] & 12.7 & 8 cohorts \\
11 & pre & -0.9 & [-0.19] & [-14.4, +12.5] & 13.6 & 5 cohorts \\ 11 & pre & -0.9 & [-0.19] & [-14.4, +12.5] & 13.6 & 5 cohorts \\
12 & post & +5.5 & [0.55] & [-37.6, +48.7] & 28.1 & 3 cohorts \\ 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 \\ 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 treated / 20{,}080 \\ 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 treated / 6{,}853 \\ 15+ & post & +6.6 & [1.19] & [-4.3, +17.6] & 15.7 & 288 / 6{,}853 \\
16 \addlinespace 16 \addlinespace
17 \multicolumn{7}{@{}l}{\textit{Any technology project vs none}} \\ 17 \multicolumn{7}{@{}l}{\textit{Any technology project vs none}} \\
18 Cohort level: mean of cohort differences & full & -0.5 & [-0.40] & [-3.1, +2.1] & 3.5 & 15 cohorts \\ 18 Cohort level: mean of cohort differences & full & -0.5 & [-0.40] & [-3.1, +2.1] & 3.5 & 15 cohorts \\
19 & pre & +0.0 & [0.04] & [-2.4, +2.4] & 3.0 & 12 cohorts \\ 19 & pre & +0.0 & [0.04] & [-2.4, +2.4] & 3.0 & 12 cohorts \\
20 & post & -2.6 & [-0.54] & [-23.8, +18.5] & 13.8 & 3 cohorts \\ 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 \\ 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 treated / 20{,}080 \\ 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 treated / 6{,}853 \\ 23+ & post & -1.9 & [-0.93] & [-6.0, +2.1] & 5.8 & 1{,}861 / 6{,}853 \\
24 \addlinespace 24 \addlinespace
25 T3 $-$ T1 of project counts among firms with $>$ 0 technology projects & full & +1.5 & [0.70] & [-3.0, +6.0] & -- & 15 cohorts \\ 25 T3 $-$ T1 of project counts among firms with $>$ 0 technology projects & full & +1.5 & [0.70] & [-3.0, +6.0] & -- & 15 cohorts \\
26 \bottomrule 26 \bottomrule
27 \end{tabular} 27 \end{tabular}
28−\begin{tablenotes}[flushleft]\footnotesize 28+\begin{tablenotes}[flushleft]\scriptsize
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). 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 \end{tablenotes} 30 \end{tablenotes}
31 \end{threeparttable}} 31 \end{threeparttable}}
modified paper/tables/tab_summary.tex +3 −3
@@ -1,7 +1,7 @@
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). 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 % 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. 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}{% 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} 4+\begin{threeparttable}\setlength{\tabcolsep}{4pt}
5 \begin{tabular}{lrrrrrrrr} 5 \begin{tabular}{lrrrrrrrr}
6 \toprule 6 \toprule
7 Variable & $N$ & Mean & SD & Min & P1 & Median & P99 & Max \\ 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 Text chunks per firm-year (count) & 27{,}354 & 330 & 154 & 1 & 68 & 306 & 866 & 2183 \\ 20 Text chunks per firm-year (count) & 27{,}354 & 330 & 154 & 1 & 68 & 306 & 866 & 2183 \\
21 \bottomrule 21 \bottomrule
22 \end{tabular} 22 \end{tabular}
23−\begin{tablenotes}[flushleft]\footnotesize 23+\begin{tablenotes}[flushleft]\scriptsize
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. 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 \end{tablenotes} 25 \end{tablenotes}
26 \end{threeparttable}} 26 \end{threeparttable}}
modified paper/tables/tab_topfirms.tex +2 −2
@@ -1,10 +1,10 @@
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). 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 % 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. 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 \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}{% 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 \begin{tabular}{lllrr} 5 \begin{tabular}{lllrr}
6 \toprule 6 \toprule
7−Ticker & Company & GICS sector & Mean composite ($z$) & Cohorts \\ 7+Ticker & Company & GICS sector & \makecell[b]{Mean composite \\ {($z$)}} & Cohorts \\
8 \midrule 8 \midrule
9 NET & Cloudflare Class A & Information Technology & 3.45 & 6 \\ 9 NET & Cloudflare Class A & Information Technology & 3.45 & 6 \\
10 HPE & Hewlett Packard Enterprise & Information Technology & 3.34 & 10 \\ 10 HPE & Hewlett Packard Enterprise & Information Technology & 3.34 & 10 \\
modified results/n1/corpus_macros.tex +9 −9
@@ -8,12 +8,12 @@
8 \newcommand{\mChunkWordsMedian}{512} 8 \newcommand{\mChunkWordsMedian}{512}
9 \newcommand{\mChunkWordsMean}{480} 9 \newcommand{\mChunkWordsMean}{480}
10 \newcommand{\mChunkShareFull}{84.2} 10 \newcommand{\mChunkShareFull}{84.2}
11−\newcommand{\mnFilings10K}{31{,}775} 11+\newcommand{\mnFilingsTenK}{31{,}775}
12−\newcommand{\mnParsed10K}{31{,}772} 12+\newcommand{\mnParsedTenK}{31{,}772}
13−\newcommand{\mnChunks10K}{4{,}380{,}094} 13+\newcommand{\mnChunksTenK}{4{,}380{,}094}
14−\newcommand{\mnFilings10Q}{95{,}167} 14+\newcommand{\mnFilingsTenQ}{95{,}167}
15−\newcommand{\mnParsed10Q}{95{,}155} 15+\newcommand{\mnParsedTenQ}{95{,}155}
16−\newcommand{\mnChunks10Q}{5{,}492{,}676} 16+\newcommand{\mnChunksTenQ}{5{,}492{,}676}
17−\newcommand{\mnFilings8K}{400{,}606} 17+\newcommand{\mnFilingsEightK}{400{,}606}
18−\newcommand{\mnParsed8K}{400{,}605} 18+\newcommand{\mnParsedEightK}{400{,}605}
19−\newcommand{\mnChunks8K}{848{,}120} 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 "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 " 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 "(July $Y{+}1$--June $Y{+}2$); `wins.' = 1/99 winsorized within the formation year; `median' = median spread within cohort; `raw' = unwinsorized. " 42 "(July $Y{+}1$--June $Y{+}2$); `wins.' = 1/99 winsorized within the formation year; `median' = median spread within cohort; `raw' = unwinsorized. "
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.") 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"): 44+def H(cell, maxlen=15):
45− """Write paper/tables/<name>.tex as a self-contained float. header = list of header-row strings (without the final \\\\).""" 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 hdr = "".join(h + " \\\\\n" for h in header); mid = "\\midrule\n" if header else "" 58 hdr = "".join(h + " \\\\\n" for h in header); mid = "\\midrule\n" if header else ""
47 pre = (f"\\setlength{{\\tabcolsep}}{{{colsep}}}" if colsep else "") 59 pre = (f"\\setlength{{\\tabcolsep}}{{{colsep}}}" if colsep else "")
48 out = (f"% Generated by {SCRIPT} from {sources or 'results/r3k_v2/'} -- do not edit by hand (FIRC-0002 v2.1, Stage E exhibits).\n" 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 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'])}). " 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 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. " 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 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.", 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 # ================================================================ T5 quintile sorts, both universes (main) ==== 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 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"} 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 def sort_row(S, k, l, sfx, first): 84 def sort_row(S, k, l, sfx, first):
73 key = f"{k}_{sfx}" 85 key = f"{k}_{sfx}"
@@ -88,7 +100,7 @@ table("tab_sorts_both", "tab:sortsboth", "Quintile sorts on AI language in the R
88 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. " 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 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'])}). " 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 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}}.", 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 # ================================================================ appendix: full sorts (all signals / weightings, Russell 3000) ==== 104 # ================================================================ appendix: full sorts (all signals / weightings, Russell 3000) ====
93 body = "" 105 body = ""
94 for k, l in SIGL: 106 for k, l in SIGL:
@@ -98,7 +110,7 @@ table("tab_sorts", "tab:sorts", "Quintile sorts on every signal and weighting, R
98 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).", 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 "llrrrrrrrrr", HDR5, body, 111 "llrrrrrrrrr", HDR5, body,
100 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}\\%.", 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 # ================================================================ T6 monthly long-short alphas, both universes (main) ==== 114 # ================================================================ T6 monthly long-short alphas, both universes (main) ====
103 body = "" 115 body = ""
104 for k, l in SIGL[:5]: 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 "llrrrrrrrrr", ["Signal & Universe & Months & Mean (\\%/yr) & [HAC $t$] & Sharpe & FF6 $\\alpha$ (\\%/yr) & [$t$] & Post months & Post FF6 $\\alpha$ & [$t$]"], body, 124 "llrrrrrrrrr", ["Signal & Universe & Months & Mean (\\%/yr) & [HAC $t$] & Sharpe & FF6 $\\alpha$ (\\%/yr) & [$t$] & Post months & Post FF6 $\\alpha$ & [$t$]"], body,
113 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). " 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 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}}.", 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 # ================================================================ appendix: full alphas ==== 128 # ================================================================ appendix: full alphas ====
117 body = "" 129 body = ""
118 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)")]: 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 "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.", 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 "llrrrrrrrr", ["Signal & Period & Months & Mean (\\%/yr) & [HAC $t$] & [plain $t$] & Sharpe & CAPM $\\alpha$ (\\%/yr) & FF6 $\\alpha$ (\\%/yr) & [$t$]"], body, 140 "llrrrrrrrr", ["Signal & Period & Months & Mean (\\%/yr) & [HAC $t$] & [plain $t$] & Sharpe & CAPM $\\alpha$ (\\%/yr) & FF6 $\\alpha$ (\\%/yr) & [$t$]"], body,
129 "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.", 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 # ================================================================ T8 two-way FE panel (main) ==== 143 # ================================================================ T8 two-way FE panel (main) ====
132 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$)"} 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 specs = list(PF); body = "" 145 specs = list(PF); body = ""
@@ -140,7 +152,7 @@ table("tab_panel", "tab:panel", "Two-way fixed-effects panel regressions of the
140 "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.", 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 "l" + "r" * len(specs), [" & " + " & ".join(f"({i + 1})" for i in range(len(specs)))], body, 153 "l" + "r" * len(specs), [" & " + " & ".join(f"({i + 1})" for i in range(len(specs)))], body,
142 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.", 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 # ================================================================ T7 Fama-MacBeth, both universes (main) ==== 156 # ================================================================ T7 Fama-MacBeth, both universes (main) ====
145 FM = R["fama_macbeth"]; FB = FM["compos"]["z_AI_COMPOS"]["fixed_b_cv05"] 157 FM = R["fama_macbeth"]; FB = FM["compos"]["z_AI_COMPOS"]["fixed_b_cv05"]
146 body = "" 158 body = ""
@@ -154,7 +166,7 @@ table("tab_fm_both", "tab:fmboth", "Fama--MacBeth regressions of the forward ret
154 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.", 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 "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, 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 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}}.", 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 # ================================================================ appendix: full FM ==== 170 # ================================================================ appendix: full FM ====
159 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)}" 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 body = "" 172 body = ""
@@ -167,7 +179,7 @@ table("tab_fm", "tab:fm", "Fama--MacBeth regressions, all specifications, Russel
167 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.", 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 "llrrrr", ["Regressor & Returns & Slope (pp/SD) & [NW $t$] & [plain $t$] & 95\\% CI"], body, 180 "llrrrr", ["Regressor & Returns & Slope (pp/SD) & [NW $t$] & [plain $t$] & 95\\% CI"], body,
169 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).", 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 # ================================================================ T9 before / after ChatGPT, both universes (main) ==== 183 # ================================================================ T9 before / after ChatGPT, both universes (main) ====
172 SP = R["subperiod_spread"]; PO = R["pooled"] 184 SP = R["subperiod_spread"]; PO = R["pooled"]
173 body = panel(8, "Panel A: cohort-level spreads (equal-weighted Q5$-$Q1, pp per year)") 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 "lllrrrrr", ["Signal & Universe & Returns & Pre Q5$-$Q1 & 95\\% CI & Post Q5$-$Q1 & 95\\% CI & Post cohorts 2022 / 2023 / 2024"], body, 200 "lllrrrrr", ["Signal & Universe & Returns & Pre Q5$-$Q1 & 95\\% CI & Post Q5$-$Q1 & 95\\% CI & Post cohorts 2022 / 2023 / 2024"], body,
189 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. " 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 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.", 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 # ================================================================ T10 cohorts (main) ==== 204 # ================================================================ T10 cohorts (main) ====
193 C, Cw, Cm = R2["cohorts"], R2["cohorts_w"], R2["cohorts_med"]; PB = R2["placebo_breaks"]; TM = RS["then_members_present"] 205 C, Cw, Cm = R2["cohorts"], R2["cohorts_w"], R2["cohorts_med"]; PB = R2["placebo_breaks"]; TM = RS["then_members_present"]
194 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" 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 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" 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 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" 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 PBw = PB["winsorized"] 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" 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"
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" 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"
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" 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"
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" 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 table("tab_cohorts", "tab:cohorts", "Cohort-by-cohort spreads of the AI composite and tests of a 2022 break, Russell~3000.", 217 table("tab_cohorts", "tab:cohorts", "Cohort-by-cohort spreads of the AI composite and tests of a 2022 break, Russell~3000.",
206 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$).", 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 "lrrrl", [], body, 219 "lrrrl", [], body,
208 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']}. " 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 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.", 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 # ================================================================ T11 size groups (main) ==== 223 # ================================================================ T11 size groups (main) ====
212 G = R["groups"]; sn = R["size_neutral"]; CT = R["contrasts"] 224 G = R["groups"]; sn = R["size_neutral"]; CT = R["contrasts"]
213 body = "" 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 r = G[g] 227 r = G[g]
216 for sfx, rl in [("_w", "wins."), ("", "raw")]: 228 for sfx, rl in [("_w", "wins."), ("", "raw")]:
217 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 "--" 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 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" 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 body += "\\addlinespace\n" 231 body += "\\addlinespace\n"
220 for sfx, rl in [("_w", "wins."), ("", "raw")]: 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 cl = CT["large_vs_small_w"]["hi_x_post_x_group"]; cm_ = CT["member_vs_non_w"]["hi_x_post_x_group"] 234 cl = CT["large_vs_small_w"]["hi_x_post_x_group"]; cm_ = CT["member_vs_non_w"]["hi_x_post_x_group"]
223 table("tab_groups", "tab:groups", "AI-composite spreads by size group and index membership, Russell~3000.", 235 table("tab_groups", "tab:groups", "AI-composite spreads by size group and index membership, Russell~3000.",
224 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.", 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 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. " 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 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'])}). " 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 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}}.", 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 # ================================================================ contrasts (main, new) ==== 242 # ================================================================ contrasts (main, new) ====
231 body = panel(8, "Panel A: pooled firm-level interactions (Q1/Q5 firm-years, cohort fixed effects)") 243 body = panel(8, "Panel A: pooled firm-level interactions (Q1/Q5 firm-years, cohort fixed effects)")
232 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")]: 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 body += f"\\quad $N$ = {n(c['n'])} & & & & & & & \\\\\n\\addlinespace\n" 248 body += f"\\quad $N$ = {n(c['n'])} & & & & & & & \\\\\n\\addlinespace\n"
237 body += "\\midrule\n" + panel(8, "Panel B: difference of cohort-level post $-$ pre changes, cohort bootstrap") 249 body += "\\midrule\n" + panel(8, "Panel B: difference of cohort-level post $-$ pre changes, cohort bootstrap")
238 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}}$")]: 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 table("tab_contrasts", "tab:contrasts", "Formal tests of the large-versus-small and member-versus-non-member post-launch differences.", 252 table("tab_contrasts", "tab:contrasts", "Formal tests of the large-versus-small and member-versus-non-member post-launch differences.",
241 "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).", 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 "llrrrrrr", ["Term & Returns & Coefficient (pp) & [$t$ firm] & [$t$ firm$\\times$cohort] & 95\\% CI & wild $p$ (Rad.\\ / Webb) & MDE (pp)"], body, 254 "llrrrrrr", ["Term & Returns & Coefficient (pp) & [$t$ firm] & [$t$ firm$\\times$cohort] & 95\\% CI & wild $p$ (Rad.\\ / Webb) & MDE (pp)"], body,
243 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).", 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 # ================================================================ T12 double sort (appendix) ==== 257 # ================================================================ T12 double sort (appendix) ====
246 body = "" 258 body = ""
247 for per, key in [("Pre-ChatGPT (2010--2021)", "double_sort_pre"), ("Post-ChatGPT (2022--2024)", "double_sort_post")]: 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 cells = [] 276 cells = []
265 for per in ["pre", "post", "full"]: 277 for per in ["pre", "post", "full"]:
266 x = Lc[f"fm_{samp}_{tag}_{st}_{per}"]; cells.append(f"{x['slope_pct']:+.2f} [{tv(x['t_nw'])}; {tv(x['t_plain'])}]") 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 for per_lbl, key in [("Pooled OLS, cohort FE", "year_fe"), ("Pooled OLS, sector $\\times$ cohort FE", "sector_year_fe")]: 280 for per_lbl, key in [("Pooled OLS, cohort FE", "year_fe"), ("Pooled OLS, sector $\\times$ cohort FE", "sector_year_fe")]:
269 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" 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 body += "\\addlinespace\n" 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" 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"
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") 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 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)]: 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 cells = [] 286 cells = []
275 for p_ in ["pre", "post", "full"]: 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 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).", 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 "llrrr", ["Estimator & Returns / sample & Pre (2010--21) & Post (2022--24) & Full"], body, 294 "llrrr", ["Estimator & Returns / sample & Pre (2010--21) & Post (2022--24) & Full"], body,
283 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).", 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 # ================================================================ T14 placebo factors (appendix) ==== 297 # ================================================================ T14 placebo factors (appendix) ====
286 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"])) 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 body = "" 299 body = ""
@@ -295,13 +307,13 @@ table("tab_placebo", "tab:placebo", "Placebo across eight semantic factors score
295 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"] 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 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 "--")) 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 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"]) 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 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"]) 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 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"]) 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 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"]) 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 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"]) 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 body = "".join(f"{a} & {b} & {c} & {d} & {e} & {f} & {g} & {h} \\\\\n" for a, b, c, d, e, f, g, h in rows) 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 MR = R2["mht"] 318 MR = R2["mht"]
307 table("tab_robust", "tab:robust", "Construction, horizon, benchmark, universe and survivorship checks on the composite spread, Russell~3000.", 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 "lrrrrrrr", ["Specification & Pre, wins. & [NW $t$] & 95\\% CI & Post, wins. & 95\\% CI & Pre, raw & Post, raw"], body, 321 "lrrrrrrr", ["Specification & Pre, wins. & [NW $t$] & 95\\% CI & Post, wins. & 95\\% CI & Pre, raw & Post, raw"], body,
310 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}}). " 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 "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).", 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 # ================================================================ T18 filing type (appendix) ==== 325 # ================================================================ T18 filing type (appendix) ====
314 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"] 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 body = panel(8, "Panel A: one form at a time") 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 "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.", 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 "lrrrrrrr", ["Signal built from & Firm-years covered & Corr.\\ with baseline & Full Q5$-$Q1 & 95\\% CI & Pre & Post & FM slope (pp/SD)"], body, 340 "lrrrrrrr", ["Signal built from & Firm-years covered & Corr.\\ with baseline & Full Q5$-$Q1 & 95\\% CI & Pre & Post & FM slope (pp/SD)"], body,
329 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).", 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 # ================================================================ T15 event study (main) ==== 343 # ================================================================ T15 event study (main) ====
332 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)")] 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 body = panel(8, "Panel A: full sample by horizon (day 0 = 1 December 2022)") 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 "lrrrrrrr", ["Horizon & Days & High (\\%) & Low (\\%) & High$-$Low (pp) & CDA $t$ & event-SD $t$ & BMP $t$"], body, 356 "lrrrrrrr", ["Horizon & Days & High (\\%) & Low (\\%) & High$-$Low (pp) & CDA $t$ & event-SD $t$ & BMP $t$"], body,
345 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}. " 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 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.", 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 # ================================================================ T16 event CDA by benchmark + placebo launches (main) ==== 360 # ================================================================ T16 event CDA by benchmark + placebo launches (main) ====
349 body = panel(8, "Panel A: one-year High$-$Low abnormal return (pp) and CDA $t$ by benchmark and sub-sample") 361 body = panel(8, "Panel A: one-year High$-$Low abnormal return (pp) and CDA $t$ by benchmark and sub-sample")
350 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)")]: 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 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).", 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 "llrrrrrr", ["Benchmark & Statistic & Full & Largest 1,000 & Remaining & S\\&P 500 & Non-S\\&P & Within-size large / small"], body, 378 "llrrrrrr", ["Benchmark & Statistic & Full & Largest 1,000 & Remaining & S\\&P 500 & Non-S\\&P & Within-size large / small"], body,
367 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.", 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 # ================================================================ T17 DiD + SPID (main) ==== 381 # ================================================================ T17 DiD + SPID (main) ====
370 Dd = R2["did"]; Pp = R2["spid"] 382 Dd = R2["did"]; Pp = R2["spid"]
371 body = panel(5, "Panel A: difference-in-differences with firm and year fixed effects (treatment = pre-determined 2019--21 exposure)") 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 body += panel(5, "Panel B: pooled regressions of the forward return on the SPID project signal, the composite and their post-launch interactions") 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 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)")]: 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 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")]: 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 c = Pp[k]["terms"].get(v) 388 c = Pp[k]["terms"].get(v)
377 if c: body += f"{vl_} & {c['coef_pct']:+.2f} & {br(c['t_firm'])} & {br(c['t_twoway'])} & {cip(c['ci95_firm_pct'], 2)} \\\\\n" 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 t17b = T17["spid_tech"]["base"]["coef"]["z_SPID_TECH:post"] if T17 else None 391 t17b = T17["spid_tech"]["base"]["coef"]["z_SPID_TECH:post"] if T17 else None
380 table("tab_did_spid", "tab:didspid", "Difference-in-differences on pre-determined exposure and the SPID project signal, Russell~3000.", 392 table("tab_did_spid", "tab:didspid", "Difference-in-differences on pre-determined exposure and the SPID project signal, Russell~3000.",
381 "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.", 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 ("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") + 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 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. " 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 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."), 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 # ================================================================ SPID binary contrasts (main, new) ==== 399 # ================================================================ SPID binary contrasts (main, new) ====
388 SB = Pp["binary_contrasts"]; body = "" 400 SB = Pp["binary_contrasts"]; body = ""
389 for flag, l in [("spid_ai_any", "Any AI-initiative project vs none"), ("spid_tech_any", "Any technology project vs none")]: 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 for per in ["full", "pre", "post"]: 403 for per in ["full", "pre", "post"]:
392 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" 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 for per in ["full", "pre", "post"]: 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 body += "\\addlinespace\n" 407 body += "\\addlinespace\n"
396 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" 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 table("tab_spid_binary", "tab:spidbinary", "Binary contrasts on the SPID project signal with minimum detectable effects, Russell~3000.", 409 table("tab_spid_binary", "tab:spidbinary", "Binary contrasts on the SPID project signal with minimum detectable effects, Russell~3000.",
398 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).", 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 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).", 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 # ================================================================ reversal + cyber (appendix, new) ==== 414 # ================================================================ reversal + cyber (appendix, new) ====
403 RV = CK["reversal"]; CY = CK["cyber"]; body = panel(5, "Panel A: reversal tests (AI-washing alternative)") 415 RV = CK["reversal"]; CY = CK["cyber"]; body = panel(5, "Panel A: reversal tests (AI-washing alternative)")
404 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)")]: 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 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.)")]: 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 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") 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 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" 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 table("tab_reversal", "tab:reversal", "Reversal tests and the cybersecurity-vocabulary check, Russell~3000.", 424 table("tab_reversal", "tab:reversal", "Reversal tests and the cybersecurity-vocabulary check, Russell~3000.",
413 "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.", 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 "lrrrr", ["Test & Estimate (pp) & [NW $t$] [plain $t$] & 95\\% CI & $n$ cohorts"], body, 426 "lrrrr", ["Test & Estimate (pp) & [NW $t$] [plain $t$] & 95\\% CI & $n$ cohorts"], body,
415 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).", 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 # ================================================================ MHT summary (main) + full (appendix, two parts) ==== 429 # ================================================================ MHT summary (main) + full (appendix, two parts) ====
418 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}")] 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 body = "" 431 body = ""
@@ -426,7 +438,7 @@ LP = "Factor $\\times$ post interactions, Table~\\ref{tab:placebo} (wild $p$)";
426 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" 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 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" 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 SCv = R2["spec_curve"] 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 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}") 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 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}\\%") 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 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}]") 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 "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.", 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 "lrrrrrrr", ["Family & Size & min $p$ & min Holm & min BH & min RW & $|t| > 3$ & Headline $p$ / RW $p$"], body, 449 "lrrrrrrr", ["Family & Size & min $p$ & min Holm & min BH & min RW & $|t| > 3$ & Headline $p$ / RW $p$"], body,
438 "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).", 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 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("_", " ") 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 body = "" 453 body = ""
442 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.")]: 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 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.", 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 "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, 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 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).", 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 # ================================================================ attrition / survivorship (main, new) ==== 481 # ================================================================ attrition / survivorship (main, new) ====
470 AP = RS["attrition_pivot_absent_share"]; AE = RS["annualised_exit_rate"]; att = pd.DataFrame(RS["attrition"]); allrow = att[att.tercile == "all"].set_index("asof") 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 body = panel(7, "Panel A: share of then-IWV constituents absent from the 28 August 2025 holdings, by market-value tercile within the snapshot") 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 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" 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 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" 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 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)") 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 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}") 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 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}") 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 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") 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 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.", 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 "lrrrrrr", [], body, 496 "lrrrrrr", [], body,
485 "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.", 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 # ================================================================ construct validity (main, new) ==== 499 # ================================================================ construct validity (main, new) ====
488 if RC: 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 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")]: 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" 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"
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" 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"
493− hw = RC["horse_race_w"]; body += "\\midrule\n" + panel(9, "Panel B: Fama--MacBeth horse races (wins., pp per SD [NW $t$])") 505+ hw = RC["horse_race_w"]; body += "\\midrule\n" + panel(7, "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" 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"
495− body += "\\midrule\n" + panel(9, "Panel C: encoder truncation and lexical content of the score (node audit of the stored chunks and embeddings)") 507+ body += "\\midrule\n" + panel(7, "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" 508+ def vrow(l, v): return f"{pcell(1, 0.28, l)} & \\multicolumn{{6}}{{l}}{{{v}}} \\\\\n"
497 if TA: 509 if TA:
498 fr = TA["frames"]; fk = max(fr, key=lambda k_: fr[k_]["n"]); f0 = fr[fk] 510 fr = TA["frames"]; fk = max(fr, key=lambda k_: fr[k_]["n"]); f0 = fr[fk]
499 body += vrow("Encoder window (tokens) / chunk length (words) / median tokens per chunk", f"{TA['max_seq_length']} / 512 / {f0['tokens_median']:.0f}") 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 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}\\%") 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 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}\\%") 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 table("tab_construct_validity", "tab:constructvalidity", "Construct validity of the semantic AI score: keyword baseline, stripped anchors, sector composition and encoder truncation.", 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.", 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.",
506− "lrrrrrrrr", ["Signal & $\\rho$ with composite & Full Q5$-$Q1 & [NW $t$] [plain $t$] & 95\\% CI & Pre & Post & FM slope, wins. & FM slope, raw"], body, 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 "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.", 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 # ================================================================ corr, top firms, coverage, corpus (appendix / main) ==== 521 # ================================================================ corr, top firms, coverage, corpus (appendix / main) ====
510 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"} 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 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" 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 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.", 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 def company_case(s_): 527 def company_case(s_):
516 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()) 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 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 = "" 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 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.", 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 "lrrrrrrrr", ["Cohort & Firms & Largest 1,000 & Remaining & No cap & Largest 42\\% & S\\&P 500 & Median filings & Median chunks"], body, 536 "lrrrrrrrr", ["Cohort & Firms & Largest 1,000 & Remaining & No cap & Largest 42\\% & S\\&P 500 & Median filings & Median chunks"], body,
525 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).", 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 fl = pd.read_parquet("data/raw_russell3000/filings"); body = "" 539 fl = pd.read_parquet("data/raw_russell3000/filings"); body = ""
528 for fm_ in ["10-K", "10-Q", "8-K"]: 540 for fm_ in ["10-K", "10-Q", "8-K"]:
529 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" 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 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" 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 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" 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 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 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 if RB: 554 if RB:
543 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'])}") 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 def lr(v): return "$-\\infty$" if v is None or (isinstance(v, float) and np.isinf(v)) else f"{v:.1f}" 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 "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}.", 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 "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, 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 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).", 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 # ================================================================ appendix exhibits block + exhibit map ==== 588 # ================================================================ appendix exhibits block + exhibit map ====
577 FIGS_APPENDIX = [("fig1_quintiles", "fig:quintiles"), ("fig2_cumulative_ls", "fig:cumls"), ("fig17_attrition", "fig:attrition")] 589 FIGS_APPENDIX = [("fig1_quintiles", "fig:quintiles"), ("fig2_cumulative_ls", "fig:cumls"), ("fig17_attrition", "fig:attrition")]
578 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) 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 % by a bare \input{tables/<name>}. \ExhibitFigure{label}{caption}{content} does the same for figures. 660 % by a bare \input{tables/<name>}. \ExhibitFigure{label}{caption}{content} does the same for figures.
649 % Both wrappers record the label as placed, and \ExhibitOnce{label}{...} prints its argument only if the label has not been placed yet 661 % Both wrappers record the label as placed, and \ExhibitOnce{label}{...} prints its argument only if the label has not been placed yet
650 % (used by tables/appendix_exhibits.tex as a safety net: an exhibit placed in the sections, in either convention, is not printed twice). 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 \makeatletter 664 \makeatletter
652 \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} 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 \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} 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