Perpetual Engine Series 파트 3: 펀딩 비율

발행: (2026년 5월 2일 PM 10:19 GMT+9)
11 분 소요
원문: Dev.to

Source: Dev.to


영구 엔진 시리즈 – 파트 3: 펀딩 레이트 (Funding Rates)

영구 스와프(Perpetual Swaps)는 전통적인 선물 계약과 달리 만료일이 없습니다. 대신, 포지션을 유지하기 위해 펀딩 레이트라는 메커니즘을 사용합니다. 이 글에서는 펀딩 레이트가 무엇인지, 어떻게 계산되는지, 그리고 실제 거래에 어떤 영향을 미치는지 살펴보겠습니다.


1️⃣ 펀딩 레이트란?

  • 정의: 펀딩 레이트는 롱 포지션 보유자와 숏 포지션 보유자 사이에 일정 주기(보통 8시간)마다 교환되는 금액입니다.
  • 목적: 현물 가격과 영구 계약 가격을 일치시키는 역할을 합니다. 가격이 현물보다 높으면 롱이 숏에게 비용을 지불하고, 반대의 경우 숏이 롱에게 비용을 지불합니다.

2️⃣ 펀딩 레이트 계산 방식

펀딩 레이트는 두 가지 주요 요소로 구성됩니다.

  1. 이자 비용 (Interest Component)

    • 기본 통화(예: USDT)와 마진 통화(예: BTC) 사이의 금리 차이를 반영합니다.
    • 일반적으로 interestRate = (borrowRate - lendRate) * (timePeriod / 365) 로 계산됩니다.
  2. 프리미엄/디스카운트 (Premium/Discount Component)

    • 영구 계약 가격과 현물 가격 사이의 차이를 나타냅니다.
    • premium = (markPrice - indexPrice) / indexPrice

전체 펀딩 레이트는 다음과 같이 구합니다.

fundingRate = (interestComponent + premiumComponent) * clamp(1, maxFundingRate, minFundingRate)

주의: 대부분의 거래소는 펀딩 레이트에 상한선과 하한선을 두어 급격한 변동을 방지합니다.


3️⃣ 실제 예시

항목
Mark Price (영구 계약 가격)20,500 USDT
Index Price (현물 가격)20,000 USDT
시간 간격8시간
Borrow Rate (BTC)5% 연간
Lend Rate (USDT)2% 연간
최대 펀딩 레이트0.03 (3%)
최소 펀딩 레이트-0.03 (-3%)
  1. 프리미엄 계산
    [ \text{premium} = \frac{20{,}500 - 20{,}000}{20{,}000} = 0.025 ;(2.5%) ]

  2. 이자 비용 계산
    [ \text{interest} = (0.05 - 0.02) \times \frac{8}{24 \times 365} \approx 0.00000274 ;(0.000274%) ]

  3. 전체 펀딩 레이트
    [ \text{fundingRate} = (0.025 + 0.00000274) \approx 0.02500274 ;(2.500274%) ]

  4. 적용

    • 롱 포지션 보유자는 8시간마다 2.500274% 를 숏 포지션에게 지급합니다.
    • 예를 들어, 1 BTC (10,000 USDT) 포지션을 보유하고 있다면, 8시간마다 약 0.2500 USDT 를 지불하게 됩니다.

4️⃣ 펀딩 레이트가 거래 전략에 미치는 영향

상황전략적 의미
펀딩 레이트가 양수 (롱이 비용 지불)롱 포지션을 장기간 유지하기 어려움 → 숏 포지션을 이용한 캐리 트레이드가 유리
펀딩 레이트가 음수 (숏이 비용 지불)숏 포지션을 장기간 유지하기 어려움 → 롱 포지션을 이용한 캐리 트레이드가 유리
극단적인 펀딩 레이트급격한 가격 변동 가능성 → 포지션 청산 위험이 증가하므로 리스크 관리가 필수

5️⃣ 실전 팁

  1. 펀딩 레이트 알림 설정

    • 대부분의 거래소는 펀딩 레이트 변동 알림을 제공합니다. 이를 활용해 급격한 레이트 변동에 대비하세요.
  2. 레버리지 조절

    • 높은 레버리지는 펀딩 비용을 크게 확대시킵니다. 레버리지를 낮게 유지하거나, 펀딩 레이트가 유리한 시점에만 레버리지를 높이는 것이 좋습니다.
  3. 다중 거래소 활용

    • 같은 자산에 대해 서로 다른 거래소에서 펀딩 레이트가 다를 수 있습니다. 차익 거래(Arbitrage)를 통해 펀딩 레이트 차익을 노릴 수 있습니다.

6️⃣ 결론

펀딩 레이트는 영구 스와프 시장에서 가격을 현물과 일치시키는 핵심 메커니즘이며, 트레이더에게는 비용 혹은 수익으로 작용합니다.

  • 양수 펀딩 → 롱이 비용을 부담 → 숏 포지션이 유리
  • 음수 펀딩 → 숏이 비용을 부담 → 롱 포지션이 유리

펀딩 레이트를 정확히 이해하고, 이를 기반으로 포지션 크기, 레버리지, 청산 시점 등을 전략적으로 조정한다면, 영구 계약 거래에서 리스크를 최소화하고 수익을 극대화할 수 있습니다.


다음 파트에서는 영구 계약의 청산 메커니즘마진 콜에 대해 다룰 예정입니다. 기대해 주세요!

소개

Cover image for Perpetual Engine Series Part 3: Funding Rates

Part 2에서 우리는 엔진의 “심장박동”인 PnL Calculation을 구축했습니다. 모든 가격 틱이 소수점 정밀도로 트레이더의 자산을 정확히 업데이트하도록 보장했습니다. 하지만 시장은 가격 움직임만으로는 살아남을 수 없습니다. 기준점이 없으면 영구 계약의 가격은 기초 자산의 실제 가치와 무관하게 떠돌게 됩니다.

그 기준점이 바로 Funding Rates입니다. 이는 영구 시장이 공정하고 균형 잡히며 현실에 맞춰지도록 보장하는 규제 메커니즘입니다. 아래는 제가 Rust로 구현한 이 “인센티브 엔진”의 구현 방식입니다.

1. 펀딩 비율이란? (시장의 앵커)

무기한 선물은 만료일이 없습니다. 계약 가격이 현물 가격에서 너무 크게 벗어나지 않도록 시스템은 피어‑투‑피어 결제 교환을 사용합니다.

  • 롱 포지션이 우세할 때 (강세): 무기한 가격 > 현물 가격 → 롱이 숏에게 지급합니다.
  • 숏 포지션이 우세할 때 (약세): 무기한 가격 < 현물 가격 → 숏이 롱에게 지급합니다.

Rust 구현

Result {
    let rate = self.funding_rate; // e.g., 0.0001 for 0.01%
    let mut total_applied = Decimal::ZERO;

    for position in self.positions.values_mut() {
        let notional_value = position.quantity * self.mark_price;
        let funding_amount = notional_value * rate;

        // Longs pay when rate is positive, Shorts receive
        if position.position_type == PositionType::Long {
            position.pnl -= funding_amount;
            total_applied += funding_amount;
        } else {
            position.pnl += funding_amount;
            total_applied -= funding_amount;
        }
    }

    self.last_funding_time = std::time::Instant::now();
    Ok(FundingResult { total_applied, rate })
}

4. “조용한 살인자”: 펀딩‑트리거 청산

이는 파트 1 (Liquidations)과 파트 3 사이의 가장 중요한 통합 지점입니다. 가격이 움직이지 않더라도 포지션은 청산될 수 있습니다.

트레이더가 최대 레버리지를 사용하고 유지증거금이 거의 남지 않은 경우, 단일 펀딩 지급으로 손익(PnL)이 적자로 전환되어 즉시 청산이 발생할 수 있습니다.

Logic Flow

  1. Trigger: 타이머가 3600 seconds에 도달합니다.
  2. Apply: 모든 열린 포지션의 PnL에 펀딩을 차감/추가합니다.
  3. Audit: 즉시 should_liquidate 검사를 실행합니다.
  4. Execute: 마진 요건을 더 이상 충족하지 못하는 포지션을 종료합니다.

5. Tokio를 이용한 다중 사용자 확장성

프로덕션 수준 엔진에서는 펀딩을 계산하기 위해 주문서를 차단할 수 없습니다. tokio::time::interval을 사용하면 펀딩 로직을 백그라운드 작업으로 실행하여 엔진이 응답성을 유지합니다.

백그라운드 작업

tokio::spawn(async move {
    let mut interval = tokio::time::interval(Duration::from_secs(3600));
    loop {
        interval.tick().await;
        // Acquire write lock and apply funding to all users
        engine.apply_funding().await?;
    }
});

6. 요약 표

ConceptWhatWhy
Funding Rate거래자 간에 지급되는 %영구 선물 가격을 현물 가격에 가깝게 유지한다.
Notional Value수량 × 가격수수료가 전체 시장 노출 규모에 비례하도록 보장한다.
Zero‑Sum롱 포지션이 숏 포지션에 지급(또는 그 반대)거래소는 중립적인 중개자 역할을 유지한다.
Liquidation Risk수수료로 인한 마진 감소높은 레버리지는 펀딩만으로도 사라질 수 있다.

결론

Funding rates는 단순한 “betting” 엔진을 정교한 금융 상품으로 전환합니다. 이를 Rust로 구현함으로써 thread safety를 활용하여 수천 건의 거래가 진행되는 동안에도 “funding heartbeat”가 모든 잔액을 정확히 조정하고 단 한 푼도 사라지지 않도록 보장합니다.

0 조회
Back to Blog

관련 글

더 보기 »