Dr. Manhattan - 예측 시장 거래
Dr. Manhattan은 CCXT가 암호화폐 거래소에서 하는 것처럼 예측 시장을 위한 통합 API입니다. Polymarket, Kalshi, Opinion, Limitless, Predict.fun을 단일 인터페이스로 지원합니다.
설정
uv로 의존성 설치:
uv venv && uv pip install -e .
MCP 서버(Claude 통합)의 경우:
uv sync --extra mcp
지원 거래소
| 거래소 | 체인/유형 | 인증 |
|---|---|---|
| Polymarket | Polygon | 개인 키 + 펀더 주소 |
| Kalshi | 규제 CEX | API 키 + RSA 개인 키 |
| Opinion | BNB 체인 | API 키 + 개인 키 + 다중 서명 주소 |
| Limitless | Base | 개인 키 |
| Predict.fun | BNB 체인 | API 키 + 개인 키 (EOA 또는 스마트 지갑) |
Python 라이브러리로 사용
읽기 전용 (자격 증명 없음)
import dr_manhattan
polymarket = dr_manhattan.Polymarket({'timeout': 30})
markets = polymarket.fetch_markets()
for market in markets:
print(f"{market.question}: {market.prices}")
인증 포함
import dr_manhattan
polymarket = dr_manhattan.Polymarket({
'private_key': '0x...',
'funder': '0x...',
})
order = polymarket.create_order(
market_id="market_123",
outcome="Yes",
side=dr_manhattan.OrderSide.BUY,
price=0.65,
size=100,
params={'token_id': 'token_id'}
)
거래소 팩토리
from dr_manhattan import create_exchange, list_exchanges
print(list_exchanges()) # ['polymarket', 'opinion', 'limitless', 'predictfun', 'kalshi']
exchange = create_exchange('polymarket', {'timeout': 30})
MCP 서버를 통한 사용
Dr. Manhattan은 모든 거래 기능을 MCP 도구로 제공합니다. Claude Code(~/.claude/settings.json 또는 .mcp.json)에서 설정:
{
"mcpServers": {
"dr-manhattan": {
"command": "/path/to/dr-manhattan/.venv/bin/python",
"args": ["-m", "dr_manhattan.mcp.server"],
"cwd": "/path/to/dr-manhattan"
}
}
}
MCP 도구 참조
거래소 도구:
list_exchanges- 사용 가능한 모든 예측 시장 거래소를 나열합니다.get_exchange_info(exchange)- 거래소의 메타데이터와 기능을 가져옵니다.validate_credentials(exchange)- 거래 없이 자격 증명이 유효한지 확인합니다.
시장 탐색:
search_markets(exchange, query)- 키워드로 시장을 검색합니다. 주제에 대한 시장을 찾는 가장 빠른 방법입니다.fetch_markets(exchange, limit?, offset?)- 페이지네이션으로 모든 시장을 가져옵니다.fetch_market(exchange, market_id)- 특정 시장을 ID로 가져옵니다.fetch_markets_by_slug(exchange, slug)- 슬러그 또는 URL로 시장을 가져옵니다 (Polymarket, Limitless).find_tradeable_market(exchange, binary?, limit?, min_liquidity?)- 거래에 적합한 시장을 찾습니다.find_crypto_hourly_market(exchange, token_symbol?)- 암호화폐 시간별 가격 시장을 찾습니다 (Polymarket).fetch_token_ids(exchange, market_id)- 시장의 토큰 ID를 가져옵니다.parse_market_identifier(identifier)- Polymarket URL에서 슬러그를 추출합니다.get_tag_by_slug(slug)- Polymarket 태그 정보를 가져옵니다.
주문장:
get_orderbook(exchange, token_id)- 전체 주문장(매수 및 매도)을 가져옵니다.get_best_bid_ask(exchange, token_id)- 최우선 매수 및 매도 가격을 가져옵니다.
거래:
create_order(exchange, market_id, outcome, side, price, size)- 매수 또는 매도 주문을 제출합니다. 가격은 0-1(확률)입니다. 사이드는 "buy" 또는 "sell"입니다.cancel_order(exchange, order_id, market_id?)- 특정 주문을 취소합니다.cancel_all_orders(exchange, market_id?)- 모든 미체결 주문을 취소합니다.fetch_order(exchange, order_id, market_id?)- 주문 세부 정보와 체결 상태를 가져옵니다.fetch_open_orders(exchange, market_id?)- 모든 미체결 주문을 나열합니다.
계정:
fetch_balance(exchange)- 계정 잔액(USDC)을 가져옵니다.fetch_positions(exchange, market_id?)- 손익이 포함된 현재 포지션을 가져옵니다.fetch_positions_for_market(exchange, market_id)- 특정 시장의 포지션을 가져옵니다.calculate_nav(exchange, market_id?)- 순자산 가치(현금 + 포지션)를 계산합니다.
전략 관리:
create_strategy_session(strategy_type, exchange, market_id, ...)- 백그라운드에서 마켓 메이킹 전략을 시작합니다.get_strategy_status(session_id)- 전략 실시간 상태(NAV, 포지션, 델타)를 가져옵니다.get_strategy_metrics(session_id)- 성능 지표(업타임, 체결)를 가져옵니다.pause_strategy(session_id)- 실행 중인 전략을 일시 중지합니다.resume_strategy(session_id)- 일시 중지된 전략을 재개합니다.stop_strategy(session_id, cleanup?)- 전략을 중지하고 선택적으로 주문을 취소합니다.list_strategy_sessions- 모든 활성 전략 세션을 나열합니다.
일반적인 워크플로우
시장 찾기 및 분석
search_markets를 키워드와 함께 사용하여 관련 시장을 찾습니다.- 결과에서 시장을 선택하고
id와metadata.clobTokenIds를 확인합니다. get_orderbook을 토큰 ID와 함께 사용하여 현재 매수/매도 호가를 확인합니다.get_best_bid_ask로 빠른 스프레드 확인을 합니다.
거래 실행
search_markets또는fetch_markets_by_slug로 시장을 찾습니다.fetch_balance로 사용 가능한 자금을 확인합니다.get_orderbook으로 주문장을 확인하여 현재 가격을 봅니다.create_order를 시장 ID, 결과("Yes" 또는 "No"), 사이드("buy" 또는 "sell"), 가격(0-1), 크기와 함께 사용합니다.fetch_order또는fetch_open_orders로 모니터링합니다.
마켓 메이킹 전략 실행
search_markets또는find_tradeable_market으로 시장을 찾습니다.create_strategy_session(strategy_type="market_making", exchange, market_id)로 시작합니다.get_strategy_status와get_strategy_metrics로 모니터링합니다.pause_strategy,resume_strategy, 또는stop_strategy로 제어합니다.
포트폴리오 확인
fetch_balance로 현금을 확인합니다.fetch_positions로 모든 미실현 손익이 포함된 미체결 포지션을 확인합니다.calculate_nav로 총 포트폴리오 가치(현금 + 포지션)를 계산합니다.
주요 개념
- 가격은 확률입니다. 0에서 1 사이(제외)의 값을 가집니다. 0.65의 가격은 시장이 65%의 확률을 암시함을 의미합니다.
- 결과는 일반적으로 이진 시장에서 "Yes"와 "No"입니다. 두 가격의 합은 약 1입니다.
- 토큰 ID는 각 시장 결과에 대한 거래소별 식별자입니다. 주문장 조회에 필요합니다.
- 슬러그는 사람이 읽을 수 있는 URL 식별자(예: "trump-2024")로, Polymarket과 Limitless에서 사용됩니다.
- 지원 주문 유형: GTC(지정가 대기), FOK(전부 체결 또는 취소), IOC(즉시 체결 또는 취소).
예제 실행
uv run python examples/list_all_markets.py polymarket
uv run python examples/spread_strategy.py --exchange polymarket --slug fed-decision
uv run python examples/spike_strategy.py -e opinion -m 813 --spike-threshold 0.02
데이터 모델
시장 필드: id, question, outcomes, prices, volume, liquidity, close_time, tick_size, description, metadata (slug, clobTokenIds 포함).
주문 필드: id, market_id, outcome, side (BUY/SELL), price, size, filled, status (PENDING/OPEN/FILLED/CANCELLED), time_in_force.
포지션 필드: market_id, outcome, size, average_price, current_price. 속성: cost_basis, current_value, unrealized_pnl.
주문장 필드: bids (가격, 크기 내림차순), asks (가격, 크기 오름차순). 속성: best_bid, best_ask, mid_price, spread.