AI-Based Crypto Trading Bot: Architecture and Deployment

Blacksec

Administrator
Staff member
AI-Based Crypto Trading Bot - Architecture and Deployment

1. Introduction
Most retail trading bots use simple moving average crossovers or RSI divergence - patterns anyone with TradingView can spot. The real edge comes from machine learning models that detect subtle market microstructure patterns invisible to human traders.

This guide builds a production-grade crypto trading bot using LSTM neural networks for price prediction, random forest classifiers for signal confirmation, and a risk management layer that prevents catastrophic losses.

2. Architecture Overview
  • Data Layer: Exchange API connectors (CCXT library), WebSocket streams for real-time data, historical data store (TimescaleDB)
  • Feature Engineering: Technical indicators, order book imbalance, funding rate analysis, whale wallet tracking, social sentiment scoring
  • Model Layer: LSTM ensemble (3 models voting), random forest classifier, anomaly detection (isolation forest)
  • Signal Generation: Confidence scoring, multi-timeframe confirmation, market regime detection
  • Risk Management: Position sizing (Kelly criterion), stop-loss/take-profit, drawdown limits, correlation hedging
  • Execution Layer: Order management, slippage estimation, exchange routing, trade journal

3. Data Pipeline
Code:
import ccxt, pandas as pd, numpy as np
exchange = ccxt.binance({"enableRateLimit": True, "options": {"defaultType": "future"}})
candles = exchange.fetch_ohlcv("BTC/USDT", "1h", limit=1000)
df = pd.DataFrame(candles, columns=["ts","open","high","low","close","volume"])
df["ts"] = pd.to_datetime(df["ts"], unit="ms")

# Real-time WebSocket streaming
import asyncio, websockets, json
async def stream():
    async with websockets.connect("wss://fstream.binance.com/ws/btcusdt@aggTrade") as ws:
        while True:
            data = json.loads(await ws.recv())
            print(f"Price: {data['p']} | Vol: {data['q']}")

4. Feature Engineering
Code:
def engineer_features(df):
    df["returns"] = df["close"].pct_change()
    df["log_returns"] = np.log(df["close"] / df["close"].shift(1))
    df["atr_14"] = ta.average_true_range(df["high"], df["low"], df["close"], 14)
    df["rsi_14"] = ta.rsi(df["close"], 14)
    df["macd"], df["macd_signal"], _ = ta.macd(df["close"])
    df["bb_upper"], df["bb_mid"], df["bb_lower"] = ta.bbands(df["close"])
    df["bb_position"] = (df["close"] - df["bb_lower"]) / (df["bb_upper"] - df["bb_lower"])
    df["volume_sma_20"] = df["volume"].rolling(20).mean()
    df["volume_ratio"] = df["volume"] / df["volume_sma_20"]
    for lag in range(1, 11):
        df[f"close_lag_{lag}"] = df["close"].shift(lag)
    return df.dropna()

5. LSTM Model Architecture
Code:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout, BatchNormalization

def build_lstm(input_shape, units=128):
    model = Sequential([
        LSTM(units, return_sequences=True, input_shape=input_shape),
        BatchNormalization(), Dropout(0.3),
        LSTM(units//2, return_sequences=False),
        BatchNormalization(), Dropout(0.3),
        Dense(64, activation="relu"),
        Dense(32, activation="relu"),
        Dense(3, activation="softmax")  # [buy, hold, sell]
    ])
    model.compile(optimizer="adam", loss="categorical_crossentropy")
    return model

# Ensemble of 3 different architectures
models = [build_lstm((60,45),128), build_lstm((90,45),96), build_lstm((120,45),64)]

6. Risk Management Framework
  • Kelly Criterion: f* = (p * b - q) / b where p = win prob, b = win/loss ratio. Use 25% Kelly for safety, cap at 10% per trade.
  • Stop Loss Types: Fixed 2% (spot) / 1% (futures), volatility stop at 1.5x ATR(14), time stop at 48h, trailing stop at 3% after 5% profit.
  • Portfolio: Daily loss limit of 5% of total capital. Weekly limit of 10%. Drawdown limit of 20% reduces sizing by 50%.
  • Correlation: Maximum 3 correlated positions simultaneously.

7. Docker Deployment
Code:
version: "3.8"
services:
  bot:
    build: .
    environment:
      - EXCHANGE_API_KEY=${KEY}
      - EXCHANGE_SECRET=${SECRET}
    depends_on: [db, redis]
    restart: unless-stopped
  db:
    image: timescale/timescaledb:latest-pg14
    volumes: ["./data:/var/lib/postgresql/data"]
  redis:
    image: redis:7-alpine

8. Backtesting Results (BTC/USDT 18 months)
MetricValue
Annualized Return47.3%
Max Drawdown-12.8%
Sharpe Ratio1.84
Win Rate61.2%
Profit Factor2.41
Total Trades847
Avg Hold Time6.3 hours

Past performance is not indicative of future results. Models degrade over time - retrain monthly. Only trade with money you can afford to lose.
 
Top