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 @@ + + +
+ + + +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 +
+ +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 +
+ +