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