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

ردیابی پورتفوی ارزهای دیجیتال با مبنای هزینه در Beancount

ردیابی پورتفوی ارزهای دیجیتال در Beancount در صرافیهای مختلف، با مبنای هزینه، دستهها و تحلیل عملکرد در یک دفتر کل.

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

یک دفتر کل نمونه زنده ارز دیجیتال را کاوش کنید:

باز کردن Cryptocurrency Example Ledger در برگه جدید

چرا ردیاب‌های سنتی پرتفوی ناکافی هستند​

مشکلات رایج ابزارهای پرتفوی کریپتو​

  • پشتیبانی محدود از صرافی: بسیاری از ابزارها از تمام صرافی‌ها یا پروتکل‌های دیفای پشتیبانی نمی‌کنند
  • بهای تمام‌شده نادرست: محاسبات ساده‌شده FIFO/LIFO سناریوهای پیچیده را از دست می‌دهند
  • تراکنش‌های جاافتاده: محدودیت‌های API و شکاف‌های ورود دستی
  • بدون سفارشی‌سازی: دسته‌بندی‌ها و ساختارهای گزارشی ثابت
  • نگرانی‌های حریم خصوصی: اشتراک‌گذاری کلیدهای API با سرویس‌های شخص ثالث
  • قفل‌شدن به فروشنده: قالب‌های داده اختصاصی و گزینه‌های صادرات محدود

مزایای Beancount.io​

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

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

سلسله مراتب پایه حساب‌ها​

با یک ساختار جامع حساب که اکوسیستم کریپتوی شما را بازتاب می‌دهد شروع کنید:

; Exchange Accounts - Organized by Platform
1970-01-01 open Assets:Crypto:Coinbase:USD
1970-01-01 open Assets:Crypto:Coinbase:BTC
1970-01-01 open Assets:Crypto:Coinbase:ETH
1970-01-01 open Assets:Crypto:Coinbase:ADA
 
1970-01-01 open Assets:Crypto:Binance:USD
1970-01-01 open Assets:Crypto:Binance:BTC
1970-01-01 open Assets:Crypto:Binance:ETH
1970-01-01 open Assets:Crypto:Binance:BNB
 
1970-01-01 open Assets:Crypto:Kraken:USD
1970-01-01 open Assets:Crypto:Kraken:BTC
1970-01-01 open Assets:Crypto:Kraken:ETH
1970-01-01 open Assets:Crypto:Kraken:ADA
1970-01-01 open Assets:Crypto:Binance:ADA
 
; Wallet Accounts - Organized by Type
1970-01-01 open Assets:Crypto:Wallet:Ledger:BTC
1970-01-01 open Assets:Crypto:Wallet:Ledger:ETH
1970-01-01 open Assets:Crypto:Wallet:MetaMask:ETH
1970-01-01 open Assets:Crypto:Wallet:MetaMask:USDC
1970-01-01 open Assets:Crypto:Wallet:MetaMask:UNI
1970-01-01 open Assets:Crypto:Wallet:TrustWallet:BNB
 
; DeFi Protocol Accounts
1970-01-01 open Assets:DeFi:Uniswap:ETH-USDC-LP
1970-01-01 open Assets:DeFi:Compound:CUSDC
1970-01-01 open Assets:Staking:Ethereum:ETH
1970-01-01 open Assets:Staking:Cardano:ADA
 
; Income Tracking
1970-01-01 open Income:Crypto:Staking:ETH
1970-01-01 open Income:Crypto:Staking:ADA
1970-01-01 open Income:Crypto:Mining:BTC
1970-01-01 open Income:Crypto:Airdrops
1970-01-01 open Income:Crypto:DeFi:Yield
1970-01-01 open Income:Crypto:Arbitrage
1970-01-01 open Income:CapitalGains:Crypto
1970-01-01 open Income:CapitalGains:LongTerm
 
; Expense Tracking
1970-01-01 open Expenses:Crypto:Fees:Trading
1970-01-01 open Expenses:Crypto:Fees:Network
1970-01-01 open Expenses:Crypto:Fees:Withdrawal
1970-01-01 open Expenses:CapitalLoss:Crypto

یک قاعده نام‌گذاری اینجا دردسرساز است و پارسر آن را به‌جای عرف، الزامی می‌کند: هر مؤلفه حساب، و هر نماد کالا، باید با یک حرف بزرگ یا رقم شروع شود. Compound توکن رسید خود را در سراسر رابطش cUSDC می‌نویسد، اما Assets:DeFi:Compound:cUSDC و کالای cUSDC هر دو خطای lexer هستند. آن‌ها را CUSDC بنویسید و املای خود پروتکل را در متادیتای name: کالا نگه دارید.

تعریف کالاها با متاداده​

ارزهای دیجیتال خود را با متادیتای غنی برای ردیابی بهتر تعریف کنید:

1970-01-01 commodity BTC
  name: "Bitcoin"
  asset-class: "cryptocurrency"
  sector: "digital-currency"
  price-source: "coinbase"
  website: "https://bitcoin.org"
 
1970-01-01 commodity ETH
  name: "Ethereum"
  asset-class: "cryptocurrency"
  sector: "smart-contract-platform"
  price-source: "coinbase"
  website: "https://ethereum.org"
 
1970-01-01 commodity ADA
  name: "Cardano"
  asset-class: "cryptocurrency"
  sector: "smart-contract-platform"
  price-source: "binance"
  website: "https://cardano.org"
 
1970-01-01 commodity DOT
  name: "Polkadot"
  asset-class: "cryptocurrency"
  sector: "interoperability"
  price-source: "kraken"
  website: "https://polkadot.network"

پیگیری پرتفوی چندصرافه‌ای​

ثبت خریدها در صرافی‌های مختلف​

همان ارز دیجیتال را در صرافی‌های مختلف با بهای تمام‌شده دقیق ردیابی کنید:

; Bitcoin purchases on different exchanges
2024-01-15 * "Buy BTC on Coinbase"
  Assets:Crypto:Coinbase:BTC      1.0 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:USD  -45000.00 USD
  Expenses:Crypto:Fees:Trading    50.00 USD
  Assets:Crypto:Coinbase:USD     -50.00 USD
 
2024-01-20 * "Buy BTC on Binance"
  Assets:Crypto:Binance:BTC       0.5 BTC {46000.00 USD}
  Assets:Crypto:Binance:USD   -23000.00 USD
  Expenses:Crypto:Fees:Trading    25.00 USD
  Assets:Crypto:Binance:USD      -25.00 USD
 
2024-01-25 * "Buy BTC on Kraken"
  Assets:Crypto:Kraken:BTC        0.8 BTC {44000.00 USD}
  Assets:Crypto:Kraken:USD    -35200.00 USD
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Kraken:USD       -30.00 USD

انتقالات بین صرافی‌ها​

انتقال‌ها بین صرافی‌ها را در حین حفظ بهای تمام‌شده ردیابی کنید:

2024-02-01 * "Transfer BTC from Coinbase to Ledger"
  Assets:Crypto:Coinbase:BTC      -0.5 BTC {45000.00 USD}
  Assets:Crypto:Wallet:Ledger:BTC  0.5 BTC {45000.00 USD}
  Expenses:Crypto:Fees:Withdrawal  0.0005 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:BTC      -0.0005 BTC {45000.00 USD}

فرصت‌های آربیتراژ​

آربیتراژ یک رویداد اقتصادی در دو محل است، پس آن را به‌عنوان یک تراکنش ثبت کنید. این ورودی ۱۰ ETH را که از قبل در Coinbase دارید به قیمت ۲,۵۸۰.۰۰ دلار می‌فروشد و بلافاصله موقعیت را در Binance به قیمت ۲,۵۰۰.۰۰ دلار بازسازی می‌کند:

2024-02-10 * "Arbitrage: Buy ETH on Binance, Sell on Coinbase"
  ; Buy leg on Binance
  Assets:Crypto:Binance:ETH       10 ETH {2500.00 USD}
  Assets:Crypto:Binance:USD   -25000.00 USD
  Expenses:Crypto:Fees:Trading    25.00 USD
  Assets:Crypto:Binance:USD      -25.00 USD
  ; Sell leg on Coinbase, at the higher price
  Assets:Crypto:Coinbase:ETH     -10 ETH {2500.00 USD} @ 2580.00 USD
  Assets:Crypto:Coinbase:USD   25800.00 USD
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD
  Income:Crypto:Arbitrage       -800.00 USD  ; 25,800.00 proceeds - 25,000.00 basis

سه نکته برای کپی کردن:

  • هرگز بین پستینگ‌ها خط خالی نگذارید. یک خط خالی تراکنش را پایان می‌دهد و Beancount روی پستینگ‌های بعد از آن خطای نگارشی گزارش می‌کند. به‌جای آن از توضیحات ; تورفته برای برچسب‌گذاری بخش‌ها استفاده کنید — که همان کاری است که دو خط توضیح بالا انجام می‌دهند.
  • سود، سود واگذاری است، ۸۰۰.۰۰ دلار، و منفی است چون حساب‌های Income اعتبار نگه می‌دارند. ۵۵.۰۰ دلار کارمزد جداست: همان چیزی است که ۸۰۰.۰۰ دلار اسپرد ناخالص را به ۷۴۵.۰۰ دلار سود تبدیل می‌کند، و قبلاً روی دو پستینگ خودش ثبت شده است.
  • بخش فروش، لاتی را کاهش می‌دهد که باید از قبل داشته باشید. این ورودی فرض می‌کند ۱۰ ETH قبلاً در Coinbase به قیمت ۲,۵۰۰.۰۰ دلار خریده شده است؛ بدون آن لات، کاهش چیزی برای ثبت در برابر آن ندارد.

مدیریت پیشرفته بهای تمام شده​

ردیابی مبتنی بر دسته​

سیستم مبتنی بر لات Beancount.io ردیابی دقیق بهای تمام‌شده را ارائه می‌دهد:

; Multiple purchases at different prices
2024-01-01 * "BTC Purchase Lot 1"
  Assets:Crypto:Coinbase:BTC  1.0 BTC {40000.00 USD}
  Assets:Crypto:Coinbase:USD -40000.00 USD
 
2024-02-01 * "BTC Purchase Lot 2"
  Assets:Crypto:Coinbase:BTC  1.0 BTC {45000.00 USD}
  Assets:Crypto:Coinbase:USD -45000.00 USD
 
2024-03-01 * "BTC Purchase Lot 3"
  Assets:Crypto:Coinbase:BTC  1.0 BTC {50000.00 USD}
  Assets:Crypto:Coinbase:USD -50000.00 USD

کنوانسیون علامت برای سود و زیان​

حساب‌های Income اعتبار نگه می‌دارند، پس Beancount آن‌ها را به‌عنوان اعداد منفی ذخیره می‌کند. بنابراین هر سود زیر یک پستینگ منفی به یک حساب درآمد است، و هر زیان یک پستینگ مثبت به یک حساب هزینه. کارمزد از هر دو جداست: خودش یک هزینه است، پس کم‌کردن آن از سود نیز آن را دو بار کسر می‌کند و تراکنش را نامتوازن می‌گذارد.

برای یک واگذاری، حساب همیشه این است:

gain (or loss) = gross proceeds - cost basis of the lots removed
net cash       = gross proceeds - fees

روش شناسایی خاص​

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

; Sell the most expensive lot: 1.0 BTC bought at $50,000.00
2024-04-01 * "Sell BTC Lot 3 for tax optimization"
  Assets:Crypto:Coinbase:BTC    -1.0 BTC {50000.00 USD} @ 48000.00 USD
  Assets:Crypto:Coinbase:USD   48000.00 USD  ; gross proceeds
  Expenses:Crypto:Fees:Trading    50.00 USD
  Assets:Crypto:Coinbase:USD     -50.00 USD
  Expenses:CapitalLoss:Crypto   2000.00 USD  ; 50,000.00 basis - 48,000.00 proceeds

فروش قدیمی‌ترین یا جدیدترین دسته​

نام‌بردن یک بهای متفاوت، لات متفاوتی را انتخاب می‌کند. این دو فروش، لات ۴۰,۰۰۰.۰۰ دلاری و سپس لات ۴۵,۰۰۰.۰۰ دلاری را می‌گیرند — دو لاتی که پس از رفتن لات ۵۰,۰۰۰.۰۰ دلاری در مثال بالا باقی می‌مانند — که همان انتخابی است که FIFO و LIFO به‌طور خودکار انجام می‌دهند، اینجا با دست نوشته شده:

; Sell the oldest lot (bought 2024-01-01 at $40,000.00)
2024-05-01 * "Sell 0.5 BTC from the oldest lot"
  Assets:Crypto:Coinbase:BTC    -0.5 BTC {40000.00 USD} @ 52000.00 USD
  Assets:Crypto:Coinbase:USD   26000.00 USD  ; gross proceeds, 0.5 * 52,000.00
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD
  Income:CapitalGains:Crypto   -6000.00 USD  ; 26,000.00 proceeds - 20,000.00 basis
 
; Sell the newest remaining lot (bought 2024-02-01 at $45,000.00)
2024-05-02 * "Sell 0.5 BTC from the newest lot"
  Assets:Crypto:Coinbase:BTC    -0.5 BTC {45000.00 USD} @ 52000.00 USD
  Assets:Crypto:Coinbase:USD   26000.00 USD
  Expenses:Crypto:Fees:Trading    30.00 USD
  Assets:Crypto:Coinbase:USD     -30.00 USD
  Income:CapitalGains:Crypto   -3500.00 USD  ; 26,000.00 proceeds - 22,500.00 basis

قیمت فروش یکسان، لات متفاوت، ۲,۵۰۰.۰۰ دلار تفاوت در سود محقق‌شده. اگر ترجیح می‌دهید Beancount خودش لات را انتخاب کند، به‌جای نام‌بردن یک بها، یک روش رزرو روی حساب تنظیم کنید — "FIFO"، "LIFO" یا "HIFO" روی دستور open، که در مدیریت موجودی توضیح داده شده است.

تجزیه و تحلیل عملکرد پرتفولیوی سرمایه گذاری​

تنظیم ردیابی قیمت​

فیدهای قیمت خودکار را برای ارزش‌گذاری دقیق راه‌اندازی کنید:

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

; Daily price updates
2024-01-15 price BTC 45000.00 USD
2024-01-15 price ETH 2500.00 USD
2024-01-15 price ADA 0.50 USD
 
2024-01-16 price BTC 46000.00 USD
2024-01-16 price ETH 2550.00 USD
2024-01-16 price ADA 0.52 USD

ردیابی تخصیص پرتفولیو​

از ویژگی‌های گزارشی Beancount.io برای تحلیل تخصیص استفاده کنید:

-- Query for portfolio allocation by asset
SELECT
  account,
  sum(position) as balance,
  value(sum(position)) as market_value
WHERE account ~ "Assets:Crypto"
GROUP BY 1
ORDER BY market_value DESC

معیارهای عملکرد​

شاخص‌های کلیدی عملکرد را ردیابی کنید:

-- Total portfolio value query
SELECT
  sum(value(position)) as total_portfolio_value
WHERE account ~ "Assets:Crypto"
 
-- Realized gains/losses
SELECT
  sum(position) as realized_gains
WHERE account ~ "Income:CapitalGains:Crypto"

ادغام استیکینگ و دی‌فای​

ردیابی پاداش‌های استیکینگ​

پاداش‌های استیکینگ را با شناسایی درآمد مناسب ثبت کنید. واحدهای ورودی و درآمد شناسایی‌شده همان رویداد از دو سو هستند، پس وزن‌هایشان باید یکدیگر را خنثی کنند: [واحدها] × [قیمت] دارایی ورودی، همان مقدار دلار درآمد خروجی — و درآمد یک اعتبار است، پس منفی است.

2024-01-31 * "ETH Staking Rewards - January"
  Assets:Staking:Ethereum:ETH     0.08 ETH {2500.00 USD}
  Income:Crypto:Staking:ETH     -200.00 USD  ; 0.08 * 2,500.00
 
2024-01-31 * "ADA Staking Rewards - January"
  Assets:Staking:Cardano:ADA        25 ADA {0.50 USD}
  Income:Crypto:Staking:ADA      -12.50 USD  ; 25 * 0.50

{2,500.00 USD} و {0.50 USD} ارزش‌گذاری‌های خارجی هستند. Beancount هر چه بنویسید ذخیره می‌کند؛ قیمتی را واکشی نمی‌کند و تصمیم نمی‌گیرد کدام نقل‌قول درست است. یک منبع انتخاب کنید — صرافی‌ای که واقعاً در آن می‌فروختید، یا یک شاخص منتشرشده — و آن را به‌طور پیوسته استفاده کنید، چون آن عدد هم درآمد شماست و هم بهای تمام‌شده آینده‌تان.

مبنای پاداش یکبار شناسایی می‌شود​

۲۰۰.۰۰ دلاری که بالا شناسایی شد، بهای تمام‌شده ۰.۰۸ ETH می‌شود. فروش آن بعداً فقط حرکت از تاریخ پاداش را محقق می‌کند:

2024-06-30 * "Sell the January ETH staking reward"
  Assets:Staking:Ethereum:ETH   -0.08 ETH {2500.00 USD} @ 3000.00 USD
  Assets:Crypto:Coinbase:USD     240.00 USD  ; gross proceeds, 0.08 * 3,000.00
  Income:CapitalGains:Crypto     -40.00 USD  ; 240.00 proceeds - 200.00 basis

۴۰.۰۰ دلار سود سرمایه‌ای، نه ۲۴۰.۰۰ دلار — ۲۰۰.۰۰ دلار اول قبلاً در ژانویه درآمد بوده است. ثبت تمام ۲۴۰.۰۰ دلار به‌عنوان سود، رایج‌ترین راهی است که درآمد پاداش دو بار شمرده می‌شود. زمان مشمول مالیات شدن پاداش، و نرخ آن، بر اساس حوزه قضایی متفاوت است؛ دفتر کل دریافت و واگذاری را جداگانه ثبت می‌کند تا هر یک از دو رفتار از آن قابل گزارش باشد.

ردیابی بازده دی‌فای​

موقعیت‌های پیچیده دیفای را ردیابی کنید:

تأمین نقدینگی دو کالا را با یک کالای سوم مبادله می‌کند، پس هر بخش باید به همان واحد پول وزن داشته باشد تا تراکنش متوازن شود. بخش‌های ETH و LP از قبل دارند، چون بهایی حمل می‌کنند؛ بخش استیبل‌کوین به یک @ 1.00 USD صریح نیاز دارد، وگرنه Beancount خروج ۲۵,۰۰۰ واحد USDC و ورود ۲۵,۰۰۰.۰۰ دلار ارزش می‌بیند، که کالاهای متفاوتی هستند و یکدیگر را خنثی نمی‌کنند.

2024-02-01 * "Uniswap LP Position"
  Assets:Crypto:Wallet:MetaMask:ETH    -10 ETH {2500.00 USD}
  Assets:Crypto:Wallet:MetaMask:USDC -25000 USDC @ 1.00 USD
  Assets:DeFi:Uniswap:ETH-USDC-LP      100 UNI-V2-ETH-USDC {500.00 USD}
 
2024-02-28 * "Uniswap LP Rewards - February"
  Assets:Crypto:Wallet:MetaMask:UNI    50 UNI {8.00 USD}
  Income:Crypto:DeFi:Yield          -400.00 USD  ; 50 * 8.00

مدیریت خودکار پرتفولیو​

وارد کردن داده‌های صرافی​

Beancount هیچ کلاینت API صرافی همراه ندارد، و هیچ فایل پیکربندی وجود ندارد که آن را وادار به گفتگو با Coinbase یا Binance کند. مسیر پشتیبانی‌شده یک importer است: شما صادرات CSV صرافی را دانلود می‌کنید (یا آن را با اسکریپت خودتان واکشی می‌کنید) و با beangulp، چارچوب importer که جانشین beancount.ingest داخلی Beancount 2 شد، آن را به تراکنش‌های Beancount تبدیل می‌کنید. beancount.ingest در Beancount 3 وجود ندارد.

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

# Configuration for YOUR OWN fetch script. No Beancount tool reads this file.
exchanges:
  coinbase:
    api_key: "your_api_key"
    api_secret: "your_api_secret"
    passphrase: "your_passphrase"
  binance:
    api_key: "your_api_key"
    api_secret: "your_api_secret"

تسویه خودکار​

تأیید خودکار موجودی را راه‌اندازی کنید:

; Balance assertions for automated verification
2024-01-31 balance Assets:Crypto:Coinbase:BTC    2.5 BTC
2024-01-31 balance Assets:Crypto:Binance:ETH    15.0 ETH
2024-01-31 balance Assets:Crypto:Kraken:ADA   1000.0 ADA

آن سه عدد از صفحه‌های صرافی شما می‌آیند، نه از این صفحه، پس بلوک بالا تا زمانی که تراکنش‌های خودتان در دفتر کل نباشد، در برابر هیچ‌چیز تأیید نخواهد شد. دو قانون تصمیم می‌گیرند که اصلاً تأیید شود یا نه. یک دستور balance موجودی را در ابتدای روز نام‌برده‌شده تأیید می‌کند، پس یک تأییدیه مورخ 2024-01-31 هیچ‌چیزی که در 2024-01-31 ثبت شده را نمی‌بیند — آن را روز بعد از دوره‌ای که می‌بندید تاریخ‌گذاری کنید. و هر حساب تأییدشده باید باز باشد، که دلیل حضور Assets:Crypto:Kraken:ADA در بخش سلسله‌مراتب پایه حساب‌ها در بالا است.

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

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

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

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

قیمت‌ها به‌عنوان دستورات price در دفتر کل زندگی می‌کنند. Beancount 3.2.3 بالادستی خودش آن‌ها را واکشی نمی‌کند؛ includeهای مدیریت‌شده میزبانی‌شده از افزونه لودر Beancount.io که در بالا توضیح داده شد استفاده می‌کنند. هیچ دستور custom "price-source" وجود ندارد — یک نماد کالای خالی حتی یک مقدار custom معتبر نیست، پس آن خط خطای نگارشی است — و هیچ ماژول beancount.plugins.forecast وجود ندارد؛ لودر در صورت نام‌بردن آن با خطای import متوقف می‌شود.

beanprice را داخل موتور مدیریت‌شده با bea engine enable beanprice فعال کنید، سپس نقل‌قول‌ها را با bea price main.beancount واکشی کنید. این یک فیلد متادیتای price: روی هر دستور commodity می‌خواند، به شکل "<quote currency>:<source module>/<ticker>"، و دستورات price را می‌نویسد که به دفتر کل خود اضافه می‌کنید:

1970-01-01 commodity BTC
  name: "Bitcoin"
  asset-class: "cryptocurrency"
  price: "USD:beanprice.sources.coinbase/BTC-USD"
 
1970-01-01 commodity ETH
  name: "Ethereum"
  asset-class: "cryptocurrency"
  price: "USD:beanprice.sources.coinbase/ETH-USD"
 
; Example quotes to append after reviewing the output of bea price - and what you would otherwise type by hand
2024-01-15 price BTC 45000.00 USD
2024-01-15 price ETH 2500.00 USD

هر متادیتای دیگری که به یک کالا ضمیمه کنید — sector، website، یا فیلد price-source که قبلاً در این راهنما استفاده شد — مستندسازی آزاد به نفع خودتان است. لودر آن را ذخیره می‌کند و هیچ ابزاری بر اساس آن عمل نمی‌کند.

استراتژی‌های بهینه‌سازی مالیاتی​

برداشت منظم زیان مالیاتی​

برداشت زیان مالیاتی سیستماتیک را پیاده‌سازی کنید:

; The lot being harvested, so this block stands on its own
2024-03-01 * "Buy ADA on Binance"
  Assets:Crypto:Binance:ADA       1000 ADA {0.60 USD}
  Assets:Crypto:Binance:USD    -600.00 USD
 
; Identify positions with unrealized losses
2024-12-15 * "Tax loss harvesting - Sell ADA at loss"
  Assets:Crypto:Binance:ADA      -1000 ADA {0.60 USD} @ 0.45 USD
  Assets:Crypto:Binance:USD       450.00 USD  ; gross proceeds
  Expenses:Crypto:Fees:Trading      5.00 USD
  Assets:Crypto:Binance:USD        -5.00 USD
  Expenses:CapitalLoss:Crypto     150.00 USD  ; 600.00 basis - 450.00 proceeds
 
; Repurchase after wash sale period (31 days)
2025-01-16 * "Repurchase ADA after wash sale period"
  Assets:Crypto:Binance:ADA      1000 ADA {0.45 USD}
  Assets:Crypto:Binance:USD     -450.00 USD
  Expenses:Crypto:Fees:Trading     5.00 USD
  Assets:Crypto:Binance:USD       -5.00 USD

سود بلندمدت در مقابل کوتاه‌مدت​

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

; Use metadata to track purchase dates
2024-01-01 * "BTC Purchase - Long-term hold" ^long-term-btc
  Assets:Crypto:Coinbase:BTC  1.0 BTC {40000.00 USD}
  Assets:Crypto:Coinbase:USD -40000.00 USD
 
; Sell after one year for long-term capital gains treatment
2025-01-02 * "BTC Sale - Long-term capital gains" ^long-term-btc
  Assets:Crypto:Coinbase:BTC    -1.0 BTC {40000.00 USD} @ 55000.00 USD
  Assets:Crypto:Coinbase:USD   55000.00 USD
  Income:CapitalGains:LongTerm -15000.00 USD  ; 55,000.00 proceeds - 40,000.00 basis

لینک ^long-term-btc روی هر دو ورودی همان چیزی است که به شما اجازه می‌دهد بعداً خرید و فروش را با هم بالا بیاورید؛ Beancount خودش دوره‌های نگهداری را ردیابی نمی‌کند.

گزارش‌دهی و تحلیل‌ها​

گزارش‌های خلاصه پرتفوی​

سهم هر ارز دیجیتال از پرتفوی را در یک ارز ارزیابی محاسبه کنید. این مثال از قیمت‌های USD موجود در ۳۱ مارس ۲۰۲۴ و دارایی‌های پیش از ۱ آوریل استفاده می‌کند. برای تاریخ گزارش متفاوت، هر دو تاریخ را با هم تغییر دهید. دستور SELECT زیر را در ابزار پرس‌وجوی BQL محلی خود اجرا کنید.

-- Portfolio allocation by cryptocurrency
SELECT
  currency,
  units(sum(position)) AS total_units,
  convert(sum(position), 'USD', 2024-03-31) AS allocation_value
FROM close ON 2024-04-01
WHERE account ~ '^Assets:Crypto:'
GROUP BY currency
ORDER BY currency;

بررسی کنید که هر allocation_value غیرصفر به USD باشد پیش از محاسبه درصدها. تبدیل از قیمت‌های ثبت‌شده موجود در یا پیش از تاریخ ارزیابی استفاده می‌کند. یک تبدیل گم‌شده می‌تواند مقداری را در ارز اصلی خود باقی بگذارد. اگر هر مقدار BTC، ETH یا مقدار غیر-USD دیگر باقی بماند، ارزیابی ناقص است. قیمت‌های تاریخ‌دار گم‌شده را اضافه کنید و دوباره اجرا کنید؛ دارایی‌های بدون قیمت را صفر در نظر نگیرید یا واحدهای ارز نامرتبط را اضافه نکنید.

مقدارهای USD را جمع کنید تا کل پرتفوی به دست آید. سپس تخصیص هر دارایی را به‌صورت ارزش USD دارایی / ارزش کل USD * 100 محاسبه کنید. تا زمان نمایش درصد، دقت کامل را حفظ کنید. برای مثال، دارایی‌های ۱ BTC و ۳ ETH، با قیمت ۲۰۰ دلار به ازای هر BTC و ۲۰ دلار به ازای هر ETH، به این نتیجه می‌رسند:

داراییارزش USDمحاسبه تخصیصسهم نمایش‌داده‌شده
BTC200200 / 260 * 10076.92%
ETH6060 / 260 * 10023.08%
مجموع260260 / 260 * 100100.00%

گرد کردن سهم‌های فردی به دو رقم اعشار می‌تواند مجموع نمایش‌داده‌شده آن‌ها را کمی متفاوت از ۱۰۰٪ کند. موجودی با ارزش صفر ممکن است خالی نمایش داده شود. برای پرتفوی خالی یا مجموع USD صفر، تخصیص‌ها را در دسترس‌نبودنی گزارش کنید و بر صفر تقسیم نکنید. این مثال دارایی‌های مثبت را توصیف می‌کند؛ موجودی‌های منفی نیازمند تفسیر مواجهه‌های علامت‌دار به‌جای سهم‌های معمول پرتفوی هستند.

تحلیل عملکرد​

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

برای ۳۱ ژانویه:

SELECT convert(sum(position), 'USD', 2024-01-31) AS portfolio_value
FROM close ON 2024-02-01
WHERE account ~ '^Assets:Crypto:';

برای ۲۹ فوریه:

SELECT convert(sum(position), 'USD', 2024-02-29) AS portfolio_value
FROM close ON 2024-03-01
WHERE account ~ '^Assets:Crypto:';

برای ۳۱ مارس:

SELECT convert(sum(position), 'USD', 2024-03-31) AS portfolio_value
FROM close ON 2024-04-01
WHERE account ~ '^Assets:Crypto:';

FROM close ON ثبت‌های به تاریخ برابر یا پس از برش خود را حذف می‌کند. تاریخ داخل convert قیمت‌های موجود در یا پیش از تاریخ گزارش را انتخاب می‌کند. برای ماه دیگر، هر دو تاریخ را با هم تغییر دهید. هر ماهی که می‌خواهید گزارش کنید را درخواست دهید، از جمله ماه‌های بدون تراکنش. پیش از در نظر گرفتن نتیجه به‌عنوان مجموع USD، ارزهای تبدیل‌نشده را همان‌طور که در بالا توضیح داده شد بررسی کنید.

برای مثال، فرض کنید ژانویه با ۲ BTC به قیمت ۱۰۰ دلار هر کدام و ۳ ETH به قیمت ۱۰ دلار هر کدام تمام می‌شود. فروش ۱ BTC در فوریه، ۱ BTC و ۳ ETH باقی می‌گذارد. اگر مارس معامله‌ای نداشته باشد اما قیمت‌های ثبت‌شده به ۲۰۰ دلار هر BTC و ۲۰ دلار هر ETH برسد، تصاویر لحظه‌ای این‌ها هستند:

پایان ماهارزش بسته ارز دیجیتال
۳۱ ژانویه2 * 100 + 3 * 10 = 230 USD
۲۹ فوریه1 * 100 + 3 * 10 = 130 USD
۳۱ مارس1 * 200 + 3 * 20 = 260 USD

ارزش فوریه فرض می‌کند هیچ دستور قیمت جدیدی آن ماه وجود ندارد. قیمت @ یک فروش، عواید آن را ثبت می‌کند؛ یک دستور قیمت بازار ایجاد نمی‌کند. این پرس‌وجوها فقط حساب‌های Assets:Crypto: را پوشش می‌دهند، پس عواید نقدی نگهداری‌شده در جای دیگر حذف می‌شوند.

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

تحلیل درآمد​

منابع درآمد را تحلیل کنید:

-- Income breakdown by source
SELECT
  account,
  sum(position) as total_income
WHERE account ~ "Income:Crypto"
GROUP BY account
ORDER BY total_income DESC;

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

1. ثبت مستمر​

  • تراکنش‌ها را بلافاصله پس از اجرا ثبت کنید
  • از توضیحات استاندارد تراکنش استفاده کنید
  • هش تراکنش را در متادیتا وارد کنید

2. تسویه منظم​

  • موجودی‌ها را هفتگی در سراسر تمام پلتفرم‌ها تأیید کنید
  • از تأییدیه‌های موجودی برای یافتن اختلاف‌ها استفاده کنید
  • تراکنش‌های جاافتاده را پایش کنید

۳. پشتیبان‌گیری و امنیت​

  • به‌طور منظم از فایل‌های Beancount خود پشتیبان بگیرید
  • از کنترل نسخه (Git) برای ردیابی تغییرات استفاده کنید
  • داده‌های حساس را رمزنگاری کنید

۴. مستندسازی​

  • تصمیمات ساختار حساب خود را مستند کنید
  • یادداشت‌هایی درباره تراکنش‌های پیچیده نگه دارید
  • سوابق پیکربندی‌های API را حفظ کنید

۵. آماده‌سازی مالیاتی​

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

نتیجه‌گیری​

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

مزایای کلیدی استفاده از Beancount.io برای ردیابی پرتفوی کریپتو:

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

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

آماده‌اید کنترل پرتفوی ارز دیجیتال خود را در دست بگیرید؟ همین امروز با Beancount.io شروع کنید.

منبع: https://beancount.io/fa/docs/Solutions/cryptocurrency-portfolio-tracking