Перейти до основного вмісту

Управління запасами в 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 {}

Обробка цін

Важливо розуміти різницю між собівартістю ({}) та ціною (@). Вони служать різним цілям і не є взаємозамінними.

Ціна проти вартості

  • {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.