← 기사 목록으로
March 26, 2026
5분 소요

ETF 포트폴리오 자동 리밸런싱: Tinkoff 투자용 봇 개발기

ETF 포트폴리오 자동 리밸런싱: Tinkoff 투자용 봇 개발기
#etf
#tinkoff
#리밸런싱
#포트폴리오
#봇
#알고리즘매매
#오픈소스

ETF Balancer Bot 포트폴리오 자동 리밸런싱: 봇이 목표 비중을 모니터링하고 대신 매매합니다.

TMOS, TBRU, TRUR 그리고 루블 현금으로 구성된 4개의 ETF 포트폴리오가 있다고 가정합니다. 각각 25%씩. 시장이 올라 TMOS가 32%로 늘어나고, TBRU는 18%로 줄었습니다. 고전적 이론은 말합니다: 오른 것은 팔고, 내린 것은 사라. 이것이 리밸런싱입니다.

문제는 이 작업을 수동으로 하면 매우 번거롭다는 것입니다. 특히 계좌가 여러 개이고, 전략에 마진 거래가 포함되며, 매시간 리밸런싱이 필요한 경우에는 더욱 그렇습니다. 우리는 이 과정을 자동화하는 봇을 만들었습니다.

TIEBB(Tinkoff Invest ETF Balancer Bot)는 TypeScript 기반 오픈소스 봇으로, Tinkoff 투자 API에 연결하여 포트폴리오의 목표 배분을 자동으로 유지합니다. 4가지 밸런싱 모드, 마진 거래, 멀티 계좌, 테스트를 위한 dry-run 모드를 지원합니다.


요약

  • 오픈소스(Apache 2.0) ETF 포트폴리오 자동 리밸런싱 봇
  • 4가지 밸런싱 모드: 수동, 시가총액 기준, AUM 기준, 탈상관
  • 마진 거래 최대 4배 레버리지, 리스크 관리 포함
  • 멀티 계좌: 무제한 계좌 수, 개별 설정 가능
  • TypeScript + Bun — 빠르고, 타입 안전하며, 스트레스 없는 개발
  • Dry-run 모드 — 주문을 계산하되 실행하지 않음

리밸런싱이 왜 필요한가

포트폴리오 리밸런싱 개념

아이디어는 간단합니다. 포트폴리오 내 각 자산의 목표 비중을 정합니다(예: TMOS 25%, TBRU 25%, TRUR 25%, RUB 25%). 시간이 지나면 시장이 움직이면서 실제 비중이 목표에서 벗어납니다. 리밸런싱이란 오른 자산을 팔고 내린 자산을 사서 목표 비중으로 돌아가는 것입니다.

왜 필요한가:

  1. 리스크 관리 — 하나의 자산이 포트폴리오의 60%까지 커지면 단일 종목에 과도하게 의존하게 됩니다
  2. 체계적인 이익 실현 — 오른 자산을 자동으로 매도
  3. 저점 매수 — 하락한 자산을 자동으로 추가 매수
  4. 원칙 준수 — 감정 없이 알고리즘만

수동으로 하면 피곤합니다. 특히 다음과 같은 경우:

  • 여러 계좌를 보유한 경우
  • 분기별이 아닌 매시간 리밸런싱이 필요한 경우
  • 전략에 마진 거래가 포함된 경우
  • 거래 단위, 최소 금액, 거래소 운영 시간을 고려해야 하는 경우

봇 동작 방식

메인 루프

1. MOEX(모스크바 거래소)가 열려 있는지 확인
2. 현재 포지션과 가격 조회
3. 목표 배분 계산 (4가지 모드)
4. 주문 생성: 매도 먼저, 그다음 매수
5. 시장가 주문으로 체결
6. BALANCE_INTERVAL 대기 후 반복

봇은 무한 루프로 동작합니다. 인터벌은 1분에서 1일까지 설정 가능하며, 기본값은 1시간입니다.

4가지 밸런싱 모드

4가지 밸런싱 모드

1. 수동 모드(manual)

가장 간단합니다. 비중을 직접 설정합니다:

{
  "desired_wallet": {
    "TMOS": 25,
    "TBRU": 25,
    "TRUR": 25,
    "RUB": 25
  }
}

봇이 퍼센트를 100%로 정규화하고 해당 비율을 유지합니다.

2. 시가총액 모드(marketcap)

비중이 각 펀드의 시가총액에 비례합니다. 로직: 펀드가 클수록 비중도 커집니다. 데이터는 T-Bank와 investfunds.ru 사이트에서 가져옵니다.

3. 운용자산 규모 모드(aum)

비중이 각 펀드의 AUM(Assets Under Management, 운용자산 규모)에 비례합니다. 데이터는 t-capital-funds.ru에서 가져옵니다. 투자자들 사이에서 펀드의 인기도를 반영합니다.

4. 탈상관 모드(decorrelation)

가장 흥미로운 모드입니다. 공식:

decorrelationPct = (marketCap - AUM) / AUM * 100
metric = max_decorrelationPct - individual_decorrelationPct
weight = metric / sum(metrics) * 100

아이디어: 시가총액과 AUM 사이에 차이가 있는 종목을 찾아 이 지표들 간에 밸런싱합니다. 시장이 펀드를 운용자산보다 높게 평가한다면 — 그것이 시그널입니다.

주문 생성

봇은 똑똑하게 설계되어 있습니다: 먼저 매도하고 그 다음 매수합니다. 이것이 중요한 이유:

  1. 매도로 매수에 필요한 자금이 확보됩니다
  2. 계좌에 여유 현금을 미리 준비할 필요가 없습니다
  3. 가용 잔액이 0이어도 동작합니다

모든 종목은 로트 단위로 거래됩니다. 봇은 목표 금액을 루블로 변환 → 로트 수로 변환 → 반올림 → 주문을 생성합니다.


고급 기능

마진 거래

마진 거래

{
  "margin_trading": {
    "enabled": true,
    "multiplier": 2,
    "free_threshold": 5000,
    "max_margin_size": 50000,
    "balancing_strategy": "keep_if_small"
  }
}

봇은 최대 4배 레버리지를 지원합니다. 3가지 마진 관리 전략:

  • keep — 마진 포지션을 항상 유지
  • remove — 거래일 종료 전 마진 청산
  • keep_if_small — 마진 규모가 임계값 이하이면 유지

봇은 거래소 마감 시간(모스크바 시간 18:45)이 가까워지면 자동으로 감지하고 전략을 자동 적용합니다. 익일 이월 수수료(5,000루블 초과 포지션의 1%)도 고려합니다.

멀티 계좌

하나의 CONFIG.json으로 무제한 계좌를 관리합니다. 각 계좌별 독립 설정:

  • API 토큰
  • 목표 배분
  • 밸런싱 모드
  • 리밸런싱 인터벌
  • 마진 설정
{
  "accounts": [
    {
      "id": "main_broker",
      "name": "주 증권 계좌",
      "desired_wallet": { "TMOS": 50, "TBRU": 50 },
      "balance_interval": 3600000
    },
    {
      "id": "iis_account",
      "name": "개인투자계좌",
      "desired_wallet": { "TRUR": 100 },
      "balance_interval": 86400000
    }
  ]
}

최소 수익률 기준

{
  "min_profit_percent_for_close_position": 5
}

수익률이 5% 미만이면 포지션을 매도하지 않습니다. 반대로 -2로 설정하면 손절매(최대 손실 2%)로 사용할 수 있습니다.

Dry-run 모드

{
  "exchange_closure_behavior": {
    "mode": "dry_run",
    "update_iteration_result": true
  }
}

봇이 모든 주문을 계산하고 로그에 기록하지만, 거래소로 전송하지는 않습니다. 전략 테스트에 이상적입니다.

차분 기반 조정

{
  "diff": "iteration",
  "diff_multiplier": 50
}

마지막 리밸런싱 이후(또는 당일 시작 이후)의 변화를 기반으로 비중을 조정합니다. 승수는 0에서 100까지이며, 영향력의 강도를 결정합니다.


기술 스택과 아키텍처

구성 요소 기술
런타임 Bun 1.0+(또는 Node.js 18+)
언어 TypeScript
API Tinkoff Invest gRPC(tinkoff-sdk-grpc-js)
설정 CONFIG.json + .env
메트릭 Puppeteer(시가총액, AUM 스크래핑)

왜 Bun인가? Node.js 대비 시작 속도가 20~30배 빠르고, TypeScript 네이티브 지원, 내장 테스트 러너를 제공합니다. 시작 후 루프로 동작하는 봇에게는 크게 중요하지 않지만, 개발 시에는 Bun이 더 편리합니다.

모듈식 아키텍처:

  • Provider — API 통신, 포트폴리오 관리
  • Balancer — 리밸런싱 알고리즘(4가지 모드)
  • OrderManager — 주문 생성 및 체결
  • MarginCalculator — 마진 및 리스크 계산
  • Tools — 메트릭 스크래핑, 데이터 수집

빠른 시작

curl -fsSL https://bun.sh/install | bash

git clone https://github.com/suenot/tinkoff-invest-etf-balancer-bot.git
cd tinkoff-invest-etf-balancer-bot
bun install

cp .env-example .env
cp CONFIG.example.json CONFIG.json


bun run start          # 일반 모드
bun run dev            # 디버그 모드
bun run dev -- --once  # 1회 실행

관리 유틸리티:

bun run accounts         # 사용 가능한 계좌 목록
bun run config list      # 설정 내 모든 계좌
bun run config validate  # 설정 검증

제한 사항 및 면책 조항

  • 루블 표시 주식과 펀드만 지원합니다. 계좌 내 다른 종목은 건드리지 않습니다.
  • 이것은 베타 버전입니다. 모델이 수익을 보장하지 않습니다.
  • 거래 결과에 대한 모든 책임은 사용자에게 있습니다.
  • dry-run 모드부터 시작할 것을 권장합니다.

사용해 보기


링크:


인용

@software{soloviov2026etfbalancer,
  author = {Soloviov, Eugen},
  title = {ETF 포트폴리오 자동 리밸런싱: Tinkoff 투자용 봇},
  year = {2026},
  url = {https://marketmaker.cc/ru/blog/post/etf-balancer-bot-tinkoff},
  description = {Tinkoff 투자에서 ETF 포트폴리오를 자동으로 리밸런싱하는 TypeScript 기반 오픈소스 봇.}
}
blog.disclaimer

MarketMaker.cc Team

퀀트 리서치 및 전략

Telegram에서 토론하기
Newsletter

시장에서 앞서 나가세요

뉴스레터를 구독하여 독점적인 AI 트레이딩 통찰력, 시장 분석 및 플랫폼 업데이트를 받아보세요.

귀하의 개인정보를 존중합니다. 언제든지 구독을 취소할 수 있습니다.