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

دفترهای میزبانی‌شده اکنون شامل قیمت‌های مدیریت‌شده را حل می‌کنند

منتشر شده آخرین بهروزرسانی زمان مطالعه 11 دقیقهMike ThriftMike Thrift
دفترهای میزبانی‌شده اکنون شامل قیمت‌های مدیریت‌شده را حل می‌کنند
فهرست مطالب این صفحه

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

این عدم تقارن، قدیمی‌ترین و آزاردهنده‌ترین کار طاقت‌فرسا در حسابداری متن‌ساده است. یک خرید را یک‌بار می‌نویسید و برای همیشه مهر و موم می‌شود: 120 NWRB {41.80 USD, 2024-03-12} به‌طور دائمی یک مقدار، یک بهای تمام‌شده و یک تاریخ را قفل می‌کند. هیچ اتفاقی که پس از آن بیفتد این واقعیت‌ها را تغییر نمی‌دهد. اما یک قیمت، دقیقاً نقطه‌ی مقابل این است — فقط برای یک روز درست است و سپس بی‌سروصدا نادرست می‌شود. بدتر اینکه، نادرستی‌اش به شکلی است که هیچ بررسی ترازنامه‌ای هرگز آن را نمی‌گیرد، چون دفتری با قیمت‌های کهنه همچنان کاملاً تراز است.

از نظر تاریخی، روش بی‌کانت برای مدیریت این موضوع، واکشی قیمت‌ها با یک اسکریپت و کامیت کردن خروجی بوده است. کار می‌کند و بسیاری از افراد آن را خودکار کرده‌اند. اما در نهایت، هنوز اسکریپتی است که باید از آن مراقبت کنید، یک cron job که نگه‌داری می‌کنید و فایلی که مدام merge می‌کنید.

دیگر بس است. برای دفترهایی که روی beancount.io میزبانی می‌شوند، موتور ما اکنون این حل‌وفصل را به‌صورت بومی انجام می‌دهد. این مطلب دقیقاً شرح می‌دهد که چه چیزی تازه منتشر شد، چه چیزی را عمداً دست‌نخورده گذاشتیم و — به همان اندازه مهم — چه چیزی را هنوز نساخته‌ایم.


آنچه منتشر شد​

یک دفتر میزبانی‌شده beancount.io اکنون می‌تواند دستور include را حمل کند که به‌جای یک نام فایل محلی، به یک URL اشاره می‌کند:

; main.bean, in a hosted beancount.io ledger.
;
; The catalog quotes no currency for this page's language, so the example uses
; USD. Use a currency from the list under the fence.
 
option "title" "Taxable brokerage"
option "operating_currency" "USD"
 
; Only the hosted engine resolves the URL form, and upstream `include` takes a
; file glob — so the line is shown commented out here and this file still
; loads if you copy it to your own machine. Uncomment it in a hosted ledger.
; include "https://beancount.io/prices/AAPL-USD"

توجه: برای باز کردن آن URL باید ابتدا وارد شوید. درخواست‌های ناشناس به صفحه ورود هدایت می‌شوند. فهرست برای زبان این صفحه هیچ نقل‌قولی ندارد، بنابراین مثال به دلار آمریکا نقل‌قول می‌کند — یکی از ارزهایی که فهرست شده است. پس از احراز هویت، https://beancount.io/prices/AAPL-USD را باز کنید و تأیید کنید که در حال مشاهده دستورهای استاندارد price هستید. سپس آن خط را به دفتر میزبانی‌شده خود اضافه کنید.

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

  • 中文: CNY، https://beancount.io/prices/AAPL-CNY. آن URL یک جفت فهرست‌شده نیست. این قیمت پایانی تعدیل‌نشده AAPL-USD از Databento است که با USD-CNY بانک مرکزی اروپا تلاقی داده شده است.
  • 日本語: JPY، https://beancount.io/prices/AAPL-JPY
  • 한국어: KRW، https://beancount.io/prices/AAPL-KRW
  • Deutsch، Français، Español، Italiano، Nederlands، Català، Português، Slovenčina و Български: EUR، https://beancount.io/prices/AAPL-EUR. دفترهای بلغاری که امسال باز شده‌اند به یورو هستند؛ فهرست همچنین BGN را نقل‌قول می‌کند اگر فایلی قدیمی‌تر هنوز از آن استفاده کند.
  • فارسی، Русский و Українська: فهرست هیچ IRR، RUB یا UAH ندارد، پس جفتی برای باز کردن وجود ندارد. یکی از نقل‌قول‌هایی را که فهرست کرده انتخاب کنید.

فهرست موجود در https://beancount.io/prices/ پشت همان ورود قرار دارد. خود AAPL-USD یک نقل‌قول مستقیم Databento است، نه یک تلاقی. سایر سهام ردیف اول به همین شکل کار می‌کنند — نماد را عوض کنید و ارز نقل‌قول را برای زبان خود نگه دارید. ACME-USD خطای 404 برمی‌گرداند.

دستور include در بی‌کانت بالادستی از نظر فنی انتظار یک نام فایل دارد، بنابراین یک شامل URL رفتاری کاملاً متعلق به موتور میزبانی‌شده است. هرگز ادعا نمی‌کند که بی‌کانت ساده است. در زیر دقیقاً آنچه موتور ما در پشت صحنه انجام می‌دهد آمده است:

  • فید را به‌عنوان یک فایل مجازی فقط‌خواندنی مادی می‌کند. URL از طریق مسیر حل‌وفصل شامل خود موتور حل می‌شود — دقیقاً همان جایی که یک فایل محلی فرود می‌آمد — بنابراین هر دستور یک مکان منبع واقعی را حفظ می‌کند. بایت‌های اصلی شما هرگز بازنویسی نمی‌شوند. فایلی که نوشتید همان فایلی می‌ماند که نوشتید.
  • اعتبارسنجی سخت‌گیرانه محتوا. بدنه واکشی‌شده به‌عنوان فقط قیمت اعتبارسنجی می‌شود. ما به‌طور سخت‌گیرانه دستورهای price، توضیحات و چهار کلید فراداده مشخص (price-source، price-kind، observed-at و provisional) را مجاز می‌دانیم. هر چیز دیگری کل بدنه را رد می‌کند. هیچ درج جزئی وجود ندارد، یعنی یک فید سرکش هرگز نمی‌تواند تراکنشی را به دفتر شما قاچاق کند.
  • کش هوشمند. فیدها به‌عنوان یک بازنگری تغییرناپذیر با یک اشاره‌گر متحرک کش می‌شوند. چرخه‌های تازه‌سازی توسط مُهرهای زمانی هدایت می‌شوند نه انقضای کش، و تضمین می‌کنند که یک قطعی بالادستی آخرین بازنگری سالم شما را از بین نمی‌برد.
  • تازگی قابل حسابرسی. تازگی به‌صورت پویا هنگام خواندن دفتر محاسبه می‌شود (تازه، کهنه یا در دسترس نیست) همراه با زمان مشاهده گزارش‌شده فید. قیمتی که نمی‌توانید تاریخ‌گذاری کنید، قیمتی است که نمی‌توانید حسابرسی کنید.
  • به‌طور اکید فقط‌خواندنی. ورودی‌های مدیریت‌شده قابل ویرایش یا حذف نیستند (تلاش برای این کار خطایی پرتاب می‌کند که منبع را نام می‌برد). علاوه بر این، آن‌ها به سقف دستورهای شما احتساب نمی‌شوند — ما اجازه نمی‌دهیم فیدها بودجه دفتر شما را بخورند.

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


قیمت خودتان همیشه برنده است​

این برای هر کسی که دفترش را جدی می‌گیرد نقطه‌ی تصمیم است، پس بگذارید کاملاً شفاف باشیم:

برای همان تاریخ و همان جفت کالا (شامل معکوسش)، قیمتی که خودتان نوشته‌اید همیشه بر فید مدیریت‌شده برنده است.

نه «معمولاً» و نه «فقط اگر include خود را آخر بگذارید». این تصمیم سایه‌اندازی پیش از ساخت نقشه قیمت رخ می‌دهد، یعنی کاملاً مستقل از آن است که include در کجای فایل شما قرار دارد. آن را در بالا بگذارید، در پایین بگذارید یا در سه فایل تقسیمش کنید — قیمت دست‌نویس شما همیشه برنده است.

قاعده معکوس آسان است که از دست برود اما حیاتی است. فیدی از AAPL-USD قیمتی از AAPL به USD است. اگر شما قیمتی برعکس نوشته باشید — USD به AAPL، همان تاریخ — ورودی شما همچنان فید را شکست می‌دهد. همین برای هر نقل‌قولی که شامل کرده‌اید صادق است، چه CNY چه JPY.

چرا این قاعده؟ چون یک قیمت در فایل خودتان یک تصمیم آگاهانه است. ممکن است دقیقاً همان قیمت پایانی باشد که کارگزارتان روی صورت‌حسابی که در حال تطبیقش هستید چاپ کرده، یا یک نقل‌قول همزمان برای دارایی‌ای با معاملات کم، یا رقم خاصی که حسابدارتان خواسته است. یک فید زمینه شما را نمی‌داند. سیستمی که بی‌سروصدا یک رقم نوشته‌شده به‌دست انسان را بازنویسی می‌کند، دیگر دفتر نیست و به یک عقیده تبدیل می‌شود. فید برای پر کردن شکاف‌هاست؛ شما را اصلاح نمی‌کند.


قیمت‌ها ارزش‌گذاری را جابه‌جا می‌کنند و نه چیز دیگری​

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

بیایید یک ورودی خاص را بیرون بکشیم. یک ایردراپ توکن حاکمیتی می‌رسد و به‌عنوان درآمد به ارزش منصفانه بازار در روزی که می‌رسد ثبت می‌شود:

2024-03-20 * "Uniswap" "Receive UNI governance token airdrop"
  Assets:Crypto:Wallet:MetaMask:UNI       50.00 UNI {12.50 USD, 2024-03-20}
  Income:Crypto:Airdrops                -625.00 USD
 

آن 625.00 دلار درآمد، و بهای 12.50 دلار به ازای هر واحد متصل به لات، اکنون واقعیت‌های تغییرناپذیر 2024-03-20 هستند. هر دستور price در دفتر — چه مدیریت‌شده، چه دست‌نویس یا کاملاً غایب — هر دو را دست‌نخورده می‌گذارد.

قیمت‌ها ارزش بازار را تغییر می‌دهند؛ آن‌ها هرگز مقادیر، بهای تمام‌شده، جریان‌های نقدی، کارمزدها یا سودهای تحقق‌یافته را تغییر نمی‌دهند. دقیقاً به همین دلیل است که فید قیمت ابزاری امن برای تکیه کردن است: بدترین کاری که یک قیمت بد می‌تواند بکند، به‌طور موقت اعلام نادرست ارزش امروز یک موقعیت است. هرگز نمی‌تواند اعداد سخت را که در اظهارنامه مالیاتی خود می‌گذارید خراب کند.


جایی که یک مدل قیمت اشتباه واقعاً شما را گمراه می‌کند​

دفتر نمونه سهام و ETF نسخه تیزتر همین نکته را نشان می‌دهد:

این شامل یک تقسیم سهام 4 به 1 است که به روش صحیح ثبت شده — به‌عنوان یک تغییر مقدار که کل بهای تمام‌شده را حفظ می‌کند بدون لمس هر حساب درآمدی:

2025-07-15 * "Broker" "NWRB 4-for-1 share split — quantity change, not income"
  Assets:Brokerage:NWRB                   -120 NWRB {41.80 USD, 2024-03-12}
  Assets:Brokerage:NWRB                    480 NWRB {10.45 USD, 2024-03-12}
 

هر دو طرف برابر با 5,016.00 دلار است. ارزش بازار در طول تقسیم بدون تغییر می‌ماند (7,440.00 دلار در هر دو حالت)، و تاریخ تحصیل در آکولاد باقی می‌ماند — که همان چیزی است که فروش این سهام در 2026 را به‌عنوان بلندمدت طبقه‌بندی‌شده نگه می‌دارد.

تله رایج این است که تقسیم را به‌جای آن به‌عنوان یک رویداد قیمتی ثبت کنیم و به شدت بر یک سری قیمتِ «تعدیل‌شده برای تقسیم» تکیه کنیم تا ریاضیات درست از آب دربیاید. این تنها تا زمانی کار می‌کند که هر قیمتی که تا به حال نگاه می‌کنید به همان شکل دقیق تعدیل شده باشد. همان لحظه‌ای که یک رقم تعدیل‌نشده به دفترتان برسد — یک رسید تأیید قدیمی، یک اسکرین‌شات یا یک فید شخص ثالث که داده‌های تاریخی را بازنویسی نمی‌کند — موقعیت ناگهان چهار برابر ارزش واقعی‌اش ارزش‌گذاری می‌شود. بدتر اینکه، تعداد سهام در دفتر دیگر با صورت‌حساب کارگزارتان مطابقت ندارد، یعنی ادعاهای تراز پایان سال شما بی‌سروصدا شکست می‌خورند.

این استدلال واقعی برای تکیه بر یک فید قیمت با منبع اعلام‌شده، نوع اعلام‌شده و زمان مشاهده قابل‌مشاهده است. این فقط درباره راحتی نیست؛ درباره این است که بدانید دقیقاً اعداد وارداتی شما از کدام قرارداد ریاضی پیروی می‌کنند.

(یادداشتی سریع درباره جاسازی‌ها: نمایشگر دفتر میزبانی‌شده موجودی حساب‌ها را به بهای تمام‌شده رندر می‌کند و در حال حاضر کنترل‌های ارزش‌گذاری روی صفحه ارائه نمی‌دهد. دفترهای بالا برای نمایش مکانیک‌های زیربنایی در نظر گرفته شده‌اند — لات‌ها، تقسیم، فروش‌ها. هر دو عمومی هستند و می‌توانید آن‌ها را کلون کرده و به‌صورت محلی اجرا کنید.)


آنچه هنوز اینجا نیست​

ما معتقدیم که یک changelog اگر بیش از حد وعده بدهد، بی‌فایده‌تر از نبودنش است. پس اینجا حقیقت بی‌پرده درباره آنچه نساخته‌ایم آمده است، بدون هیچ زمان‌بندی پیوست:

  • احراز هویت اجباری است. درخواست‌های ناشناس به https://beancount.io/prices/<ALIAS> شما را به صفحه ورود هدایت می‌کنند.
  • بدون پشتیبانی CLI محلی. CLI محلی bea فایل‌ها را از دیسک می‌خواند، یعنی یک شامل URL به‌صورت محلی به‌عنوان یک glob فایلی نامطابق شکست می‌خورد. افزودن پشتیبانی بارگذار به CLI در نقشه راه ما است.
  • بدون سطح API. ما در حال حاضر هیچ فیلد REST، GraphQL یا MCP برای قیمت‌های مدیریت‌شده نداریم.
  • بدون داشبورد UI. هنوز هیچ صفحه‌ای برای «اتصال یک فید» و هیچ برچسب تازگی در UI وجود ندارد. (داده‌های تازگی که موتور ما محاسبه می‌کند در حال حاضر جایی برای نمایش ندارد).
  • بدون اسنپ‌شات، خروجی یا نقاط تازه‌سازی دستی.

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


بعد کجا را نگاه کنیم​

هر دو دفتری که در بالا جاسازی شده‌اند بخشی از گالری نمونه‌های ما هستند — شش الگوی کاملاً پیاده‌شده که می‌توانید کلون کرده و به‌صورت محلی اجرا کنید. (هر دو به‌عمد با فایل‌های قیمت ایستا و checked-in عرضه می‌شوند، و تضمین می‌کنند که یک کلون که دو سال بعد ساخته شود دقیقاً همان گزارشی را تولید می‌کند که امروز تولید می‌کند). هر چیز دیگری که منتشر می‌کنیم مستقیماً در changelog ما قرار می‌گیرد.

اگر شما کاملاً راضی هستید که قیمت‌ها را با واکشی‌کننده خودتان به‌روز نگه دارید، همان را ادامه دهید. این همچنان بهترین پاسخ برای یک دفتر کاملاً محلی است. مستندات واکشی قیمت خود بی‌کانت و ابزار نگه‌داری‌شده beanprice بهترین جاها برای شروع هستند.

بخش کسل‌کننده را کسل‌کننده نگه دارید​

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

به‌صورت رایگان شروع کنید و دفترهایتان را در فایل‌هایی نگه دارید که واقعاً می‌توانید بخوانید.

منبع: https://beancount.io/fa/blog/2026/09/17/managed-price-includes-hosted-ledgers

منتشر شده: ۲۶ شهریور ۱۴۰۵

آخرین بهروزرسانی: ۲۸ شهریور ۱۴۰۵