Cryptocurrency Markets and Quant Trading › Crypto in Quantitative Portfolios

Michael BrenndoerferJanuary 5, 20266 min read
Quantitative FinanceAll chapters
Part 13 of 15Machine Learning and Alternative Data
Chapter 72Cryptocurrency Markets and Quant Trading › Crypto in Quantitative Portfolios
Reading section 7 of 11 · Crypto in Quantitative Portfolios · 6 minSection 7 of 11 · 6 min

Book contents

Section 7 of 11 · 6 min read

Cryptocurrency Markets and Quant Trading › Crypto in Quantitative PortfoliosOne section · Sections in this chapter7 / 11 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

As cryptocurrency markets have matured, institutional investors have increasingly considered crypto allocations within broader portfolios. The question is how to integrate an asset class with these unique characteristics.

Correlation Structure

Bitcoin and other cryptocurrencies have exhibited time-varying correlations with traditional assets:

In[23]:
Code
# Calculate rolling correlations
df_returns = pd.DataFrame(
    {"SP500": returns_sp500, "Bitcoin": returns_btc, "Altcoin": returns_alt},
    index=dates,
)

# Rolling 90-day correlations
rolling_window = 90
corr_btc_sp500 = (
    df_returns["Bitcoin"].rolling(rolling_window).corr(df_returns["SP500"])
)
corr_alt_btc = (
    df_returns["Altcoin"].rolling(rolling_window).corr(df_returns["Bitcoin"])
)
Out[24]:
Visualization
Line chart of two rolling 90-day correlations. Altcoin versus Bitcoin stays positive and above Bitcoin versus S&P 500 for most of the simulated period.
Rolling 90-day correlations in the simulation. Bitcoin's correlation with the S&P 500 is unstable and briefly turns negative, while the altcoin remains more consistently and positively correlated with Bitcoin.

Key observations about crypto correlations:

  • Rising equity correlations: During market stress (March 2020, 2022 bear market), Bitcoin has increasingly correlated with equities, reducing its diversification benefit precisely when it would be most valuable.
  • High intra-crypto correlations: Most cryptocurrencies are highly correlated with Bitcoin, limiting diversification benefits within the crypto universe.
  • Correlation instability: The correlation structure shifts significantly over time, making static allocation models unreliable.

Portfolio Allocation

Given the extreme volatility and unique risks, how should a quantitative portfolio include crypto exposure?

A risk-parity inspired approach allocates capital inversely proportional to volatility to equalize risk contributions. The intuition is straightforward: if Bitcoin is four times as volatile as equities, you should hold one-quarter as much Bitcoin to contribute equal risk to your portfolio. This approach ensures that neither asset dominates the portfolio's risk profile, allowing diversification benefits to accrue.

The target weight calculation (prior to applying maximum limits) is:

wcrypto∗=1/σcrypto1/σcrypto+1/σequityw_{\text{crypto}}^* = \frac{1/\sigma_{\text{crypto}}}{1/\sigma_{\text{crypto}} + 1/\sigma_{\text{equity}}}

where:

  • wcrypto∗w_{\text{crypto}}^*: unconstrained target weight for the crypto allocation
  • σcrypto\sigma_{\text{crypto}}: current annualized volatility of the cryptocurrency
  • σequity\sigma_{\text{equity}}: annualized volatility of the equity portfolio

To understand this formula, consider what happens as crypto volatility increases. The term 1/σcrypto1/\sigma_{\text{crypto}} decreases, making the numerator smaller relative to the denominator, which reduces the target weight. Conversely, if crypto volatility decreases toward equity volatility levels, the weights would converge toward 50/50. This inverse weighting mechanism ensures that the asset with higher volatility receives a proportionally lower weight, keeping the risk contribution w⋅σw \cdot \sigma roughly constant across assets.

In practice, risk-parity allocations to crypto are typically very small. If equity volatility is 16% and crypto volatility is 65%, the risk-parity weight for crypto would be approximately 20% (16/(16+65)). However, most institutional investors apply additional constraints based on operational concerns, liquidity limits, and mandate restrictions.

We then apply the portfolio constraint:

wcrypto=min⁡(wcrypto∗,wmax)w_{\text{crypto}} = \min(w_{\text{crypto}}^*, w_{\text{max}})

where:

  • wcryptow_{\text{crypto}}: final constrained weight
  • wmaxw_{\text{max}}: maximum allowable position weight (cap)

The calculate_crypto_allocation function implements this framework. It computes the risk-parity weights based on the inverse of annualized volatilities for both crypto and equity components, then applies the maximum weight constraint to determine the final allocation. The function also calculates the resulting portfolio volatility and the risk contribution from the crypto allocation, allowing investors to understand exactly how much of their total risk comes from their crypto position:

In[25]:
Code
def calculate_crypto_allocation(
    portfolio_vol_target,
    crypto_vol,
    equity_vol,
    max_crypto_weight=0.10,
    corr_crypto_equity=0.4,
):
    """
    Calculate optimal crypto allocation for a two-asset portfolio.
    """
    # For a two-asset portfolio:
    # portfolio_vol^2 = w_c^2 * vol_c^2 + w_e^2 * vol_e^2 + 2*w_c*w_e*vol_c*vol_e*corr

    # Target: crypto contributes same marginal risk as its weight
    # Marginal risk of crypto = d(portfolio_vol) / d(w_crypto)

    # Simple approach: equal risk contribution
    # w_c * vol_c = w_e * vol_e (in simple case)
    # With constraint w_c + w_e = 1

    # Risk parity weights
    inv_vol_crypto = 1 / crypto_vol
    inv_vol_equity = 1 / equity_vol

    w_crypto_rp = inv_vol_crypto / (inv_vol_crypto + inv_vol_equity)
    w_equity_rp = 1 - w_crypto_rp

    # Apply maximum constraint
    w_crypto_final = min(w_crypto_rp, max_crypto_weight)
    w_equity_final = 1 - w_crypto_final

    # Calculate resulting portfolio volatility
    port_vol = np.sqrt(
        w_crypto_final**2 * crypto_vol**2
        + w_equity_final**2 * equity_vol**2
        + 2
        * w_crypto_final
        * w_equity_final
        * crypto_vol
        * equity_vol
        * corr_crypto_equity
    )

    # Risk contribution
    crypto_risk_contrib = (
        w_crypto_final * crypto_vol**2
        + w_crypto_final
        * w_equity_final
        * crypto_vol
        * equity_vol
        * corr_crypto_equity
    )
    crypto_risk_pct = crypto_risk_contrib / (port_vol**2) * 100

    return {
        "risk_parity_weight": w_crypto_rp * 100,
        "constrained_weight": w_crypto_final * 100,
        "equity_weight": w_equity_final * 100,
        "portfolio_volatility": port_vol * 100,
        "crypto_risk_contribution": crypto_risk_pct,
    }


# Calculate for different crypto volatility scenarios
equity_vol_param = 0.16
corr_param = 0.4
max_weight_param = 0.10

scenarios = []
for crypto_vol in [0.50, 0.65, 0.80, 1.00]:
    result = calculate_crypto_allocation(
        portfolio_vol_target=0.15,
        crypto_vol=crypto_vol,
        equity_vol=equity_vol_param,
        max_crypto_weight=max_weight_param,
        corr_crypto_equity=corr_param,
    )
    result["crypto_vol"] = crypto_vol * 100
    scenarios.append(result)

df_allocation = pd.DataFrame(scenarios)
Out[26]:
Console
Crypto Portfolio Allocation Analysis
======================================================================
Equity volatility: 16%
Correlation (crypto-equity): 40%
Maximum crypto weight: 10%

Allocation by Crypto Volatility Regime:
----------------------------------------------------------------------
Crypto Vol: 50%
  Risk Parity Weight: 24.2%
  Constrained Weight: 10.0%
  Portfolio Vol: 17.0%
  Crypto Risk Contribution: 96.2%

Crypto Vol: 65%
  Risk Parity Weight: 19.8%
  Constrained Weight: 10.0%
  Portfolio Vol: 18.0%
  Crypto Risk Contribution: 141.7%

Crypto Vol: 80%
  Risk Parity Weight: 16.7%
  Constrained Weight: 10.0%
  Portfolio Vol: 19.1%
  Crypto Risk Contribution: 188.7%

Crypto Vol: 100%
  Risk Parity Weight: 13.8%
  Constrained Weight: 10.0%
  Portfolio Vol: 20.6%
  Crypto Risk Contribution: 250.3%

The analysis shows that risk-parity principles would suggest very small crypto allocations, typically 1-5% depending on the volatility regime. Even a small capital allocation results in a significant contribution to total portfolio risk. A 10% weight in crypto with 65% volatility contributes far more to portfolio risk than a 90% weight in equities with 16% volatility. This highlights why institutional investors who have added crypto exposure have generally done so in very small amounts, treating it as a satellite position rather than a core holding.

Key Parameters

The key parameters for the Portfolio Allocation model are:

  • σcrypto\sigma_{crypto}: Cryptocurrency volatility. The primary driver of allocation size in risk parity, as higher volatility directly reduces the target weight.
  • σequity\sigma_{equity}: Equity portfolio volatility. Used as the baseline for risk comparison. The ratio of volatilities determines the relative weights.
  • Correlation: The correlation coefficient between crypto and equity. Affects portfolio variance but less critical for simple risk parity weights. However, the instability of this correlation is a key concern for portfolio construction.
  • Max Weight: Hard cap on allocation to prevent concentration risk regardless of volatility. This constraint reflects practical considerations such as liquidity limits, operational constraints, and mandate restrictions.