Skip to main content

researching crypto altcoin momentum - expanding beyond btc/eth

crypto allocation is 30% but only trading BTC/ETH.

leaving money on table. been researching altcoins on r/CryptoCurrency and CoinGecko.

current crypto setup
#

allocation: $107,700 (30% of $359k account)

instruments:

  • BTC: 60% of crypto ($64,620)
  • ETH: 40% of crypto ($43,080)

strategy: momentum breakouts on 15min timeframe

performance august: +$1,840 (14 trades, 71% win rate)

problem
#

altcoins move harder than BTC/ETH.

5-10% moves in hours vs days.

higher volatility = more opportunity for momentum strategy.

research goals
#

1. find liquid altcoins

need volume for entries/exits.

min $50M daily volume.

2. correlation check

avoid too much BTC correlation.

want diversification not duplication.

3. backtest momentum signals

apply same breakout logic to altcoin data.

see if edge persists.

data collection
#

using coingecko API + binance websockets.

import ccxt
import pandas as pd
from datetime import datetime, timedelta

def get_liquid_altcoins(min_volume_usd=50_000_000):
    """
    find altcoins with sufficient daily volume
    """
    exchange = ccxt.binance()
    markets = exchange.load_markets()

    # filter USDT pairs only
    usdt_pairs = [m for m in markets.keys() if '/USDT' in m]

    liquid_alts = []

    for pair in usdt_pairs:
        try:
            ticker = exchange.fetch_ticker(pair)

            # get 24h volume in USD
            volume_usd = ticker['quoteVolume']

            if volume_usd >= min_volume_usd:
                # exclude BTC and ETH (already trading these)
                symbol = pair.split('/')[0]
                if symbol not in ['BTC', 'ETH']:
                    liquid_alts.append({
                        'symbol': symbol,
                        'pair': pair,
                        'volume_24h': volume_usd,
                        'price': ticker['last']
                    })

        except Exception as e:
            continue

    # sort by volume descending
    liquid_alts.sort(key=lambda x: x['volume_24h'], reverse=True)

    return liquid_alts

ran this today.

found 47 altcoins with >$50M daily volume.

top candidates by volume
#

1. BNB - $890M daily (binance coin)

2. SOL - $720M daily (solana)

3. XRP - $680M daily (ripple)

4. ADA - $520M daily (cardano)

5. DOGE - $480M daily (dogecoin)

6. MATIC - $340M daily (polygon)

7. DOT - $285M daily (polkadot)

8. LINK - $260M daily (chainlink)

correlation analysis
#

def calculate_correlation_matrix(symbols, lookback_days=90):
    """
    calculate price correlation between assets
    """
    exchange = ccxt.binance()

    # fetch historical data
    dfs = {}
    for symbol in symbols:
        ohlcv = exchange.fetch_ohlcv(
            f"{symbol}/USDT",
            timeframe='1d',
            limit=lookback_days
        )
        df = pd.DataFrame(
            ohlcv,
            columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']
        )
        df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
        df.set_index('timestamp', inplace=True)
        dfs[symbol] = df['close']

    # create correlation matrix
    price_df = pd.DataFrame(dfs)
    correlation = price_df.corr()

    return correlation

ran correlation against BTC for past 90 days.

correlation results
#

high correlation (>0.8) - AVOID:

  • ETH: 0.92 (already trading)
  • BNB: 0.87
  • MATIC: 0.84
  • LINK: 0.82

medium correlation (0.6-0.8) - MAYBE:

  • SOL: 0.76
  • ADA: 0.71
  • DOT: 0.68

low correlation (<0.6) - TARGET:

  • DOGE: 0.54 (meme coin, different drivers)
  • XRP: 0.48 (regulatory news driven)

backtest setup
#

applying momentum breakout strategy to altcoin data.

same logic as BTC/ETH:

  • 20-period consolidation
  • volume >1.5x average
  • breakout above range high
  • stop loss at consolidation low - 0.5 ATR
  • two-stage exits (50% at 2R, trail 50%)
def backtest_altcoin_momentum(symbol, start_date, end_date):
    """
    backtest momentum strategy on altcoin
    """
    exchange = ccxt.binance()

    # fetch 15min data
    ohlcv = exchange.fetch_ohlcv(
        f"{symbol}/USDT",
        timeframe='15m',
        since=int(start_date.timestamp() * 1000)
    )

    df = pd.DataFrame(
        ohlcv,
        columns=['timestamp', 'open', 'high', 'low', 'close', 'volume']
    )
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

    # calculate indicators
    df['atr'] = calculate_atr(df, period=14)

    # detect consolidations
    df['consolidation'] = detect_consolidation(df, period=20)

    # identify breakouts
    df['breakout'] = detect_breakout(df)

    # volume filter
    df['avg_volume'] = df['volume'].rolling(50).mean()
    df['volume_ratio'] = df['volume'] / df['avg_volume']

    # simulate trades
    trades = []
    position = None

    for i in range(len(df)):
        row = df.iloc[i]

        # entry logic
        if position is None:
            if (row['breakout'] and
                row['volume_ratio'] > 1.5 and
                row['consolidation']):

                # calculate position size (0.5% risk)
                stop_distance = row['close'] - (row['low'] - row['atr'] * 0.5)
                position_size = (CAPITAL * 0.005) / stop_distance

                position = {
                    'entry_price': row['close'],
                    'entry_time': row['timestamp'],
                    'stop_loss': row['low'] - (row['atr'] * 0.5),
                    'size': position_size,
                    'stage1_exit': False
                }

        # exit logic
        elif position is not None:
            current_price = row['close']

            # calculate R-multiple
            risk = position['entry_price'] - position['stop_loss']
            profit = current_price - position['entry_price']
            r_multiple = profit / risk

            # stage 1: exit 50% at 2R
            if r_multiple >= 2.0 and not position['stage1_exit']:
                position['stage1_exit'] = True
                position['stop_loss'] = position['entry_price']  # breakeven

            # stage 2: trail stop with ATR
            if position['stage1_exit']:
                trailing_stop = current_price - (row['atr'] * 1.5)
                position['stop_loss'] = max(position['stop_loss'], trailing_stop)

            # check stop loss
            if current_price <= position['stop_loss']:
                pnl = (position['stop_loss'] - position['entry_price']) * position['size']
                trades.append({
                    'symbol': symbol,
                    'entry': position['entry_price'],
                    'exit': position['stop_loss'],
                    'pnl': pnl,
                    'r_multiple': r_multiple
                })
                position = None

    return trades

preliminary backtest results (june-aug 2023)
#

ran backtests on top 8 altcoins.

SOL (Solana):

  • trades: 23
  • win rate: 78%
  • avg R: 2.1
  • net: +$3,240

DOGE (Dogecoin):

  • trades: 19
  • win rate: 68%
  • avg R: 1.8
  • net: +$2,140

XRP (Ripple):

  • trades: 16
  • win rate: 63%
  • avg R: 1.6
  • net: +$1,580

ADA (Cardano):

  • trades: 21
  • win rate: 71%
  • avg R: 1.9
  • net: +$2,680

next steps
#

1. paper trade top 3 altcoins

SOL, ADA, DOGE based on backtest results.

collect 20+ trades before going live.

2. position sizing

start at 0.25% risk (half of normal).

altcoins more volatile than BTC/ETH.

3. correlation monitoring

daily check against BTC.

if correlation spikes >0.8, pause that altcoin.

4. exchange risk

currently using binance.us.

considering kraken as backup.

don’t want all crypto on one exchange.

risks
#

1. higher volatility

altcoins can gap 10-20% overnight.

stop losses less reliable.

2. liquidity risk

volume can dry up fast during crashes.

may not fill at intended price.

3. exchange risk

binance regulatory issues possible.

need multi-exchange setup.

4. correlation breakdown

low correlation today ≠ low correlation tomorrow.

flash crashes hit everything.

timeline
#

september: paper trade SOL, ADA, DOGE (20+ trades each)

october: if validated, go live with 0.25% risk

november: if performing, increase to 0.5% risk

december: evaluate full crypto allocation (maybe increase from 30%)

why this matters
#

crypto is 30% allocation but underutilized.

BTC/ETH only = missing altcoin volatility.

momentum strategy works on BTC/ETH.

should work on liquid altcoins too.

potential to add $2-3k monthly profit if validated.


3:05am tuesday. crypto altcoin research done. SOL, ADA, DOGE look promising. paper trading next month. expanding beyond BTC/ETH.

-AK

Related

momentum breakout strategy - how it works
momentum strategy has 5 wins, 0 losses. time to explain how it works. core concept # capture trending moves after consolidation breaks.
momentum strategy live - first week results
went live with momentum strategy monday. ran it alongside mean reversion all week. first week results in. strategy recap # mean reversion (existing): trade in ranging markets, high win rate, small consistent wins
testing momentum overlay - early results promising
been running mean reversion strategies for 4 months. works well. 87% win rate in july. but: only trades when price reverts. misses trending moves. the idea # add momentum overlay to existing system.