پرش به محتوای اصلی

لات‌ها، بهای تمام‌شده و روش‌های ثبت در Beancount

چگونه Beancount هنگام فروش سهام یا ارزها مبانی بهای تمام‌شده را ثبت می‌کند: هزینهٔ پایه، مشخصات مبنا، روش‌های ثبت STRICT، FIFO، LIFO و HIFO، قیمت در برابر هزینه، و بازنویسی‌های هر حساب.

سیستم موجودی Beancount یک ویژگی قدرتمند برای ردیابی دارایی‌هایی است که در طول زمان خریداری و فروخته می‌شوند، مانند سهام، صندوق‌های سرمایه‌گذاری مشترک یا ارزهای خارجی. این سیستم امکان ردیابی دقیق بهای تمام‌شده را فراهم می‌کند که برای محاسبه سود سرمایه و درک عملکرد پرتفوی ضروری است. این آموزش مکانیک‌های اصلی مدیریت موجودی‌ها در دفتر کل شما را پوشش می‌دهد.

مفاهیم اصلی​

در قلب خود، مدیریت موجودی حول ردیابی موقعیت‌ها می‌چرخد. یک «موقعیت» به سادگی مقداری از یک کالا است که در یک حساب نگهداری می‌شود. Beancount بین دو نوع بنیادین موقعیت تمایز قائل می‌شود.

انواع موقعیت‌ها​

  1. موقعیت ساده (بدون بهای تمام‌شده): این یک ثبت موجودی استاندارد است. مقداری از یک کالا را بدون هیچ هزینه تحصیل مرتبط نشان می‌دهد. برای وجه نقد یا تأیید موجودی ساده مناسب است.

    Assets:Bank:Checking      100.00 USD
  2. موقعیت با بهای تمام‌شده: این نوع موقعیت نه تنها تعداد واحدها و کالا را شامل می‌شود، بلکه هزینه‌ای که با آن تحصیل شده است را نیز در بر می‌گیرد. این پایه و اساس ردیابی موجودی است. بهای تمام‌شده درون آکولاد {} مشخص می‌شود.

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

    در این مثال، ما ۱۰ واحد از VTSAX را نگهداری می‌کنیم. هر واحد با هزینه ۱۰۰.۰۰ دلار آمریکا تحصیل شده است. این دسته خاص از سهام به عنوان یک «لات» شناسایی می‌شود.

عملیات موجودی​

دو عملیات اصلی وجود دارد که می‌توانید روی یک موجودی انجام دهید:

  1. افزایش‌ها (افزودن به موجودی): وقتی کالایی می‌خرید، موجودی خود را افزایش می‌دهید. لات جدیدی با تعداد مشخصی واحد و بهای تمام‌شده ایجاد می‌کنید.

    2024-01-15 * "خرید سهام"
      Assets:Invest:STOCK     50 STOCK {25.00 USD, "lot-1"}
      Assets:Bank:Checking   -1250.00 USD

    در اینجا، ما ۵۰ واحد از STOCK را با هزینه هر واحد ۲۵.۰۰ دلار آمریکا می‌خریم. این یک لات در حساب Assets:Invest:STOCK ایجاد می‌کند.

  2. کاهش‌ها (حذف از موجودی): وقتی کالایی می‌فروشید، موجودی خود را کاهش می‌دهید. باید مشخص کنید که از کدام لات می‌فروشید. این کار با ارائه اطلاعات منطبق درون آکولاد انجام می‌شود.

    2024-01-20 * "فروش سهام"
      Assets:Invest:STOCK    -25 STOCK {25.00 USD}
      Assets:Bank:Checking    625.00 USD

    در این تراکنش، ما ۲۵ واحد از STOCK را از لاتی که با ۲۵.۰۰ دلار آمریکا به ازای هر واحد خریداری شده بود، می‌فروشیم.

روش‌های ثبت​

وقتی موجودی را کاهش می‌دهید، Beancount به یک قاعده نیاز دارد تا تصمیم بگیرد اگر چندین لات با کاهش مطابقت دارند، از کدام لات خاص برداشت کند. این قاعده «روش تخصیص» نامیده می‌شود. می‌توانید یک پیش‌فرض برای کل فایل با یک گزینه تعیین کنید، یا به یک حساب روش خودش را در دستور open بدهید.

Beancount 3.2.3 هفت نام روش را می‌پذیرد: STRICT (پیش‌فرض)، STRICT_WITH_SIZE، NONE، FIFO، LIFO، HIFO و AVERAGE. شش مورد از آن‌ها پیاده‌سازی شده‌اند؛ AVERAGE تجزیه می‌شود اما در لحظه‌ای که باید یک کاهش را تخصیص دهد، خطا صادر می‌کند، همان‌طور که بخش AVERAGE در زیر نشان می‌دهد.

1. STRICT (پیش‌فرض)​

روش STRICT پیش‌فرض و ایمن‌ترین روش تخصیص است. تطبیق صریح و بدون ابهام را الزامی می‌کند.

2024-01-01 open Assets:Invest:STOCK "STRICT"
  • نیاز به تطبیق دقیق لات: مشخص‌کننده بهای تمام‌شده در ثبت کاهش ({...}) باید یک لات واحد را شناسایی کند — بر اساس بهای تمام‌شده، تاریخ تحصیل، برچسب، یا هر ترکیبی از آن‌ها.
  • خطا در تطبیق‌های مبهم: اگر مشخص‌کننده با بیش از یک لات مطابقت داشته باشد، Beancount به جای حدس زدن، یک AmbiguousMatchError صادر می‌کند.
  • استثنا: اگر یک کاهش دقیقاً کل تعداد واحدی را که مشخص‌کننده با آن مطابقت دارد حذف کند، یک مشخص‌کننده خالی ({}) مجاز است و کاهش بین آن لات‌ها تقسیم می‌شود.

این دفتر کل دو لات نگهداری می‌کند و یکی از آن‌ها را با نام‌بردن بهای تمام‌شده‌اش می‌فروشد، که بدون ابهام است:

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Strict  STK  "STRICT"
1970-01-01 open Assets:Broker:Cash    USD
1970-01-01 open Income:Gains          USD
 
2024-01-10 * "خرید لات اول"
  Assets:Broker:Strict    10 STK {100.00 USD}
  Assets:Broker:Cash   -1000.00 USD
 
2024-02-10 * "خرید لات دوم"
  Assets:Broker:Strict    10 STK {120.00 USD}
  Assets:Broker:Cash   -1200.00 USD
 
; بهای تمام‌شده دقیقاً یک لات را شناسایی می‌کند، پس STRICT برآورده می‌شود.
2024-06-01 * "فروش لات ۱۲۰.۰۰ دلاری"
  Assets:Broker:Strict   -10 STK {120.00 USD} @ 150.00 USD
  Assets:Broker:Cash    1500.00 USD
  Income:Gains

بدون خطا بارگذاری می‌شود، ۳۰۰.۰۰ دلار سود را به Income:Gains تخصیص می‌دهد و 10 STK {100.00 USD} را در حساب باقی می‌گذارد.

ثبت آخر را با یک مشخص‌کننده خالی جایگزین کنید و همان فایل شکست می‌خورد:

; تحت STRICT رد می‌شود: "-10 STK {}" با هر دو لات مطابقت دارد.
2024-06-01 * "فروش ۱۰ سهم"
  Assets:Broker:Strict  -10 STK {} @ 150.00 USD
  Assets:Broker:Cash   1500.00 USD
  Income:Gains

Beancount گزارش می‌دهد Ambiguous matches for "-10 STK {}" و نامزدها را فهرست می‌کند. اما فروش کل موقعیت اشکالی ندارد، چون چیزی برای انتخاب باقی نمی‌ماند:

; تحت STRICT مجاز است: -20 STK کل دارایی است، پس مشخص‌کننده
; خالی بین هر دو لات تقسیم می‌شود.
2024-06-01 * "بستن موقعیت"
  Assets:Broker:Strict  -20 STK {} @ 150.00 USD
  Assets:Broker:Cash   3000.00 USD
  Income:Gains

این ۸۰۰.۰۰ دلار سود را تخصیص می‌دهد — ۳٬۰۰۰.۰۰ دلار عایدی در مقابل ۱٬۰۰۰.۰۰ + ۱٬۲۰۰.۰۰ دلار بهای تمام‌شده — و حساب را خالی می‌گذارد. این ویژگی خودِ STRICT است، نه چیزی که مجبور باشید برای آن به STRICT_WITH_SIZE سوئیچ کنید.

2. FIFO (اولین وارده، اولین صادره)​

روش FIFO به طور خودکار کاهش‌ها را ابتدا در مقابل قدیمی‌ترین لات‌های موجود تخصیص می‌دهد.

2024-01-01 open Assets:Invest:STOCK "FIFO"
  • حل خودکار ابهام: ابهام را با انتخاب قدیمی‌ترین لات‌های منطبق برطرف می‌کند.
  • تطبیق زمانی: فرض می‌کنید دارایی‌هایی را می‌فروشید که طولانی‌ترین مدت نگهداری کرده‌اید. چندین مرجع مالیاتی این را به عنوان پیش‌فرض وقتی لاتی را شناسایی نکرده‌اید، در نظر می‌گیرند.

3. LIFO (آخرین وارده، اولین صادره)​

روش LIFO نقطه مقابل FIFO است. کاهش‌ها را ابتدا در مقابل جدیدترین لات‌های موجود تخصیص می‌دهد.

2024-01-01 open Assets:Invest:STOCK "LIFO"
  • ترتیب زمانی معکوس: جدیدترین لات‌های منطبق تحصیل‌شده را انتخاب می‌کند.
  • جدیدترین، نه گران‌ترین: LIFO تنها بر اساس تاریخ تحصیل انتخاب می‌کند. اتفاقاً وقتی قیمت‌ها در حال افزایش بوده‌اند، سهام گران‌ترین را می‌فروشد، اما اگر جدیدترین لات شما ارزان‌ترین باشد — که مثال زیر دقیقاً برای نشان‌دادن آن ساخته شده — LIFO بزرگ‌ترین سود را محقق می‌کند، نه کوچک‌ترین. روشی که همیشه گران‌ترین سهام را می‌فروشد HIFO است که در ادامه توضیح داده می‌شود.

4. HIFO (بالاترین قیمت هنگام ورود، خروج اول)​

روش HIFO کاهش‌ها را ابتدا در مقابل گران‌ترین لات‌های موجود تخصیص می‌دهد، بدون توجه به تاریخ آن‌ها.

2024-01-01 open Assets:Invest:STOCK "HIFO"
  • تطبیق بر اساس رتبه بهای تمام‌شده: لات‌های منطبق با بالاترین بهای تمام‌شده را انتخاب می‌کند.
  • کوچک‌ترین سود محقق‌شده: برای یک قیمت فروش معین، فروش گران‌ترین سهام کوچک‌ترین سود (یا بزرگ‌ترین زیان) را محقق می‌کند. اینکه آیا مجاز به استفاده از آن هستید یک مسئله قضایی است — برای مثال در ایالات متحده، انتخاب هر لات اصلاً نیازمند شناسایی خاص در زمان فروش است — پس با این روش به عنوان یک مکانیزم دفتری برخورد کنید و انتخاب مالیاتی را جداگانه تأیید کنید.

5. مقایسه FIFO، LIFO و HIFO بر روی همان دسته‌ها​

این سه روش تنها زمانی متفاوت هستند که قدیمی‌ترین، جدیدترین و گران‌ترین لات سه لات متفاوت باشند. این دفتر کل دقیقاً همین را ترتیب می‌دهد — لات A قدیمی‌ترین است، لات C جدیدترین، و لات میانی B گران‌ترین — و سپس ۱۰ سهم را از سه حسابی که فقط در روش تخصیصشان تفاوت دارند، می‌فروشد:

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Fifo  STK  "FIFO"
1970-01-01 open Assets:Broker:Lifo  STK  "LIFO"
1970-01-01 open Assets:Broker:Hifo  STK  "HIFO"
1970-01-01 open Assets:Broker:Cash  USD
1970-01-01 open Income:Gains        USD
 
; لات A - قدیمی‌ترین، با ۱۰۰.۰۰ دلار به ازای هر سهم
2024-01-10 * "خرید لات A"
  Assets:Broker:Fifo     10 STK {100.00 USD}
  Assets:Broker:Lifo     10 STK {100.00 USD}
  Assets:Broker:Hifo     10 STK {100.00 USD}
  Assets:Broker:Cash  -3000.00 USD
 
; لات B - گران‌ترین، با ۱۲۰.۰۰ دلار به ازای هر سهم
2024-02-10 * "خرید لات B"
  Assets:Broker:Fifo     10 STK {120.00 USD}
  Assets:Broker:Lifo     10 STK {120.00 USD}
  Assets:Broker:Hifo     10 STK {120.00 USD}
  Assets:Broker:Cash  -3600.00 USD
 
; لات C - جدیدترین، با ۹۰.۰۰ دلار به ازای هر سهم
2024-03-10 * "خرید لات C"
  Assets:Broker:Fifo     10 STK {90.00 USD}
  Assets:Broker:Lifo     10 STK {90.00 USD}
  Assets:Broker:Hifo     10 STK {90.00 USD}
  Assets:Broker:Cash  -2700.00 USD
 
; ۱۰ سهم از هر حساب را با ۱۵۰.۰۰ دلار بفروشید و بگذارید
; روش تخصیص هر حساب تعیین کند کدام لات خارج می‌شود.
2024-06-01 * "فروش ۱۰ سهم از هر حساب"
  Assets:Broker:Fifo    -10 STK {} @ 150.00 USD
  Assets:Broker:Lifo    -10 STK {} @ 150.00 USD
  Assets:Broker:Hifo    -10 STK {} @ 150.00 USD
  Assets:Broker:Cash   4500.00 USD
  Income:Gains

با صفر خطا بارگذاری می‌شود و ۱٬۴۰۰.۰۰ دلار سود را به طور کل تخصیص می‌دهد، که این‌گونه تقسیم می‌شود:

حسابروشلات تخصیص‌یافتهبهای تمام‌شدهسود محقق‌شدهلات‌های باقی‌مانده
Assets:Broker:FifoFIFOلات A، ۲۰۲۴-۰۱-۱۰$100.00$500.0010 @ $120.00, 10 @ $90.00
Assets:Broker:LifoLIFOلات C، ۲۰۲۴-۰۳-۱۰$90.00$600.0010 @ $100.00, 10 @ $120.00
Assets:Broker:HifoHIFOلات B، ۲۰۲۴-۰۲-۱۰$120.00$300.0010 @ $100.00, 10 @ $90.00

سطر LIFO همان چیزی است که ارزش خیره‌شدن دارد: بزرگ‌ترین سود را از بین این سه محقق کرد، چون جدیدترین لات هم ارزان‌ترین بود.

6. STRICT_WITH_SIZE​

STRICT_WITH_SIZE همان STRICT است به علاوه یک تساوی‌شکن اضافی: وقتی چندین لات مطابقت دارند اما دقیقاً یکی از آن‌ها دقیقاً همان تعداد واحدی را که حذف می‌کنید نگهداری می‌کند، آن لات انتخاب می‌شود.

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Sized  STK  "STRICT_WITH_SIZE"
1970-01-01 open Assets:Broker:Cash   USD
1970-01-01 open Income:Gains         USD
 
2024-01-10 * "خرید ۱۰ سهم"
  Assets:Broker:Sized    10 STK {100.00 USD}
  Assets:Broker:Cash  -1000.00 USD
 
2024-02-10 * "خرید ۷ سهم"
  Assets:Broker:Sized     7 STK {120.00 USD}
  Assets:Broker:Cash   -840.00 USD
 
; تنها یک لات دقیقاً ۷ واحد نگهداری می‌کند، پس مشخص‌کننده خالی حل می‌شود.
2024-06-01 * "فروش ۷ سهم"
  Assets:Broker:Sized    -7 STK {} @ 150.00 USD
  Assets:Broker:Cash   1050.00 USD
  Income:Gains

این ۲۱۰.۰۰ دلار سود را در مقابل لات ۱۲۰.۰۰ دلاری تخصیص می‌دهد. همان فایل با "STRICT" در خط open با Ambiguous matches for "-7 STK {}" شکست می‌خورد.

7. میانگین (پذیرفته شده، اما پیاده‌سازی نشده)​

AVERAGE یک نام معتبر است — option "booking_method" "AVERAGE" و open … "AVERAGE" هر دو تجزیه می‌شوند — اما Beancount 3.2.3 هیچ پیاده‌سازی پشت آن ندارد. همه چیز در اینجا تا زمان فروش بارگذاری می‌شود:

1970-01-01 commodity STK
1970-01-01 open Assets:Broker:Avg   STK  "AVERAGE"
1970-01-01 open Assets:Broker:Cash  USD
1970-01-01 open Income:Gains        USD
 
2024-01-10 * "خرید ۱۰ سهم با ۱۰.۰۰ دلار"
  Assets:Broker:Avg      10 STK {10.00 USD}
  Assets:Broker:Cash  -100.00 USD
 
2024-02-10 * "خرید ۱۰ سهم دیگر با ۸.۰۰ دلار"
  Assets:Broker:Avg      10 STK {8.00 USD}
  Assets:Broker:Cash   -80.00 USD
 
; یک موتور بهای تمام‌شده میانگین این را با ۹.۰۰ دلار به ازای هر سهم تخصیص می‌داد. این یکی امتناع می‌کند.
2024-06-01 * "فروش ۵ سهم"
  Assets:Broker:Avg      -5 STK {}
  Assets:Broker:Cash    45.00 USD
  Income:Gains

در لحظه‌ای که آن کاهش باید تخصیص یابد، بارگذار متوقف می‌شود با:

AVERAGE method is not supported

برای آن دفتر کل برنامه‌ریزی نکنید. اگر امروز رفتار بهای تمام‌شده میانگین را می‌خواهید، موقعیت را در یک حساب NONE نگه دارید و میانگین را خودتان محاسبه کنید، یا هر لات را ردیابی کنید و سود در سطح لات را بپذیرید.

8. هیچ‌کدام​

روش NONE تطبیق لات را کاملاً غیرفعال می‌کند.

2024-01-01 open Assets:Invest:STOCK "NONE"
  • بدون تطبیق لات: Beancount تلاش نمی‌کند کاهش‌ها را با افزایش‌ها تطبیق دهد.
  • اجازه علائم مختلط: این به یک حساب اجازه می‌دهد همزمان موجودی‌های مثبت و منفی از همان کالا را نگهداری کند. این رفتار مشابه نحوه برخورد ابزار CLI Ledger با کالاها است.

مشخصات دسته​

یک «لات» یک بلوک خاص از یک کالا است که در زمان و قیمت خاصی تحصیل شده است. وقتی موقعیتی را ایجاد یا کاهش می‌دهید، می‌توانید ویژگی‌های لات آن را به تفصیل مشخص کنید.

مشخصات کامل​

وقتی موجودی را افزایش می‌دهید (خرید)، می‌توانید تا سه ویژگی برای لات مشخص کنید، جداشده با کاما درون یک جفت آکولاد:

Assets:Invest:STOCK  10 STOCK {100.00 USD, 2024-01-15, "lot-identifier"}
  • 100.00 USD — بهای تمام‌شده، بیان‌شده به ازای هر واحد.
  • 2024-01-15 — تاریخ تحصیل. Beancount این را از تاریخ تراکنش پر می‌کند وقتی آن را حذف کنید، به همین دلیل پیام‌های خطای بالا یک تاریخ روی هر لات نشان می‌دهند.
  • "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 یا HIFO این قدیمی‌ترین، جدیدترین یا گران‌ترین لات منطبق است؛ تحت STRICT پیش‌فرض یک AmbiguousMatchError است مگر اینکه کاهش لات‌های منطبق را دقیقاً خالی کند.

    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

    این ثبت ۱۰ STOCK را از لاتی که هر کدام ۱۰۰.۰۰ دلار هزینه داشته، با قیمت فروش ۱۰۵.۰۰ دلار هر کدام می‌فروشد.

یک دستور price مستقل داده‌های مرجع برای ارزش‌گذاری بازار فراهم می‌کند. قیمت‌های زنده می‌تواند این دستورات را برای دارایی‌های پشتیبانی‌شده در دفترهای کل میزبانی‌شده نگهداری کند. یک تازه‌سازی لات‌ها، روش تخصیص، هزینه‌های تحصیل و عایدی‌های فروش ثبت‌شده شما را بدون تغییر می‌گذارد.

قوانین استفاده از قیمت​

  1. حاشیه‌نویسی‌های قیمت (@) بر اینکه کدام لات تخصیص می‌یابد تأثیری ندارند. تطبیق لات منحصراً توسط بهای تمام‌شده ({}) و روش تخصیص حساب انجام می‌شود.
  2. نماد @ تنها برای موارد زیر استفاده می‌شود:
  • تبدیل ارز.
  • ثبت ارزش بازار یک دارایی در زمان یک تراکنش.
  • ارائه قیمت فروش برای محاسبات سود سرمایه.

پیکربندی​

می‌توانید روش‌های تخصیص را به صورت سراسری یا بر اساس هر حساب پیکربندی کنید.

روش ثبت جهانی​

می‌توانید یک روش تخصیص پیش‌فرض برای کل فایل Beancount خود با استفاده از دستور option تعیین کنید.

option "booking_method" "STRICT"

مقادیر پذیرفته‌شده عبارتند از "STRICT" (پیش‌فرض وقتی چیزی تعیین نمی‌کنید)، "STRICT_WITH_SIZE"، "NONE"، "FIFO"، "LIFO"، "HIFO" و "AVERAGE". هر رشته دیگری در زمان بارگذاری با Error for option 'booking_method' رد می‌شود. "AVERAGE" اینجا و در open پذیرفته می‌شود، اما تخصیص یک کاهش تحت آن شکست می‌خورد، همان‌طور که بخش AVERAGE در بالا نشان می‌دهد.

جایگزینی به ازای هر حساب​

اغلب مفید است که روش‌های متفاوتی برای حساب‌های مختلف داشته باشید. برای مثال، ممکن است FIFO برای یک حساب بازنشستگی اما STRICT برای یک حساب کارگزاری مشمول مالیات بخواهید تا اطمینان حاصل کنید که لات‌های مالیاتی خاصی را می‌فروشید. می‌توانید روش تخصیص را هنگام باز کردن حساب تعیین کنید.

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

بهترین روش‌ها​

  1. سازمان‌دهی موجودی: برای تمیز و ساده نگه‌داشتن دفتر کل، به شدت توصیه می‌شود از حساب‌های جداگانه برای هر کالای منحصربه‌فردی که نگهداری می‌کنید استفاده کنید، و هر کدام را در دستور open خود به آن کالا محدود کنید.

    ; خوب: حساب‌های جداگانه بر اساس کالا، هر کدام محدود به یکی
    2024-01-01 open Assets:Invest:VTSAX  VTSAX
    2024-01-01 open Assets:Invest:VFIAX  VFIAX

    از مخلوط‌کردن سهام یا صندوق‌های مختلف در یک حساب خودداری کنید، چون مدیریت موجودی را پیچیده می‌کند. فهرست کالا در open باعث می‌شود Beancount یک ثبت سرگردان را رد کند به جای اینکه بی‌صدا دو موجودی را مخلوط کند.

  2. مدیریت لات:

  • از برچسب‌های معنادار برای لات‌ها استفاده کنید، خصوصاً برای تراکنش‌های خاص مانند برداشت زیان مالیاتی یا اعطای سهام کارمندان.

    Assets:Invest:STOCK  10 STOCK {100.00 USD, "tax-loss-harvest-2024"}
  • معاملات خود را با نظرات مستند کنید. این کار خواندن و درک دفتر کل شما را بعداً آسان‌تر می‌کند.

    Assets:Invest:STOCK  -10 STOCK {100.00 USD} @ 110.00 USD ; سود: ۱۰٪
  1. اشکال‌زدایی: اگر با خطاها یا رفتار غیرمنتظره مواجه شدید، Beancount ابزارهایی برای بررسی وضعیت موجودی شما فراهم می‌کند.
  • بررسی وضعیت موجودی: از bea doctor context main.beancount 42 برای بررسی تراکنش در خط ۴۲، شامل ثبت‌ها و موجودی حساب‌های متأثر استفاده کنید. نام فایل و شماره خط را با تراکنشی که می‌خواهید بررسی کنید جایگزین کنید.

    <LINENO> را با شماره خط بلافاصله بعد از یک تراکنش جایگزین کنید تا اثر آن را ببینید.

  • تأیید تطبیق لات: ابزار bea check کل فایل شما را اعتبارسنجی می‌کند. هر خطای تخصیص، مانند تطبیق‌های مبهم لات در حالت STRICT را می‌گیرد.

منبع: https://beancount.io/fa/docs/Basics/inventories