본문으로 건너뛰기

Beancount의 재고 관리

Beancount의 재고 시스템은 주식, 뮤추얼 펀드 또는 외화와 같이 시간이 지남에 따라 사고 팔리는 자산을 추적하는 강력한 기능입니다. 자본 이득을 계산하고 포트폴리오 성과를 이해하는 데 필수적인 취득 원가를 정확하게 추적할 수 있습니다. 이 튜토리얼에서는 원장 내에서 재고를 관리하는 핵심 메커니즘을 다룹니다.

핵심 개념

inventories

핵심적으로 재고 관리는 포지션 추적을 중심으로 이루어집니다. "포지션"은 단순히 계정에 보유된 상품의 양입니다. Beancount는 두 가지 기본적인 포지션 유형을 구별합니다.

포지션 유형

  1. 단순 포지션 (원가 없음): 이것은 표준 잔액 게시입니다. 이는 관련 취득 원가 없이 상품의 양을 나타냅니다. 현금 또는 단순 잔액 어설션에 적합합니다.

    Assets:Bank:Checking      100.00 USD
  2. 취득 원가가 있는 포지션: 이 유형의 포지션에는 단위 수와 상품뿐만 아니라 취득한 원가도 포함됩니다. 이것은 재고 추적의 기초입니다. 원가는 중괄호 {} 안에 지정됩니다.

    Assets:Invest:VTSAX      10 VTSAX {100.00 USD, "lot-1"}

    이 예제에서는 VTSAX 10단위를 보유하고 있습니다. 각 단위는 100.00 USD의 비용으로 취득했습니다. 이 특정 주식 배치는 "lot"으로 식별됩니다.

재고 작업

재고에 대해 수행할 수 있는 두 가지 주요 작업이 있습니다.

  1. 증가 (재고에 추가): 상품을 구매하면 재고가 증가합니다. 특정 단위 수와 취득 원가로 새 lot을 만듭니다.

    2024-01-15 * "주식 구매"
    Assets:Invest:STOCK 50 STOCK {25.00 USD, "lot-1"}
    Assets:Bank:Checking -1250.00 USD

    여기서는 단위당 25.00 USD의 비용으로 STOCK 50단위를 구매합니다. 그러면 Assets:Invest:STOCK 계정에 lot이 생성됩니다.

  2. 감소 (재고에서 제거): 상품을 판매하면 재고가 감소합니다. 판매하는 lot을 지정해야 합니다. 이는 중괄호 안에 일치하는 정보를 제공하여 수행됩니다.

    2024-01-20 * "주식 판매"
    Assets:Invest:STOCK -25 STOCK {25.00 USD}
    Assets:Bank:Checking 625.00 USD

    이 거래에서는 단위당 25.00 USD로 구매한 lot에서 STOCK 25단위를 판매합니다.

부킹 방법

재고를 줄일 때 Beancount는 여러 lot이 일치하거나 일치가 모호한 경우 풀할 특정 lot을 결정하는 규칙이 필요합니다. 이 규칙을 "부킹 방법"이라고 합니다. 전체 파일에 대한 기본 방법을 설정하거나 각 계정에 대해 하나를 지정할 수 있습니다.

1. STRICT (기본값)

STRICT 방법은 기본값이자 가장 안전한 부킹 방법입니다. 명시적이고 명확한 일치를 적용합니다.

2024-01-01 open Assets:Invest:STOCK "STRICT"
  • 정확한 lot 일치 필요: 판매되는 lot을 고유하게 식별하기 위해 감소 게시 ({...})에 충분한 정보를 제공해야 합니다.
  • 모호한 일치 시 오류 발생: 제공된 정보가 여러 lot과 일치하면 Beancount는 오류를 발생시켜 더 구체적으로 지정해야 합니다.
  • 예외: 감소 게시가 계정에 보유된 총 단위 수를 정확히 제거하는 경우 빈 원가 지정자 ({})가 허용됩니다.

2. FIFO (선입선출)

FIFO 방법은 사용 가능한 가장 오래된 lot에 대해 자동으로 감소를 부킹합니다.

2024-01-01 open Assets:Invest:STOCK "FIFO"
  • 자동 해결: 가장 오래된 일치하는 lot을 선택하여 모호성을 해결합니다.
  • 시간순 일치: 이것은 가장 오랫동안 보유한 자산을 판매한다고 가정하는 일반적인 회계 방법입니다. 이것은 많은 국가에서 세금 목적으로 필요한 방법입니다.

3. LIFO (후입선출)

LIFO 방법은 FIFO의 반대입니다. 사용 가능한 최신 lot에 대해 감소를 부킹합니다.

2024-01-01 open Assets:Invest:STOCK "LIFO"
  • 역순: 감소 기준과 일치하는 가장 최근에 취득한 lot을 선택합니다.
  • 세금 최적화: 일부 관할 구역에서는 자본 이득을 최소화하기 위해 가장 높은 취득 원가를 가진 주식을 먼저 판매하는 등 이 방법을 사용하여 세금을 최적화할 수 있습니다.

4. NONE

NONE 방법은 lot 일치를 완전히 비활성화합니다.

2024-01-01 open Assets:Invest:STOCK "NONE"
  • lot 일치 없음: Beancount는 감소를 증가에 일치시키려고 시도하지 않습니다.
  • 혼합된 부호 허용: 이렇게 하면 계정이 동일한 상품의 양수 및 음수 잔액을 동시에 보유할 수 있습니다. 이 동작은 Ledger CLI 도구가 상품을 처리하는 방식과 유사합니다.

Lot 사양

"lot"은 특정 시점과 가격에 취득한 특정 상품 블록입니다. 포지션을 생성하거나 줄일 때 lot 속성을 자세히 지정할 수 있습니다.

전체 사양

재고를 늘릴 때 (구매) lot에 대해 최대 세 가지 속성을 지정할 수 있습니다.

Assets:Invest:STOCK  10 STOCK {
100.00 USD, # 취득 원가 (단위당 비용)
2024-01-15, # 취득 날짜
"lot-identifier" # 고유한 문자열 레이블
}

세 가지 모두 선택 사항이지만 최소한 취득 원가를 제공하는 것이 일반적인 관행입니다.

일치 방법

재고를 줄일 때 (판매) 동일한 구문을 사용하여 판매할 lot을 지정합니다.

  • 원가별 일치: 이것이 가장 일반적인 방법입니다.

    Assets:Invest:STOCK  -5 STOCK {100.00 USD}
  • 날짜별 일치: 원가가 동일한 경우 취득 날짜를 사용하여 명확하게 구분할 수 있습니다.

    Assets:Invest:STOCK  -5 STOCK {2024-01-15}
  • 레이블별 일치: 레이블은 lot을 식별하는 확실한 방법을 제공합니다.

    Assets:Invest:STOCK  -5 STOCK {"lot-identifier"}
  • 모든 lot 일치: 빈 중괄호 세트 {}는 사용 가능한 모든 lot과 일치합니다. 이것은 특정 lot이 자동으로 선택되는 FIFO 또는 LIFO 부킹과 함께 자주 사용됩니다.

    Assets:Invest:STOCK  -5 STOCK {}

가격 처리

취득 원가 ({})와 가격 (@)의 차이점을 이해하는 것이 중요합니다. 이들은 서로 다른 목적을 수행하며 상호 교환할 수 없습니다.

가격 대 원가

  • {cost}: 자산의 취득 원가를 정의합니다. 재고 lot 자체의 일부이며 감소를 부킹하고 자본 이득을 계산하는 데 사용됩니다.
  • @ price: 거래 시점의 시장 가격을 기록하는 주석입니다. 통화 변환 또는 특정 날짜의 시장 가치를 기록하는 데 사용됩니다.

다음은 세 가지 시나리오입니다.

  1. 가격 주석 (변환): @를 사용하여 한 통화에서 다른 통화로 변환합니다.

    Assets:Forex     1000 USD @ 0.85 EUR
  2. 취득 원가 (취득): 자산을 구매할 때 {}를 사용하여 원가를 설정합니다.

    Assets:Invest    10 STOCK {100.00 USD}
  3. 둘 다 (가격 기록이 있는 판매): 자산을 판매할 때 {}를 사용하여 판매되는 lot을 식별하고 @를 사용하여 판매 가격을 기록합니다. 이렇게 하면 자동 자본 이득 계산이 가능합니다.

    Assets:Invest    -10 STOCK {100.00 USD} @ 105.00 USD

    이 항목은 각각 100.00 USD의 비용이 드는 lot에서 10개의 STOCK을 각각 105.00 USD의 판매 가격으로 판매합니다.

가격 사용 규칙

  1. 가격 주석 (@)은 부킹되는 lot에 영향을 미치지 않습니다. lot 일치는 취득 원가 ({})와 계정의 부킹 방법에 의해서만 처리됩니다.
  2. @ 기호는 다음에만 사용됩니다.
  • 통화 변환.
  • 거래 시점의 자산 시장 가치 기록.
  • 자본 이득 계산을 위한 판매 가격 제공.

구성

부킹 방법을 전역적으로 또는 계정별로 구성할 수 있습니다.

전역 부킹 방법

option 지시문을 사용하여 전체 Beancount 파일에 대한 기본 부킹 방법을 설정할 수 있습니다.

option "booking_method" "STRICT"

사용 가능한 옵션은 "STRICT", "FIFO", "LIFO", "NONE"입니다.

계정별 재정의

서로 다른 계정에 대해 서로 다른 방법을 사용하는 것이 유용한 경우가 많습니다. 예를 들어 퇴직 계정에는 FIFO를 사용하고 과세 대상 중개 계정에는 특정 세금 lot을 판매하도록 STRICT를 사용할 수 있습니다. 계정을 열 때 부킹 방법을 설정할 수 있습니다.

2024-01-01 open Assets:Retirement:401K "FIFO"
2024-01-01 open Assets:Taxable:Stock "STRICT"

모범 사례

  1. 재고 구성: 원장을 깔끔하고 간단하게 유지하려면 보유한 각 고유 상품에 대해 별도의 계정을 사용하는 것이 좋습니다.

    # GOOD: 상품별로 계정 분리
    Assets:Invest:VTSAX ; 여기에는 VTSAX 포지션만 해당
    Assets:Invest:VFIAX ; 여기에는 VFIAX 포지션만 해당

    재고 관리를 복잡하게 만들므로 동일한 계정에서 다른 주식이나 펀드를 혼합하지 마십시오.

  2. Lot 관리:

  • 특히 세금 손실 수확 또는 직원 주식 부여와 같은 특정 거래의 경우 lot에 의미 있는 레이블을 사용하십시오.

    Assets:Invest:STOCK  10 STOCK {100.00 USD, "tax-loss-harvest-2024"}
  • 의견으로 거래를 문서화하십시오. 이렇게 하면 원장을 읽고 나중에 이해하기 쉬워집니다.

    Assets:Invest:STOCK  -10 STOCK {100.00 USD} @ 110.00 USD ; Gain: 10%
  1. 디버깅: 오류나 예기치 않은 동작이 발생하면 Beancount는 재고 상태를 검사하는 도구를 제공합니다.
  • 재고 상태 검사: bean-doctor 도구는 파일의 어느 시점에서든 모든 재고의 정확한 상태를 보여줄 수 있습니다.

    <LINENO>를 거래 직후의 줄 번호로 바꾸어 효과를 확인하십시오.

  • lot 일치 확인: bean-check 도구는 전체 파일의 유효성을 검사합니다. STRICT 모드에서 모호한 lot 일치와 같은 부킹 오류를 포착합니다.