Перейти к основному содержимому

Управление запасами в Beancount

Система управления запасами Beancount — это мощная функция для отслеживания активов, которые покупаются и продаются с течением времени, таких как акции, взаимные фонды или иностранные валюты. Она позволяет точно отслеживать себестоимость, что необходимо для расчета прироста капитала и понимания эффективности портфеля. В этом руководстве рассматриваются основные механики управления запасами в вашей книге учета.

Основные концепции

inventories

В своей основе управление запасами вращается вокруг отслеживания позиций. «Позиция» — это просто количество товара, хранящегося на счете. Beancount различает два основных типа позиций.

Типы позиций

  1. Простая позиция (без себестоимости): Это стандартная запись баланса. Она представляет собой количество товара без какой-либо связанной стоимости приобретения. Подходит для наличных денег или простых подтверждений баланса.

    Assets:Bank:Checking      100.00 USD
  2. Позиция с себестоимостью: Этот тип позиции включает в себя не только количество единиц и товар, но и стоимость, по которой он был приобретен. Это основа отслеживания запасов. Стоимость указывается в фигурных скобках {}.

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

    В этом примере у нас есть 10 единиц VTSAX. Каждая единица была приобретена по цене 100.00 USD. Эта конкретная партия акций идентифицируется как «лот».

Операции с запасами

Существует две основные операции, которые вы можете выполнять с запасами:

  1. Увеличение (добавление в запасы): Когда вы покупаете товар, вы увеличиваете свои запасы. Вы создаете новый лот с определенным количеством единиц и себестоимостью.

    2024-01-15 * "Купить акции"
    Assets:Invest:STOCK 50 STOCK {25.00 USD, "lot-1"}
    Assets:Bank:Checking -1250.00 USD

    Здесь мы покупаем 50 единиц STOCK по цене 25.00 USD за единицу. Это создает лот на счете Assets:Invest:STOCK.

  2. Уменьшение (удаление из запасов): Когда вы продаете товар, вы уменьшаете свои запасы. Вы должны указать, из какого лота вы продаете. Это делается путем предоставления совпадающей информации в фигурных скобках.

    2024-01-20 * "Продать акции"
    Assets:Invest:STOCK -25 STOCK {25.00 USD}
    Assets:Bank:Checking 625.00 USD

    В этой транзакции мы продаем 25 единиц STOCK из лота, который был приобретен по цене 25.00 USD за единицу.

Методы учета

Когда вы уменьшаете запасы, Beancount нужен правило, чтобы решить, из какого конкретного лота брать, если несколько лотов совпадают или если совпадение неоднозначно. Это правило называется «методом учета». Вы можете установить метод по умолчанию для всего файла или указать его для каждого счета.

1. STRICT (по умолчанию)

STRICT — это метод учета по умолчанию и самый безопасный. Он обеспечивает явное и однозначное сопоставление.

2024-01-01 open Assets:Invest:STOCK "STRICT"
  • Требуется точное соответствие лота: Вы должны предоставить достаточно информации в записи уменьшения ({...}), чтобы однозначно идентифицировать продаваемый лот.
  • Ошибка при неоднозначных соответствиях: Если предоставленная информация соответствует нескольким лотам, Beancount выдаст ошибку, заставляя вас быть более конкретным.
  • Исключение: Если запись уменьшения точно удаляет общее количество единиц, хранящихся на счете, допускается пустой спецификатор стоимости ({}).

2. FIFO (первым пришел — первым ушел)

Метод FIFO автоматически учитывает уменьшения по отношению к самым старым доступным лотам.

2024-01-01 open Assets:Invest:STOCK "FIFO"
  • Автоматическое разрешение: Он устраняет неоднозначность, выбирая самые старые совпадающие лоты.
  • Хронологическое соответствие: Это распространенный метод учета, при котором вы предполагаете, что продаете активы, которыми владели дольше всего. Это обязательный метод для целей налогообложения во многих странах.

3. LIFO (последним пришел — первым ушел)

Метод LIFO противоположен FIFO. Он учитывает уменьшения по отношению к самым новым доступным лотам.

2024-01-01 open Assets:Invest:STOCK "LIFO"
  • Обратный хронологический порядок: Он выбирает самые последние приобретенные лоты, которые соответствуют критериям уменьшения.
  • Налоговая оптимизация: В некоторых юрисдикциях этот метод можно использовать для налоговой оптимизации, например, путем продажи акций с самой высокой себестоимостью в первую очередь, чтобы минимизировать прирост капитала.

4. NONE

Метод NONE полностью отключает сопоставление лотов.

2024-01-01 open Assets:Invest:STOCK "NONE"
  • Нет сопоставления лотов: Beancount не пытается сопоставить уменьшения с увеличениями.
  • Разрешены смешанные знаки: Это позволяет счету одновременно содержать как положительные, так и отрицательные остатки одного и того же товара. Это поведение аналогично тому, как инструмент Ledger CLI обрабатывает товары.

Спецификация лота

«Лот» — это конкретный блок товара, приобретенный в определенное время и по определенной цене. Когда вы создаете или уменьшаете позицию, вы можете подробно указать атрибуты ее лота.

Полная спецификация

При увеличении запасов (покупке) вы можете указать до трех атрибутов для лота:

Assets:Invest:STOCK  10 STOCK {
100.00 USD, # Себестоимость (стоимость за единицу)
2024-01-15, # Дата приобретения
"lot-identifier" # Уникальная строковая метка
}

Хотя все три являются необязательными, указание, по крайней мере, себестоимости является стандартной практикой.

Методы сопоставления

При уменьшении запасов (продаже) вы используете тот же синтаксис, чтобы указать, из каких лотов продавать.

  • Сопоставление по стоимости: Это наиболее распространенный метод.

    Assets:Invest:STOCK  -5 STOCK {100.00 USD}
  • Сопоставление по дате: Если затраты идентичны, вы можете устранить неоднозначность, используя дату приобретения.

    Assets:Invest:STOCK  -5 STOCK {2024-01-15}
  • Сопоставление по метке: Метки обеспечивают надежный способ идентификации лота.

    Assets:Invest:STOCK  -5 STOCK {"lot-identifier"}
  • Сопоставить любой лот: Пустой набор скобок {} будет соответствовать любому доступному лоту. Это часто используется с учетом FIFO или LIFO, где конкретный лот выбирается автоматически.

    Assets:Invest:STOCK  -5 STOCK {}

Обработка цен

Крайне важно понимать разницу между себестоимостью ({}) и ценой (@). Они служат разным целям и не являются взаимозаменяемыми.

Цена vs Стоимость

  • {cost}: Определяет стоимость приобретения актива. Она является частью самого инвентарного лота и используется для бронирования сокращений и расчета прироста капитала.
  • @ price: Аннотация, которая записывает рыночную цену во время транзакции. Она используется для конвертации валюты или для указания рыночной стоимости на определенную дату.

Вот три сценария:

  1. Ценовая аннотация (конвертация): Используйте @, чтобы конвертировать одну валюту в другую.

    Assets:Forex     1000 USD @ 0.85 EUR
  2. Себестоимость (приобретение): Используйте {}, когда покупаете актив, чтобы установить его себестоимость.

    Assets:Invest    10 STOCK {100.00 USD}
  3. Оба (продажа с записью цены): При продаже актива используйте {}, чтобы идентифицировать продаваемый лот, и @, чтобы записать цену продажи. Это позволяет автоматизировать расчет прироста капитала.

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

    Эта запись продает 10 STOCK из лота, который стоил 100.00 USD за штуку, по цене продажи 105.00 USD за штуку.

Правила использования цен

  1. Ценовые аннотации (@) не влияют на то, какой лот бронируется. Сопоставление лотов обрабатывается исключительно себестоимостью ({}) и методом бронирования счета.
  2. Символ @ используется только для:
  • Конвертации валюты.
  • Записи рыночной стоимости актива во время транзакции.
  • Предоставления цены продажи для расчета прироста капитала.

Конфигурация

Вы можете настроить методы бронирования глобально или для каждого счета.

Глобальный метод бронирования

Вы можете установить метод бронирования по умолчанию для всего файла Beancount, используя директиву option.

option "booking_method" "STRICT"

Доступны следующие параметры: "STRICT", "FIFO", "LIFO" и "NONE".

Переопределение для каждого счета

Часто полезно иметь разные методы для разных счетов. Например, вы можете захотеть использовать FIFO для пенсионного счета, но STRICT для налогооблагаемого брокерского счета, чтобы убедиться, что вы продаете определенные налоговые лоты. Вы можете установить метод бронирования при открытии счета.

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

Рекомендации

  1. Организация запасов: Чтобы ваша книга учета была чистой и простой, настоятельно рекомендуется использовать отдельные счета для каждого уникального товара, которым вы владеете.

    # ХОРОШО: Раздельные счета по товарам
    Assets:Invest:VTSAX ; Только позиции VTSAX здесь
    Assets:Invest:VFIAX ; Только позиции VFIAX здесь

    Избегайте смешивания разных акций или фондов на одном и том же счете, так как это усложняет управление запасами.

  2. Управление лотами:

  • Используйте понятные метки для лотов, особенно для конкретных транзакций, таких как сбор налоговых убытков или предоставление акций сотрудникам.

    Assets:Invest:STOCK  10 STOCK {100.00 USD, "tax-loss-harvest-2024"}
  • Документируйте свои сделки с помощью комментариев. Это облегчит чтение и понимание вашей книги учета в будущем.

    Assets:Invest:STOCK  -10 STOCK {100.00 USD} @ 110.00 USD ; Прибыль: 10%
  1. Отладка: Если вы столкнулись с ошибками или неожиданным поведением, Beancount предоставляет инструменты для проверки состояния ваших запасов.
  • Изучите состояние запасов: Инструмент bean-doctor может показать вам точное состояние всех запасов в любой момент вашего файла.

    Замените <LINENO> номером строки сразу после транзакции, чтобы увидеть ее эффект.

  • Проверьте соответствие лотов: Инструмент bean-check проверяет весь ваш файл. Он обнаружит любые ошибки бронирования, такие как неоднозначные соответствия лотов в режиме STRICT.