Система запасів 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-ідентифікатор" # Унікальний рядковий мітка
}Хоча всі три є необов'язковими, надання принаймні собівартості є стандартною практикою.
Методи зіставлення
Під час зменшення запасів (продажу) ви використовуєте той самий синтаксис, щоб вказати, з якого лоту (лотів) продавати.
-
Зіставлення за вартістю: Це найпоширеніший метод.
Assets:Invest:STOCK -5 STOCK {100.00 USD} -
Зіставлення за датою: Якщо вартість однакова, ви можете зняти неоднозначність, використовуючи дату придбання.
Assets:Invest:STOCK -5 STOCK {2024-01-15} -
Зіставлення за міткою: Мітки забезпечують безпомилковий спосіб ідентифікації лоту.
Assets:Invest:STOCK -5 STOCK {"lot-ідентифікатор"} -
Зіставлення з будь-яким лотом: Порожній набір дужок
{}збігатиметься з будь-яким доступним лотом. Це часто використовується з бронюваннямFIFOабоLIFO, де конкретний лот вибирається автоматично.Assets:Invest:STOCK -5 STOCK {}
Обробка ціни
Важливо розуміти різницю між собівартістю ({}) та ціною (@). Вони слугують різним цілям і не є взаємозамінними.
Ціна проти собівартості
{собівартість}: Визначає вартість придбання активу. Вона є частиною самого лоту запасів і використовується для бронювання зменшення та розрахунку приросту капіталу.@ ціна: Анотація, яка записує ринкову ціну на момент транзакції. Вона використовується для конвертації валют або для фіксації ринкової вартості на певну дату.
Ось три сценарії:
-
Анотація ціни (конвертація): Використовуйте
@для конвертації з однієї валюти в іншу.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з лоту, який коштував 105.00 кожен.
Правила використання ціни
- Анотації ціни (
@) не впливають на те, який лот бронюється. Зіставлення лотів обробляється виключно собівартістю ({}) та методом бронювання рахунку. - Символ
@використовується лише для:- Конвертації валют.
- Запису ринкової вартості активу на момент транзакції.
- Надання ціни продажу для розрахунку приросту капіталу.
Налаштування
Ви можете налаштувати методи бронювання глобально або для кожного рахунку окремо.
Глобальний метод бронювання
Ви можете встановити метод бронювання за замовчуванням для всього файлу 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.
- Перевірка стану запасів: Інструмент