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

مدیریت موجودی در 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 دلار آمریکا به دست آمده است. این دسته خاص از سهام به عنوان یک "لات" شناسایی می‌شود.

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

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

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

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

    در اینجا، ما 50 واحد از STOCK را با هزینه 25.00 دلار آمریکا به ازای هر واحد خریداری می‌کنیم. این کار یک لات در حساب 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 دلار آمریکا به ازای هر واحد خریداری شده بود، می‌فروشیم.

روش‌های ثبت

هنگامی که موجودی را کاهش می‌دهید، 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 دلار آمریکا بوده است، با قیمت فروش 105.00 دلار آمریکا به ازای هر سهم می‌فروشد.

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

  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 را شناسایی می‌کند.