hummingbot 설치부터 실전까지 — 거래소 이름 뒤에 _paper_trade 만 붙이면 모의가 되는 마켓메이킹 봇

별 2만 개짜리 마켓메이킹 봇을 키 없이 깔고, 바이낸스 실시세에 호가를 대고, 22번 체결시키고, 중지 조건을 실제로 발동시킵니다. 그리고 끊었다 붙였을 때 무엇이 사라지는지까지.

13편. hummingbot — 거래소 이름 뒤에 _paper_trade 만 붙이면 모의가 됩니다

이 글의 완료 조건: 독자는 API 키를 한 개도 만들지 않고 바이낸스 실시세 위에 호가를 대고, 모의 체결을 받고, hbot history 에서 수수료와 손익을 따로 읽으면 성공입니다.

하는 일 사는 값과 파는 값을 동시에 걸어 두고 그 차이를 먹는 마켓메이킹·차익거래 봇. 거래소 커넥터 63개 위에서 전략을 돌립니다
맞는 사람 크립토 마켓메이킹이나 거래소 간 차익거래를 해 보고 싶은데 돈을 먼저 넣기는 싫은 사람 · 거래소 두 곳 이상에 동시에 붙어야 하는 전략을 짜는 사람
안 맞는 사람 방향을 맞히는 봉 기반 전략을 하는 사람(결이 다릅니다) · 며칠 이상 모의를 끊김 없이 돌려 손익을 재야 하는 사람(재시작하면 모의 지갑이 리셋됩니다) · 주식이 필요한 사람
이 글의 결과물 키 0개로 받은 일봉 90개, 바이낸스 실호가 위에 걸린 내 모의 주문, 22체결 11왕복의 기록과 그중 절반이 수수료라는 숫자, 그리고 실제로 발동한 중지 조건
준비물·비용 코드 0원(Apache-2.0) · 모델 없음(LLM 을 쓰지 않는 도구입니다) · 시세 0원, API 키 0개 · 거래소 계정 0개
시간·난도 설치 9.4초, 첫 호가까지 2분. 난도 중상 — 휠 설치라 손이 두 번 가고, pure_market_making 설정 항목만 40개가 넘습니다
weltiq 와의 관계 실행은 안 붙습니다. hummingbot 이 봉·판단·모의 체결·기록을 전부 자기 안에서 합니다. 5절은 "연결하는 법"이 아니라 같은 자리에 있는 두 페이퍼가 무엇을 다르게 재는가 입니다
검증 환경·날짜 macOS 26.6.2 · arm64 · uv 0.10.12 · CPython 3.12.13 · PyPI hummingbot 20260920(hbot dev-2.17.0) · 2026-09-22 01:46~02:16 KST
제휴 고지 필자는 weltiq 로부터 이 연재의 원고료를 받습니다. 도구 평가는 필자가 직접 돌린 결과만 씁니다

사람 쪽 문장은 실제로 친 명령을 대화로 옮긴 것이고, 출력은 실측이며 숫자는 손대지 않았습니다. 거래소 계정도 API 키도 만들지 않았습니다 — 거래소에는 공개 시세 조회만 했고 거래소로 나간 주문은 한 건도 없습니다. 이 글의 체결은 전부 hummingbot 자체 paper_trade 안에서 일어났습니다. 어떤 매매 의견도 아닙니다. 원문 로그는 검증 기록에 있습니다.


1. 이게 뭔가요

hummingbot/hummingbot 은 마켓메이킹과 차익거래를 하는 오픈소스 트레이딩 봇입니다. 2019년에 나왔고, 거래소 커넥터를 잔뜩 들고 있고, 그 위에서 호가를 대는 전략들을 돌립니다.

마켓메이킹(시장 조성) 은 사는 값과 파는 값을 동시에 걸어 두는 일입니다. 지금 SOL 이 117.8 이라면 117.76 에 사자 주문을, 117.84 에 팔자 주문을 같이 겁니다. 둘 다 채워지면 0.08 을 법니다. 방향을 맞히는 게 아니라 양쪽에 서 있다가 오가는 사람에게 값을 대 주고 그 차이를 받는 장사입니다. 그래서 LLM 에이전트들이 "무엇을 살까"를 푸는 동안 hummingbot 은 "얼마에 걸고 얼마나 자주 갱신할까" 를 풉니다.

항목 값 확인 방법
주소 github.com/hummingbot/hummingbot
라이선스 Apache-2.0 GitHub API
별 수 ★20,124 · 포크 4,948 (관측일 2026-09-22) GitHub API
마지막 푸시 2026-09-20 GitHub API
개설 2019-04-02 · 열린 이슈 166 · 아카이브 아님 GitHub API
버전 PyPI hummingbot 20260920 · hbot dev-2.17.0 hbot --version
커넥터 63개 (현물 33 · 파생 30) AllConnectorSettings.get_connector_settings()

_paper_trade — 전환 비용이 문자열 하나입니다

설정 파일에서 거래소 이름을 binance 라고 쓰면 실거래, binance_paper_trade 라고 쓰면 모의입니다. 그게 전부이고, 코드가 정말 그렇게 생겼습니다.

# hummingbot/client/settings.py:311
paper_trade_settings = ConnectorSetting(
    name=f"{e}_paper_trade",           # ← 이름만 바꿔 하나 더 만든다
    type=base_connector_settings.type,
    parent_name=base_connector_settings.name,
)
cls.all_connector_settings.update({f"{e}_paper_trade": paper_trade_settings})

# hummingbot/client/config/client_config_map.py:207
paper_trade_account_balance: Dict[str, float] = Field(
    default={"BTC": 1, "USDT": 100000, "USDC": 100000, "ETH": 20,
             "WETH": 20, "SOL": 100, "DOGE": 1000000, "HBOT": 10000000},
)

진짜 커넥터를 복제해 이름 뒤에 _paper_trade 를 붙인 쌍둥이를 하나 더 등록합니다. 시세는 진짜 커넥터가 가져오고 체결만 모사합니다. 기본으로 네 곳(binance · kucoin · kraken · gate_io)에 쌍둥이가 붙습니다. 그리고 모의 지갑의 초기 잔고가 설정에 그냥 적혀 있는데, 이 줄이 4절 마지막 실험의 복선입니다. README 의 "시작하기" 예제 자체가 페이퍼이고 실거래 예제는 그다음에 나옵니다.

진짜 자산은 커넥터 수입니다. 설치본에서 세어 보면 63개 — 마켓메이킹에서 이건 장식이 아닙니다. 같은 코인이 거래소마다 값이 조금씩 다르고, 그 차이를 먹는 전략(cross_exchange_market_making, amm_arb, spot_perpetual_arbitrage)은 거래소 두 곳 이상에 동시에 붙어야 아예 성립합니다. 커넥터가 곧 전략의 사거리입니다. 전략은 V1 9개와 V2 스크립트 17개·컨트롤러 20여 개가 들어 있습니다.

그리고 예전의 화면 가득한 터미널 UI 말고 비대화형 CLI(hbot) 가 따로 있습니다. 이 글은 처음부터 끝까지 그걸로 했습니다 — hbot start · status · stop · history 가 전부 마크다운 표로 나오고 --json 도 있습니다. LLM 에게 시키기 딱 맞는 모양입니다.


2. 설치

공식 설치 경로는 이게 아닙니다. hummingbot 이 안내하는 것은 도커와 소스 빌드(Anaconda + make install, Cython 컴파일) 둘인데, 이 글을 쓴 환경에는 도커도 conda 도 없었습니다. 그래서 PyPI 휠로 깔았습니다 — macOS arm64·CPython 3.12 휠이 있습니다. 다만 그쪽이 지원한다고 말한 경로가 아니라서 손이 두 번 갑니다. 도커를 쓰실 수 있으면 도커가 맞습니다.

uv venv -p 3.12 ./venv-hummingbot
uv pip install --no-cache --python ./venv-hummingbot/bin/python hummingbot

캐시를 비우고 받아 139 패키지에 9.4초였습니다(같은 명령을 한 번 더 콜드로 돌렸을 땐 29.3초 — 내려받기 속도 편차입니다). 예전에 Cython 컴파일로 몇십 분씩 걸리던 기억이 있으시면, 휠에는 .so 가 이미 들어 있어서 그 단계가 없습니다.

휠로 깔면 두 가지가 비어 있습니다 — 실행 진입점과 설정 폴더 위치입니다.

# ① bin/hbot 이 휠에 안 들어 있으므로 진입점을 직접 부른다
cat > hbot_run.py <<'EOF'
import sys
from hummingbot.cli.main import main
sys.exit(main())
EOF

# ② conf/ logs/ data/ scripts/ controllers/ 를 패키지 설치 위치에서 찾으므로 링크를 건다
SP=$(python -c "import hummingbot,os;print(os.path.dirname(os.path.dirname(hummingbot.__file__)))")
for d in conf logs data certs scripts controllers; do mkdir -p ./$d; ln -sfn $PWD/$d $SP/$d; done

export HBOT_PASSWORD='아무거나'   # 첫 실행 때 키스토어 비밀번호를 만듭니다

scripts/ 와 controllers/ 는 저장소에서 그 두 폴더만 복사해 오면 됩니다.

설치 확인

설치가 끝난 화면입니다. 아래쪽 hbot doctor 표를 보십시오 — 컴파일된 Cython 확장이 import 되는지, 키스토어가 열리는지, 인터넷 시각과 오차가 얼마인지(skew ~0.6s) 까지 스스로 점검합니다. 전부 ok 면 다음으로 넘어가셔도 됩니다. (캡처는 실제 터미널 출력을 그대로 옮겨 렌더한 것입니다.)

시계 오차를 자가진단에 넣어 둔 것이 인상적이었습니다. 호가를 밀리초 단위로 갱신하는 봇에게 시계가 밀리는 건 진짜 사고라서입니다.

막히는 자리

증상 원인 해결
No such file or directory: .../site-packages/conf/strategies/... 휠이 conf/ 를 패키지 설치 위치에서 찾습니다 위 ② 의 심볼릭 링크
hbot: command not found 휠에 bin/hbot 이 없습니다 위 ① 의 hbot_run.py
정상 종료했는데 ModuleNotFoundError: No module named 'appnope' ERROR 휠이 macOS 전용 의존성 하나를 선언하지 않았습니다 무시해도 됩니다 — 그 다음 줄부터 주문이 정상 취소되고 Trading core shutdown complete 까지 갑니다. 깨끗이 하려면 uv pip install appnope
Extra inputs are not permitted conf_client.yml 에 없는 키를 넣었습니다 pydantic 이 막습니다. 키 이름 확인
봇이 시작하자마자 죽음 (Invalid password) HBOT_PASSWORD 가 키스토어와 다릅니다 키스토어는 conf/.password_verification

3. 첫 결과

제일 작은 예제는 호가를 대 보는 것입니다. 계정도 키도 필요 없습니다.

이렇게 말합니다

바이낸스 페이퍼로 SOL-USDT 에 양쪽 0.5% 씩 호가 걸고 30초마다 갱신하게 띄워 줘. 키는 없어.

그러면 이런 게 돌아옵니다

## deployed conf_pmm_tut13.yml
- type: v1-strategy   - pid: 76398   - status: running
- applied: ask_spread, bid_spread, exchange, market, order_amount, order_refresh_time
직접 치고 싶다면
hbot create pure_market_making --with-defaults --name conf_pmm_tut13.yml
hbot deploy conf_pmm_tut13.yml \
  --set exchange=binance_paper_trade --set market=SOL-USDT \
  --set bid_spread=0.5 --set ask_spread=0.5 \
  --set order_refresh_time=30 --set order_amount=0.5
`deploy` 는 "설정을 채우고 곧바로 띄우기"를 한 번에 합니다. 설정만 만들려면 `create`, 띄우기만 하려면 `start` 입니다.

전략 설정 화면

hbot config — 지금 불러온 전략의 설정 전부입니다. 위에서 다섯째 줄 exchange | binance_paper_trade 가 이 봇이 모의라는 유일한 표시입니다. 여기를 binance 로 바꾸면 실거래가 됩니다. 그 아래 bid_spread / ask_spread / order_refresh_time / order_amount 네 개가 이 글에서 실제로 만진 값이고, 나머지는 전부 기본값입니다. 오른쪽 live 칸은 봇을 돌린 채로 바꿀 수 있는가인데 전부 no 입니다 — 4절에서 다시 나옵니다. (화면이 길어 앞쪽 27줄만 잘랐습니다.)

1분쯤 뒤 hbot status 로 상태를 봅니다.

paper_trade 가 호가를 대고 있는 화면

hbot status 입니다. 세 군데를 보십시오. Markets 줄의 binance_PaperTrade SOL-USDT 117.8 / 117.81 은 지금 이 순간 바이낸스의 진짜 호가입니다. Assets 의 SOL 100 / USDT 100000 은 1절에서 본 설정 기본값 그대로인 모의 지갑입니다. 그리고 Orders 두 줄 — sell 117.8939 와 buy 117.7761 이 지금 걸려 있는 필자의 호가입니다. 진짜 시세 위에 가짜 주문이 얹혀 있는 상태입니다.

이렇게 나오면 성공입니다. Age 칸의 00:00:17 은 17초 전에 건 주문이라는 뜻이고, 30초마다 취소하고 다시 겁니다. 이게 마켓메이킹의 실체입니다 — 하루 종일 걸고, 취소하고, 다시 겁니다. 4분 36초 동안 주문을 18건 만들고 16건 취소했습니다. 그리고 주문 기록이 자기가 모의라고 밝힙니다 — "event_source": "None_PaperTrade".

대시보드 — 도커 없이는 껍데기입니다

터미널만으로도 되지만 웹 대시보드가 따로 있습니다. 본체가 아니라 hummingbot/dashboard(★367, Apache-2.0)라는 별도 저장소의 Streamlit 앱이고, 의존성 176개가 깔립니다. 기본 포트는 8501(Streamlit 기본)이고 이 글은 --server.port 9040 으로 옮겼습니다. 로그인은 기본으로 꺼져 있고(AUTH_SYSTEM_ENABLED=false) 거래소 키도 필요 없습니다 — 켜면 credentials.yml 의 admin / abc 가 기본 계정이니 켜실 거면 반드시 바꾸십시오.

git clone --depth 1 https://github.com/hummingbot/dashboard.git && cd dashboard
uv venv -p 3.12 ./venv-hbdash
uv pip install --python ./venv-hbdash/bin/python \
  hummingbot hummingbot-api-client nest_asyncio pydantic "streamlit>=1.36.0" watchdog \
  python-dotenv "plotly==5.24.1" pycoingecko glom defillama statsmodels pyyaml \
  "streamlit-authenticator==0.3.2" sqlalchemy
./venv-hbdash/bin/python -m streamlit run main.py \
  --server.headless true --server.port 9040 --server.address 127.0.0.1

대시보드 첫 화면

http://127.0.0.1:9040 첫 화면입니다. 왼쪽 사이드바가 이 도구의 전부입니다 — Bot Orchestration(Instances · Deploy V2 · Credentials · Portfolio · Trading · Archived Bots), Config Generator(Grid Strike · PMM Simple · PMM Dynamic · D-Man Maker V2 · Bollinger V1 · MACD_BB V1 · SuperTrend V1 · XEMM Controller), Data(Download Candles). 그리고 노란 경고 박스를 꼭 읽으십시오 — "The metrics, charts, and statistics shown below are simulated/mocked data for demonstration purposes." 바로 아래 Active Bots 3 · Total Portfolio $12,847 · Win Rate 74.2% 는 전부 가짜 예시 숫자입니다. 제 봇의 숫자가 아닙니다.

첫 화면의 숫자가 가짜라는 걸 놓치면 안 됩니다. 스크린샷만 돌아다니면 오해하기 딱 좋은 화면이라 굵게 적습니다. 그리고 사이드바의 다른 항목을 누르면 전부 같은 곳에서 막힙니다.

백엔드가 있어야 합니다

Config Generator → PMM Simple 을 누른 화면입니다. Failed to initialize API client: 404, message='Not Found', url='http://127.0.0.1:8000/docker/running'. Download Candles 든 Instances 든 전부 같은 오류입니다. 즉 첫 화면 말고는 아무것도 안 됩니다.

대시보드는 혼자 도는 물건이 아니라 백엔드 API(hummingbot/hummingbot-api, 8000번 포트)의 화면이고, 그 백엔드는 도커로 봇 컨테이너를 띄우는 쪽이라 도커가 전제입니다. (위 오류가 Connection refused 가 아니라 404 인 것은 그 컴퓨터에서 8000번을 다른 프로그램이 쓰고 있어서입니다. 뜻은 같습니다.) 도커를 쓰실 수 있으면 hummingbot/deploy 가 대시보드·백엔드·브로커를 한 번에 띄웁니다. 못 쓰시면 hbot CLI 로 하십시오 — 이 글 4절 전부가 CLI 로 됐습니다. 덧붙여 대시보드 저장소의 마지막 푸시가 2025-10-27 로 본체(2026-09-20)와 거의 1년 차이가 납니다. 오늘 hummingbot 을 쓰는 제대로 된 길은 hbot CLI 입니다.


4. 제일 잘 쓰는 법 — 마켓메이킹을 30분 돌려 보면 무슨 일이 벌어지나

먼저 해 본 것을 한눈에 적습니다. 전부 hummingbot 안에서, 키 없이 끝났습니다.

해 본 것 결과 걸린 시간
캔들 피드로 BTC-USDT 일봉 90개 (키 없음) 90행 정상, 다만 미완성 봉이 섞여 나옵니다 3.406초
스프레드 0.5% 로 호가 대기 18건 생성·16건 취소, 체결 0 4분 36초
스프레드를 0.01% 로 좁혀 재기동 7초 만에 첫 체결, 수수료 percent 0.001 4분 39초에 7건
중지 조건(kill switch) 발동시키기 -0.05 안 걸림 → -0.001 안 걸림 → -0.0001 에서 14초 만에 발동 세 번
포지션을 연 채 kill -9 뒤 재기동 모의 지갑이 초기값으로 리셋, 체결 기록은 보존 10초
일곱 번의 실행을 합산 22체결 11왕복 · base_vol 0 · fees 1.29339 · total_pnl −2.56183 약 30분

체결 기록은 자기가 모의라고 밝히고(event_source: None_PaperTrade), exchange_order_id 가 빈 문자열이며, 체결 가격은 건 지정가 그대로입니다. 각 항목의 원문 로그는 검증 기록에 있습니다.

중지 조건이 두 번은 왜 안 걸렸나

hummingbot 의 중지 조건은 conf_client.yml 의 kill_switch_rate 한 줄입니다. -0.05 로 3분 33초를 돌려 4건이 체결되고 손실이 났는데도 조용했고, -0.001 로도 안 걸렸고, -0.0001 에서야 14초 만에 걸렸습니다.

kill switch 발동

위가 발동 로그, 아래가 발동 뒤의 hbot status 입니다. 로그의 Current profitability is -0.000001088… 를 보십시오 — 임계값 -0.000001 을 아슬아슬하게 뚫었습니다. 그리고 아래 hbot status 를 보십시오. state: running 인데 Markets·Assets·Orders 표가 통째로 사라졌습니다. 이게 이 절의 핵심입니다.

코드를 보면 답이 나옵니다. kill_switch_rate 는 100으로 나뉘고(kill_switch_rate / Decimal(100)), 비교 대상 _profitability 는 포트폴리오 전체 평가액 대비 수익률입니다. 이 모의 지갑은 SOL 100 + USDT 100,000 = 약 111,700 USDT 였으니 손실이 1~2 USDT 나도 −0.00001 언저리밖에 안 됩니다. 버그가 아니라 정의의 문제이고, 쓰는 사람에게는 함정입니다 — -5 라고 적으면 "이번 매매 5%"가 아니라 전 재산 5% 입니다. 자본의 0.1% 만 굴리는 마켓메이킹에서는 사실상 절대 안 걸리는 값이 됩니다.

발동한 뒤가 더 흥미롭습니다. 로그는 02:05:22 에서 멈췄고 전략은 Strategy stopped successfully 로 내려갔는데, hbot status 는 3분 뒤에도 state: running 이었습니다. 프로세스가 살아 있어서입니다. hbot status 만 보고 있었다면 멈춘 줄 몰랐을 겁니다.

끊었다 붙이면 지갑이 리셋됩니다

포지션이 있는 채로 프로세스를 kill -9 로 죽이고 다시 띄웠습니다.

죽이기 직전  01:57:42   SOL  98.499     USDT 100176.2895
재기동 뒤    01:58:12   SOL 100.4995    USDT  99941.1684

검산: 100 + 0.4995            = 100.4995    ← SOL 100 에서 다시 시작해 0.5 매수(수수료 0.1% 차감)
      100000 − 0.5 × 117.6632 =  99941.1684 ← USDT 100000 에서 다시 시작

페이퍼 지갑이 1절에서 본 설정 기본값(SOL 100 / USDT 100000)에서 새로 시작했습니다. 그동안 쌓인 손익도, 갖고 있던 재고도 통째로 없던 일이 됐습니다. 그런데 거래 기록은 남습니다 — hbot history 의 거래 수는 7 → 8 로 이어졌습니다. sqlite 에 들어 있어서입니다.

끊었다 붙이면
체결 기록 (TradeFill) 남습니다 — sqlite
미체결 주문 추적 상태 복원 시도합니다 (restore_market_states)
모의 지갑 잔고 설정 초기값으로 리셋
누적 손익 지갑이 리셋되므로 끊깁니다

실거래에서는 이게 문제가 안 됩니다 — 잔고의 진실은 거래소에 있고 재접속하면 다시 읽어 오니까요. 모의에는 그 거래소가 없습니다. 다시 물어볼 곳이 설정 파일밖에 없고, 거기엔 시작 잔고만 적혀 있습니다.

그래서 30분의 결론

체결이 쌓인 결과

위가 hbot history 의 누적 집계, 아래가 체결 원본(TradeFill 테이블) 마지막 8건입니다. 위 표에서 trades 22 · buys 11 · sells 11 · base_vol 0 를 먼저 보십시오 — 정확히 11번 왕복했고 재고가 제자리로 돌아왔다는 뜻입니다. 그리고 fees 1.29339 와 total_pnl -2.56183 를 나란히 보십시오. 손실의 절반이 수수료입니다. 아래 원본에서는 체결이 1~2분에 한 건씩, 값은 117.4~117.7 사이에서 왔다 갔다 한 것이 보입니다.

주의 하나. 위 캡처는 봇을 내린 뒤 찍은 것이라 return% 칸이 -201.967 로 나옵니다. hbot 이 그 아래에 직접 적어 뒀듯 "봇이 멈춰 있어 현재 잔고를 못 읽는다 — 실현 손익은 정확하고 현재가·미실현 값은 근사"라는 뜻입니다. 봇이 돌고 있을 때 같은 명령을 치면 -0.0023 이었습니다. 실현 손익(trade_pnl · fees · total_pnl)은 두 경우 모두 같습니다.

이 표에서 제일 중요한 줄은 total_pnl 이 아니라 fees 입니다. 매수 11건, 매도 11건으로 정확히 짝이 맞고 base_vol 0 이라 재고가 처음 자리로 돌아왔습니다 — 마켓메이킹이 의도대로 돈 겁니다. 그런데 결과는 −2.56 USDT 이고 그중 수수료가 1.29 입니다. 나머지 −1.27 은 값이 내려가는 동안 계속 사 주고 올라가는 동안 계속 팔아 준 결과입니다.

마켓메이킹이 어려운 이유가 이 한 줄에 다 있습니다. 11번 완벽하게 왕복했는데도 졌습니다. 편도 0.01~0.05% 스프레드로 왕복 0.2% 수수료를 이길 방법이 없기 때문입니다. 실제 마켓메이커들은 메이커 수수료를 환급받거나, 유동성 공급 보상을 따로 받거나, 스프레드를 훨씬 넓게 잡고 체결 빈도를 포기합니다. 필자는 셋 다 안 했고, 그래서 졌습니다.

그리고 이게 이 시나리오의 값입니다. 돈을 한 푼도 안 쓰고 "내 설정으로는 안 된다"를 30분 만에 알았습니다. 실계좌로 알아냈다면 수수료가 1.29 달러가 아니었을 테고, 무엇보다 "수수료가 절반"이라는 구조를 못 보고 "시장이 나빴네"로 넘겼을 겁니다. 권하는 순서는 이렇습니다 — (ㄱ) _paper_trade 로 며칠 돌린다 → (ㄴ) hbot history 의 fees 와 trade_pnl 을 따로 본다 → (ㄷ) 수수료를 뺀 뒤에도 남는지 확인한다 → (ㄹ) 그제야 키를 넣는다. 다만 이 손익은 끊기지 않은 구간에서만 믿을 수 있고(위 지갑 리셋), 메이커 수수료 환급·유동성 보상 같은 실제 마켓메이커의 수입원은 이 모의에 아예 들어 있지 않습니다.


5. weltiq 로 옮기기 — 붙는 자리가 얕습니다

먼저 정직하게 적습니다. 이 도구와 weltiq 가 붙는 자리는 얕습니다. hummingbot 은 봉도 자기가 받고, 판단도 자기가 하고, 모의 체결도 자기가 하고, 기록도 자기 sqlite 에 남깁니다. 4절 전부를 hummingbot 안에서 돌린 게 그 증거입니다. 크립토 마켓메이킹을 하시는 분이 굳이 페이퍼 계좌를 덧붙일 이유가 없습니다.

다만 둘 다 페이퍼라서 나란히 놓고 볼 값은 있습니다. 재는 방식이 다르기 때문입니다. 비교를 하려면 자가 같아야 하니 봉부터 맞춰 봤습니다.

겹치는 일봉 30개 중 네 값(OHLC) 모두 일치 30 · 다름 0
  2026-09-20T09:00+09:00  hb(2026-09-19) o=80883.86 c=81249.99 | wq o=80883.86 c=81249.99 → 일치
  2026-09-21T09:00+09:00  hb(2026-09-20) o=81249.99 c=81178.00 | wq o=81249.99 c=81178.00 → 일치

hb 마지막 봉 시작일(UTC): 2026-09-21   close 85987.32
wq 마지막 봉 라벨:        2026-09-21T09:00:00+09:00   close 81178.00

30개 전부 소수점까지 같았습니다. 다만 두 가지가 다릅니다 — hummingbot 은 봉에 시작 시각을 UTC 로 붙이고 미완성 봉을 포함하는 반면, weltiq 는 끝나는 시각을 요청 시간대로 붙이고 확정 봉만 저장합니다. 라벨 차이는 규약 문제라 한 봉 밀어서 맞추면 됩니다(위 대조도 그렇게 하고 나서 30/30 이 나왔습니다). 미완성 봉은 성격 문제입니다 — 위 마지막 두 줄이 그것으로, hummingbot 에는 close 85987.32 짜리 오늘 봉이 있고 weltiq 에는 없습니다. 호가를 15초마다 갱신하는 봇에게 "봉이 끝날 때까지 기다려라"는 쓸모없는 규칙이고, 봉 하나로 판단하는 규칙에게 미완성 봉은 같은 입력에 다른 답이 나오는 원인입니다. 재는 단위가 다릅니다.

같은 자리에 있는 두 페이퍼 — 무엇이 다른가

weltiq 전략 컨테이너를 하나 띄워 놓고 hummingbot 과 같은 시각에 찍었습니다.

hummingbot 02:15:07

02:15:07 의 hummingbot 입니다. Orders 두 줄을 보십시오 — sell 117.6438 · buy 117.5262, Age 00:00:01. 1초 전에 새로 건 호가입니다. 이 봇은 쉬지 않고 값을 대고 있습니다.**

weltiq 02:15:09

같은 시각(02:15:09)의 weltiq 컨테이너입니다. 세 군데를 보십시오. Engine: attached — 엔진이 붙어 있습니다. Entry conditions not met — waiting (normal) — 주문을 안 내고 있는 것이 정상 상태라고 밝힙니다. Last bar 9/22, 02:15 AM — 직전 확정 봉의 시각입니다. 그리고 오른쪽 Auto-stop −200 · 9/22, 04:14 AM — 컨테이너를 만들 때 반드시 넣어야 했던 중지 조건입니다.

hummingbot paper_trade weltiq 페이퍼
무엇을 재나 호가. 실시간 오더북에 대고 체결을 모사 확정 봉. 봉이 끝나야 신호가 돈다
체결 가격 내가 건 지정가 그대로 체결 규칙에 따라 기록, 저널에 남김
중지 조건 선택. 안 넣으면 안 넣은 대로 돈다 필수 게이트. 없으면 컨테이너가 아예 안 뜬다
끊겼다 붙으면 모의 잔고가 초기값으로 리셋 포지션·손익을 이어받고 무엇을 이어받았는지 적는다
상태가 밖에서 보이나 hbot status. 중지 조건 발동 뒤에도 running 심볼마다 신호등 + 사유 문구
기록 자기 sqlite (TradeFill) 저널·원장·GET /export
잘하는 전략 마켓메이킹·차익거래 봉 기반 신호

마지막 줄이 제일 중요합니다. 마켓메이킹은 weltiq 가 하는 일이 아닙니다. weltiq 블록은 봉을 읽어 "지금 진입/청산"을 내는 신호 블록이고, 호가를 양쪽에 대고 재고를 관리하는 칸이 없습니다. 4절의 30분 실험을 weltiq 로는 못 합니다. 단점이 아니라 다른 물건이라는 뜻이고, hummingbot 을 쓰실 이유이기도 합니다. 반대로 weltiq 쪽 칸 셋은 hummingbot 에 없습니다 — 중지 조건 강제, 끊겼다 붙었을 때의 이어받기, 밖에서 읽히는 상태.

이 대조에서 weltiq 쪽 빈칸이 하나 나왔습니다

나란히 놓으려고 SOLUSDT 1분봉 컨테이너를 먼저 만들었는데 이렇게 됐습니다.

엔진이 안 붙은 컨테이너

SOLUSDT 1분봉 컨테이너입니다. running 이라고 돼 있지만 그 옆이 빨간 글씨 Engine not attached — state unknown 이고 Engine 칸이 not attached 입니다. 5분을 기다려도 그대로였습니다. 아래 ORDERS·FILLS 는 당연히 비어 있습니다.

원인은 봉이었습니다 — 그날 최근 1시간 1분봉이 BTCUSDT 60 · SOLUSDT 0 · ETHUSDT 0 이었습니다. 그날 binance-spot 1분봉 수집은 BTCUSDT 에만 돌고 있었고, SOL 1분봉 컨테이너는 붙을 봉이 없어 엔진이 잡지 못했습니다(일봉은 SOLUSDT 도 정상이었습니다). 그래서 이 글의 나란히 놓기는 BTCUSDT 로 바꿔서 했고, 그쪽은 40초 안에 붙었습니다.

그 뒤 (2026-09-22): 고쳤습니다. 크립토도 주식과 같은 구독 경로(market.symbol_subscriptions)를 씁니다 — 컨테이너를 부착하면 그 종목 피드를 구독하고 3일치 1분봉을 백필합니다. 수집 대상을 미리 정해 두는 목록이 아니라 부착이 곧 구독입니다. 지금 binance-spot 1m 봉이 들어오는 종목은 89개입니다. 위의 Engine not attached — state unknown 화면도 같은 원인이었고, 지금 같은 순서로 SOL 1분봉 컨테이너를 만들면 그대로 붙습니다.

그리고 이게 마켓메이킹 이야기와 이어집니다. hummingbot 의 힘이 커넥터 63개라면 weltiq 의 대응물은 봉 수집 범위입니다. 커넥터가 많아도 시세가 안 들어오면 전략이 못 돕니다. 그 빈칸이 이 글을 쓸 때는 1분봉 쪽에 있었고, 적어 둔 대로 고쳐졌습니다.


6. 써 보니

좋았던 것

  1. _paper_trade 가 정말로 문자열 하나입니다. 키를 지울 필요도 다른 명령을 쓸 필요도 없습니다. 전환 비용이 낮으면 사람들이 실제로 씁니다. README 의 시작 예제도 페이퍼가 먼저입니다
  2. hbot 이 스크립트로 몰기 좋습니다. 마크다운 표 + --json + 안정적인 종료 코드. 이 글 전체를 TUI 한 번 안 띄우고 했습니다. 게다가 hbot doctor 가 확장 모듈·키스토어·시계 오차·디스크를 한 번에 점검합니다
  3. 커넥터 63개. 이게 이 도구의 본체입니다. 거래소 두 곳 이상에 동시에 붙어야 성립하는 전략들이 여기서 나옵니다
  4. 수수료를 제대로 물립니다. 모의인데 0.1% 를 그대로 뗍니다. 그래서 "완벽하게 왕복했는데 졌다"가 나옵니다 — 안 봐주는 쪽이 맞습니다. 대시보드가 첫 화면 숫자를 "가짜"라고 밝히는 것도 같은 성격입니다

아쉬웠던 것

  1. 끊겼다 붙으면 모의 잔고가 리셋됩니다. 제일 큰 단점입니다. 며칠짜리 모의 운용의 손익을 이 도구만으로는 못 잽니다
  2. kill switch 의 기준이 직관과 다르고(전 재산 대비), 발동 뒤 상태가 밖으로 안 보입니다 — 전략은 내려갔는데 hbot status 는 3분 뒤에도 running 이었습니다. 게다가 돌고 있는 봇의 스프레드를 무중단으로 못 바꿔서, 고치려면 재시작해야 하고 재시작은 위의 잔고 리셋을 부릅니다
  3. 체결이 너무 착합니다. 지정가에 정확히 채워지고, 호가 잔량을 소진하지 않고, 내 주문이 호가창에 끼어드는 효과도 없습니다. 마켓메이킹에서 제일 중요한 "내 앞에 누가 있나"가 이 모의에는 없습니다
  4. 휠 설치가 공식 경로가 아니고(2절의 세 줄), 대시보드는 도커 없이는 껍데기입니다. 그리고 크립토 전용에 진입 장벽이 낮지 않습니다 — pure_market_making 설정 항목만 40개가 넘습니다

비용

항목 값
코드·시세 0원 (Apache-2.0 · API 키 0개 · 거래소 계정 0개)
모델 없음 — LLM 을 쓰지 않는 도구입니다
시간 설치 9.4초 · 캔들 90개 3.4초 · 첫 체결까지 7초

이런 분에게 맞습니다 — 크립토 마켓메이킹이나 거래소 간 차익거래를 해 보고 싶은데 돈을 먼저 넣기는 싫으신 분. 4절 하나만으로 값이 있습니다. 안 맞는 분은 방향을 맞히는 봉 기반 전략을 하시는 분, 며칠 이상 모의를 끊김 없이 돌려 손익을 재야 하는 분, 그리고 주식이 필요하신 분입니다.


7. 다음 편 예고

다음은 QuantDinger(★11.9k)입니다. 이번 편과 정반대 방향입니다 — hummingbot 은 거래소에 붙는 폭이 자산인 물건이었고, QuantDinger 는 전략 런타임이 본체입니다. 어댑터 확장점이 열려 있고 Agent Gateway 와 MCP 가 붙어 있어 체결을 어디서 할지 갈아 끼울 수 있게 설계돼 있습니다.

그래서 다음 편의 질문도 정반대가 됩니다. 이번에는 "자기 페이퍼가 있으니 낄 자리가 없다"였고, 다음에는 "그 어댑터 자리에 weltiq 를 꽂으면 전략 런타임이 통째로 그 체결 위에서 도는가" 입니다.

weltiq 준비 — 3줄 1. 가입: {{CTA_URL}} 2. 마이 → 연결 관리에서 API 키 발급 3. claude mcp add weltiq --header "Authorization: Bearer <키>" https://weltiq.ai/mcp

hummingbot 이 못 가는 주식·해외 시장까지 같은 규칙을 걸어 보고 싶으시면 그때 보실 자리입니다.


이 글의 모든 명령·출력·숫자는 2026-09-22 에 실제로 돌려서 얻었습니다. 실제 돈이 오간 주문은 없고 전부 모의입니다. 어떤 매매 의견도 아닙니다. 여기 적지 않은 시행착오·원문 로그·돌리지 않은 항목은 검증 기록에 있습니다.