{"id":231051,"date":"2025-09-24T11:53:12","date_gmt":"2025-09-24T15:53:12","guid":{"rendered":"https:\/\/ibkrcampus.com\/campus\/?p=231051"},"modified":"2025-09-24T11:54:40","modified_gmt":"2025-09-24T15:54:40","slug":"return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework","status":"publish","type":"post","link":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/","title":{"rendered":"Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p><em><strong>#Abstract<\/strong><\/em><\/p>\n\n\n\n<p>We study causal linkages among six major crypto assets (BTC, ETH, BNB, ADA, XRP, LTC) using the Toda\u2013Yamamoto (T\u2013Y) framework applied in rolling windows. We emphasize the impact of multiple-testing corrections on inference.<\/p>\n\n\n\n<p>Raw (no-FDR) results suggest numerous causal connections, with Bitcoin often appearing as a leading driver. However, once false discovery rate (FDR) controls are applied, the network becomes much sparser: leadership is weak and intermittent rather than persistent. For example, the BTC \u2192 ETH relation is significant in only about 6.8% of windows under per-window FDR and 4.6% under global FDR, rather than being consistently strong. We document three reporting regimes\u2014no FDR, per-window FDR, and global FDR\u2014highlighting the trade-off between sensitivity and conservatism. Our results underscore the multiple-testing burden in high-dimensional causality networks (K(K\u22121) tests per window) and demonstrate that strong claims of market-wide dominance do not survive conservative adjustment.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"Introduction\">Introduction<a href=\"#Introduction\"><\/a><\/h1>\n\n\n\n<p>Cryptocurrencies are frequently portrayed as highly interconnected, with Bitcoin often assumed to be the primary driver of market dynamics. While Bitcoin\u2019s size and visibility make this assumption plausible, formal statistical testing is required to assess whether causal leadership is strong and persistent.<\/p>\n\n\n\n<p>This study investigates causal linkages among six widely traded assets \u2014 Bitcoin (BTC), Ethereum (ETH), Binance Coin (BNB), Cardano (ADA), Ripple (XRP), and Litecoin (LTC). Using the Toda\u2013Yamamoto (T\u2013Y)<\/p>\n\n\n\n<p>causality framework, we test directional predictability both in the full sample and within rolling windows. Our analysis emphasizes the importance of controlling for multiple testing. In a setting with K assets, there are K(K\u22121) pairwise directional tests per window (30 tests when K=6), which strongly inflates raw significance rates. We therefore contrast three reporting regimes:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>No correction (raw p-values),<\/li>\n\n\n\n<li>Per-window FDR (controlling discoveries within each window), and<\/li>\n\n\n\n<li>Global FDR (controlling across all windows and pairs, most conservative).<\/li>\n<\/ol>\n\n\n\n<p>The results show that raw tests yield many apparent causal connections and suggest Bitcoin as a frequent leader. However, after FDR adjustment, most links disappear, and Bitcoin\u2019s role becomes weaker and intermittent. A handful of other relations \u2014 such as ADA \u2192 XRP and XRP \u2192 ETH \u2014 appear more persistent under the less conservative per-window FDR. Only a small number of edges survive global-FDR adjustment.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"Crypto-Causality-Analysis-(Toda%E2%80%93Yamamoto-+-Rolling-Stability)\">Crypto Causality Analysis (Toda\u2013Yamamoto + Rolling Stability)<a href=\"#Crypto-Causality-Analysis-(Toda%E2%80%93Yamamoto-+-Rolling-Stability)\"><\/a><\/h1>\n\n\n\n<p>This notebook contains a full, runnable pipeline to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fetch daily crypto prices (yfinance)<\/li>\n\n\n\n<li>Compute log-returns<\/li>\n\n\n\n<li>Run Toda\u2013Yamamoto pairwise causality (Wald tests via VAR)<\/li>\n\n\n\n<li>Perform rolling-window causality<\/li>\n\n\n\n<li>Compute stability metrics (fraction significant, mean p-value, longest run)<\/li>\n\n\n\n<li>Apply per-window and global FDR (Benjamini-Hochberg)<\/li>\n\n\n\n<li>Produce visualizations and save CSV outputs<\/li>\n<\/ul>\n\n\n\n<p>Usage: run cells sequentially. Edit the parameters cell as needed.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># PARAMETERS - edit as needed\ntickers = {\n    'BTC': 'BTC-USD',\n    'ETH': 'ETH-USD',\n    'BNB': 'BNB-USD',\n    'ADA': 'ADA-USD',\n    'XRP': 'XRP-USD',\n    'LTC': 'LTC-USD'\n}\nstart = \"2018-01-01\"\nend = None   # None =&gt; to today\nfreq = '1d'\nmaxlag_for_ic = 10   # max lags used when selecting VAR lag via AIC\nwindow_days = 180    # rolling window size (days)\nstep_days = 30       # step (days)\nalpha = 0.05<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Imports (uncomment pip install lines if required)\n# !pip install yfinance statsmodels matplotlib seaborn tqdm networkx\nimport yfinance as yf\nimport pandas as pd\nimport numpy as np\nfrom statsmodels.tsa.stattools import adfuller, kpss\nfrom statsmodels.tsa.api import VAR\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom tqdm import tqdm\nimport itertools\nimport math\nimport networkx as nx\n%matplotlib inline\nsns.set_style('whitegrid')<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Fetch prices and compute log-returns\ndef fetch_prices(ticker_map, start, end, interval='1d'):\n    df = yf.download(list(ticker_map.values()), start=start, end=end, interval=interval,\n                     progress=False, auto_adjust=False)['Adj Close']\n    if isinstance(df, pd.Series):\n        df = df.to_frame()\n    df.columns = list(ticker_map.keys())\n    return df.dropna()\n\ndef log_returns(prices):\n    return np.log(prices).diff().dropna()\n\nprices = fetch_prices(tickers, start, end, interval=freq)\nprint('Prices shape:', prices.shape)\nrets = log_returns(prices)\nprint('Returns shape:', rets.shape)\ndisplay(prices.head())\ndf = prices<\/pre>\n\n\n\n<p>Prices shape: (2818, 6) <br>Returns shape: (2817, 6)<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>BTC<\/th><th>ETH<\/th><th>BNB<\/th><th>ADA<\/th><th>XRP<\/th><th>LTC<\/th><\/tr><tr><th>Date<\/th><th><\/th><th><\/th><th><\/th><th><\/th><th><\/th><th><\/th><\/tr><\/thead><tbody><tr><th>2018-01-01<\/th><td>0.728657<\/td><td>8.41461<\/td><td>13657.200195<\/td><td>772.640991<\/td><td>229.033005<\/td><td>2.39103<\/td><\/tr><tr><th>2018-01-02<\/th><td>0.782587<\/td><td>8.83777<\/td><td>14982.099609<\/td><td>884.443970<\/td><td>255.684006<\/td><td>2.48090<\/td><\/tr><tr><th>2018-01-03<\/th><td>1.079660<\/td><td>9.53588<\/td><td>15201.000000<\/td><td>962.719971<\/td><td>245.367996<\/td><td>3.10537<\/td><\/tr><tr><th>2018-01-04<\/th><td>1.114120<\/td><td>9.21399<\/td><td>15599.200195<\/td><td>980.921997<\/td><td>241.369995<\/td><td>3.19663<\/td><\/tr><tr><th>2018-01-05<\/th><td>0.999559<\/td><td>14.91720<\/td><td>17429.500000<\/td><td>997.719971<\/td><td>249.270996<\/td><td>3.04871<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\nimport pandas as pd\n\n# Compute daily statistics\nmean_returns = rets.mean() * 100          # Mean daily log-return (%)\nvolatility = rets.std() * 100             # Daily volatility (%)\nsharpe_ratios = (mean_returns \/ volatility) * np.sqrt(365)  # Annualized Sharpe ratio\n\n# Print results\nprint(\"Mean Returns (%):\\n\", mean_returns)\nprint(\"\\nVolatility (%):\\n\", volatility)\nprint(\"\\nAnnual Sharpe Ratios:\\n\", sharpe_ratios)<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Mean Returns (%):\n BTC    0.008092\nETH    0.169422\nBNB    0.076319\nADA    0.063138\nXRP   -0.024096\nLTC    0.009434\ndtype: float64\n\nVolatility (%):\n BTC    5.419906\nETH    4.841994\nBNB    3.463202\nADA    4.529353\nXRP    4.825922\nLTC    5.424487\ndtype: float64\n\nAnnual Sharpe Ratios:\n BTC    0.028525\nETH    0.668484\nBNB    0.421017\nADA    0.266317\nXRP   -0.095392\nLTC    0.033227\ndtype: float64<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"Risk%E2%80%93Return-Analysis-of-Cryptocurrencies\">Risk\u2013Return Analysis of Cryptocurrencies<a href=\"#Risk%E2%80%93Return-Analysis-of-Cryptocurrencies\"><\/a><\/h1>\n\n\n\n<p>The analysis of mean returns, volatility, and Sharpe ratios across six major cryptocurrencies provides valuable insights into their performance.<\/p>\n\n\n\n<p><strong>Mean Returns:<\/strong><br>Ethereum (<strong>0.169%<\/strong>) shows the highest average daily return, followed by Binance Coin (<strong>0.076%<\/strong>) and Cardano (<strong>0.063%<\/strong>). Bitcoin and Litecoin recorded very small positive returns, while XRP stands out with a&nbsp;<strong>negative mean return (-0.024%)<\/strong>, highlighting its underperformance over the sample period.<\/p>\n\n\n\n<p><strong>Volatility:<\/strong><br>Bitcoin (<strong>5.42%<\/strong>) and Litecoin (<strong>5.42%<\/strong>) exhibit the highest volatility, reflecting larger daily price fluctuations. In contrast, Binance Coin (<strong>3.46%<\/strong>) is the least volatile, making it relatively more stable compared to other assets. Ethereum, Cardano, and XRP fall in between, with volatility around&nbsp;<strong>4\u20135%<\/strong>.<\/p>\n\n\n\n<p><strong>Sharpe Ratios:<\/strong><br>The Sharpe Ratio, which measures risk-adjusted performance, shows Ethereum as the clear leader (<strong>0.668<\/strong>), delivering the best returns per unit of risk. Binance Coin also performs well (<strong>0.421<\/strong>), while Cardano shows a modest ratio (<strong>0.267<\/strong>). Bitcoin and Litecoin have very low Sharpe Ratios (<strong>0.028<\/strong>&nbsp;and&nbsp;<strong>0.033<\/strong>), indicating their returns barely compensated for risk. XRP records a&nbsp;<strong>negative Sharpe Ratio (-0.096)<\/strong>, underscoring poor risk-adjusted performance.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Interpretation\">Interpretation<a href=\"#Interpretation\"><\/a><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ethereum<\/strong>&nbsp;emerges as the strongest asset in terms of both returns and risk-adjusted performance.<\/li>\n\n\n\n<li><strong>Binance Coin<\/strong>&nbsp;offers a good balance of stability and return.<\/li>\n\n\n\n<li><strong>XRP<\/strong>&nbsp;underperformed significantly, both in raw and adjusted measures.<\/li>\n\n\n\n<li><strong>Bitcoin and Litecoin<\/strong>&nbsp;remain volatile benchmarks but delivered minimal excess return over risk.<\/li>\n<\/ul>\n\n\n\n<p>Overall, the findings highlight that not all cryptocurrencies offer the same investment value.<br>Ethereum and BNB stand out as&nbsp;<strong>attractive choices<\/strong>, while XRP lags behind.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import matplotlib.pyplot as plt\n\nmetrics = pd.DataFrame({\n    'Mean Returns': mean_returns,\n    'Volatility': volatility,\n    'Sharpe Ratio': sharpe_ratios\n})\n\nfig, axes = plt.subplots(1, 3, figsize=(15,4))\nmetrics['Mean Returns'].plot(kind='bar', ax=axes[0], title='Mean Daily Returns (%)')\nmetrics['Volatility'].plot(kind='bar', ax=axes[1], title='Volatility (%)')\nmetrics['Sharpe Ratio'].plot(kind='bar', ax=axes[2], title='Annual Sharpe Ratios')\n\nplt.tight_layout()\nplt.show()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1100\" height=\"288\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-1-1100x288.png\" alt=\"Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework\" class=\"wp-image-231056 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-1-1100x288.png 1100w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-1-700x183.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-1-300x79.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-1-768x201.png 768w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-1.png 1490w\" data-sizes=\"(max-width: 1100px) 100vw, 1100px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1100px; aspect-ratio: 1100\/288;\" \/><\/figure>\n\n\n\n<p>Source: Yahoo Finance<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom scipy import stats\nfrom matplotlib import rcParams\n\n# Set plotting style\nrcParams['font.family'] = 'DejaVu Sans'\nrcParams['font.size'] = 12\n\n# --- Detect column type and get list of tickers ---\nif isinstance(df.columns, pd.MultiIndex):\n    # If multi-level, assume top level like 'Close'\n    if 'Close' in df.columns.get_level_values(0):\n        tickers = df['Close'].columns.tolist()\n    else:\n        tickers = df.columns.get_level_values(1).unique().tolist()\nelse:\n    # Single-level columns\n    tickers = df.columns.tolist()\n\n# --- Compute returns and rolling volatility ---\nfor t in tickers:\n    if isinstance(df.columns, pd.MultiIndex):\n        # MultiIndex: assume we have 'Close' as top-level\n        df[('Return', t)] = df[('Close', t)].pct_change() * 100\n        df[('RollingVol', t)] = df[('Return', t)].rolling(20).std()\n    else:\n        # Single-level\n        df[f'Return_{t}'] = df[t].pct_change() * 100\n        df[f'RollingVol_{t}'] = df[f'Return_{t}'].rolling(20).std()\n\n# --- Create plots ---\nfig, axes = plt.subplots(len(tickers), 4, figsize=(20, 4*len(tickers)))\n\n# Make axes always 2D\nif len(tickers) == 1:\n    axes = np.expand_dims(axes, axis=0)\n\nfor i, t in enumerate(tickers):\n    if isinstance(df.columns, pd.MultiIndex):\n        returns = df[('Return', t)].dropna()\n        rolling_vol = df[('RollingVol', t)]\n    else:\n        returns = df[f'Return_{t}'].dropna()\n        rolling_vol = df[f'RollingVol_{t}']\n\n    # 1. Histogram with quantiles\n    axes[i, 0].hist(returns, bins=50, density=True, alpha=0.7, color='#FFB6C1')\n    for q in [0.05, 0.25, 0.5, 0.75, 0.95]:\n        q_val = returns.quantile(q)\n        axes[i, 0].axvline(q_val, linestyle='--', label=f'{int(q*100)}%: {q_val:.2f}%')\n    axes[i, 0].set_title(f\"{t} Return Distribution\")\n    axes[i, 0].legend(fontsize=8)\n\n    # 2. Q-Q plot\n    stats.probplot(returns, dist=\"norm\", plot=axes[i, 1])\n    axes[i, 1].set_title(f\"{t} Q-Q Plot\")\n\n    # 3. Boxplot\n    axes[i, 2].boxplot(returns, patch_artist=True, boxprops=dict(facecolor='#FFB6C1'))\n    axes[i, 2].set_title(f\"{t} Return Boxplot\")\n\n    # 4. Rolling volatility\n    axes[i, 3].plot(df.index, rolling_vol, color='#FF69B4')\n    axes[i, 3].set_title(f\"{t} 20-Day Rolling Volatility\")\n\nplt.tight_layout()\nplt.show()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1100\" height=\"1322\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-2-1100x1322.png\" alt=\"Return Causality among Cryptocurrencies\" class=\"wp-image-231061 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-2-1100x1322.png 1100w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-2-700x842.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-2-300x361.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-2-768x923.png 768w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-2-1278x1536.png 1278w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-2-1704x2048.png 1704w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-2.png 1983w\" data-sizes=\"(max-width: 1100px) 100vw, 1100px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1100px; aspect-ratio: 1100\/1322;\" \/><\/figure>\n\n\n\n<p>Source: Yahoo Finance<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"Detect-tickers-in-your-DataFrame.\">Detect tickers in your DataFrame.<a href=\"#Detect-tickers-in-your-DataFrame.\"><\/a><\/h4>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"Compute-daily-returns-and-rolling-volatility.\">Compute daily returns and rolling volatility.<a href=\"#Compute-daily-returns-and-rolling-volatility.\"><\/a><\/h4>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"Print-key-statistics:-mean,-std,-skewness,-kurtosis.\">Print key statistics: mean, std, skewness, kurtosis.<a href=\"-mean,-std,-skewness,-kurtosis.\"><\/a><\/h4>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"lot-histograms,-Q-Q-plots,-boxplots,-and-rolling-volatility.\">lot histograms, Q-Q plots, boxplots, and rolling volatility.<a href=\"#lot-histograms,-Q-Q-plots,-boxplots,-and-rolling-volatility.\"><\/a><\/h4>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"Layout-plots-cleanly-with-tight-spacing-for-inline-display-in-Colab.\">Layout plots cleanly with tight spacing for inline display in Colab.<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># ADF test quick check (returns should typically be stationary)\ndef adf_pvalue(series):\n    try:\n        return adfuller(series, autolag='AIC')[1]\n    except Exception:\n        return np.nan\n\ndef integration_order_estimate(series, adf_alpha=0.05):\n    pv = adf_pvalue(series)\n    if pd.isna(pv):\n        return 0\n    return 1 if pv &gt; adf_alpha else 0\n\nadf_summary = {col: adf_pvalue(rets[col]) for col in rets.columns}\nprint('ADF p-values (returns):')\ndisplay(pd.Series(adf_summary))<\/pre>\n\n\n\n<p>ADF p-values (returns):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">0\nBTC\t0.000000e+00\nETH\t3.310268e-26\nBNB\t2.026843e-30\nADA\t6.717843e-29\nXRP\t0.000000e+00\nLTC\t0.000000e+00\n\ndtype:\u00a0float64<\/pre>\n\n\n\n<p>Interpretation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>All p-values are extremely small (&lt; 0.05).<\/li>\n\n\n\n<li>We reject the null hypothesis: returns are stationary.<\/li>\n\n\n\n<li>Conclusion: BTC, ETH, BNB, ADA, XRP, and LTC returns have stable mean and variance over time, suitable for time series modeling.<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Inspect columns first\nprint(\"First 10 columns:\", df.columns[:10])\n\n# Flexible helper to get close price column for a ticker\ndef get_close_column(df, ticker):\n    cols = df.columns\n\n    # Case 1: multi-index (('Close','BTC'))\n    if isinstance(cols, pd.MultiIndex):\n        if ('Close', ticker) in cols:\n            return ('Close', ticker)\n        elif (ticker, 'Close') in cols:\n            return (ticker, 'Close')\n\n    # Case 2: single-level with names like BTC_Close\n    for c in cols:\n        if str(c).lower() in [f\"{ticker.lower()}_close\", f\"close_{ticker.lower()}\"]:\n            return c\n\n    # Case 3: maybe just ticker name itself\n    if ticker in cols:\n        return ticker\n\n    raise KeyError(f\"\u274c No close column found for {ticker}\")\n\n# Compute returns &amp; rolling volatility\nfor t in tickers:\n    close_col = get_close_column(df, t)\n    df[f\"{t}_Return\"] = df[close_col].pct_change() * 100\n    df[f\"{t}_RollingVol\"] = df[f\"{t}_Return\"].rolling(20).std()<\/pre>\n\n\n\n<p>First 10 columns: Index([&#8216;BTC&#8217;, &#8216;ETH&#8217;, &#8216;BNB&#8217;, &#8216;ADA&#8217;, &#8216;XRP&#8217;, &#8216;LTC&#8217;, &#8216;Return_BTC&#8217;, <br>&#8216;RollingVol_BTC&#8217;, &#8216;Return_ETH&#8217;, &#8216;RollingVol_ETH&#8217;], <br>dtype=&#8217;object&#8217;)<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># --- Create plots ---\nfig, axes = plt.subplots(len(tickers), 4, figsize=(20, 4*len(tickers)))\n\nif len(tickers) == 1:\n    axes = np.expand_dims(axes, axis=0)\n\nfor i, t in enumerate(tickers):\n    if isinstance(df.columns, pd.MultiIndex):\n        returns = df[('Return', t)].dropna()\n        rolling_vol = df[('RollingVol', t)]\n    else:\n        returns = df[f'Return_{t}'].dropna()\n        rolling_vol = df[f'RollingVol_{t}']\n\n    # 1. Histogram with quantiles\n    axes[i, 0].hist(returns, bins=50, density=True, alpha=0.7, color='#FFB6C1')\n    for q in [0.05, 0.25, 0.5, 0.75, 0.95]:\n        q_val = returns.quantile(q)\n        axes[i, 0].axvline(q_val, linestyle='--', label=f'{int(q*100)}%: {q_val:.2f}%')\n    axes[i, 0].set_title(f\"{t} Return Distribution\")\n    axes[i, 0].legend(fontsize=8)\n\n    # 2. Q-Q plot\n    stats.probplot(returns, dist=\"norm\", plot=axes[i, 1])\n    axes[i, 1].set_title(f\"{t} Q-Q Plot\")\n\n    # 3. Boxplot\n    axes[i, 2].boxplot(returns, patch_artist=True, boxprops=dict(facecolor='#FFB6C1'))\n    axes[i, 2].set_title(f\"{t} Return Boxplot\")\n\n    # 4. Rolling volatility\n    axes[i, 3].plot(df.index, rolling_vol, color='#FF69B4')\n    axes[i, 3].set_title(f\"{t} 20-Day Rolling Volatility\")\n\nplt.tight_layout()\n\n# \ud83d\udd39 Save the figure as PNG\nplt.savefig(\"ticker_analysis_plots.png\", dpi=300, bbox_inches=\"tight\")\n\n# Optional: also show interactively\nplt.show()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1100\" height=\"1322\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-3-1100x1322.png\" alt=\"Return Causality among Cryptocurrencies\" class=\"wp-image-231062 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-3-1100x1322.png 1100w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-3-700x842.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-3-300x361.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-3-768x923.png 768w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-3-1278x1536.png 1278w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-3-1704x2048.png 1704w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-3.png 1983w\" data-sizes=\"(max-width: 1100px) 100vw, 1100px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1100px; aspect-ratio: 1100\/1322;\" \/><\/figure>\n\n\n\n<p>Source: Yahoo Finance<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import warnings\nfrom tqdm import tqdm\n\n# Suppress statsmodels frequency warnings\nwarnings.filterwarnings(\"ignore\", category=Warning)\n\ndef rolling_toda_yamamoto(df, window, step, max_lag_ic=10, progress=True):\n    dates = []\n    windows = []\n    n = len(df)\n    indices = list(range(0, n - window + 1, step))\n\n    if progress:\n        indices = tqdm(indices, desc='Rolling windows')\n\n    for start_idx in indices:\n        end_idx = start_idx + window\n        sub = df.iloc[start_idx:end_idx]\n        mid_date = sub.index[-1]\n\n        # Compute full-sample Toda-Yamamoto causality matrix\n        pmat = full_sample_toda_yamamoto_matrix(sub, max_lag_ic=max_lag_ic)\n\n        dates.append(mid_date)\n        windows.append(pmat)\n\n    # Print only final summary\n    if dates:\n        print(f\"\u2705 Computed {len(windows)} windows from {dates[0].date()} to {dates[-1].date()}\")\n    else:\n        print(\"\u26a0\ufe0f No windows computed\")\n\n    return dates, windows\n\n# Example usage\nwindow = window_days\nstep = step_days\ndates, windows = rolling_toda_yamamoto(rets, window, step, max_lag_ic=maxlag_for_ic, progress=True)<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Rolling windows: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 88\/88 [01:30&lt;00:00, 1.03s\/it]<br>\u2705 Computed 88 windows from 2018-06-30 to 2025-08-22<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"Rolling-window-Toda%E2%80%93Yamamoto-causality-%E2%80%93-Summary:\">Rolling-window Toda\u2013Yamamoto causality \u2013 Summary:<a href=\"\"><\/a><\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Purpose: Track how causal relationships between time series change over time.<\/li>\n\n\n\n<li>Method: Compute T\u2013Y causality matrices on rolling windows of data.<\/li>\n\n\n\n<li>Outputs: \u2022 dates \u2192 End date of each window \u2022 windows \u2192 Pairwise causality matrices for each window<\/li>\n\n\n\n<li>Interpretation: Each matrix shows which assets may &#8217;cause&#8217; others; allows analysis of dynamic, time-varying relationships.<\/li>\n\n\n\n<li>Colab-friendly: Shows progress and reports number of windows with date range.<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># FDR (Benjamini-Hochberg) and stability metrics\ndef fdr_bh(pvals, alpha=0.05):\n    p = np.array(pvals, dtype=float)\n    mask = ~np.isnan(p)\n    p_valid = p[mask]\n    n = len(p_valid)\n    decisions = np.zeros_like(p, dtype=bool)\n    if n == 0:\n        return decisions\n    order = np.argsort(p_valid)\n    sorted_p = p_valid[order]\n    thresholds = (np.arange(1, n+1) \/ n) * alpha\n    below = sorted_p &lt;= thresholds\n    if not np.any(below):\n        decisions[mask] = False\n        return decisions\n    max_idx = np.max(np.where(below))\n    rej = np.zeros(n, dtype=bool)\n    rej[:max_idx+1] = True\n    inv_order = np.argsort(order)\n    decisions[mask] = rej[inv_order]\n    return decisions\n\ndef compute_stability_metrics(dates, windows, alpha=0.05, per_window_fdr=False, global_fdr=False):\n    names = windows[0].index.tolist()\n    pairs = [(x,y) for x in names for y in names if x!=y]\n    n_windows = len(windows)\n    pvals = {pair: [] for pair in pairs}\n    for w in windows:\n        for pair in pairs:\n            pvals[pair].append(w.loc[pair[0], pair[1]])\n    if global_fdr:\n        flat = []\n        flat_pairs = []\n        for pair in pairs:\n            for t in range(n_windows):\n                flat.append(pvals[pair][t])\n                flat_pairs.append(pair + (t,))\n        flags_flat = fdr_bh(flat, alpha=alpha)\n        sig = {pair: [False]*n_windows for pair in pairs}\n        for idx, flag in enumerate(flags_flat):\n            pair = flat_pairs[idx][:2]\n            t = flat_pairs[idx][2]\n            sig[pair][t] = bool(flag)\n    else:\n        sig = {pair: [] for pair in pairs}\n        for t in range(n_windows):\n            p_window = [pvals[pair][t] for pair in pairs]\n            if per_window_fdr:\n                flags = fdr_bh(p_window, alpha=alpha)\n            else:\n                flags = np.array([ (pv &lt; alpha) if (not np.isnan(pv)) else False for pv in p_window ])\n            for i, pair in enumerate(pairs):\n                sig[pair].append(bool(flags[i]))\n    rows = []\n    for pair in pairs:\n        sig_seq = np.array(sig[pair], dtype=bool)\n        p_seq = np.array(pvals[pair], dtype=float)\n        frac_sig = np.nanmean(sig_seq) if len(sig_seq)&gt;0 else np.nan\n        mean_p = np.nanmean(p_seq)\n        max_run = 0\n        run = 0\n        for b in sig_seq:\n            if b:\n                run += 1\n                if run &gt; max_run:\n                    max_run = run\n            else:\n                run = 0\n        rows.append({\n            'cause': pair[0],\n            'effect': pair[1],\n            'frac_significant': frac_sig,\n            'mean_p': mean_p,\n            'longest_run_windows': max_run,\n            'n_windows': n_windows\n        })\n    stability_df = pd.DataFrame(rows)\n    return stability_df, pvals, sig, pairs\n\nstab_no_fdr, pvals_no_fdr, sig_no_fdr, pairs = compute_stability_metrics(dates, windows, alpha=alpha, per_window_fdr=False, global_fdr=False)\nstab_perwindow_fdr, pvals_perwindow_fdr, sig_perwindow_fdr, _ = compute_stability_metrics(dates, windows, alpha=alpha, per_window_fdr=True, global_fdr=False)\nstab_global_fdr, pvals_global_fdr, sig_global_fdr, _ = compute_stability_metrics(dates, windows, alpha=alpha, per_window_fdr=False, global_fdr=True)\n\nprint('Top pairs by fraction significant (no FDR):')\ndisplay(stab_no_fdr.sort_values('frac_significant', ascending=False).head(10))\nprint('Top pairs by fraction significant (per-window FDR):')\ndisplay(stab_perwindow_fdr.sort_values('frac_significant', ascending=False).head(10))\nprint('Top pairs by fraction significant (global FDR):')\ndisplay(stab_global_fdr.sort_values('frac_significant', ascending=False).head(10))\n\n# Save outputs\npmat_full.to_csv('ty_fullsample_pvalues.csv')\nstab_no_fdr.to_csv('stability_no_fdr.csv', index=False)\nstab_perwindow_fdr.to_csv('stability_perwindow_fdr.csv', index=False)\nstab_global_fdr.to_csv('stability_global_fdr.csv', index=False)\nprint('Saved CSVs: ty_fullsample_pvalues.csv, stability_no_fdr.csv, stability_perwindow_fdr.csv, stability_global_fdr.csv')<\/pre>\n\n\n\n<p>Top pairs by fraction significant (no FDR):<br><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>cause<\/th><th>effect<\/th><th>frac_significant<\/th><th>mean_p<\/th><th>longest_run_windows<\/th><th>n_windows<\/th><\/tr><\/thead><tbody><tr><th>27<\/th><td>LTC<\/td><td>BNB<\/td><td>0.227273<\/td><td>0.192875<\/td><td>5<\/td><td>88<\/td><\/tr><tr><th>21<\/th><td>XRP<\/td><td>ETH<\/td><td>0.204545<\/td><td>0.242837<\/td><td>4<\/td><td>88<\/td><\/tr><tr><th>14<\/th><td>BNB<\/td><td>LTC<\/td><td>0.181818<\/td><td>0.280912<\/td><td>5<\/td><td>88<\/td><\/tr><tr><th>19<\/th><td>ADA<\/td><td>LTC<\/td><td>0.181818<\/td><td>0.306245<\/td><td>6<\/td><td>88<\/td><\/tr><tr><th>25<\/th><td>LTC<\/td><td>BTC<\/td><td>0.181818<\/td><td>0.279368<\/td><td>5<\/td><td>88<\/td><\/tr><tr><th>4<\/th><td>BTC<\/td><td>LTC<\/td><td>0.170455<\/td><td>0.234125<\/td><td>6<\/td><td>88<\/td><\/tr><tr><th>17<\/th><td>ADA<\/td><td>BNB<\/td><td>0.170455<\/td><td>0.199688<\/td><td>6<\/td><td>88<\/td><\/tr><tr><th>18<\/th><td>ADA<\/td><td>XRP<\/td><td>0.159091<\/td><td>0.237433<\/td><td>6<\/td><td>88<\/td><\/tr><tr><th>26<\/th><td>LTC<\/td><td>ETH<\/td><td>0.159091<\/td><td>0.244020<\/td><td>4<\/td><td>88<\/td><\/tr><tr><th>9<\/th><td>ETH<\/td><td>LTC<\/td><td>0.147727<\/td><td>0.233621<\/td><td>3<\/td><td>88<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Top pairs by fraction significant (per-window FDR):<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>cause<\/th><th>effect<\/th><th>frac_significant<\/th><th>mean_p<\/th><th>longest_run_windows<\/th><th>n_windows<\/th><\/tr><\/thead><tbody><tr><th>18<\/th><td>ADA<\/td><td>XRP<\/td><td>0.136364<\/td><td>0.237433<\/td><td>6<\/td><td>88<\/td><\/tr><tr><th>21<\/th><td>XRP<\/td><td>ETH<\/td><td>0.136364<\/td><td>0.242837<\/td><td>4<\/td><td>88<\/td><\/tr><tr><th>19<\/th><td>ADA<\/td><td>LTC<\/td><td>0.090909<\/td><td>0.306245<\/td><td>5<\/td><td>88<\/td><\/tr><tr><th>14<\/th><td>BNB<\/td><td>LTC<\/td><td>0.090909<\/td><td>0.280912<\/td><td>2<\/td><td>88<\/td><\/tr><tr><th>25<\/th><td>LTC<\/td><td>BTC<\/td><td>0.090909<\/td><td>0.279368<\/td><td>3<\/td><td>88<\/td><\/tr><tr><th>27<\/th><td>LTC<\/td><td>BNB<\/td><td>0.090909<\/td><td>0.192875<\/td><td>2<\/td><td>88<\/td><\/tr><tr><th>2<\/th><td>BTC<\/td><td>ADA<\/td><td>0.079545<\/td><td>0.259896<\/td><td>3<\/td><td>88<\/td><\/tr><tr><th>26<\/th><td>LTC<\/td><td>ETH<\/td><td>0.079545<\/td><td>0.244020<\/td><td>3<\/td><td>88<\/td><\/tr><tr><th>16<\/th><td>ADA<\/td><td>ETH<\/td><td>0.068182<\/td><td>0.261890<\/td><td>4<\/td><td>88<\/td><\/tr><tr><th>0<\/th><td>BTC<\/td><td>ETH<\/td><td>0.068182<\/td><td>0.357408<\/td><td>3<\/td><td>88<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Top pairs by fraction significant (global FDR):<br><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>cause<\/th><th>effect<\/th><th>frac_significant<\/th><th>mean_p<\/th><th>longest_run_windows<\/th><th>n_windows<\/th><\/tr><\/thead><tbody><tr><th>14<\/th><td>BNB<\/td><td>LTC<\/td><td>0.068182<\/td><td>0.280912<\/td><td>2<\/td><td>88<\/td><\/tr><tr><th>3<\/th><td>BTC<\/td><td>XRP<\/td><td>0.056818<\/td><td>0.305443<\/td><td>4<\/td><td>88<\/td><\/tr><tr><th>18<\/th><td>ADA<\/td><td>XRP<\/td><td>0.056818<\/td><td>0.237433<\/td><td>2<\/td><td>88<\/td><\/tr><tr><th>2<\/th><td>BTC<\/td><td>ADA<\/td><td>0.056818<\/td><td>0.259896<\/td><td>3<\/td><td>88<\/td><\/tr><tr><th>5<\/th><td>ETH<\/td><td>BTC<\/td><td>0.045455<\/td><td>0.219297<\/td><td>2<\/td><td>88<\/td><\/tr><tr><th>9<\/th><td>ETH<\/td><td>LTC<\/td><td>0.045455<\/td><td>0.233621<\/td><td>2<\/td><td>88<\/td><\/tr><tr><th>25<\/th><td>LTC<\/td><td>BTC<\/td><td>0.045455<\/td><td>0.279368<\/td><td>3<\/td><td>88<\/td><\/tr><tr><th>24<\/th><td>XRP<\/td><td>LTC<\/td><td>0.045455<\/td><td>0.376740<\/td><td>2<\/td><td>88<\/td><\/tr><tr><th>27<\/th><td>LTC<\/td><td>BNB<\/td><td>0.045455<\/td><td>0.192875<\/td><td>1<\/td><td>88<\/td><\/tr><tr><th>26<\/th><td>LTC<\/td><td>ETH<\/td><td>0.045455<\/td><td>0.244020<\/td><td>1<\/td><td>88<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Saved CSVs: ty_fullsample_pvalues.csv, stability_no_fdr.csv, stability_perwindow_fdr.csv, stability_global_fdr.csv<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-1-what-the-columns-mean\">1. What the Columns Mean<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cause \u2192 effect: Direction of causality tested in the Toda\u2013Yamamoto framework.\n\nfrac_significant: Fraction of rolling windows where the causal effect was statistically significant. Higher values \u2192 more consistent causality.\n\nmean_p: Average p-value across windows. Lower values \u2192 stronger evidence of causality.\n\nlongest_run_windows: Longest consecutive sequence of windows where causality was significant. Shows persistence.\n\nn_windows: Total number of rolling windows analyzed (here, 88).<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-2-key-observations\">2. Key Observations<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">No FDR\n\nLTC \u2192 BNB is most frequently significant (22.7% of windows).\n\nXRP \u2192 ETH and BNB \u2192 LTC are also prominent.A\n\nSome pairs like ADA \u2192 LTC and LTC \u2192 BTC have moderate persistence (5\u20136 consecutive windows).\n\nWithout correction, several causal relationships appear relatively frequent, but some may be false positives.\n\nPer-Window FDR\n\nFraction significant drops for all pairs after controlling for multiple tests.\n\nADA \u2192 XRP and XRP \u2192 ETH remain the top pairs (~13.6% of windows).\n\nLongest runs show some persistence (e.g., ADA \u2192 XRP: 6 consecutive windows).\n\nThis shows adjusting for false discoveries reduces apparent causality, highlighting the most robust effects.\n\nGlobal FDR\n\nFraction significant further decreases across all pairs (highest ~6.8%).\n\nBNB \u2192 LTC and BTC \u2192 XRP emerge as the top globally significant pairs.\n\nMany previously frequent effects are no longer significant after global multiple-testing correction.\n\nThis is the most conservative approach, ensuring only the strongest causal signals are considered.\n\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-3-practical-interpretation\">3. Practical Interpretation<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Raw results (no FDR): Suggest multiple potential causal relationships but may include false positives.\n\nPer-window FDR: Highlights robust, time-local causality; shows which relationships are significant within individual windows.\n\nGlobal FDR: Highlights overall, highly stable causal relationships across the entire time period.\n\nStrong\/persistent effects to note:\n\nLTC \u2192 BNB (robust across no-FDR and per-window FDR).\n\nADA \u2192 XRP, XRP \u2192 ETH (robust per-window).\n\nBNB \u2192 LTC, BTC \u2192 XRP (appear under global FDR).<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"Summary:\">Summary:<a href=\"\"><\/a><\/h1>\n\n\n\n<p>Most causal relationships in crypto returns are weak and intermittent. Only a few pairs show robust, persistent causality, especially after controlling for false discoveries. FDR correction is critical to identify truly meaningful links and avoid spurious effects.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Visualizations: fraction heatmap and p-value time series for example pair\npairs_df = stab_no_fdr.pivot(index='cause', columns='effect', values='frac_significant')\nplt.figure(figsize=(8,6))\nsns.heatmap(pairs_df, annot=True, fmt='.2f', vmin=0, vmax=1, cmap='viridis', cbar_kws={'label': 'fraction significant'})\nplt.title(f'Fraction of windows where X -&gt; Y is significant (window={window_days} days, step={step_days} days) [no FDR]')\nplt.tight_layout()\nplt.show()\n\n# Example p-value series for BTC -&gt; ETH\npair_example = ('BTC','ETH')\np_series = pvals_no_fdr[pair_example]\nsig_series_no_fdr = sig_no_fdr[pair_example]\nsig_series_perwindow = sig_perwindow_fdr[pair_example]\nsig_series_global = sig_global_fdr[pair_example]\n\nplt.figure(figsize=(12,4))\nplt.plot(dates, p_series, marker='o', label='p-value')\nplt.axhline(alpha, color='r', linestyle='--', label=f'alpha={alpha}')\nfor i, dt in enumerate(dates):\n    if sig_series_perwindow[i]:\n        plt.scatter(dt, p_series[i], marker='s', s=80, facecolors='none', edgecolors='green', label='per-window FDR sig' if i==0 else \"\")\n    if sig_series_global[i]:\n        plt.scatter(dt, p_series[i], marker='D', s=60, facecolors='none', edgecolors='purple', label='global FDR sig' if i==0 else \"\")\nplt.title(f'Rolling T\u2013Y p-values: {pair_example[0]} -&gt; {pair_example[1]}')\nplt.ylabel('p-value')\nplt.legend()\nplt.tight_layout()\nplt.show()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"804\" height=\"590\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-4.png\" alt=\"Return Causality among Cryptocurrencies\" class=\"wp-image-231065 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-4.png 804w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-4-700x514.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-4-300x220.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-4-768x564.png 768w\" data-sizes=\"(max-width: 804px) 100vw, 804px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 804px; aspect-ratio: 804\/590;\" \/><\/figure>\n\n\n\n<p>Source: Yahoo Finance<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1100\" height=\"361\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-5-1100x361.png\" alt=\"Return Causality among Cryptocurrencies\" class=\"wp-image-231066 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-5-1100x361.png 1100w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-5-700x230.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-5-300x98.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-5-768x252.png 768w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-5.png 1189w\" data-sizes=\"(max-width: 1100px) 100vw, 1100px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1100px; aspect-ratio: 1100\/361;\" \/><\/figure>\n\n\n\n<p>Source: Yahoo Finance<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Build network for full-sample significant links (threshold alpha)\nG = nx.DiGraph()\nthreshold = alpha\nfor idx, row in pmat_full.stack().reset_index().iterrows():\n    src = row['level_0']\n    tgt = row['level_1']\n    pval = row[0]\n    if not np.isnan(pval) and pval &lt; threshold:\n        G.add_edge(src, tgt, weight=1-pval)\n\nplt.figure(figsize=(8,6))\npos = nx.spring_layout(G, seed=42)\nnx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=1400, arrowsize=20)\nedge_labels = {(u,v): f\"{1-d['weight']:.2f}\" for u,v,d in G.edges(data=True)}\nnx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)\nplt.title('Full-sample significant causality network (p &lt; {:.2f})'.format(threshold))\nplt.show()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"819\" height=\"642\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-6.png\" alt=\"Return Causality among Cryptocurrencies\" class=\"wp-image-231068 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-6.png 819w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-6-700x549.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-6-300x235.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-6-768x602.png 768w\" data-sizes=\"(max-width: 819px) 100vw, 819px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 819px; aspect-ratio: 819\/642;\" \/><\/figure>\n\n\n\n<p>Source: Yahoo Finance<\/p>\n\n\n\n<p>Figure 2 \u2013 Rolling p-values for three representative pairs<\/p>\n\n\n\n<p>Rolling-window Toda\u2013Yamamoto p-values are plotted over time for three illustrative causal directions: ADA \u2192 XRP, XRP \u2192 ETH, and BTC \u2192 ETH.&#8217;<\/p>\n\n\n\n<p>\u25cf The raw (no-FDR) p-values are shown as time series.<\/p>\n\n\n\n<p>\u25cf Horizontal reference lines indicate the 5% threshold (uncorrected) and the corresponding thresholds under per-window FDR and global FDR.<\/p>\n\n\n\n<p>\u25cf ADA \u2192 XRP: shows moderate persistence, with repeated dips below the 5% level, some surviving per-window FDR.<\/p>\n\n\n\n<p>\u25cf XRP \u2192 ETH: occasional significance that weakens after adjustment.<\/p>\n\n\n\n<p>\u25cf BTC \u2192 ETH: appears significant in raw tests but becomes weak and intermittent under both FDR regimes.<\/p>\n\n\n\n<p>Overall, this figure illustrates how multiple-testing correction reduces the number of apparent causal episodes, highlighting that most effects are local and transient rather than stable.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pandas as pd\n\nstab_no_fdr = pd.read_csv(\"stability_no_fdr.csv\")\nstab_perwindow_fdr = pd.read_csv(\"stability_perwindow_fdr.csv\")\nstab_global_fdr = pd.read_csv(\"stability_global_fdr.csv\")<\/pre>\n\n\n\n<p><strong>Find the most stable causal pairs<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Top pairs without FDR\nprint(\"Top pairs (no FDR):\")\nprint(stab_no_fdr.sort_values('frac_significant', ascending=False).head(10))\n\n# Top pairs with per-window FDR\nprint(\"Top pairs (per-window FDR):\")\nprint(stab_perwindow_fdr.sort_values('frac_significant', ascending=False).head(10))\n\n# Top pairs with global FDR\nprint(\"Top pairs (global FDR):\")\nprint(stab_global_fdr.sort_values('frac_significant', ascending=False).head(10))<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Top pairs (no FDR):\n   cause effect  frac_significant    mean_p  longest_run_windows  n_windows\n27   LTC    BNB          0.227273  0.192875                    5         88\n21   XRP    ETH          0.204545  0.242837                    4         88\n14   BNB    LTC          0.181818  0.280912                    5         88\n19   ADA    LTC          0.181818  0.306245                    6         88\n25   LTC    BTC          0.181818  0.279368                    5         88\n4    BTC    LTC          0.170455  0.234125                    6         88\n17   ADA    BNB          0.170455  0.199688                    6         88\n18   ADA    XRP          0.159091  0.237433                    6         88\n26   LTC    ETH          0.159091  0.244020                    4         88\n9    ETH    LTC          0.147727  0.233621                    3         88\nTop pairs (per-window FDR):\n   cause effect  frac_significant    mean_p  longest_run_windows  n_windows\n18   ADA    XRP          0.136364  0.237433                    6         88\n21   XRP    ETH          0.136364  0.242837                    4         88\n19   ADA    LTC          0.090909  0.306245                    5         88\n14   BNB    LTC          0.090909  0.280912                    2         88\n25   LTC    BTC          0.090909  0.279368                    3         88\n27   LTC    BNB          0.090909  0.192875                    2         88\n2    BTC    ADA          0.079545  0.259896                    3         88\n26   LTC    ETH          0.079545  0.244020                    3         88\n16   ADA    ETH          0.068182  0.261890                    4         88\n0    BTC    ETH          0.068182  0.357408                    3         88\nTop pairs (global FDR):\n   cause effect  frac_significant    mean_p  longest_run_windows  n_windows\n14   BNB    LTC          0.068182  0.280912                    2         88\n3    BTC    XRP          0.056818  0.305443                    4         88\n18   ADA    XRP          0.056818  0.237433                    2         88\n2    BTC    ADA          0.056818  0.259896                    3         88\n5    ETH    BTC          0.045455  0.219297                    2         88\n9    ETH    LTC          0.045455  0.233621                    2         88\n25   LTC    BTC          0.045455  0.279368                    3         88\n24   XRP    LTC          0.045455  0.376740                    2         88\n27   LTC    BNB          0.045455  0.192875                    1         88\n26   LTC    ETH          0.045455  0.244020                    1         88<\/pre>\n\n\n\n<p>\ud83d\udd39 BTC as cause (BTC \u2192 others)<\/p>\n\n\n\n<p>No FDR (raw):<\/p>\n\n\n\n<p>\u25cf BTC \u2192 LTC is the strongest (17.0% of windows, mean p \u2248 0.23, run length 6).<\/p>\n\n\n\n<p>\u25cf BTC \u2192 XRP and BTC \u2192 ADA show moderate frequency (~13\u201312%).<\/p>\n\n\n\n<p>\u25cf BTC \u2192 ETH (10.2%) and BTC \u2192 BNB (9.1%) are weaker and intermittent. \ud83d\udc49 Interpretation: Raw results make BTC appear influential across several pairs, especially on LTC.<\/p>\n\n\n\n<p>Per-window FDR (from your earlier leaderboard):<\/p>\n\n\n\n<p>\u25cf Only a few BTC-driven effects survive:<\/p>\n\n\n\n<p>\u25cb BTC \u2192 ADA (7.95%)<\/p>\n\n\n\n<p>\u25cb BTC \u2192 ETH (6.82%)<\/p>\n\n\n\n<p>\u25cf The others (BTC \u2192 XRP, BTC \u2192 LTC) largely vanish. \ud83d\udc49 Interpretation: Once multiple-testing correction is applied, BTC\u2019s influence becomes weaker and less consistent.<\/p>\n\n\n\n<p>Global FDR:<\/p>\n\n\n\n<p>\u25cf BTC \u2192 XRP (5.68%) and BTC \u2192 ADA (5.68%) survive.<\/p>\n\n\n\n<p>\u25cf BTC \u2192 LTC remains only borderline. \ud83d\udc49 Interpretation: Under the strictest correction, only a couple of BTC links remain, and even these are weak and intermittent.<\/p>\n\n\n\n<p>\ud83d\udd39 BTC as effect (others \u2192 BTC)<\/p>\n\n\n\n<p>No FDR (raw):<\/p>\n\n\n\n<p>\u25cf LTC \u2192 BTC is strongest (18.2%, mean p \u2248 0.28, run length 5).<\/p>\n\n\n\n<p>\u25cf BNB \u2192 BTC (11.4%) is stronger than BTC \u2192 BNB (9.1%).<\/p>\n\n\n\n<p>\u25cf ETH \u2192 BTC (9.1%) vs BTC \u2192 ETH (10.2%) are nearly symmetric.<\/p>\n\n\n\n<p>\u25cf ADA \u2192 BTC (9.1%) is comparable to BTC \u2192 ADA (12.5%).<\/p>\n\n\n\n<p>\u25cf XRP \u2192 BTC (6.8%) is weaker than BTC \u2192 XRP (13.6%). \ud83d\udc49 Interpretation: Without correction, LTC appears to influence BTC more than the reverse, and the ETH\/BTC relation looks bidirectional but weak.<\/p>\n\n\n\n<p>Per-window FDR:<\/p>\n\n\n\n<p>\u25cf ETH \u2192 BTC (4.5%) survives, but BTC \u2192 ETH (6.8%) is stronger.<\/p>\n\n\n\n<p>\u25cf LTC \u2192 BTC largely drops out. \ud83d\udc49 Interpretation: After adjustment, the apparent \u201creverse\u201d influence of LTC on BTC vanishes, and ETH \u2194 BTC is weakly bidirectional.<\/p>\n\n\n\n<p>Global FDR:<\/p>\n\n\n\n<p>\u25cf ETH \u2192 BTC (4.5%) survives, BTC \u2192 ETH does not.<\/p>\n\n\n\n<p>\u25cf BTC \u2192 XRP and BTC \u2192 ADA remain, but no reverse links. \ud83d\udc49 Interpretation: Globally, BTC looks more like a receiver from ETH than a universal driver.<\/p>\n\n\n\n<p><strong>Visualize rolling p-values for example pairs<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Example: BTC -&gt; ETH\npair = ('BTC', 'ETH')\np_series = pvals_no_fdr[pair]  # list of p-values per window\ndates = pd.to_datetime(dates)\n\nplt.figure(figsize=(12,4))\nplt.plot(dates, p_series, marker='o', label='p-value')\nplt.axhline(0.05, color='r', linestyle='--', label='alpha=0.05')\nplt.title(f'Rolling Toda-Yamamoto p-values: {pair[0]} -&gt; {pair[1]}')\nplt.ylabel('p-value')\nplt.xlabel('Date')\nplt.legend()\nplt.show()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1001\" height=\"393\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-7.png\" alt=\"Return Causality among Cryptocurrencies\" class=\"wp-image-231070 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-7.png 1001w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-7-700x275.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-7-300x118.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-7-768x302.png 768w\" data-sizes=\"(max-width: 1001px) 100vw, 1001px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1001px; aspect-ratio: 1001\/393;\" \/><\/figure>\n\n\n\n<p>Source: Yahoo Finance<\/p>\n\n\n\n<p><strong>Filter BTC as the \u201ccause\u201d<\/strong><\/p>\n\n\n\n<p>We want to see which coins are influenced by BTC:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">btc_cause_no_fdr = stab_no_fdr[stab_no_fdr['cause'] == 'BTC']\nbtc_cause_no_fdr = btc_cause_no_fdr.sort_values('frac_significant', ascending=False)\nprint(\"BTC \u2192 other cryptos (no FDR):\")\ndisplay(btc_cause_no_fdr[['effect','frac_significant','mean_p','longest_run_windows']])<\/pre>\n\n\n\n<p>BTC \u2192 other cryptos (no FDR):<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>effect<\/th><th>frac_significant<\/th><th>mean_p<\/th><th>longest_run_windows<\/th><\/tr><\/thead><tbody><tr><th>4<\/th><td>LTC<\/td><td>0.170455<\/td><td>0.234125<\/td><td>6<\/td><\/tr><tr><th>3<\/th><td>XRP<\/td><td>0.136364<\/td><td>0.305443<\/td><td>4<\/td><\/tr><tr><th>2<\/th><td>ADA<\/td><td>0.125000<\/td><td>0.259896<\/td><td>3<\/td><\/tr><tr><th>0<\/th><td>ETH<\/td><td>0.102273<\/td><td>0.357408<\/td><td>3<\/td><\/tr><tr><th>1<\/th><td>BNB<\/td><td>0.090909<\/td><td>0.336439<\/td><td>3<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><strong>Do the same for per-window FDR and global FDR:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">btc_cause_perwindow = stab_perwindow_fdr[stab_perwindow_fdr['cause'] == 'BTC'].sort_values('frac_significant', ascending=False)\nbtc_cause_global = stab_global_fdr[stab_global_fdr['cause'] == 'BTC'].sort_values('frac_significant', ascending=False)<\/pre>\n\n\n\n<p><strong>Interpretation:<\/strong><\/p>\n\n\n\n<p>Higher frac_significant means BTC has a stable causal influence on that coin.<\/p>\n\n\n\n<p>Compare BTC \u2192 ETH vs ETH \u2192 BTC in the CSV to see directionality.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">btc_effect_no_fdr = stab_no_fdr[stab_no_fdr['effect'] == 'BTC'].sort_values('frac_significant', ascending=False)\nprint(\"Other cryptos \u2192 BTC (no FDR):\")\ndisplay(btc_effect_no_fdr[['cause','frac_significant','mean_p','longest_run_windows']])<\/pre>\n\n\n\n<p>Other cryptos \u2192 BTC (no FDR):<br><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>cause<\/th><th>frac_significant<\/th><th>mean_p<\/th><th>longest_run_windows<\/th><\/tr><\/thead><tbody><tr><th>25<\/th><td>LTC<\/td><td>0.181818<\/td><td>0.279368<\/td><td>5<\/td><\/tr><tr><th>10<\/th><td>BNB<\/td><td>0.113636<\/td><td>0.216391<\/td><td>3<\/td><\/tr><tr><th>5<\/th><td>ETH<\/td><td>0.090909<\/td><td>0.219297<\/td><td>2<\/td><\/tr><tr><th>15<\/th><td>ADA<\/td><td>0.090909<\/td><td>0.357628<\/td><td>3<\/td><\/tr><tr><th>20<\/th><td>XRP<\/td><td>0.068182<\/td><td>0.279812<\/td><td>5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Compare reverse direction<\/p>\n\n\n\n<p>Check if the influence is stronger one way<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import matplotlib.pyplot as plt\n\nplt.figure(figsize=(8,5))\nplt.bar(btc_cause_no_fdr['effect'], btc_cause_no_fdr['frac_significant'], color='orange', alpha=0.7, label='BTC \u2192 other')\nplt.bar(btc_effect_no_fdr['cause'], btc_effect_no_fdr['frac_significant'], color='blue', alpha=0.5, label='Other \u2192 BTC')\nplt.ylabel('Fraction of significant windows')\nplt.title('Directional influence: BTC vs other cryptos (no FDR)')\nplt.xticks(rotation=45)\nplt.legend()\nplt.show()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"708\" height=\"467\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-8.png\" alt=\"Return Causality among Cryptocurrencies\" class=\"wp-image-231074 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-8.png 708w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-8-700x462.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-8-300x198.png 300w\" data-sizes=\"(max-width: 708px) 100vw, 708px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 708px; aspect-ratio: 708\/467;\" \/><\/figure>\n\n\n\n<p>Source: Yahoo Finance<\/p>\n\n\n\n<p><strong>Interpretation of the plot:<\/strong><\/p>\n\n\n\n<p>Orange bars higher than blue bars \u2192 BTC dominates as a causal driver.<\/p>\n\n\n\n<p>If some blue bars are comparable, it means reverse causality exists (maybe smaller altcoins occasionally influence BTC, e.g., during hype events).<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import matplotlib.pyplot as plt\n\n# Top 5 strongest BTC \u2192 other cryptos\ntop_n = 5\ntop_links = btc_cause_no_fdr.head(top_n)\n\nplt.figure(figsize=(8,5))\nplt.bar(top_links['effect'], top_links['frac_significant'], color='orange', alpha=0.8)\nplt.ylabel('Fraction of significant windows')\nplt.xlabel('Effect Cryptos')\nplt.title(f'Top {top_n} BTC \u2192 other cryptos (strongest stable links)')\nplt.ylim(0,1)\nplt.grid(axis='y', linestyle='--', alpha=0.5)\nfor i, val in enumerate(top_links['frac_significant']):\n    plt.text(i, val+0.02, f\"{val:.2f}\", ha='center', va='bottom', fontsize=10)\nplt.show()<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"691\" height=\"470\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-9.png\" alt=\"Return Causality among Cryptocurrencies\" class=\"wp-image-231075 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-9.png 691w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/Return-Causality-among-Cryptocurrencies-9-300x204.png 300w\" data-sizes=\"(max-width: 691px) 100vw, 691px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 691px; aspect-ratio: 691\/470;\" \/><\/figure>\n\n\n\n<p>Source: Yahoo Finance<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"conclusion:\">Conclusion:<a href=\"\"><\/a><\/h1>\n\n\n\n<p>\u25cf This study examined causal linkages among six major cryptocurrencies (BTC, ETH, BNB, ADA, XRP, LTC) using the Toda\u2013Yamamoto framework applied in rolling windows. The analysis highlights how inference is strongly shaped by the treatment of multiple testing.<\/p>\n\n\n\n<p>\u25cf Raw (no-FDR) results suggest a dense network of apparent causal connections, with Bitcoin and Litecoin often emerging as influential senders. However, once false discovery rate (FDR) adjustments are applied, the network becomes far sparser: leadership effects are weak, intermittent, and often non-persistent. The contrast between pre-FDR and FDR-adjusted results underscores how easily raw significance can overstate structure when many tests are conducted simultaneously.<\/p>\n\n\n\n<p>\u25cf The stability leaderboard (Table 3) shows that only a handful of relations display consistent significance across windows, and even these weaken under stricter corrections. LTC \u2192 BNB is the most robust under raw and per-window FDR settings, while ADA \u2192 XRP and XRP \u2192 ETH show local robustness. Under global FDR, only a few links such as BNB \u2192 LTC and BTC \u2192 XRP survive, emphasizing the rarity of truly persistent causal effects.<\/p>\n\n\n\n<p>\u25cf Overall, our findings suggest that causal relations in crypto returns are weak, transient, and highly sensitive to multiple-testing adjustments. Claims of persistent dominance\u2014such as Bitcoin being a universal driver\u2014are not supported once proper corrections are applied. This highlights the importance of controlling for false discoveries in high-dimensional time-series causality analysis.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We study causal linkages among six major crypto assets (BTC, ETH, BNB, ADA, XRP, LTC) using the Toda\u2013Yamamoto (T\u2013Y) framework applied in rolling windows. <\/p>\n","protected":false},"author":1641,"featured_media":231054,"comment_status":"open","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"_acf_changed":true,"footnotes":""},"categories":[339,343,349,338,341],"tags":[8494,1263,4659,1224,595,20570,20571,4580,5545,6674],"contributors-categories":[19857],"class_list":{"0":"post-231051","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-data-science","8":"category-programing-languages","9":"category-python-development","10":"category-ibkr-quant-news","11":"category-quant-development","12":"tag-cryptocurrencies","13":"tag-import","14":"tag-matplotlib","15":"tag-pandas","16":"tag-python","17":"tag-return-causality","18":"tag-rolling-window-toda-yamamoto-framework","19":"tag-seaborn","20":"tag-sharpe-ratio","21":"tag-yfinance","22":"contributors-categories-quant-insider"},"pp_statuses_selecting_workflow":false,"pp_workflow_action":"current","pp_status_selection":"publish","acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework<\/title>\n<meta name=\"description\" content=\"We study causal linkages among six major crypto assets (BTC, ETH, BNB, ADA, XRP, LTC) using the Toda\u2013Yamamoto (T\u2013Y) framework applied in rolling...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/posts\/231051\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework\" \/>\n<meta property=\"og:description\" content=\"We study causal linkages among six major crypto assets (BTC, ETH, BNB, ADA, XRP, LTC) using the Toda\u2013Yamamoto (T\u2013Y) framework applied in rolling windows.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/\" \/>\n<meta property=\"og:site_name\" content=\"IBKR Campus US\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-24T15:53:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-24T15:54:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/poly-cube.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"563\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Tribhuvan Bisen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tribhuvan Bisen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\n\t    \"@context\": \"https:\\\/\\\/schema.org\",\n\t    \"@graph\": [\n\t        {\n\t            \"@type\": \"NewsArticle\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/#article\",\n\t            \"isPartOf\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/\"\n\t            },\n\t            \"author\": {\n\t                \"name\": \"Tribhuvan Bisen\",\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/person\\\/9d33390fc6ad294459c7d636bb4962b9\"\n\t            },\n\t            \"headline\": \"Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework\",\n\t            \"datePublished\": \"2025-09-24T15:53:12+00:00\",\n\t            \"dateModified\": \"2025-09-24T15:54:40+00:00\",\n\t            \"mainEntityOfPage\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/\"\n\t            },\n\t            \"wordCount\": 1820,\n\t            \"commentCount\": 0,\n\t            \"publisher\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/#primaryimage\"\n\t            },\n\t            \"thumbnailUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/09\\\/poly-cube.jpg\",\n\t            \"keywords\": [\n\t                \"cryptocurrencies\",\n\t                \"import\",\n\t                \"Matplotlib\",\n\t                \"Pandas\",\n\t                \"Python\",\n\t                \"Return Causality\",\n\t                \"Rolling Window Toda\u2013Yamamoto Framework\",\n\t                \"Seaborn\",\n\t                \"Sharpe Ratio\",\n\t                \"yfinance\"\n\t            ],\n\t            \"articleSection\": [\n\t                \"Data Science\",\n\t                \"Programming Languages\",\n\t                \"Python Development\",\n\t                \"Quant\",\n\t                \"Quant Development\"\n\t            ],\n\t            \"inLanguage\": \"en-US\",\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"CommentAction\",\n\t                    \"name\": \"Comment\",\n\t                    \"target\": [\n\t                        \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/#respond\"\n\t                    ]\n\t                }\n\t            ]\n\t        },\n\t        {\n\t            \"@type\": \"WebPage\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/\",\n\t            \"name\": \"Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework | IBKR Campus US\",\n\t            \"isPartOf\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\"\n\t            },\n\t            \"primaryImageOfPage\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/#primaryimage\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/#primaryimage\"\n\t            },\n\t            \"thumbnailUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/09\\\/poly-cube.jpg\",\n\t            \"datePublished\": \"2025-09-24T15:53:12+00:00\",\n\t            \"dateModified\": \"2025-09-24T15:54:40+00:00\",\n\t            \"description\": \"We study causal linkages among six major crypto assets (BTC, ETH, BNB, ADA, XRP, LTC) using the Toda\u2013Yamamoto (T\u2013Y) framework applied in rolling windows.\",\n\t            \"inLanguage\": \"en-US\",\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"ReadAction\",\n\t                    \"target\": [\n\t                        \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/\"\n\t                    ]\n\t                }\n\t            ]\n\t        },\n\t        {\n\t            \"@type\": \"ImageObject\",\n\t            \"inLanguage\": \"en-US\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\\\/#primaryimage\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/09\\\/poly-cube.jpg\",\n\t            \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2025\\\/09\\\/poly-cube.jpg\",\n\t            \"width\": 1000,\n\t            \"height\": 563,\n\t            \"caption\": \"Poly Cube\"\n\t        },\n\t        {\n\t            \"@type\": \"WebSite\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"name\": \"IBKR Campus US\",\n\t            \"description\": \"Financial Education from Interactive Brokers\",\n\t            \"publisher\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\"\n\t            },\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"SearchAction\",\n\t                    \"target\": {\n\t                        \"@type\": \"EntryPoint\",\n\t                        \"urlTemplate\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/?s={search_term_string}\"\n\t                    },\n\t                    \"query-input\": {\n\t                        \"@type\": \"PropertyValueSpecification\",\n\t                        \"valueRequired\": true,\n\t                        \"valueName\": \"search_term_string\"\n\t                    }\n\t                }\n\t            ],\n\t            \"inLanguage\": \"en-US\"\n\t        },\n\t        {\n\t            \"@type\": \"Organization\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\",\n\t            \"name\": \"Interactive Brokers\",\n\t            \"alternateName\": \"IBKR\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"logo\": {\n\t                \"@type\": \"ImageObject\",\n\t                \"inLanguage\": \"en-US\",\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\",\n\t                \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"width\": 669,\n\t                \"height\": 669,\n\t                \"caption\": \"Interactive Brokers\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\"\n\t            },\n\t            \"publishingPrinciples\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/about-ibkr-campus\\\/\",\n\t            \"ethicsPolicy\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/cyber-security-notice\\\/\"\n\t        },\n\t        {\n\t            \"@type\": \"Person\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/person\\\/9d33390fc6ad294459c7d636bb4962b9\",\n\t            \"name\": \"Tribhuvan Bisen\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/author\\\/tribhuvan1bisen\\\/\"\n\t        }\n\t    ]\n\t}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework","description":"We study causal linkages among six major crypto assets (BTC, ETH, BNB, ADA, XRP, LTC) using the Toda\u2013Yamamoto (T\u2013Y) framework applied in rolling...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/posts\/231051\/","og_locale":"en_US","og_type":"article","og_title":"Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework","og_description":"We study causal linkages among six major crypto assets (BTC, ETH, BNB, ADA, XRP, LTC) using the Toda\u2013Yamamoto (T\u2013Y) framework applied in rolling windows.","og_url":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/","og_site_name":"IBKR Campus US","article_published_time":"2025-09-24T15:53:12+00:00","article_modified_time":"2025-09-24T15:54:40+00:00","og_image":[{"width":1000,"height":563,"url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/poly-cube.jpg","type":"image\/jpeg"}],"author":"Tribhuvan Bisen","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Tribhuvan Bisen","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/#article","isPartOf":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/"},"author":{"name":"Tribhuvan Bisen","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/person\/9d33390fc6ad294459c7d636bb4962b9"},"headline":"Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework","datePublished":"2025-09-24T15:53:12+00:00","dateModified":"2025-09-24T15:54:40+00:00","mainEntityOfPage":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/"},"wordCount":1820,"commentCount":0,"publisher":{"@id":"https:\/\/ibkrcampus.com\/campus\/#organization"},"image":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/#primaryimage"},"thumbnailUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/poly-cube.jpg","keywords":["cryptocurrencies","import","Matplotlib","Pandas","Python","Return Causality","Rolling Window Toda\u2013Yamamoto Framework","Seaborn","Sharpe Ratio","yfinance"],"articleSection":["Data Science","Programming Languages","Python Development","Quant","Quant Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/","url":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/","name":"Return Causality among Cryptocurrencies: Evidence from a Rolling Window Toda\u2013Yamamoto Framework | IBKR Campus US","isPartOf":{"@id":"https:\/\/ibkrcampus.com\/campus\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/#primaryimage"},"image":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/#primaryimage"},"thumbnailUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/poly-cube.jpg","datePublished":"2025-09-24T15:53:12+00:00","dateModified":"2025-09-24T15:54:40+00:00","description":"We study causal linkages among six major crypto assets (BTC, ETH, BNB, ADA, XRP, LTC) using the Toda\u2013Yamamoto (T\u2013Y) framework applied in rolling windows.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/return-causality-among-cryptocurrencies-evidence-from-a-rolling-window-toda-yamamoto-framework\/#primaryimage","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/poly-cube.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/poly-cube.jpg","width":1000,"height":563,"caption":"Poly Cube"},{"@type":"WebSite","@id":"https:\/\/ibkrcampus.com\/campus\/#website","url":"https:\/\/ibkrcampus.com\/campus\/","name":"IBKR Campus US","description":"Financial Education from Interactive Brokers","publisher":{"@id":"https:\/\/ibkrcampus.com\/campus\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ibkrcampus.com\/campus\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ibkrcampus.com\/campus\/#organization","name":"Interactive Brokers","alternateName":"IBKR","url":"https:\/\/ibkrcampus.com\/campus\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","width":669,"height":669,"caption":"Interactive Brokers"},"image":{"@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/"},"publishingPrinciples":"https:\/\/www.interactivebrokers.com\/campus\/about-ibkr-campus\/","ethicsPolicy":"https:\/\/www.interactivebrokers.com\/campus\/cyber-security-notice\/"},{"@type":"Person","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/person\/9d33390fc6ad294459c7d636bb4962b9","name":"Tribhuvan Bisen","url":"https:\/\/www.interactivebrokers.com\/campus\/author\/tribhuvan1bisen\/"}]}},"jetpack_featured_media_url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2025\/09\/poly-cube.jpg","_links":{"self":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts\/231051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/users\/1641"}],"replies":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/comments?post=231051"}],"version-history":[{"count":0,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts\/231051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media\/231054"}],"wp:attachment":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media?parent=231051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/categories?post=231051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/tags?post=231051"},{"taxonomy":"contributors-categories","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/contributors-categories?post=231051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}