DRADIS
Direct Reaction And Dynamic Intelligence System — Kalshi 및 Polymarket을 위한 저지연(low-latency) Rust 예측 시장 거래 봇. 10개의 자율 Viper 전략, Raptor 정찰 계층 (Price, Funding, Derivatives, Tide "Institutional Pulse", Horizon "TradFi Velocity", 스포츠 북 컨센서스 스카우트, 그리고 장소 중립적인 테니스 이벤트 상태 스카우트), Squadron 배포 프레임워크, 동시 다중 자산 지원이 가능한 CAG 비동기 디스패치 레이어, 실시간 Next.js Control Tower, 그리고 LLM Advisor (Ollama 로컬/원격, OpenAI 호환 또는 Anthropic)를 갖추고 있습니다. 이 Advisor는 Telegram 및 OpenClaw를 통해 최적화 권장 사항을 전달하며, 계층화되고 가드 레일이 적용된 자율성 정책 하에 라이브 설정 변경을 제안하거나 자율적으로 적용할 수 있습니다.
Rust
Tokio
axum
Next.js
Tailwind CSS
Node.js
Ollama
Docker
OpenClaw
License
AWS Marketplace
경고: 돈을 잃을 가능성이 높습니다. GHOST 모드에서 시작하여 라이브로 전환하기 전에 조정하십시오. LLM이 설정 및 Viper 전략 구현에 대해 자주 조언하므로 정기적으로 업데이트를 확인하는 것이 중요합니다.
Public Demo Site: https://demo.dradis.live/
실행 방법 두 가지
소스 코드 — 이 저장소에서
클론(Clone)하여 위험 프로필을 선택하고 Docker로 실행하십시오. 전체 엔진, 모든 10개 전략 및 Control Tower가 여기에 있습니다. 유료 이미지에 대해서는 아무것도 제한되지 않습니다. AGPL v3 — LICENSE 참조.
사전 구축된 AMI — AWS Marketplace
사용자의 AWS 계정에 설정된 인스턴스를 실행합니다. 세 가지 거래소 모두 이미지에 포함되어 있으며, Control Tower도 함께 제공되고 API 키는 사용자에게 남아 있습니다.
AGPL이므로 아래의 카피레프트 의무 사항은 해당 배포판에 적용되지 않습니다.
설치 및 업그레이드 가이드: https://dradis.live/docs
나머지 README 내용은 소스 코드 경로를 다룹니다.
️ 전술 개요
DRADIS는 예측 시장(prediction markets)을 위한 포괄적인 트레이딩 자동화 플랫폼입니다. 최대의 동시성(concurrency)과 메모리 안전성을 위해 Rust로 구축되었으며, 선택된 시장들을 50ms마다 평가하고, 여러 자율 전략들(autonomous strategies)을 조정하여 자본을 보존하고 비효율성이 감지되는 곳에 주문을 넣습니다.
이 시스템은 네 가지 BSG에서 영감을 받은 전술적 계층(tactical layers)을 중심으로 구성되어 있습니다:
| Layer | Folder | Role |
|---|
| Raptors | src/raptors/ | 신호 정찰병 — 외부 데이터를 가져오고(fetch), 표준화하며(normalise), 방송합니다(broadcast) |
| ... | | |
⚡ 빠른 시작 (Quick Start)
git clone https://github.com/youruser/dradis.git && cd dradis
cp .env.example .env
...
약 5분 후 스택이 활성화됩니다:
| Service | URL |
|---|
| Control Tower | http://<host>:3002 |
| ... | |
전제 조건: 원격 호스트에 Docker, 로컬 빌드에는 Rust 1.95+만 필요합니다.
거래소 선택 (Choosing a venue)
DRADIS는 Cargo의 기능(feature)을 통해 빌드 시점에 오직 하나의 실행 거래소(execution venue)를 컴파일합니다. 모든 거래소는 거래소에 중립적인 Execution 트레이트(src/venues/core.rs)와 공유되는 OrderLifecycle 재조정기(src/venues/lifecycle.rs)를 통해 동일한 전략/추상화 계층을 공유하며, 오직 거래소 모듈만 다릅니다. 따라서 사용하지 않는 거래소의 의존성은 바이너리에서 제거됩니다.
| Feature | Venue | Auth | Gateway |
|---|
intl_clob (default) | Polymarket International (self-custody) | EOA wallet + EIP-712 over Polygon | clob.polymarket.com |
| ... | | | |
로컬에서 시작하기
./start-local.sh
./start-local.sh eth
...
수동으로 빌드하기
cargo build --release
cargo test
...
Polymarket US Retail 설정 (.env)
POLYMARKET_US_KEY_ID=<key-id-uuid>
POLYMARKET_US_SECRET_KEY=<base64-secret>
...
Polymarket US Retail 상태: MVP 루프 (src/venues/us/trader.rs)는 Venue에 구애받지 않는 차익거래(arbitrage) 전략을 실행합니다. 즉, 이진 시장을 발견하고 → 두 레그를 WebSocket을 통해 스트리밍하며 → 엔진-원자적(engine-atomic) 배치 주문( /v1/orders/batched)을 통해 $1 미만의 YES+NO를 구매한 후 → OrderLifecycle을 통해 정산합니다. 개방 포지션과 포트폴리오 P&L은 us 자산 선택기 아래의 Control Tower에 표시됩니다. Control Tower API는 :9000에서 항상 활성화되어 있습니다. 두 번째 암호화폐 윙(crypto wing) (us-crypto 자산)은 전체 Raptor 스택을 사용하여 암호화폐 클래스 시장을 추적하며, 따라서 아홉 개의 모든 암호화폐 Viper가 이 위에서 비행합니다. 단기 시장의 경우 한 시간 단위 형태를 먼저 취합니다. GBoost는 여기에서도 Kalshi와 마찬가지로 작동합니다: 이는 한 시간짜리 BTC 시장에 점수를 매기고, 모델을 시장의 기초 자산에 키(key)하며, 스트리밍하는 북(book)에서 시장 자체의 미드 가격을 읽고 (이 Venue는 프린트나 히스토리를 게시하지 않음), 모든 한 시간 단위 시장을 기록하여 해당 Venue가 일주일 동안 정착된 사례를 갖게 되면 파이프라인이 모델을 훈련할 수 있도록 합니다.
Kalshi 설정 파일(.env)
Kalshi는 모든 요청을 로컬에서 RSA-PSS로 서명합니다. 계정 설정에서 API 키를 생성해야 합니다 (키 ID + 다운로드 가능한 RSA 개인 키 PEM, 한 번만 표시됨).
데모 거래소에서 위험 없이 사용해 보세요. demo.kalshi.co는 가상 화폐와 동일한 실시간 암호화폐 시장을 갖춘 완전한 페이퍼 트레이딩(paper-trading) 환경입니다. 데모 자격 증명은 프로덕션(production)과 분리되어 있습니다.
적절한 거래소 샤드(exchange shard)에 자금을 지원하세요. Kalshi는 별도의 매칭 엔진("거래소 샤드")을 운영하며 각 샤드별로 잔액을 유지합니다. 암호화폐 시장은 샤드 2에서 거래되며, Kalshi는 스포츠를 시리즈별로 샤드 3으로 옮기고 있고, 정치 및 대부분의 다른 시장은 샤드 0에 남아 있습니다. 사용자가 거래할 때 Kalshi 앱은 담보(collateral)를 샤드 간에 이동시키지만, API 주문은 그렇지 않습니다. 따라서 샤드 0에 예치된 자금으로는 모든 암호화폐 주문이 insufficient_shard_balance로 거부됩니다. 설정(Setup) 탭에서는 샤드별 잔액을 보여주고, 배포된 스쿼드론(squadrons)의 시장이 거래되는 샤드를 표시하며 (장소별, 시장별로 읽음), 해당 샤드 간에 자금을 이동시키거나 Kalshi의 자동 리밸런싱 목표를 설정할 수 있습니다. 이 모든 작업은 확인 절차를 거치는 관리자 세션(admin session)을 통해 이루어집니다. 엔진은 자신의 샤드가 커버할 수 없는 주문은 재시도하는 대신 거부하며, Viper's 카드에 이를 표시합니다. 헤드리스 인스턴스(headless instance)의 경우, scripts/kalshi_shards.py가 엔진 자체 자격 증명을 사용하여 셸(shell)에서 동일한 작업을 수행하며, --yes 없이 실행할 경우 아무것도 전송하지 않습니다.
KALSHI_API_KEY_ID=<key-id-uuid>
KALSHI_PRIVATE_KEY_PATH=data/kalshi-key.pem
KALSHI_DEMO=1
...
Kalshi 현황: 루프(src/venues/kalshi/trader.rs)는 암호화폐 우선(crypto-first) 방식입니다. 설정된 시리즈 전반에 걸쳐 열린 시장을 발견합니다 (KXBTC15M 및 BTC의 ETH 쌍인 KXBTCD). 각 시장의 창문은 게시된 개장가와 폐장가에서 읽어오며, 가장 적합한 형태를 가진 가장 활발한 시장을 주력으로 삼습니다. 이는 Kalshi의 시간당 상/하단 리스팅 중 하나가 보드에 올라올 때(예: KXBTCD는 시간별 및 일일 리스팅 모두 포함) 또는 그렇지 않을 경우 15분 단위 시장이며, 느린 Vipers를 위해 같은 코인 옆에 일일 시장이 배치됩니다. 이는 공유된 분류 체계를 통해 두 가지 모두를 분류하고 모든 아홉 개의 암호화폐 Viper로 전체 Raptor 인텔리전스 스택을 실행합니다. GBoost는 모델이 훈련되는 형태인 시간당 시장 점수를 매기므로, 시간별 리스팅 사이에는 유휴 상태임을 알립니다. 다른 장소용으로 표시된 모델은 해당 장소 자체의 해상도를 거쳐 그림자 레인을 거래하며, Kalshi용으로 표시된 것이 홀드아웃을 통과할 때까지 정착합니다. Kalshi는 가격 기록을 게시하지 않으므로 훈련 저장소는 실시간으로 작성됩니다: 루프가 실행하는 모든 시간당 BTC 시장은 기록되며(분당 미디스, 폐장 시 테이프, 장소의 이후 결제), 파이프라인은 그 기록들 중 일주일치가 정착된 후에 훈련을 진행합니다. 오더북은 인증된 WebSocket(orderbook_delta와 시퀀스-갭 복구)을 통해 스트리밍되며 체결(fills)은 비공개 fill 채널을 통해 이벤트 단위로 확인됩니다. Kalshi의 이차적 테이커 수수료(P=0.50일 때 최대 1.75¢/계약)는 Viper의 우위 임계값에 가격 책정되어 있습니다. 포지션과 P&L은 kalshi 자산 선택기 아래에서 나타납니다.
️ 아키텍처
┌─────────────────────────────────────────────────────────────────────┐
│ src/ layout │
│ │
...
┌──────────────────────┐ ┌──────────────────────┐
│ src/raptors/ │ │ Polymarket CLOB │
│ Price Raptor │ │ (WebSocket Feed) │
...
핵심 설계 원칙 (Core design principles)
- 병렬 디스패치 (Parallel Dispatch): 50ms마다 발생하는 하트비트(heartbeat) 시, CIC는 등록된 모든 Viper를 동시에 평가합니다.
- 격리 예산 (Isolated budgets): 각 Viper는 독립적인 자본 예산과 포지션 장부를 가집니다. 한 섹터에서의 손실이 다른 섹터의 연료를 고갈시킬 수 없습니다.
- 다중 자산 동시성 (Multi-asset concurrency): 각 자산은 자체 raptor와 세션 상태를 가진 독립적인
tokio::spawn 태스크에서 실행됩니다. tokio 런타임은 작은 인스턴스에서 과부하(oversubscribing)되는 것을 방지하기 위해 호스트의 코어 수(최소 2개)에 맞춰 워커 풀 크기를 조정합니다. 다중 자산 박스의 경우(BTC + ETH + SOL을 4개 이상의 vCPU 호스트에서 사용하는 경우 등) TOKIO_WORKER_THREADS를 설정하여 늘릴 수 있습니다. 블로킹 작업은 전용 spawn_blocking 풀에서 실행되므로, 매칭 워커를 코어에 할당하는 것이 올바른 구성입니다.
- OS 스레드 감시자 (OS-thread watchdog): 네이티브 OS 스레드(tokio 런타임 외부)가 60초마다 원자적 하트비트를 확인합니다. 거래 루프가 5분 동안 침묵하면, Docker의 재시작 정책을 발동하기 위해
process::exit(1)를 호출합니다. 이는 tokio 런타임 교착 상태에 면역입니다. 엔진이 Setup을 기다리며 의도적으로 정지된 동안에는 작동하지 않습니다. 따라서 아직 자격 증명이 없는 박스를 멈춘 것으로 오인하지 않습니다. 만약 멈춤 현상이 발생하면, 종료하기 전에 모든 스레드의 스택을 기록합니다 — 아래 'Stall 진단' 섹션을 참조하세요.
- OBI 거부권 (OBI Veto): −0.60의 내장 주문장 불균형(Order Book Imbalance) 게이트는 유독한 흐름/분배 벽(toxic flow / distribution walls)으로의 진입을 차단합니다.
- 전략 시간 초과 (Strategy Timeout): 각 Viper 평가는 500ms로 제한됩니다. 작동이 멈춘 Viper는 해당 틱에서는 건너뛰어지며, 엔진은 절대 멈추지 않습니다.
- REST API:
:9000의 axum 서버가 라이브 설정, P&L(손익), 포지션 및 거래 기록을 Control Tower에 노출합니다.
Stall 진단 (Diagnosing a stall)
만약 트레이딩 루프가 조용해지면, OS-스레드 워치독이 180초에 소프트 경고를 발생시키고 300초에 프로세스를 종료하여 슈퍼바이저가 재시작합니다. 두 지점 모두 모든 스레드의 스택을 덤프하며, 일반적으로 소프트 경고가 더 유용합니다. 왜냐하면 그 시점에서도 프로세스는 살아있기 때문에 잠금을 보유한 것이 여전히 잠금을 유지하고 있기 때문입니다.
덤프는 루프가 어떤 단계에 있었는지(SIGNAL_EVAL, MARKET_ROTATE, ORDER_PLACE, …)와, 신호 평가(signal evaluation) 내부에서는 어떤 viper 또는 설정 단계였는지를 명시합니다. 이것만으로도 종종 충분합니다. 그렇지 않은 경우, 스택을 심볼화해야 합니다: