داراییهای شما از قبل در دفتر هستند. قیمتهایشان همان بخشی هستند که مدام دوباره تایپ میکنید.
این عدم تقارن قدیمیترین زحمت در حسابداری متنساده است. یک خرید یکبار نوشته میشود و برای همیشه
درست است: 120 NWRB {41.80 USD, 2024-03-12} یک مقدار، یک بهای تمامشده و یک تاریخ را ثبت میکند و
هیچ اتفاقی که بعد از آن بیفتد هیچکدام از این سه را تغییر نمیدهد. قیمت دقیقاً برعکس است — برای یک روز
درست است، سپس بیصدا غلط میشود، و آنقدر غلط میشود که هیچ بررسی ترازنامهای هرگز آن را نمیگیرد، چون
یک قیمت کهنه همچنان کاملاً تراز میشود. پاسخ خود Beancount همیشه این بوده که آنها را با یک ابزار
واکشی کنید و خروجی را commit کنید، که کار میکند و بسیاری آن را خودکار کردهاند. اما همچنان اسکریپتی
است که خودتان مالکش هستید، یک ورودی cron که نگهداری میکنید، و فایلی که ادغام میکنید.
موتور دفتر beancount.io اکنون خودش این حلوفصل را برای دفترهای میزبانیشده نزد ما انجام میدهد. این پست دربارهی چیزی است که واقعاً عرضه شده، چیزی که بهعمد دست نمیزند، و — به همان اندازه مهم — چیزی که هنوز ساخته نشده است.
آنچه عرضه شد
یک دفتر میزبانیشده beancount.io میتواند شامل یک include باشد که هدفش بهجای نام فایل، یک آدرس است:
; main.bean, in a hosted beancount.io ledger.
;
; The managed line is shown commented out on purpose: upstream `include` takes a
; file glob, so this file still loads if you copy it to your own machine. Only
; the hosted engine resolves the URL form.
option "title" "Taxable brokerage"
option "operating_currency" "USD"
include "accounts.bean"
; include "https://beancount.io/prices/ACME-USD"
include "transactions/purchases.bean"
include "transactions/sales.bean"دستور include در Beancount بالادستی یک نام فایل میگیرد — «مسیر مشخصشده میتواند یک نام فایل
مطلق یا نسبی باشد» تمام مشخصات آن است — پس یک include آدرس، Beancount خالص نیست و هرگز خود را چنین
جا نمیزند. این یک رفتار موتور میزبانیشده است، و اینجا دقیقاً چیزی است که موتور با آن انجام میدهد:
- فید را بهصورت یک فایل مجازی فقطخواندنی مادی میکند. آدرس از مسیر حلوفصل include خود موتور عبور میکند، دقیقاً همان جایی که یک فایل محلی فرود میآمد، پس هر دستور یک مکان منبع واقعی را حفظ میکند. بایتهای شما هرگز بازنویسی نمیشوند. فایلی که نوشتید همان فایلی میماند که نوشتید.
- بدنهی واکشیشده بهعنوان فقط-قیمت اعتبارسنجی میشود. دستورهای
price، توضیحات، و چهار کلید فراداده مجاز —price-source،price-kind،observed-atوprovisional— و هیچ چیز دیگری. هر چیزی فراتر از آن کل بدنه را رد میکند. هیچ درج جزئی وجود ندارد، پس یک فید هرگز نمیتواند یک تراکنش را قاچاقی وارد دفترهای شما کند. - فیدها بهصورت یک نسخهی تغییرناپذیر بهعلاوه یک اشارهگر متحرک ذخیره میشوند. بازآوری توسط یک مُهر زمانی هدایت میشود نه با انقضای کش، که یعنی یک قطعی بالادستی نمیتواند آخرین نسخهی خوب شما را با خود ببرد. یک بازآوری ناموفق هرگز یک نسخهی خوب را با هیچ چیز جایگزین نمیکند.
- تازگی هنگام خواندن دفتر محاسبه میشود، نه ذخیره:
recent،stale، یاunavailable، در کنار زمان مشاهدهای که خود فید گزارش کرده است. قیمتی که نمیتوانید تاریخگذاری کنید، قیمتی است که نمیتوانید حسابرسی کنید. - ورودیهای مدیریتشده فقطخواندنی هستند. ویرایش یا حذف یکی با خطایی که منبع مدیریتشده را نام میبرد رد میشود، و آنها بهحساب محدودیتهای دستور حساب نمیشوند — فید اجازه ندارد بودجهی دفتر شما را مصرف کند.
همهچیز در آن فهرست داخل سرویس دفتر میزبانیشده اجرا میشود. هیچکدام از آنها معنای یک دستور price
را تغییر نمیدهد: همچنان نرخ مبادله بین یک کالای پایه و یک کالای مظنه را برقرار میکند، دقیقاً همانطور
که مرجع زبان تعریف میکند. کار موتور فقط این است که موارد درست، تاریخدار و قابلانتساب را در برابر
بارگذارنده قرار دهد.
قیمت خودتان همیشه برنده است
این همان بخشی است که تعیین میکند آیا یک فید برای کسی که دفترش را جدی میگیرد قابل استفاده است یا نه، پس دقیق بیان میشود.
برای همان تاریخ و همان جفت کالا — و برای جفت متقابل — قیمتی که خودتان نوشتهاید بر فید مدیریتشده برنده است، بدون توجه به ترتیب include.
نه «معمولاً»، و نه «اگر include را آخر بگذارید». تصمیم سایهاندازی پیش از ساختهشدن نقشهی قیمت گرفته میشود، پس به این که include کجای فایل قرار دارد بستگی ندارد. آن را به بالا منتقل کنید، به پایین منتقل کنید، آن را در سه فایل تقسیم کنید: پاسخ یکسان است.
; include "https://beancount.io/prices/ACME-USD" ; hosted-engine form, again shown commented
; A price you wrote yourself, for the same date and pair.
; This one wins — above the include or below it, it makes no difference.
2026-09-16 price ACME 93.40 USD(ACME همان صادرکنندهی خیالی از دفتر نمونهی پایینتر است؛ عدد ساختگی است، نه یک مشاهدهی بازار.)
چرا آن قاعده و نه قاعدهی دیگر: یک قیمت در فایل خودتان یک تصمیم است. ممکن است قیمت بستهای باشد که کارگزارتان روی صورتحسابی که در حال تطبیق آن هستید چاپ کرده، یک مظنهی همزمان برای موقعیتی کممعامله، یا رقمی باشد که حسابدارتان از شما خواسته استفاده کنید. یک فید هیچکدام از اینها را نمیداند، و سیستمی که بیصدا یک رقم نوشتهشدهی انسان را نادیده میگیرد دیگر یک دفتر نیست و به یک عقیده تبدیل شده است. فید شکافها را پر میکند؛ شما را تصحیح نمیکند.
قیمتها ارزشگذاری را جابهجا میکنند، و هیچ چیز دیگری را
اطمینان دوم ساختاری است نه یک انتخاب سیاستی، و ارزش آن است که با اعداد واقعی نشان داده شود نه صرفاً ادعا. اینجا دفتر نمونهی رمزارز است — لاتهای تاریخدار، استیکینگ، ماینینگ، موقعیتهای 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آن ۶۲۵٫۰۰ دلار درآمد، و پایهی ۱۲٫۵۰ دلار بهازای هر واحد متصل به لات، اکنون واقعیتهایی دربارهی ۲۰۲۴-۰۳-۲۰ هستند. هر دستور قیمتی در دفتر — مدیریتشده، دستنویس، یا کاملاً غایب — هر دو را دستنخورده میگذارد. قیمتها ارزش بازار را تغییر میدهند؛ آنها هرگز مقادیر، بهای تمامشده، جریانهای نقدی، کارمزدها یا سودهای تحققیافته را تغییر نمیدهند. به همین دلیل است که یک فید قیمت از ابتدا چیز ایمنی برای پذیرش کمک در موردش است: بدترین کاری که یک قیمت غلط میتواند بکند این است که آنچه یک موقعیت امروز ارزش دارد را اشتباه گزارش کند، و هرگز نمیتواند رقمی که در اظهارنامه مالیاتی میگذارید را خراب کند.
جایی که یک مدل قیمت غلط واقعاً شما را گمراه میکند
دفتر نمونهی سهام و ETF نسخهی تیزتر همان نکته را میسازد:
این دفتر یک تقسیم سهام ۴ به ۱ را نگه میدارد، و تقسیم به روش درست ثبت شده است — بهعنوان یک تغییر مقدار که پایهی کل را حفظ میکند، بدون دستزدن به هیچ حساب درآمدی:
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}هر دو طرف ۵٬۰۱۶٫۰۰ دلار هستند. ارزش بازار در طول تقسیم بدون تغییر است — ۱۲۰ سهم به قیمت ۶۲٫۰۰ دلار روز قبل، ۴۸۰ سهم به قیمت ۱۵٫۵۰ دلار روز بعد، ۷٬۴۴۰٫۰۰ دلار در هر دو حالت — و تاریخ تحصیل در آکولادها باقی میماند، که همان چیزی است که یک فروش ۲۰۲۶ آن سهام را بلندمدت نگه میدارد.
اشتباه رایج این است که تقسیم را بهعنوان یک رویداد قیمت ثبت کنید و به یک سری «تعدیلشده برای تقسیم» تکیه کنید تا ارزشگذاری درست از آب دربیاید. این فقط تا زمانی کار میکند که هر قیمتی که تا به حال میبینید به همان روش تعدیل شده باشد. لحظهای که یک رقم تعدیلنشده میرسد — یک تأییدیهی قدیمی، یک اسکرینشات، یک سری شخص ثالث که هیچ چیزی را بازبیان نمیکند — موقعیت به چهار برابر ارزشش ارزشگذاری میشود، و تعداد سهام در دفتر دیگر با صورتحساب کارگزار مطابقت ندارد، پس ادعای پایان سال که میتوانست آن را بگیرد نمیتواند فعال شود.
این استدلال واقعی برای یک فید قیمت با منبع اعلامشده، نوع اعلامشده و زمان مشاهدهی قابلمشاهده است: نه راحتی، بلکه دانستن این که عددی که همین حالا وارد کردید تحت کدام قرارداد محاسبه شده است. فایل قیمت خود دفتر نمونه بهعمد تعدیلنشده است و همین را میگوید، و دو دستور آن که تقسیم را در بر میگیرند بهصورت یک بررسی نوشته شدهاند که میتوانید با چشم تأیید کنید.
یک نکتهی صادقانه دربارهی کلیک روی هر کدام از این embedها: نمایشگر دفتر میزبانیشده موجودی حسابها را به بهای تمامشده نمایش میدهد، و هیچ کنترل ارزشگذاری در صفحه ارائه نمیدهد. دفترهای بالا آنجا هستند تا دفترها را به شما نشان دهند — لاتها، تقسیم، فروشهای لات خاص — نه یک ارزشگذاری بازار که نمایشگر در حال حاضر رسم نمیکند. هر دو عمومی هستند، و هر دو میتوانند کلون شده و بهصورت محلی اجرا شوند.
آنچه هنوز اینجا نیست
یک ورودی تغییرات کمتر از هیچ ارزش دارد اگر شما را وادار کند چیزی را باور کنید که درست نیست، پس اینجا نیمهی دیگر است، صریح و بدون هیچ تاریخی برای هیچکدام.
- نقطهی پایانی قیمت عمومی نیست. یک درخواست ناشناس به
https://beancount.io/prices/<ALIAS>به صفحهی ورود هدایت میشود. هیچ فهرست مستعاری عمومی وجود ندارد. - پس این چیزی نیست که امروز بتوانید در فایل خودتان بچسبانید. موتور include را حل میکند؛ مسیری که حل میکند هنوز باز نیست. وقتی باز شد، آن خودش یک ورودی تغییرات جداگانه خواهد بود.
- CLI محلی
beaشامل آدرس را حل نمیکند. این ابزار فایلها را از دیسک میخواند، پس یک include آدرس بهصورت محلی بهعنوان یک glob فایل که هیچ فایلی را منطبق نمیکند شکست میخورد. پشتیبانی بارگذارنده در CLI یک پیگیری نامگذاریشده است. - هیچ سطح API وجود ندارد. هیچ فیلد REST، GraphQL یا MCP برای قیمتهای مدیریتشده.
- هیچ سطح داشبورد وجود ندارد. هیچ صفحهی اتصال فید و هیچ برچسب تازگی در رابط کاربری؛ تازگیای که موتور محاسبه میکند هنوز جایی برای نمایش ندارد.
- اسنپشات و خروجی ساخته نشدهاند، و نه یک فهرست ابزار و نه یک نقطهی پایانی بازآوری دستی.
آنچه عرضه شد لایهی موتور است: حلوفصل include، اعتبارسنجی، کش نسخه، قاعدهی تقدم و محاسبهی تازگی. این همان بخشی است که هر چیز دیگری باید روی آن بایستد، و همان بخشی است که تغییر دادنش بعداً سختترین است، که به همین دلیل اول رفت.
بعد کجا را نگاه کنید
هر دو دفتر بالا بخشی از گالری نمونهها هستند، شش الگوی کارشده که میتوانید کلون کنید و بهصورت محلی اجرا کنید — هر دوی این دو بهعمد فایلهای قیمت ایستا و ثبتشده را همراه دارند، پس یک کلون که دو سال بعد گرفته شود همچنان همان گزارشی را تولید میکند که امروز تولید میکند. هر چیز دیگری که عرضه میکنیم در تغییرات قرار میگیرد.
اگر هنوز قیمتها را با یک واکشیکنندهی خودتان بهروز نگه میدارید، آن همچنان پاسخ درست برای یک دفتر محلی است، و مستندات واکشی قیمت خود Beancount بهعلاوهی ابزار نگهداریشدهی beanprice جایی است که باید شروع کنید.
بخش کسلکننده را کسلکننده نگه دارید
دلیل ارزشمند بودن خودکارسازی قیمتها این است که آنها تنها بخشی از یک دفتر متنساده هستند که خودبهخود فرسوده میشوند. Beancount.io حسابداری متنسادهای به شما میدهد که مال خودتان میماند — قابل حسابرسی، تحت کنترل نسخه، و هرگز پشت سر شما بازنویسی نمیشود، که دقیقاً همان استانداردی است که یک فید مدیریتشده باید برآورده میکرد پیش از آنکه یکی را عرضه کنیم. رایگان شروع کنید و دفترهایتان را در فایلهایی نگه دارید که میتوانید بخوانید.


