Управление запасами в Beancount
Система управления запасами Beancount — это мощная функция для отслеживания активов, которые покупаются и продаются с течением времени, таких как акции, взаимные фонды или иностранные валюты. Она позволяет точно отслеживать себестоимость, что необходимо для расчета прироста капитала и понимания эффективности портфеля. В этом руководстве рассматриваются основные механики управления запасами в вашей книге учета.
Основные концепции
В своей основе упра вление запасами вращается вокруг отслеживания позиций. «Позиция» — это просто количество товара, хранящегося на счете. Beancount различает два основных типа позиций.
Типы позиций
-
Простая позиция (без себестоимости): Это стандартная запись баланса. Она представляет собой количество товара без какой-либо связанной стоимости приобретения. Подходит для наличных денег или простых подтверждений баланса.
Assets:Bank:Checking 100.00 USD -
Позиция с себестоимостью: Этот тип позиции включает в себя не только количество единиц и товар, но и стоимость, по которой он был приобретен. Это основа отслеживания запасов. Стоимость указывается в фигурных скобках
{}.Assets:Invest:VTSAX 10 VTSAX {100.00 USD, "lot-1"}В этом примере у нас есть 10 единиц
VTSAX. Каждая единица была приобретена по цене 100.00 USD. Эта конкретная партия акций идентифицируется как «лот».
Операции с запасами
Существует две основные операции, которые вы можете выполнять с запасами:
-
Увеличение (добавление в запасы): Когда вы покупаете товар, вы увеличиваете свои запасы. Вы создаете новый лот с определенным количеством единиц и себестоимостью.
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. -
Уменьшение (удаление из запасов): Когда вы продаете товар, вы уменьшаете свои запасы. Вы должны указать, из какого лота вы продаете. Это делается путем предоставления совпадающей информации в фигурных скобках.
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: Аннотация, которая записывает рыночную цену во время транзакции. Она используется для конвертации валюты или для указания рыночной стоимости на определенную дату.
Вот три сценария:
-
Ценовая аннотация (конвертация): Используйте
@, чтобы конвертировать одну валюту в другую.Assets:Forex 1000 USD @ 0.85 EUR -
Себестоимость (приобретение): Используйте
{}, когда покупаете актив, чтобы установить его себестоимость.Assets:Invest 10 STOCK {100.00 USD} -
Оба (продажа с записью цены): При продаже актива используйте
{}, чтобы идентифицировать продаваемый лот, и@, чтобы записать цену продажи. Это позволяет автоматизировать расчет прироста капитала.Assets:Invest -10 STOCK {100.00 USD} @ 105.00 USDЭта запись продает 10
STOCKиз лота, который стоил 100.00 USD за штуку, по цене продажи 105.00 USD за штуку.
Правила использования цен
- Ценовые аннотации (
@) не влияют на то, какой лот бронируется. Сопоставление лотов обрабатывается исключительно себестоимостью ({}) и методом бронирования счета. - Символ
@используется только для:
- Конвертации валюты.
- Записи рыночной стоимости актива во время транзакции.
- Предоставления цены продажи для расчета прироста капитала.
Конфигурация
Вы можете настроить методы бронирования глобально или для каждого счета.
Глобальный метод бронирования
Вы можете установить метод бронирования по умолчанию для всего файла 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"
Рекомендации
-
Организация запасов: Чтобы ваша книга учета была чистой и простой, настоятельно рекомендуется использовать отдельные счета для каждого уникального товара, которым вы владеете.
# ХОРОШО: Раздельные счета по товарам
Assets:Invest:VTSAX ; Только позиции VTSAX здесь
Assets:Invest:VFIAX ; Только позиции VFIAX здесьИзбегайте смешивания разных акций или фондов на одном и том же счете, так как это усложняет управление запасами.
-
Управление лотами:
-
Используйте понятные метки для лотов, особенно для конкретных транзакций, таких как сбор налоговых убытков или предоставление акций сотрудникам.
Assets:Invest:STOCK 10 STOCK {100.00 USD, "tax-loss-harvest-2024"} -
Документируйте свои сделки с помощью комментариев. Это облегчит чтение и понимание вашей книги учета в будущем.
Assets:Invest:STOCK -10 STOCK {100.00 USD} @ 110.00 USD ; Прибыль: 10%
- Отладка: Если вы столкнулись с ошибками или неожиданным поведением, Beancount предоставляет инструменты для проверки состояния ваших запасов.
-
Изучите состояние запасов: Инструмент
bean-doctorможет показать вам точное состояние всех запасов в любой момент вашего файла.Замените
<LINENO>номером строки сразу после транзакции, чтобы увидеть ее эффект. -
Проверьте соответствие лотов: Инструмент
bean-checkпроверяет весь ваш файл. Он обнаружит любые ошибки бронирования, такие как неоднозначные соответствия лотов в режимеSTRICT.