diff --git a/agents/rio/posts/figures/.gitignore b/agents/rio/posts/figures/.gitignore new file mode 100644 index 000000000..40b86366c --- /dev/null +++ b/agents/rio/posts/figures/.gitignore @@ -0,0 +1,4 @@ +venv/ +__pycache__/ +data/bea_landing.html +data/bea_test.json diff --git a/agents/rio/posts/figures/chart_01_finance_share_corporate_profits.png b/agents/rio/posts/figures/chart_01_finance_share_corporate_profits.png new file mode 100644 index 000000000..dae446a08 Binary files /dev/null and b/agents/rio/posts/figures/chart_01_finance_share_corporate_profits.png differ diff --git a/agents/rio/posts/figures/chart_01_finance_share_corporate_profits.py b/agents/rio/posts/figures/chart_01_finance_share_corporate_profits.py new file mode 100644 index 000000000..8d613bd7b --- /dev/null +++ b/agents/rio/posts/figures/chart_01_finance_share_corporate_profits.py @@ -0,0 +1,111 @@ +""" +Chart 1: Finance share of US corporate profits, 1947-2025 + +Source data: FRED + - BOGZ1FA796060005A: Domestic Financial Sectors; Corporate Profits Before Tax + Excluding IVA and CCAdj (annual, millions of dollars) + - A053RC1A027NBEA: Corporate profits before tax (without IVA and CCAdj) + (annual, billions of dollars) + +Story: rose from ~7-8% in 1950 to a peak of 34.8% in 2002, stabilized at +20-25% since. Not the 40-44% figure sometimes cited (that uses a different +BEA NIPA table that includes Federal Reserve banks). +""" + +from pathlib import Path +import csv +import matplotlib.pyplot as plt +import matplotlib.ticker as mtick + +HERE = Path(__file__).parent +DATA = HERE / "data" +OUT = HERE / "chart_01_finance_share_corporate_profits.png" + + +def load_csv(name, value_in_millions=False): + """Load a FRED CSV. Returns dict[year_str -> float in billions].""" + out = {} + with open(DATA / name) as f: + r = csv.reader(f) + next(r) # header + for row in r: + try: + v = float(row[1]) + if value_in_millions: + v = v / 1000.0 + out[row[0][:4]] = v + except ValueError: + continue + return out + + +fin = load_csv("finance_corp_profits_annual.csv", value_in_millions=True) +tot = load_csv("total_corp_profits_annual.csv") + +years = sorted(set(fin) & set(tot)) +years = [y for y in years if int(y) >= 1947] + +share = [100 * fin[y] / tot[y] for y in years] +x = [int(y) for y in years] + +fig, ax = plt.subplots(figsize=(10, 5.5), dpi=200) +ax.plot(x, share, color="#1f4e79", linewidth=2.0) +ax.fill_between(x, share, alpha=0.12, color="#1f4e79") + +# Annotate peaks +peak_idx = share.index(max(share)) +ax.annotate( + f"Peak: {share[peak_idx]:.1f}% ({x[peak_idx]})", + xy=(x[peak_idx], share[peak_idx]), + xytext=(x[peak_idx] - 18, share[peak_idx] + 3), + fontsize=9, + arrowprops=dict(arrowstyle="->", color="#666", lw=0.8), +) + +# Annotate 1950 baseline +idx_1950 = x.index(1950) +ax.annotate( + f"1950: {share[idx_1950]:.1f}%", + xy=(1950, share[idx_1950]), + xytext=(1952, share[idx_1950] + 4), + fontsize=9, + arrowprops=dict(arrowstyle="->", color="#666", lw=0.8), +) + +# Annotate 2025 current +idx_last = -1 +ax.annotate( + f"2025: {share[idx_last]:.1f}%", + xy=(x[idx_last], share[idx_last]), + xytext=(x[idx_last] - 14, share[idx_last] + 4), + fontsize=9, + arrowprops=dict(arrowstyle="->", color="#666", lw=0.8), +) + +ax.set_title( + "Finance share of US corporate profits, 1947–2025", + fontsize=13, + fontweight="bold", + pad=14, +) +ax.set_xlabel("Year", fontsize=10) +ax.set_ylabel("Domestic financial sector profits as % of total", fontsize=10) +ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=0)) +ax.set_ylim(0, max(share) * 1.18) +ax.grid(alpha=0.25) +ax.spines["top"].set_visible(False) +ax.spines["right"].set_visible(False) + +source_text = ( + "Source: FRED, BOGZ1FA796060005A ÷ A053RC1A027NBEA (BEA NIPA, annual). " + "Pre-tax profits, IVA/CCAdj excluded. Computed by Rio for the Teleo Codex, May 2026." +) +fig.text(0.02, 0.01, source_text, fontsize=7, color="#555") + +plt.tight_layout(rect=[0, 0.025, 1, 1]) +plt.savefig(OUT, dpi=200, bbox_inches="tight") +print(f"wrote {OUT}") +print(f"data span: {x[0]}–{x[-1]} ({len(x)} years)") +print(f"min: {min(share):.1f}% in {x[share.index(min(share))]}") +print(f"max: {max(share):.1f}% in {x[share.index(max(share))]}") +print(f"latest ({x[-1]}): {share[-1]:.1f}%") diff --git a/agents/rio/posts/figures/chart_02_finance_share_gdp.png b/agents/rio/posts/figures/chart_02_finance_share_gdp.png new file mode 100644 index 000000000..de0e34072 Binary files /dev/null and b/agents/rio/posts/figures/chart_02_finance_share_gdp.png differ diff --git a/agents/rio/posts/figures/chart_02_finance_share_gdp.py b/agents/rio/posts/figures/chart_02_finance_share_gdp.py new file mode 100644 index 000000000..682a93b04 --- /dev/null +++ b/agents/rio/posts/figures/chart_02_finance_share_gdp.py @@ -0,0 +1,98 @@ +""" +Chart 2: Finance & insurance value added as % of US GDP, 1997-2025 + +Source: BEA Industry Economic Accounts, Table 1.10 (TVA110-A annual) +URL: https://apps.bea.gov/industry/Release/XLS/GDPxInd/ValueAdded.xlsx +Published April 9, 2026. Annual frequency. NAICS-based. + +Key story: NO COMPRESSION. Finance and insurance share of GDP went from +6.7% (1997) to 7.9% (2025), oscillating between a 5.9% GFC trough (2008) +and an 8.0% peak (2020). Every prior tech wave was supposed to compress this. +It didn't. + +Data gap: pre-1997 data uses SIC industry codes (not NAICS) and lives in +BEA historical archives. The Greenwood/Ialenti/Scharfstein 2025 Annual +Review paper and Philippon's 2015 AER paper provide the longer-run series +back to 1880. We don't reproduce their data here — we cite it in caption. +""" + +from pathlib import Path +import csv +import matplotlib.pyplot as plt +import matplotlib.ticker as mtick + +HERE = Path(__file__).parent +OUT = HERE / "chart_02_finance_share_gdp.png" + +years, vals = [], [] +with open(HERE / "data" / "bea_finance_share_gdp_1997_2025.csv") as f: + r = csv.DictReader(f) + for row in r: + years.append(int(row["year"])) + vals.append(float(row["finance_insurance_pct_gdp"])) + +fig, ax = plt.subplots(figsize=(10, 5.5), dpi=200) +ax.plot(years, vals, color="#1f4e79", linewidth=2.0, marker="o", markersize=4) +ax.fill_between(years, vals, alpha=0.12, color="#1f4e79") + +# Reference: Philippon "constant unit cost of intermediation" implies stable ~2% of GDP for the +# *unit cost* metric — different from value-added, but worth annotating as the related claim. +# The relevant horizontal here is the 1997 baseline of 6.7%. +ax.axhline(6.7, color="#888", linestyle="--", linewidth=0.8, alpha=0.6) +ax.text(1997.5, 6.55, "1997 baseline: 6.7%", fontsize=8, color="#666", va="top") + +# Annotate key points +ax.annotate( + f"GFC trough\n2008: {vals[years.index(2008)]:.1f}%", + xy=(2008, vals[years.index(2008)]), + xytext=(2003.5, 5.4), + fontsize=8, + arrowprops=dict(arrowstyle="->", color="#666", lw=0.6), +) + +peak_idx = vals.index(max(vals)) +ax.annotate( + f"Peak\n{years[peak_idx]}: {vals[peak_idx]:.1f}%", + xy=(years[peak_idx], vals[peak_idx]), + xytext=(years[peak_idx] - 4, vals[peak_idx] + 0.5), + fontsize=8, + arrowprops=dict(arrowstyle="->", color="#666", lw=0.6), +) + +ax.annotate( + f"2025: {vals[-1]:.1f}%", + xy=(years[-1], vals[-1]), + xytext=(years[-1] - 5, vals[-1] - 0.5), + fontsize=8, + arrowprops=dict(arrowstyle="->", color="#666", lw=0.6), +) + +ax.set_title( + "Finance & insurance value added as % of US GDP, 1997–2025", + fontsize=13, + fontweight="bold", + pad=14, +) +ax.set_xlabel("Year", fontsize=10) +ax.set_ylabel("Finance & insurance value added / GDP", fontsize=10) +ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=1)) +ax.set_ylim(5.0, 9.0) +ax.set_xlim(1996, 2026) +ax.grid(alpha=0.25) +ax.spines["top"].set_visible(False) +ax.spines["right"].set_visible(False) + +caption = ( + "Source: BEA Industry Economic Accounts, Table 1.10 (Value Added as % of GDP), April 2026. NAICS-based.\n" + "Pre-1997 series exists in Philippon (AER 2015) and Greenwood/Ialenti/Scharfstein (Annual Review of\n" + "Financial Economics 2025); these show finance share rose from ~2.8% in 1950 to current levels." +) +fig.text(0.02, 0.005, caption, fontsize=7, color="#555") + +plt.tight_layout(rect=[0, 0.045, 1, 1]) +plt.savefig(OUT, dpi=200, bbox_inches="tight") +print(f"wrote {OUT}") +print(f"data span: {years[0]}–{years[-1]} ({len(years)} years)") +print(f"min: {min(vals)}% in {years[vals.index(min(vals))]}") +print(f"max: {max(vals)}% in {years[vals.index(max(vals))]}") +print(f"latest: {vals[-1]}% ({years[-1]})") diff --git a/agents/rio/posts/figures/chart_03_hyperscaler_capex.png b/agents/rio/posts/figures/chart_03_hyperscaler_capex.png new file mode 100644 index 000000000..bb7e02b05 Binary files /dev/null and b/agents/rio/posts/figures/chart_03_hyperscaler_capex.png differ diff --git a/agents/rio/posts/figures/chart_03_hyperscaler_capex.py b/agents/rio/posts/figures/chart_03_hyperscaler_capex.py new file mode 100644 index 000000000..c4a1dc46f --- /dev/null +++ b/agents/rio/posts/figures/chart_03_hyperscaler_capex.py @@ -0,0 +1,86 @@ +""" +Chart 3: Hyperscaler capex trajectory 2023-2026 + +Sources (all from 10-K filings, earnings transcripts, and consolidated reporting): + - 2023 actuals: Platformonomics 2024 retrospective (implied from 62% YoY growth) + - 2024 actuals: Platformonomics Cloud Table Stakes 2024 Retrospective (Feb 2025) + - 2025 actuals: Companies' Q4 2025 earnings reports (Jan-Feb 2026) + - 2026 guidance: Companies' Q1 2026 earnings reports (Apr-May 2026) + +Notes / data gaps: + - Microsoft reports fiscal-year (July-June); we use calendar-year approximation + - Apple and Oracle excluded (different infrastructure model, smaller scale) + - 2026 numbers are guidance, not actuals; revisable each quarter + - Numbers represent total company capex, ~75% of which is AI infrastructure + per Q1 2026 commentary (CNBC, Feb 2026) +""" + +from pathlib import Path +import matplotlib.pyplot as plt +import numpy as np + +HERE = Path(__file__).parent +OUT = HERE / "chart_03_hyperscaler_capex.png" + +years = [2023, 2024, 2025, 2026] +amazon = [48, 83.9, 125, 200] +microsoft = [41, 75.6, 95, 190] +alphabet = [32, 52.5, 92, 185] +meta = [28, 39.2, 72, 135] + +companies = [ + ("Amazon", amazon, "#FF9900"), + ("Microsoft", microsoft, "#0078D4"), + ("Alphabet", alphabet, "#34A853"), + ("Meta", meta, "#1877F2"), +] + +fig, ax = plt.subplots(figsize=(11, 6), dpi=200) +x = np.arange(len(years)) +width = 0.20 + +for i, (name, vals, color) in enumerate(companies): + bars = ax.bar(x + (i - 1.5) * width, vals, width, label=name, color=color, edgecolor="white") + for bar, v in zip(bars, vals): + ax.text(bar.get_x() + bar.get_width()/2, v + 4, f"${v:.0f}B", + ha="center", va="bottom", fontsize=8, color="#333") + +totals = [a+b+c+d for a,b,c,d in zip(amazon, microsoft, alphabet, meta)] +for xi, t in zip(x, totals): + ax.text(xi, max(amazon[x.tolist().index(xi)], microsoft[x.tolist().index(xi)], + alphabet[x.tolist().index(xi)], meta[x.tolist().index(xi)]) + 22, + f"Total: ${t:.0f}B", ha="center", va="bottom", fontsize=10, + fontweight="bold", color="#333", + bbox=dict(boxstyle="round,pad=0.3", fc="#f5f5f5", ec="#aaa", lw=0.5)) + +# Mark 2026 as guidance +ax.annotate("Guidance\n(forward)", xy=(x[3], 215), xytext=(x[3], 252), + fontsize=9, color="#a33", ha="center", style="italic") + +# Title and labels +ax.set_title("Hyperscaler capex 2023–2026: tripled in two years", + fontsize=14, fontweight="bold", pad=14) +ax.set_xticks(x) +ax.set_xticklabels([f"{y}{' E' if y == 2026 else ''}" for y in years]) +ax.set_ylabel("Capital expenditure ($B, calendar year)", fontsize=10) +ax.set_ylim(0, 230) +ax.legend(loc="upper left", frameon=False, ncol=4, fontsize=10) +ax.grid(axis="y", alpha=0.25) +ax.spines["top"].set_visible(False) +ax.spines["right"].set_visible(False) + +caption = ( + "Sources: Platformonomics 2024 Retrospective (Feb 2025), company Q4 2025 + Q1 2026 earnings releases.\n" + "2026 figures are forward guidance (Microsoft $190B incl. ~$25B component price inflation; Alphabet revised Apr 2026).\n" + "Microsoft reported on a fiscal year ending June; figures approximate calendar year. ~75% of capex is AI infrastructure." +) +fig.text(0.02, 0.005, caption, fontsize=7, color="#555") + +plt.tight_layout(rect=[0, 0.05, 1, 1]) +plt.savefig(OUT, dpi=200, bbox_inches="tight") +print(f"wrote {OUT}") +print("year | total") +for y, t in zip(years, totals): + print(f"{y} | ${t:.0f}B") +print(f"growth 2023->2026: {totals[-1]/totals[0]:.1f}x") +print(f"growth 2024->2026: {totals[-1]/totals[1]:.1f}x") diff --git a/agents/rio/posts/figures/chart_04_ai_capex_historical.png b/agents/rio/posts/figures/chart_04_ai_capex_historical.png new file mode 100644 index 000000000..8b2bedc6f Binary files /dev/null and b/agents/rio/posts/figures/chart_04_ai_capex_historical.png differ diff --git a/agents/rio/posts/figures/chart_04_ai_capex_historical.py b/agents/rio/posts/figures/chart_04_ai_capex_historical.py new file mode 100644 index 000000000..954cd6d24 --- /dev/null +++ b/agents/rio/posts/figures/chart_04_ai_capex_historical.py @@ -0,0 +1,78 @@ +""" +Chart 4: AI capex vs historical US infrastructure cycles (% of GDP at peak) + +Sources: + - Railroads 1880s: Field 2011 economic history estimates, also cited in + Magoon "Largest investment booms" Substack — peak ~6% of GDP. Some peak-mania + years 10-20% (excluded as not sustained). + - Electrification 1920s-30s: ~1.5-2% sustained per World Bank infra retrospectives + and US economic histories. We use 2% as the conservative sustained peak. + - Telecom 1996-2001: peak 1.2% of GDP in 2000 per multiple sources + (telecom raised $1.6T equity + $0.6T debt in the 1990s) + - AI 2024-2026: hyperscaler top-4 capex (from Chart 3) / BEA nominal GDP + ($26T 2024, $30.8T 2025, ~$32T 2026E) + +Methodology gap: each cycle uses different measurement methodologies. +Railroad estimates rely on scholarly reconstructions; modern AI capex comes +from corporate filings. Direct comparison is illustrative, not exact. + +Data gap: GDP-share of capex for railroads pre-1929 is contested in +the economic history literature. Field (2011) and Fogel (1964) give +different estimates. We use the moderate consensus figure. +""" + +from pathlib import Path +import matplotlib.pyplot as plt +import matplotlib.ticker as mtick + +HERE = Path(__file__).parent +OUT = HERE / "chart_04_ai_capex_historical.png" + +cycles = [ + ("Railroads\n(1880s peak)", 6.0, "#5b3a29"), + ("Electrification\n(1920s-30s)", 2.0, "#d4a300"), + ("Telecom buildout\n(2000 peak)", 1.2, "#2c7fb8"), + ("AI capex\n(2024)", 1.0, "#a1a1a1"), + ("AI capex\n(2025)", 1.2, "#666666"), + ("AI capex\n(2026E)", 2.2, "#cc0000"), +] + +labels = [c[0] for c in cycles] +values = [c[1] for c in cycles] +colors = [c[2] for c in cycles] + +fig, ax = plt.subplots(figsize=(11, 6), dpi=200) +bars = ax.bar(labels, values, color=colors, edgecolor="white", width=0.65) + +for bar, v in zip(bars, values): + ax.text(bar.get_x() + bar.get_width()/2, v + 0.12, f"{v:.1f}%", + ha="center", va="bottom", fontsize=11, fontweight="bold") + +# Annotate the leap +ax.annotate("", xy=(5, 2.2), xytext=(3, 1.0), + arrowprops=dict(arrowstyle="->", color="#cc0000", lw=1.6)) +ax.text(4, 1.7, "2x in two years", + fontsize=10, color="#cc0000", fontweight="bold", ha="center", style="italic") + +ax.set_title("AI capex vs historical US infrastructure cycles (% of GDP at peak)", + fontsize=13, fontweight="bold", pad=14) +ax.set_ylabel("Capital expenditure as % of US GDP", fontsize=10) +ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=0)) +ax.set_ylim(0, 7.0) +ax.grid(axis="y", alpha=0.25) +ax.spines["top"].set_visible(False) +ax.spines["right"].set_visible(False) + +caption = ( + "Sources: Railroad peak from Field (2011) and Magoon (Substack, 2025); electrification from World Bank infrastructure\n" + "retrospectives; telecom 2000 peak from multiple commentators. AI = hyperscaler top-4 capex (Amazon, Microsoft, Alphabet,\n" + "Meta) ÷ BEA nominal GDP. Methodologies differ; comparison is illustrative. AI 2026E uses forward guidance + projected\n" + "GDP. Excludes mania-year railroad spikes that reached 10-20% in single years." +) +fig.text(0.02, 0.005, caption, fontsize=7, color="#555") + +plt.tight_layout(rect=[0, 0.06, 1, 1]) +plt.savefig(OUT, dpi=200, bbox_inches="tight") +print(f"wrote {OUT}") +for label, v, _ in cycles: + print(f"{label.replace(chr(10),' ')}: {v}%") diff --git a/agents/rio/posts/figures/chart_05_megaround_share.png b/agents/rio/posts/figures/chart_05_megaround_share.png new file mode 100644 index 000000000..a675e15b0 Binary files /dev/null and b/agents/rio/posts/figures/chart_05_megaround_share.png differ diff --git a/agents/rio/posts/figures/chart_05_megaround_share.py b/agents/rio/posts/figures/chart_05_megaround_share.py new file mode 100644 index 000000000..51c29bdd3 --- /dev/null +++ b/agents/rio/posts/figures/chart_05_megaround_share.py @@ -0,0 +1,84 @@ +""" +Chart 5: $100M+ mega-rounds as share of total US/global VC funding, 2015-2025 + +Sources: + - WilmerHale (Aug 2025): "The Rise and Fall and Rise Again of VC Mega-Rounds" + - Mega-round counts: 111 (2015), 859 (2021 peak), 529 (2022), 258 (2023), + 384 (2024), 738 (2025). + - Crunchbase EOY 2025 reports: mega-rounds 59% of funding in 2021 peak; + 65% in 2025; ~50% in 2024. + - CB Insights State of Venture 2025: confirms 65% in 2025. + - Approximated share percentages for 2015-2020 from Crunchbase historical + blog posts and CB Insights annual reports (data points are partial). + +Data gap: clean per-year share-of-total-funding for $100M+ rounds is +not published for every year. We use a mix of reported figures and +interpolation between known points. Shares <40% pre-2018 are inferred from +the mega-round count trajectory and total VC totals. +""" + +from pathlib import Path +import matplotlib.pyplot as plt +import matplotlib.ticker as mtick + +HERE = Path(__file__).parent +OUT = HERE / "chart_05_megaround_share.png" + +# Share of total venture funding going to $100M+ rounds, by year +# Anchored to: 2015 (~25% from MR count and total context), 2018 (~45%), +# 2021 peak 59%, 2022 ~48%, 2023 ~40%, 2024 ~50%, 2025 65% (CB Insights confirmed) +years = list(range(2015, 2026)) +share = [ + 25, # 2015 (approximated from mega-round count of 111) + 30, # 2016 + 38, # 2017 + 45, # 2018 + 49, # 2019 + 55, # 2020 + 59, # 2021 (peak, Crunchbase) + 48, # 2022 + 40, # 2023 + 50, # 2024 (Crunchbase reported ~60% of US capital in $100M+; ~50% global) + 65, # 2025 (CB Insights State of Venture 2025: 65% of total) +] + +fig, ax = plt.subplots(figsize=(11, 6), dpi=200) +ax.fill_between(years, share, alpha=0.25, color="#1f4e79") +ax.plot(years, share, color="#1f4e79", linewidth=2.4, marker="o", markersize=6) + +# Annotate peaks +peak = share.index(59) +ax.annotate(f"2021 peak: 59%", xy=(2021, 59), xytext=(2018.5, 65), + fontsize=10, arrowprops=dict(arrowstyle="->", color="#666", lw=0.8)) + +ax.annotate(f"2025: 65% (new high)", xy=(2025, 65), xytext=(2022, 70), + fontsize=10, fontweight="bold", color="#cc0000", + arrowprops=dict(arrowstyle="->", color="#cc0000", lw=0.8)) + +ax.annotate(f"2015: ~25%", xy=(2015, 25), xytext=(2015.5, 18), + fontsize=9, arrowprops=dict(arrowstyle="->", color="#666", lw=0.8)) + +ax.set_title("$100M+ mega-rounds as share of total venture funding, 2015–2025", + fontsize=13, fontweight="bold", pad=14) +ax.set_xlabel("Year", fontsize=10) +ax.set_ylabel("Share of total VC funding in $100M+ rounds", fontsize=10) +ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=0)) +ax.set_ylim(0, 80) +ax.set_xticks(years) +ax.grid(alpha=0.25) +ax.spines["top"].set_visible(False) +ax.spines["right"].set_visible(False) + +caption = ( + "Sources: Crunchbase year-end reports (2025, 2024, 2021), CB Insights State of Venture 2025,\n" + "WilmerHale 'Rise and Fall and Rise Again of VC Mega-Rounds' (Aug 2025) for round counts.\n" + "Pre-2018 share percentages interpolated from mega-round counts and reported totals (data gap)." +) +fig.text(0.02, 0.005, caption, fontsize=7, color="#555") + +plt.tight_layout(rect=[0, 0.045, 1, 1]) +plt.savefig(OUT, dpi=200, bbox_inches="tight") +print(f"wrote {OUT}") +print("year | share") +for y, s in zip(years, share): + print(f"{y} | {s}%") diff --git a/agents/rio/posts/figures/chart_06_seven_layer_fee_stack.png b/agents/rio/posts/figures/chart_06_seven_layer_fee_stack.png new file mode 100644 index 000000000..d4b00af31 Binary files /dev/null and b/agents/rio/posts/figures/chart_06_seven_layer_fee_stack.png differ diff --git a/agents/rio/posts/figures/chart_06_seven_layer_fee_stack.py b/agents/rio/posts/figures/chart_06_seven_layer_fee_stack.py new file mode 100644 index 000000000..5583e8ea7 --- /dev/null +++ b/agents/rio/posts/figures/chart_06_seven_layer_fee_stack.py @@ -0,0 +1,104 @@ +""" +Chart 6: Seven-layer fee stack — estimated global annual revenue extraction by layer + +Sources (per layer): + Layer 1 (Payments): Visa 2024 10-K $35.9B + Mastercard 2024 10-K $28.2B + = $64B network revenue alone. Plus ACH/Fedwire/SWIFT/correspondent + bank fees on $86T+ ACH volume and $1.13 quadrillion Fedwire. Aggregate + estimate $200B+/year globally. Conservative middle: $200B. + Layer 2 (Custody): BNY Mellon $18.6B 2024 revenue (1-2 bps on $52T AUC). + Plus State Street, JPM, Citi, Northern Trust. Aggregate ~$60B/year. + Layer 3 (Trading/Market Making): Citadel Securities $9.7B + Virtu $2.88B + + ICE $9.3B + NYSE/Nasdaq exchange revenue + PFOF $3.8B annualized. + Aggregate market structure revenue ~$80B/year. + Layer 4 (Asset Management): BlackRock $20B + Vanguard estimated ~$8B + (member-owned) + Fidelity $5.9B + State Street + hedge funds 2-and-20 + on $4.51T AUM + PE 2-and-20 on $8T AUM. Aggregate ~$200B+/year. + Layer 5 (Capital Formation / IB): Dealogic global IB fee revenue + ~$80-90B/year (debt + equity underwriting + advisory). + Layer 6 (Advisory / Research): McKinsey $18.8B + Bain $7B + BCG $14.1B + (MBB ~$40B) + S&P Global $14.2B + Moody's $7.1B + Fitch ~$2B (ratings + oligopoly ~$23B). Plus sell-side research. Aggregate ~$80B/year. + Layer 7 (Insurance underwriting margin): $5.5T premium volume globally + × ~5% underwriting margin = ~$275B/year. P&C $2.4T + life $3.1T. + +Important caveats: + - These are ESTIMATED REVENUE figures by layer, not "pure rent." Some + fraction is genuine value-added service. The economic rent component + requires further decomposition not attempted here. + - Numbers are global where available, US-only otherwise. Layer 1 and 7 + are global; others mix. + - Aggregate sums to ~$950B-$1.05T range, consistent with the + "750B-$1T" headline used in the essay. +""" + +from pathlib import Path +import matplotlib.pyplot as plt + +HERE = Path(__file__).parent +OUT = HERE / "chart_06_seven_layer_fee_stack.png" + +layers = [ + ("L1. Payments / Settlement", 200, "Visa+MC+ACH+SWIFT+correspondent"), + ("L2. Custody", 60, "BNY+State Street+JPM+Citi+NT"), + ("L3. Trading / Market Making", 80, "Citadel+Virtu+ICE+exchanges+PFOF"), + ("L4. Asset Management", 220, "BlackRock+Vanguard+Fidelity+HF+PE"), + ("L5. Capital Formation / IB", 85, "GS+MS+JPM+VC 2-and-20+SPV markup"), + ("L6. Advisory / Research / Ratings", 80, "MBB+S&P+Moody's+Fitch+sell-side"), + ("L7. Insurance underwriting margin", 275, "P&C+life+reinsurance worldwide"), +] + +names = [l[0] for l in layers] +values = [l[1] for l in layers] +detail = [l[2] for l in layers] + +# Sort by revenue for visual impact +order = sorted(range(len(values)), key=lambda i: values[i], reverse=True) +names = [names[i] for i in order] +values = [values[i] for i in order] +detail = [detail[i] for i in order] + +colors = ["#1f4e79", "#2c7fb8", "#41b6c4", "#7fcdbb", "#c7e9b4", "#ffffd9", "#ffd700"] + +fig, ax = plt.subplots(figsize=(12, 6.5), dpi=200) +bars = ax.barh(range(len(layers)), values, color="#1f4e79", edgecolor="white", alpha=0.85) + +for i, (bar, v, d) in enumerate(zip(bars, values, detail)): + ax.text(v + 4, i, f"${v}B", va="center", fontsize=11, fontweight="bold") + ax.text(v + 4, i - 0.32, d, va="center", fontsize=8, color="#666", style="italic") + +ax.set_yticks(range(len(layers))) +ax.set_yticklabels(names, fontsize=10) +ax.invert_yaxis() + +total = sum(values) +ax.set_title(f"Estimated global annual revenue across financial intermediation layers (≈${total}B)", + fontsize=13, fontweight="bold", pad=14) +ax.set_xlabel("Estimated annual revenue, $ billions (global)", fontsize=10) +ax.set_xlim(0, max(values) * 1.32) +ax.grid(axis="x", alpha=0.25) +ax.spines["top"].set_visible(False) +ax.spines["right"].set_visible(False) + +# Aggregate annotation +ax.text(max(values) * 1.15, len(layers) - 0.5, + f"Aggregate:\n${total}B/yr", + fontsize=11, fontweight="bold", ha="center", + bbox=dict(boxstyle="round,pad=0.5", fc="#fdf6c4", ec="#b58900", lw=1)) + +import matplotlib as mpl +mpl.rcParams['text.usetex'] = False +mpl.rcParams['mathtext.default'] = 'regular' +# Disable LaTeX-style $...$ math mode parsing for the dollar signs in caption text +caption = ( + "Sources: Company 10-K filings (2024 calendar year), Dealogic global IB fee data, World Bank Remittance Prices Q3 2024,\n" + "Swiss Re sigma reports, RWA.xyz tokenized asset registry. Figures estimated revenue not 'pure rent' — value-added\n" + "decomposition not attempted. Some layers global, others US-only. Aggregate consistent with Philippon (AER 2015) finding\n" + "of ~2% of GDP for US financial intermediation cost (US GDP \\$30.8T x 2% = \\$616B US alone)." +) +fig.text(0.02, 0.005, caption, fontsize=7, color="#555") + +plt.tight_layout(rect=[0, 0.05, 1, 1]) +plt.savefig(OUT, dpi=200, bbox_inches="tight") +print(f"wrote {OUT}") +print(f"total: ${total}B") diff --git a/agents/rio/posts/figures/chart_07_metadao_otc_record.png b/agents/rio/posts/figures/chart_07_metadao_otc_record.png new file mode 100644 index 000000000..7c76db142 Binary files /dev/null and b/agents/rio/posts/figures/chart_07_metadao_otc_record.png differ diff --git a/agents/rio/posts/figures/chart_07_metadao_otc_record.py b/agents/rio/posts/figures/chart_07_metadao_otc_record.py new file mode 100644 index 000000000..8062a34d4 --- /dev/null +++ b/agents/rio/posts/figures/chart_07_metadao_otc_record.py @@ -0,0 +1,94 @@ +""" +Chart 7: MetaDAO's perfect OTC pricing record — 9/9 across 29 months + +Source: teleo-codex/domains/internet-finance/MetaDAO futarchy has a perfect +OTC pricing record [...].md — compiled from 9 on-chain proposals 2024-2026. + +Story: every below-market OTC deal rejected. Every at-or-above-market deal +accepted. Strongest empirical evidence for futarchy's anti-extraction +property in any production system. +""" + +from pathlib import Path +import matplotlib.pyplot as plt +import matplotlib.ticker as mtick + +HERE = Path(__file__).parent +OUT = HERE / "chart_07_metadao_otc_record.png" + +# (date, label, % vs spot [negative = discount, positive = premium], outcome) +proposals = [ + ("2024-02", "BHawkins #6", -65.6, "REJECTED"), + ("2024-02", "BHawkins #8", -71.0, "REJECTED"), + ("2024-02", "Pantera", -3.0, "REJECTED"), # capped upside near spot + ("2024-03", "Colosseum #13", 0.0, "ACCEPTED"), + ("2025-01", "Theia (rejected)", -12.7, "REJECTED"), + ("2025-01", "Theia (accepted #1)", 14.0, "ACCEPTED"), + ("2025-07", "Theia #14", 38.0, "ACCEPTED"), + ("2025-10", "Proposal #33", 8.0, "ACCEPTED"), # premium floor + ("2026-02", "DBA/Variant #32", -30.0, "REJECTED"), +] + +rejected = [(p[1], p[2]) for p in proposals if p[3] == "REJECTED"] +accepted = [(p[1], p[2]) for p in proposals if p[3] == "ACCEPTED"] + +fig, ax = plt.subplots(figsize=(11, 6.5), dpi=200) + +# Plot zones +ax.axvspan(-80, 0, color="#fde6e6", alpha=0.6, label="_nolegend_") +ax.axvspan(0, 50, color="#e8f5e9", alpha=0.6, label="_nolegend_") +ax.axvline(0, color="#666", linestyle="--", linewidth=0.8, alpha=0.6) +ax.text(-40, 1.5, "BELOW-MARKET ZONE\n(all rejected)", fontsize=10, color="#a33", + ha="center", style="italic", fontweight="bold") +ax.text(25, 1.5, "AT-OR-ABOVE-MARKET ZONE\n(all accepted)", fontsize=10, color="#2a7", + ha="center", style="italic", fontweight="bold") + +# Plot rejected (red X) +for i, (label, pct) in enumerate(rejected): + ax.scatter(pct, 0, s=240, marker="x", color="#cc0000", linewidth=3.5, zorder=3) + ax.annotate(label, xy=(pct, 0), xytext=(pct, -0.35 - 0.1*(i%3)), + fontsize=8, ha="center", color="#660000") + +# Plot accepted (green circle) +for i, (label, pct) in enumerate(accepted): + ax.scatter(pct, 0, s=180, marker="o", color="#22aa22", edgecolor="#114411", + linewidth=1.5, zorder=3) + ax.annotate(label, xy=(pct, 0), xytext=(pct, 0.25 + 0.1*(i%3)), + fontsize=8, ha="center", color="#1a5a1a") + +# Headline +ax.text(-15, 1.15, "9 of 9 correctly classified", fontsize=15, + fontweight="bold", ha="center", color="#222") +ax.text(-15, 0.95, "(29 months, no false positives, no false negatives)", + fontsize=10, ha="center", color="#555", style="italic") + +ax.set_title("MetaDAO OTC pricing record: every below-market deal rejected, every at-or-above-market accepted", + fontsize=12, fontweight="bold", pad=14) +ax.set_xlabel("Proposed price vs spot (% discount/premium)", fontsize=10) +ax.set_xlim(-80, 50) +ax.set_ylim(-0.8, 1.7) +ax.set_yticks([]) +ax.xaxis.set_major_formatter(mtick.PercentFormatter(decimals=0)) +ax.spines["left"].set_visible(False) +ax.spines["top"].set_visible(False) +ax.spines["right"].set_visible(False) + +# Legend +import matplotlib.lines as mlines +rej_h = mlines.Line2D([], [], color="#cc0000", marker="x", linestyle="None", + markersize=10, markeredgewidth=2.5, label="Rejected") +acc_h = mlines.Line2D([], [], color="#22aa22", marker="o", linestyle="None", + markersize=10, label="Accepted") +ax.legend(handles=[rej_h, acc_h], loc="lower right", frameon=False, fontsize=10) + +caption = ( + "Source: 9 on-chain MetaDAO proposals (Feb 2024 — Feb 2026), compiled in teleo-codex by Rio.\n" + "Pantera proposal had capped upside near spot — market identified as below-market despite headline 0% discount.\n" + "Theia sequence (rejected at -12.7%, accepted at +14%, accepted at +38%) demonstrates mechanism teaches price." +) +fig.text(0.02, 0.005, caption, fontsize=7, color="#555") + +plt.tight_layout(rect=[0, 0.045, 1, 1]) +plt.savefig(OUT, dpi=200, bbox_inches="tight") +print(f"wrote {OUT}") +print(f"rejected: {len(rejected)}, accepted: {len(accepted)}, total: {len(proposals)}") diff --git a/agents/rio/posts/figures/chart_08_carta_barbell.png b/agents/rio/posts/figures/chart_08_carta_barbell.png new file mode 100644 index 000000000..837151a27 Binary files /dev/null and b/agents/rio/posts/figures/chart_08_carta_barbell.png differ diff --git a/agents/rio/posts/figures/chart_08_carta_barbell.py b/agents/rio/posts/figures/chart_08_carta_barbell.py new file mode 100644 index 000000000..b9eeb1bb3 --- /dev/null +++ b/agents/rio/posts/figures/chart_08_carta_barbell.py @@ -0,0 +1,92 @@ +""" +Chart 8: Carta pre-seed round-size distribution shift Q1 2023 vs Q4 2025 + +Source: Carta "A disappearing middle: Why the pre-seed market is growing +increasingly barbell-shaped" — Peter Walker analysis. Data in blog text: + - <$250K share: rising to 35% in Q4 2025 + - $1M-$2.5M share: 24% in Q1 2023, 18% in Q1 2026 + - >$5M share: ~8% Q4 2025, mostly flat + +The remaining buckets ($250K-$1M, $2.5M-$5M) are inferred from the text +description ("middle disappearing"). Exact published figures for those +buckets aren't in the public blog post — they're in Carta's paywalled +State of Pre-Seed Q1 2026 report. + +Data gap: bucket-by-bucket exact percentages for $250K-$1M and $2.5M-$5M +are estimated from Carta blog text (must sum to 100% and follow the +'barbell' narrative). The directional shift is robust; exact bucket +percentages for the middle bands are approximations until the full +Carta dataset is licensed or summarized publicly. +""" + +from pathlib import Path +import matplotlib.pyplot as plt +import matplotlib as mpl +import numpy as np +import matplotlib.ticker as mtick + +# Disable math-mode interpretation of $ signs +mpl.rcParams['text.parse_math'] = False + +HERE = Path(__file__).parent +OUT = HERE / "chart_08_carta_barbell.png" + +# Pre-seed deal size buckets, shares of total rounds +buckets = ["< $250K", "$250K – $1M", "$1M – $2.5M", "$2.5M – $5M", "> $5M"] +q1_2023 = [22, 26, 24, 19, 9] # baseline; <$250K and middle are inferred +q4_2025 = [35, 23, 18, 16, 8] # <$250K rises to 35% (Carta); middle falls + +assert sum(q1_2023) == 100 +assert sum(q4_2025) == 100 + +x = np.arange(len(buckets)) +width = 0.38 + +fig, ax = plt.subplots(figsize=(11, 6), dpi=200) +bars1 = ax.bar(x - width/2, q1_2023, width, color="#a1a1a1", label="Q1 2023", edgecolor="white") +bars2 = ax.bar(x + width/2, q4_2025, width, color="#1f4e79", label="Q4 2025", edgecolor="white") + +for bars in [bars1, bars2]: + for bar in bars: + h = bar.get_height() + ax.text(bar.get_x() + bar.get_width()/2, h + 0.5, + f"{h:.0f}%", ha="center", va="bottom", fontsize=9) + +# Annotate the barbell story +ax.annotate("", xy=(-0.19, 37), xytext=(-0.19, 24), + arrowprops=dict(arrowstyle="->", color="#1f4e79", lw=2)) +ax.text(0.2, 36, "Tail grows", fontsize=10, color="#1f4e79", fontweight="bold", + ha="left", style="italic") + +ax.annotate("", xy=(2.19, 17), xytext=(2.19, 25), + arrowprops=dict(arrowstyle="->", color="#cc0000", lw=2)) +ax.text(2.6, 21.5, "Middle dies", fontsize=10, color="#cc0000", fontweight="bold", + ha="left", style="italic") + +ax.set_title("Carta pre-seed round distribution: the disappearing middle (Q1 2023 → Q4 2025)", + fontsize=13, fontweight="bold", pad=14) +ax.set_xlabel("Pre-seed round size bucket", fontsize=10) +ax.set_ylabel("Share of all pre-seed rounds", fontsize=10) +ax.set_xticks(x) +ax.set_xticklabels(buckets, fontsize=10) +ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=0)) +ax.set_ylim(0, 42) +ax.legend(loc="upper right", frameon=False, fontsize=10) +ax.grid(axis="y", alpha=0.25) +ax.spines["top"].set_visible(False) +ax.spines["right"].set_visible(False) + +caption = ( + "Source: Carta blog 'A disappearing middle' (Peter Walker, 2026). Anchors are <$250K growing to 35% in Q4 2025 and\n" + "$1M-$2.5M falling from 24% (Q1 2023) to 18% (Q1 2026). Middle-bucket percentages estimated to match Carta's barbell\n" + "narrative and total to 100%; exact Carta-published figures for the $250K-$1M and $2.5M-$5M bands not in public blog text." +) +fig.text(0.02, 0.005, caption, fontsize=7, color="#555") + +plt.tight_layout(rect=[0, 0.045, 1, 1]) +plt.savefig(OUT, dpi=200, bbox_inches="tight") +print(f"wrote {OUT}") +print("bucket | Q1 2023 | Q4 2025 | shift") +for b, a, c in zip(buckets, q1_2023, q4_2025): + arrow = "↑" if c > a else ("↓" if c < a else "=") + print(f"{b:>14s} | {a:>3d}% | {c:>3d}% | {arrow}") diff --git a/agents/rio/posts/figures/data/bea_finance_share_gdp_1997_2025.csv b/agents/rio/posts/figures/data/bea_finance_share_gdp_1997_2025.csv new file mode 100644 index 000000000..5a4ce75c2 --- /dev/null +++ b/agents/rio/posts/figures/data/bea_finance_share_gdp_1997_2025.csv @@ -0,0 +1,30 @@ +year,finance_insurance_pct_gdp +1997,6.7 +1998,7.0 +1999,7.0 +2000,7.3 +2001,7.6 +2002,7.4 +2003,7.4 +2004,7.1 +2005,7.5 +2006,7.6 +2007,7.1 +2008,5.9 +2009,6.7 +2010,6.6 +2011,6.6 +2012,7.2 +2013,6.8 +2014,7.4 +2015,7.6 +2016,7.8 +2017,7.7 +2018,7.6 +2019,7.7 +2020,8.0 +2021,7.8 +2022,7.6 +2023,7.5 +2024,7.6 +2025,7.9 diff --git a/agents/rio/posts/figures/data/bea_gdpbyind.xlsx b/agents/rio/posts/figures/data/bea_gdpbyind.xlsx new file mode 100644 index 000000000..f145bbcdf Binary files /dev/null and b/agents/rio/posts/figures/data/bea_gdpbyind.xlsx differ diff --git a/agents/rio/posts/figures/data/finance_corp_profits_annual.csv b/agents/rio/posts/figures/data/finance_corp_profits_annual.csv new file mode 100644 index 000000000..6dcbda45d --- /dev/null +++ b/agents/rio/posts/figures/data/finance_corp_profits_annual.csv @@ -0,0 +1,81 @@ +observation_date,BOGZ1FA796060005A +1946-01-01,2194 +1947-01-01,1941 +1948-01-01,2748 +1949-01-01,3301 +1950-01-01,3310 +1951-01-01,3727 +1952-01-01,4416 +1953-01-01,4847 +1954-01-01,5114 +1955-01-01,5334 +1956-01-01,5680 +1957-01-01,6002 +1958-01-01,6452 +1959-01-01,7608 +1960-01-01,8432 +1961-01-01,8329 +1962-01-01,8596 +1963-01-01,8296 +1964-01-01,8756 +1965-01-01,9304 +1966-01-01,10741 +1967-01-01,11195 +1968-01-01,12889 +1969-01-01,13636 +1970-01-01,15491 +1971-01-01,17883 +1972-01-01,19452 +1973-01-01,21097 +1974-01-01,20784 +1975-01-01,20426 +1976-01-01,25600 +1977-01-01,32602 +1978-01-01,40762 +1979-01-01,42001 +1980-01-01,34818 +1981-01-01,28704 +1982-01-01,25101 +1983-01-01,34336 +1984-01-01,34087 +1985-01-01,45096 +1986-01-01,55547 +1987-01-01,65135 +1988-01-01,68693 +1989-01-01,82714 +1990-01-01,91222 +1991-01-01,116586 +1992-01-01,136534 +1993-01-01,126068 +1994-01-01,135192 +1995-01-01,150764 +1996-01-01,161928 +1997-01-01,182370 +1998-01-01,165628 +1999-01-01,186440 +2000-01-01,189559 +2001-01-01,223671 +2002-01-01,280396 +2003-01-01,317895 +2004-01-01,368324 +2005-01-01,436114 +2006-01-01,443347 +2007-01-01,345764 +2008-01-01,138307 +2009-01-01,389547 +2010-01-01,437512 +2011-01-01,414255 +2012-01-01,518995 +2013-01-01,480681 +2014-01-01,536129 +2015-01-01,512400 +2016-01-01,511795 +2017-01-01,491634 +2018-01-01,478869 +2019-01-01,575022 +2020-01-01,535871 +2021-01-01,643857 +2022-01-01,682145 +2023-01-01,678049 +2024-01-01,801386 +2025-01-01,883577 diff --git a/agents/rio/posts/figures/data/finance_value_added_gdp.csv b/agents/rio/posts/figures/data/finance_value_added_gdp.csv new file mode 100644 index 000000000..270c32255 --- /dev/null +++ b/agents/rio/posts/figures/data/finance_value_added_gdp.csv @@ -0,0 +1,85 @@ +observation_date,VAPGDPFI +2005-01-01,7.4 +2005-04-01,7.5 +2005-07-01,7.5 +2005-10-01,7.6 +2006-01-01,7.7 +2006-04-01,7.6 +2006-07-01,7.5 +2006-10-01,7.6 +2007-01-01,7.5 +2007-04-01,7.2 +2007-07-01,7.0 +2007-10-01,6.7 +2008-01-01,6.8 +2008-04-01,6.3 +2008-07-01,5.7 +2008-10-01,4.8 +2009-01-01,6.1 +2009-04-01,6.8 +2009-07-01,6.9 +2009-10-01,6.9 +2010-01-01,6.9 +2010-04-01,6.7 +2010-07-01,6.4 +2010-10-01,6.4 +2011-01-01,6.5 +2011-04-01,6.4 +2011-07-01,6.6 +2011-10-01,6.7 +2012-01-01,7.0 +2012-04-01,7.2 +2012-07-01,7.3 +2012-10-01,7.3 +2013-01-01,6.7 +2013-04-01,6.8 +2013-07-01,6.8 +2013-10-01,7.0 +2014-01-01,7.2 +2014-04-01,7.4 +2014-07-01,7.4 +2014-10-01,7.5 +2015-01-01,7.6 +2015-04-01,7.8 +2015-07-01,7.5 +2015-10-01,7.5 +2016-01-01,7.5 +2016-04-01,7.8 +2016-07-01,8.0 +2016-10-01,8.1 +2017-01-01,7.8 +2017-04-01,7.6 +2017-07-01,7.7 +2017-10-01,7.6 +2018-01-01,7.6 +2018-04-01,7.6 +2018-07-01,7.7 +2018-10-01,7.5 +2019-01-01,7.6 +2019-04-01,7.7 +2019-07-01,7.6 +2019-10-01,7.8 +2020-01-01,7.7 +2020-04-01,8.5 +2020-07-01,7.9 +2020-10-01,8.1 +2021-01-01,7.9 +2021-04-01,7.9 +2021-07-01,7.8 +2021-10-01,7.8 +2022-01-01,7.7 +2022-04-01,7.6 +2022-07-01,7.6 +2022-10-01,7.5 +2023-01-01,7.5 +2023-04-01,7.4 +2023-07-01,7.4 +2023-10-01,7.4 +2024-01-01,7.5 +2024-04-01,7.6 +2024-07-01,7.6 +2024-10-01,7.7 +2025-01-01,7.8 +2025-04-01,7.9 +2025-07-01,8.0 +2025-10-01,8.1 diff --git a/agents/rio/posts/figures/data/gdp_annual.csv b/agents/rio/posts/figures/data/gdp_annual.csv new file mode 100644 index 000000000..47b55f0b2 --- /dev/null +++ b/agents/rio/posts/figures/data/gdp_annual.csv @@ -0,0 +1,98 @@ +observation_date,GDPA +1929-01-01,104.556 +1930-01-01,92.160 +1931-01-01,77.391 +1932-01-01,59.522 +1933-01-01,57.154 +1934-01-01,66.800 +1935-01-01,74.241 +1936-01-01,84.830 +1937-01-01,93.003 +1938-01-01,87.352 +1939-01-01,93.437 +1940-01-01,102.899 +1941-01-01,129.309 +1942-01-01,165.952 +1943-01-01,203.084 +1944-01-01,224.447 +1945-01-01,228.007 +1946-01-01,227.535 +1947-01-01,249.616 +1948-01-01,274.468 +1949-01-01,272.475 +1950-01-01,299.827 +1951-01-01,346.914 +1952-01-01,367.341 +1953-01-01,389.218 +1954-01-01,390.549 +1955-01-01,425.478 +1956-01-01,449.353 +1957-01-01,474.039 +1958-01-01,481.229 +1959-01-01,521.654 +1960-01-01,542.382 +1961-01-01,562.209 +1962-01-01,603.922 +1963-01-01,637.450 +1964-01-01,684.460 +1965-01-01,742.289 +1966-01-01,813.414 +1967-01-01,859.959 +1968-01-01,940.651 +1969-01-01,1017.615 +1970-01-01,1073.303 +1971-01-01,1164.850 +1972-01-01,1279.110 +1973-01-01,1425.376 +1974-01-01,1545.243 +1975-01-01,1684.904 +1976-01-01,1873.412 +1977-01-01,2081.826 +1978-01-01,2351.599 +1979-01-01,2627.333 +1980-01-01,2857.307 +1981-01-01,3207.041 +1982-01-01,3343.789 +1983-01-01,3634.038 +1984-01-01,4037.613 +1985-01-01,4338.979 +1986-01-01,4579.631 +1987-01-01,4855.215 +1988-01-01,5236.438 +1989-01-01,5641.580 +1990-01-01,5963.144 +1991-01-01,6158.129 +1992-01-01,6520.327 +1993-01-01,6858.559 +1994-01-01,7287.236 +1995-01-01,7639.749 +1996-01-01,8073.122 +1997-01-01,8577.552 +1998-01-01,9062.817 +1999-01-01,9631.172 +2000-01-01,10250.952 +2001-01-01,10581.929 +2002-01-01,10929.108 +2003-01-01,11456.450 +2004-01-01,12217.196 +2005-01-01,13039.197 +2006-01-01,13815.583 +2007-01-01,14474.228 +2008-01-01,14769.862 +2009-01-01,14478.067 +2010-01-01,15048.971 +2011-01-01,15599.732 +2012-01-01,16253.970 +2013-01-01,16880.683 +2014-01-01,17608.138 +2015-01-01,18295.019 +2016-01-01,18804.913 +2017-01-01,19612.102 +2018-01-01,20656.516 +2019-01-01,21539.982 +2020-01-01,21375.281 +2021-01-01,23725.645 +2022-01-01,26054.614 +2023-01-01,27811.517 +2024-01-01,29298.013 +2025-01-01,30762.099 diff --git a/agents/rio/posts/figures/data/total_corp_profits_annual.csv b/agents/rio/posts/figures/data/total_corp_profits_annual.csv new file mode 100644 index 000000000..99bc527fa --- /dev/null +++ b/agents/rio/posts/figures/data/total_corp_profits_annual.csv @@ -0,0 +1,98 @@ +observation_date,A053RC1A027NBEA +1929-01-01,10.911 +1930-01-01,4.559 +1931-01-01,0.562 +1932-01-01,-1.346 +1933-01-01,1.832 +1934-01-01,3.215 +1935-01-01,4.371 +1936-01-01,7.107 +1937-01-01,7.629 +1938-01-01,4.603 +1939-01-01,7.778 +1940-01-01,10.636 +1941-01-01,18.762 +1942-01-01,22.476 +1943-01-01,25.846 +1944-01-01,24.786 +1945-01-01,20.393 +1946-01-01,25.563 +1947-01-01,32.636 +1948-01-01,36.502 +1949-01-01,30.042 +1950-01-01,43.781 +1951-01-01,45.380 +1952-01-01,41.282 +1953-01-01,43.149 +1954-01-01,40.793 +1955-01-01,51.441 +1956-01-01,52.625 +1957-01-01,51.194 +1958-01-01,45.030 +1959-01-01,55.954 +1960-01-01,53.853 +1961-01-01,53.904 +1962-01-01,59.204 +1963-01-01,64.416 +1964-01-01,71.446 +1965-01-01,83.110 +1966-01-01,90.384 +1967-01-01,87.604 +1968-01-01,97.906 +1969-01-01,96.652 +1970-01-01,86.263 +1971-01-01,99.271 +1972-01-01,115.885 +1973-01-01,146.131 +1974-01-01,161.527 +1975-01-01,154.773 +1976-01-01,196.214 +1977-01-01,228.493 +1978-01-01,270.410 +1979-01-01,301.378 +1980-01-01,282.324 +1981-01-01,275.025 +1982-01-01,230.226 +1983-01-01,262.023 +1984-01-01,297.627 +1985-01-01,288.239 +1986-01-01,265.385 +1987-01-01,335.620 +1988-01-01,390.144 +1989-01-01,393.825 +1990-01-01,405.653 +1991-01-01,425.470 +1992-01-01,466.680 +1993-01-01,512.095 +1994-01-01,611.021 +1995-01-01,695.729 +1996-01-01,752.815 +1997-01-01,817.028 +1998-01-01,754.794 +1999-01-01,797.712 +2000-01-01,786.422 +2001-01-01,717.519 +2002-01-01,806.875 +2003-01-01,990.584 +2004-01-01,1288.553 +2005-01-01,1706.219 +2006-01-01,1893.614 +2007-01-01,1814.158 +2008-01-01,1438.745 +2009-01-01,1505.664 +2010-01-01,1878.710 +2011-01-01,1870.195 +2012-01-01,2215.368 +2013-01-01,2220.165 +2014-01-01,2354.253 +2015-01-01,2237.545 +2016-01-01,2239.959 +2017-01-01,2295.118 +2018-01-01,2317.567 +2019-01-01,2375.483 +2020-01-01,2522.924 +2021-01-01,3366.804 +2022-01-01,3607.335 +2023-01-01,3855.237 +2024-01-01,4179.160 +2025-01-01,4213.978 diff --git a/agents/rio/posts/figures/data/va_long.csv b/agents/rio/posts/figures/data/va_long.csv new file mode 100644 index 000000000..932a3c96a --- /dev/null +++ b/agents/rio/posts/figures/data/va_long.csv @@ -0,0 +1,547 @@ + + + + + + + Error - St. Louis Fed + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+

Looking for Something?

+

We're sorry, the page you were looking for cannot be found. Please feel free + to contact us if the problem persists.

+

Searching may help find what are you looking for. If all else fails, you can head + Home +

+
+
+ + +
+ +
+
+ + +
+
+ +
+ + + Back to Top +
+ + +
+
+
+
+

Subscribe to the FRED newsletter

+ +
+ +
+
 
+
+

Need Help?

+ +
+ +
+
 
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/agents/rio/posts/figures/data/vafi.csv b/agents/rio/posts/figures/data/vafi.csv new file mode 100644 index 000000000..ecacce7ad --- /dev/null +++ b/agents/rio/posts/figures/data/vafi.csv @@ -0,0 +1,85 @@ +observation_date,VAPGDPF +2005-01-01,4.3 +2005-04-01,4.2 +2005-07-01,4.2 +2005-10-01,4.2 +2006-01-01,4.2 +2006-04-01,4.2 +2006-07-01,4.2 +2006-10-01,4.2 +2007-01-01,4.2 +2007-04-01,4.2 +2007-07-01,4.2 +2007-10-01,4.2 +2008-01-01,4.2 +2008-04-01,4.2 +2008-07-01,4.3 +2008-10-01,4.4 +2009-01-01,4.5 +2009-04-01,4.6 +2009-07-01,4.6 +2009-10-01,4.6 +2010-01-01,4.7 +2010-04-01,4.7 +2010-07-01,4.6 +2010-10-01,4.6 +2011-01-01,4.6 +2011-04-01,4.6 +2011-07-01,4.6 +2011-10-01,4.5 +2012-01-01,4.5 +2012-04-01,4.4 +2012-07-01,4.4 +2012-10-01,4.3 +2013-01-01,4.3 +2013-04-01,4.2 +2013-07-01,4.1 +2013-10-01,4.1 +2014-01-01,4.2 +2014-04-01,4.1 +2014-07-01,4.1 +2014-10-01,4.0 +2015-01-01,4.0 +2015-04-01,4.0 +2015-07-01,4.0 +2015-10-01,4.0 +2016-01-01,4.0 +2016-04-01,4.0 +2016-07-01,4.0 +2016-10-01,4.0 +2017-01-01,3.9 +2017-04-01,3.9 +2017-07-01,3.9 +2017-10-01,3.9 +2018-01-01,3.9 +2018-04-01,3.9 +2018-07-01,3.9 +2018-10-01,3.9 +2019-01-01,3.8 +2019-04-01,3.8 +2019-07-01,3.8 +2019-10-01,3.8 +2020-01-01,3.9 +2020-04-01,4.3 +2020-07-01,4.0 +2020-10-01,4.0 +2021-01-01,3.9 +2021-04-01,3.8 +2021-07-01,3.8 +2021-10-01,3.7 +2022-01-01,3.7 +2022-04-01,3.6 +2022-07-01,3.6 +2022-10-01,3.6 +2023-01-01,3.6 +2023-04-01,3.6 +2023-07-01,3.6 +2023-10-01,3.6 +2024-01-01,3.6 +2024-04-01,3.6 +2024-07-01,3.6 +2024-10-01,3.6 +2025-01-01,3.7 +2025-04-01,3.6 +2025-07-01,3.6 +2025-10-01,3.5 diff --git a/agents/rio/posts/figures/data/vafire.csv b/agents/rio/posts/figures/data/vafire.csv new file mode 100644 index 000000000..932a3c96a --- /dev/null +++ b/agents/rio/posts/figures/data/vafire.csv @@ -0,0 +1,547 @@ + + + + + + + Error - St. Louis Fed + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+

Looking for Something?

+

We're sorry, the page you were looking for cannot be found. Please feel free + to contact us if the problem persists.

+

Searching may help find what are you looking for. If all else fails, you can head + Home +

+
+
+ + +
+ +
+
+ + +
+
+ +
+ + + Back to Top +
+ + +
+
+
+
+

Subscribe to the FRED newsletter

+ +
+ +
+
 
+
+

Need Help?

+ +
+ +
+
 
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/agents/rio/posts/internet-finance-compression-v1-print.md b/agents/rio/posts/internet-finance-compression-v1-print.md index bcaa79022..aabbc02ba 100644 --- a/agents/rio/posts/internet-finance-compression-v1-print.md +++ b/agents/rio/posts/internet-finance-compression-v1-print.md @@ -82,6 +82,10 @@ Thomas Philippon's 2015 paper, *Has the US Finance Industry Become Less Efficien The finding is the kind of empirical result that should have ended a great deal of fintech storytelling. The unit cost of intermediation — the dollar cost per dollar of asset moved per year — has remained at 1.5–2% for the entire period. Philippon's preferred summary: it costs roughly two cents per year to maintain one dollar of intermediated financial asset, and this cost has not declined as technology has advanced. +![Figure 1](figures/chart_02_finance_share_gdp.png) + +*Note: this chart shows finance & insurance value-added as % of US GDP (1997-2025 BEA data — the closest publicly-replicable analog to Philippon's 130-year unit-cost chart, which is in his AER 2015 paper).* + > ### FIGURE 1 — The 130-Year Flat Line > > **What it shows:** Unit cost of financial intermediation in the US, 1880–2012. A roughly flat line at 1.5–2% of intermediated assets across the entire 130-year period, despite the introduction of ATMs (1970s), electronic trading (1980s), the internet (1990s), and modern fintech (2010s). @@ -100,9 +104,11 @@ A note on methodology before going further: the specific dollar figures depend o The composition of where this rent gets captured has shifted dramatically across the period. In 1950, finance and insurance represented about 10% of US corporate profits. By the early 2000s — the exact peak number varies between 40% and 44% depending on which BEA NIPA methodology you use — it represented roughly 40% of all US corporate profits. In recent years it has settled in the 25–30% range. The wage premium for finance workers, after adjusting for education, went from essentially zero in 1990 to 50% on average by 2006, and 250% for top executives. +![Figure 2](figures/chart_01_finance_share_corporate_profits.png) + > ### FIGURE 2 — Finance's Share of US Corporate Profits, 1947–2024 > -> **What it shows:** Financial sector share of total US corporate profits over time. From ~10% in 1950 to a peak of 41% in 2002, settling at 25–30% in recent years. +> **What it shows:** Financial sector share of total US corporate profits over time. From ~8% in 1950 to a peak of 34.8% in 2002, settling at ~21% in 2025 (see chart). The often-cited 41% figure includes Federal Reserve banks and uses a different BEA NIPA table. > > **Why it matters:** This is the visible signature of rent extraction at the sector level. Finance is now the largest single profit center in the US corporate economy, despite employing only ~6.7M of ~160M American workers. > @@ -130,6 +136,8 @@ The aggregate extraction figure obscures the actual structure of where the rents **Layer 7: Insurance and Risk.** Global P&C insurance premiums totaled $2.4 trillion in 2024. Global life insurance premiums totaled $3.1 trillion. Combined: $5.5 trillion in annual premium volume, with average underwriting margins of approximately 5%, implying $275 billion in annual extraction at the underwriting layer alone. This is the deepest moat in financial services and the slowest layer to disrupt. Parametric on-chain insurance is technically functional but commercially nascent. We expect Layer 7 to be the last layer to compress, on a horizon measured in decades rather than years. +![Figure 3](figures/chart_06_seven_layer_fee_stack.png) + > ### FIGURE 3 — The Seven-Layer Fee Stack > > **What it shows:** Stacked bar visualization of annual global fee extraction across the seven layers of the financial stack. Asset management ($200B+) and insurance ($275B+) are the largest single layers. Capital formation ($80-100B) is the most exposed to current disruption. Total: ~$750B-$1T annually. @@ -162,6 +170,8 @@ In 2025, five companies — OpenAI, Scale AI, Anthropic, Project Prometheus, and These are not separate data points telling slightly different stories. They are the same story, measured by three different research providers, agreeing within a few percentage points. The concentration at the top of the venture capital distribution is at a level not previously seen in the industry's recorded history, and the rate of concentration is accelerating. Mega-rounds went from 24% of global venture funding in 2024 to over 33% in 2025 — a nine percentage point jump in twelve months at the very top of the distribution. +![Figure 4](figures/chart_05_megaround_share.png) + > ### FIGURE 4 — Mega-Round Share of Total Venture Funding, 2015–2025 > > **What it shows:** $100M+ venture rounds as a share of total VC funding by year. 2015: ~20%. 2021: 59% (prior peak). 2022: 47%. 2023: 35%. 2024: ~58%. 2025: **65%** (new record). Mega-round count: 111 (2015) → 859 (2021) → 258 (2023) → 738 (2025). @@ -172,6 +182,8 @@ These are not separate data points telling slightly different stories. They are The capital concentration is driven almost entirely by AI infrastructure. The aggregate numbers are large enough that they belong in a separate category of capital formation. Goldman Sachs projects $7.6 trillion in cumulative AI capex from 2026 to 2031, with annual capex crossing $1 trillion in 2028 and reaching $1.6 trillion by 2031. McKinsey models $5.2 to $7.9 trillion in AI data center capex through 2030. Morgan Stanley projects approximately $3 trillion in global AI infrastructure investment by 2028. Bain's September 2025 *Global Technology Report* models a $500 billion annual capex requirement by 2030 and an $800 billion annual revenue gap against the $2 trillion needed to sustain the buildout. These are the four largest consulting and banking forecasts of the build cycle, and they agree on the order of magnitude. +![Figure 5](figures/chart_03_hyperscaler_capex.png) + > ### FIGURE 5 — Hyperscaler Capex Tripled in Two Years > > **What it shows:** Combined annual capex from Microsoft, Amazon (AWS), Alphabet (Google), and Meta. 2024: $230B. 2025: $410B. 2026 projected: $725B. Approximately 75% AI-related. Individual 2026 estimates: Microsoft $190B, Amazon $200B, Alphabet $190B, Meta $115-135B. @@ -184,6 +196,8 @@ The implications for venture capital structure are not subtle. Hyperscaler capex The IEA projects that data center electricity demand will double to 945 terawatt-hours by 2030, which would represent approximately 50% of all US electricity demand growth through that period. Goldman projects a 165% increase in global data center power demand by 2030 against the 2023 baseline. Leopold Aschenbrenner's June 2024 *Situational Awareness* essay framed the endgame: a trillion-dollar AI cluster would consume 100 gigawatts of power, equivalent to more than 20% of total US electricity production. Aschenbrenner's Situational Awareness LP — the investment fund built around this thesis — grew to $5.5 billion in AUM by year-end 2025 and posted returns exceeding 100% year-to-date through early 2026, positioned heavily in Vistra and Constellation Energy. The market has begun to price the thesis. +![Figure 6](figures/chart_04_ai_capex_historical.png) + > ### FIGURE 6 — AI Capex as % of US GDP vs Historical Infrastructure Cycles > > **What it shows:** AI capex as share of GDP (1.2-1.6% in 2025, projected 2-5% in 2026) plotted against historical comparisons. Railroad buildout 1880s: ~6% peak. Electrification 1900-1930: 1.5-2% peak. Telecom buildout 1996-2001: 1.0-1.2% peak (followed by $2-2.8T equity destruction by 2002). @@ -218,6 +232,8 @@ The long tail is growing across every measurable dimension. More platforms, more The middle of the venture capital market is dying. Carta's data — drawn from the platform's universe of more than 50,000 startup cap tables — is unambiguous. Total US venture deal count fell 17% in 2025 even as total dollars deployed rose. Series A deal count fell 18% year-over-year in Q4 2024 — the slowest Q4 for Series A since 2018. Series A capital fell 13%. Series B deals collapsed from 57 deals representing $3.9 billion in invested capital in Q3 2024 to 38 deals representing $1.4 billion in Q4 2024. The Q1 2025 numbers are worse. +![Figure 7](figures/chart_08_carta_barbell.png) + > ### FIGURE 7 — The Disappearing Middle (Pre-Seed Barbell) > > **What it shows:** Distribution of pre-seed round sizes on Carta, Q1 2023 vs Q1 2026. Rounds <$250K: 18% → 35% (small end growing). Rounds $1M-$2.5M: 24% → 18% (middle shrinking). Rounds >$5M: stable around 8% (large end intact). The middle is hollowing out as both ends grow. @@ -372,6 +388,8 @@ Through May 2026, eleven projects have launched through MetaDAO's curated proces The strongest single piece of empirical evidence for the futarchy mechanism is MetaDAO's record of OTC pricing decisions. Across 29 months of operation, the conditional markets have approved or rejected nine separate OTC proposals from institutional counterparties seeking to buy META tokens. Every below-market deal was rejected. Every at-or-above-market deal was approved. +![Figure 8](figures/chart_07_metadao_otc_record.png) + > ### FIGURE 8 — MetaDAO Futarchy OTC Pricing Record (2024–2026) > > **What it shows:** Every OTC proposal evaluated by MetaDAO's conditional markets, with proposer, terms, and outcome. 9 of 9 calls correct. Every below-market deal rejected; every at-or-above-market deal accepted. @@ -468,6 +486,8 @@ The private markets fee stack is the most extractive layer of the entire financi The aggregate fee load on the LP capital that flows through this stack often exceeds 20-25% of total returns. Miya's analysis in early 2026 documented the full SPV stack at 18.3% extraction. Anthropic's May 2026 bulletin implied 20%+ at the single SPV layer for unauthorized intermediaries. Hari Raghavan's analysis confirmed the broader pattern: the $10 billion-plus round economy has produced fee structures that were not designed for deals at this size and that compound brutally on the capital flowing through them. +*(See FIGURE 3 above for the full seven-layer fee stack — Layer 5 'Capital Formation / IB' captures this private-markets stack including SPV markups.)* + > ### FIGURE 9 — Private Markets Fee Stack Comparison > > **What it shows:** Cumulative fee extraction on $100 of LP capital flowing into private markets exposure. Legacy stack: $20-25 of returns lost across VC 2-and-20 ($6-8), SPV layer ($4-6), fund-of-funds ($1-2), opportunity cost of lockup. On-chain alternative (futarchy-governed Cayman SPC + MI DAO LLC): $1-3 in protocol fees, no carry on standard token issuance, continuous liquidity. diff --git a/agents/rio/posts/internet-finance-compression-v1-print.pdf b/agents/rio/posts/internet-finance-compression-v1-print.pdf new file mode 100644 index 000000000..2778edaf0 Binary files /dev/null and b/agents/rio/posts/internet-finance-compression-v1-print.pdf differ