Le système d'inventaire de Beancount est une fonctionnalité puissante pour suivre les actifs achetés et vendus au fil du temps, tels que les actions, les fonds communs de placement ou les devises étrangères. Il permet un suivi précis de la base de coût, ce qui est essentiel pour calculer les plus-values et comprendre la performance du portefeuille. Ce tutoriel couvre les mécanismes fondamentaux de la gestion des inventaires dans votre registre.
Concepts fondamentaux
À la base, la gestion des stocks consiste à suivre des positions. Une « position » est simplement une quantité d'une marchandise détenue dans un compte. Beancount distingue deux types fondamentaux de positions.
Types de positions
-
Position simple (sans coût) : Il s'agit d'une écriture de solde standard. Elle représente une quantité d'une marchandise sans aucun coût d'acquisition associé. Elle convient aux liquidités ou aux assertions de solde simples.
Assets:Bank:Checking 100.00 USD -
Position avec base de coût : Ce type de position inclut non seulement le nombre d'unités et la marchandise, mais aussi le coût auquel elle a été acquise. C'est le fondement du suivi des stocks. Le coût est spécifié entre accolades
{}.Assets:Invest:VTSAX 10 VTSAX {100.00 USD, "lot-1"}Dans cet exemple, nous détenons 10 unités de
VTSAX. Chaque unité a été acquise à un coût de 100,00 USD. Ce lot spécifique d'actions est identifié comme un « lot ».
Opérations sur l'inventaire
Deux opérations principales peuvent être effectuées sur un inventaire :
-
Augmentations (ajout à l'inventaire) : Lorsque vous achetez une marchandise, vous augmentez votre inventaire. Vous créez un nouveau lot avec un nombre spécifique d'unités et une base de coût.
2024-01-15 * "Acheter des actions" Assets:Invest:STOCK 50 STOCK {25.00 USD, "lot-1"} Assets:Bank:Checking -1250.00 USDIci, nous achetons 50 unités de
STOCKà un coût unitaire de 25,00 USD. Cela crée un lot dans le compteAssets:Invest:STOCK. -
Réductions (retrait de l'inventaire) : Lorsque vous vendez une marchandise, vous réduisez votre inventaire. Vous devez spécifier de quel lot vous vendez. Cela se fait en fournissant les informations correspondantes entre accolades.
2024-01-20 * "Vendre des actions" Assets:Invest:STOCK -25 STOCK {25.00 USD} Assets:Bank:Checking 625.00 USDDans cette transaction, nous vendons 25 unités de
STOCKdu lot qui a été acheté à 25,00 USD par unité.
Méthodes d'enregistrement
Lorsque vous réduisez un inventaire, Beancount a besoin d'une règle pour décider de quel lot spécifique prélever si plusieurs lots correspondent à la réduction. Cette règle s'appelle la « méthode d'affectation ». Vous pouvez définir une valeur par défaut pour l'ensemble du fichier avec une option, ou donner à un compte sa propre méthode sur la directive open.
Beancount 3.2.3 accepte sept noms de méthodes : STRICT (par défaut), STRICT_WITH_SIZE, NONE, FIFO, LIFO, HIFO et AVERAGE. Six d'entre elles sont implémentées ; AVERAGE est analysée mais génère une erreur dès qu'elle doit affecter une réduction, comme le montre la section AVERAGE ci-dessous.
1. STRICT (Par défaut)
La méthode STRICT est la méthode d'affectation par défaut et la plus sûre. Elle impose une correspondance explicite et non ambiguë.
2024-01-01 open Assets:Invest:STOCK "STRICT"- Exige une correspondance exacte de lot : Le spécificateur de coût de l'écriture de réduction (
{...}) doit identifier un seul lot — par coût, par date d'acquisition, par libellé, ou par toute combinaison de ceux-ci. - Erreur en cas de correspondances ambiguës : Si le spécificateur correspond à plus d'un lot, Beancount génère une
AmbiguousMatchErrorau lieu de deviner. - Exception : Si une réduction retire exactement le nombre total d'unités auquel le spécificateur correspond, un spécificateur vide (
{}) est autorisé, et la réduction est répartie sur ces lots.
Ce registre contient deux lots et vend l'un d'eux en nommant son coût, ce qui est non ambigu :
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 * "Acheter le premier lot"
Assets:Broker:Strict 10 STK {100.00 USD}
Assets:Broker:Cash -1000.00 USD
2024-02-10 * "Acheter le second lot"
Assets:Broker:Strict 10 STK {120.00 USD}
Assets:Broker:Cash -1200.00 USD
; Le coût identifie exactement un lot, donc STRICT est satisfait.
2024-06-01 * "Vendre le lot à 120,00 USD"
Assets:Broker:Strict -10 STK {120.00 USD} @ 150.00 USD
Assets:Broker:Cash 1500.00 USD
Income:GainsIl se charge sans erreur, affecte 300,00 USD de gain à Income:Gains, et laisse 10 STK {100.00 USD} dans le compte.
Remplacez cette dernière écriture par un spécificateur vide et le même fichier échoue :
; Rejeté sous STRICT : "-10 STK {}" correspond aux deux lots.
2024-06-01 * "Vendre 10 actions"
Assets:Broker:Strict -10 STK {} @ 150.00 USD
Assets:Broker:Cash 1500.00 USD
Income:GainsBeancount signale Ambiguous matches for "-10 STK {}" et liste les candidats. Vendre la position entière est toutefois acceptable, car il ne reste rien entre quoi choisir :
; Autorisé sous STRICT : -20 STK est la détention entière, donc le
; spécificateur vide est réparti sur les deux lots.
2024-06-01 * "Clôturer la position"
Assets:Broker:Strict -20 STK {} @ 150.00 USD
Assets:Broker:Cash 3000.00 USD
Income:GainsCela enregistre 800,00 USD de gain — 3 000,00 USD de produit contre 1 000,00 USD + 1 200,00 USD de base — et laisse le compte vide. C'est une propriété de STRICT elle-même, pas quelque chose pour lequel vous devez passer à STRICT_WITH_SIZE.
2. FIFO (Premier Entré, Premier Sorti)
La méthode FIFO affecte automatiquement les réductions aux lots disponibles les plus anciens en premier.
2024-01-01 open Assets:Invest:STOCK "FIFO"- Résolution automatique : Elle résout l'ambiguïté en sélectionnant les lots correspondants les plus anciens.
- Correspondance chronologique : Vous supposez vendre les actifs que vous détenez depuis le plus longtemps. Plusieurs autorités fiscales considèrent cela comme la valeur par défaut lorsque vous n'avez pas identifié de lot.
3. LIFO (Dernier Entré, Premier Sorti)
La méthode LIFO est l'opposé de FIFO. Elle affecte les réductions aux lots disponibles les plus récents en premier.
2024-01-01 open Assets:Invest:STOCK "LIFO"- Ordre chronologique inverse : Elle sélectionne les lots correspondants acquis le plus récemment.
- Le plus récent, pas le plus cher : LIFO choisit uniquement par date d'acquisition. Il se trouve qu'elle vend les actions au coût le plus élevé lorsque les prix ont augmenté, mais si votre lot le plus récent est votre moins cher — ce que l'exemple ci-dessous est conçu pour montrer — LIFO réalisera le gain le plus élevé, pas le plus faible. La méthode qui vend toujours les actions les plus chères est
HIFO, décrite ci-après.
4. HIFO (Highest-In, First-Out)
La méthode HIFO affecte les réductions aux lots disponibles les plus chers en premier, quelle que soit leur date.
2024-01-01 open Assets:Invest:STOCK "HIFO"- Correspondance classée par coût : Elle sélectionne les lots correspondants avec la base de coût la plus élevée.
- Gain réalisé le plus faible : Pour un prix de vente donné, vendre les actions au coût le plus élevé réalise le gain le plus faible (ou la perte la plus importante). Son utilisation est une question de juridiction — aux États-Unis, par exemple, choisir un lot nécessite une identification spécifique au moment de la vente — donc considérez la méthode comme un mécanisme comptable et confirmez séparément l'option fiscale.
5. Comparaison de FIFO, LIFO et HIFO sur les mêmes lots
Les trois méthodes ne diffèrent que lorsque le lot le plus ancien, le plus récent et le plus cher sont trois lots différents. Ce registre organise exactement cela — le lot A est le plus ancien, le lot C est le plus récent, et le lot intermédiaire B est le plus cher — puis vend 10 actions sur trois comptes qui ne diffèrent que par leur méthode d'affectation :
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
; Lot A - le plus ancien, à 100,00 USD par action
2024-01-10 * "Acheter le lot 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
; Lot B - le plus cher, à 120,00 USD par action
2024-02-10 * "Acheter le lot 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
; Lot C - le plus récent, à 90,00 USD par action
2024-03-10 * "Acheter le lot 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
; Vendre 10 actions de chaque compte à 150,00 USD et laisser la
; méthode d'affectation de chaque compte choisir le lot qui sort.
2024-06-01 * "Vendre 10 actions de chaque compte"
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:GainsIl se charge sans aucune erreur et enregistre 1 400,00 USD de gain au total, réparti comme suit :
| Compte | Méthode | Lot affecté | Base de coût | Gain réalisé | Lots restants |
|---|---|---|---|---|---|
Assets:Broker:Fifo | FIFO | lot A, 2024-01-10 | 100,00 USD | 500,00 USD | 10 @ 120,00 USD, 10 @ 90,00 USD |
Assets:Broker:Lifo | LIFO | lot C, 2024-03-10 | 90,00 USD | 600,00 USD | 10 @ 100,00 USD, 10 @ 120,00 USD |
Assets:Broker:Hifo | HIFO | lot B, 2024-02-10 | 120,00 USD | 300,00 USD | 10 @ 100,00 USD, 10 @ 90,00 USD |
La ligne LIFO est celle qui mérite qu'on s'y attarde : elle a réalisé le gain le plus important des trois, parce que le lot le plus récent était aussi le moins cher.
6. STRICT_WITH_SIZE
STRICT_WITH_SIZE est STRICT plus un critère de départage supplémentaire : lorsque plusieurs lots correspondent mais qu'exactement l'un d'eux détient précisément le nombre d'unités que vous retirez, ce lot est choisi.
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 * "Acheter 10 actions"
Assets:Broker:Sized 10 STK {100.00 USD}
Assets:Broker:Cash -1000.00 USD
2024-02-10 * "Acheter 7 actions"
Assets:Broker:Sized 7 STK {120.00 USD}
Assets:Broker:Cash -840.00 USD
; Un seul lot détient exactement 7 unités, donc le spécificateur vide se résout.
2024-06-01 * "Vendre 7 actions"
Assets:Broker:Sized -7 STK {} @ 150.00 USD
Assets:Broker:Cash 1050.00 USD
Income:GainsCela enregistre 210,00 USD de gain contre le lot à 120,00 USD. Le fichier identique avec "STRICT" sur la ligne open échoue avec Ambiguous matches for "-7 STK {}".
7. MOYENNE (acceptée, mais non implémentée)
AVERAGE est un nom valide — option "booking_method" "AVERAGE" et open … "AVERAGE" s'analysent tous deux — mais Beancount 3.2.3 n'a aucune implémentation derrière. Tout ici se charge jusqu'à la vente :
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 * "Acheter 10 actions à 10,00 USD"
Assets:Broker:Avg 10 STK {10.00 USD}
Assets:Broker:Cash -100.00 USD
2024-02-10 * "Acheter 10 de plus à 8,00 USD"
Assets:Broker:Avg 10 STK {8.00 USD}
Assets:Broker:Cash -80.00 USD
; Un moteur à coût moyen affecterait ceci à 9,00 USD par action. Celui-ci refuse.
2024-06-01 * "Vendre 5 actions"
Assets:Broker:Avg -5 STK {}
Assets:Broker:Cash 45.00 USD
Income:GainsDès que cette réduction doit être affectée, le chargeur s'arrête avec :
AVERAGE method is not supportedNe planifiez pas un registre autour de cela. Si vous voulez un comportement à coût moyen aujourd'hui, gardez la position dans un compte NONE et calculez la moyenne vous-même, ou suivez chaque lot et acceptez les gains au niveau du lot.
8. AUCUN
La méthode NONE désactive entièrement la correspondance des lots.
2024-01-01 open Assets:Invest:STOCK "NONE"- Aucune correspondance de lot : Beancount ne tente pas de faire correspondre les réductions aux augmentations.
- Autorise les signes mixtes : Cela permet à un compte de détenir simultanément des soldes positifs et négatifs de la même marchandise. Ce comportement est similaire à la façon dont l'outil en ligne de commande Ledger gère les marchandises.
Spécification des lots
Un « lot » est un bloc spécifique d'une marchandise acquis à un moment et à un prix particuliers. Lorsque vous créez ou réduisez une position, vous pouvez spécifier ses attributs de lot en détail.
Spécification complète
Lors de l'augmentation d'un inventaire (achat), vous pouvez spécifier jusqu'à trois attributs pour le lot, séparés par des virgules à l'intérieur d'une seule paire d'accolades :
Assets:Invest:STOCK 10 STOCK {100.00 USD, 2024-01-15, "lot-identifier"}100.00 USD— la base de coût, exprimée par unité.2024-01-15— la date d'acquisition. Beancount la remplit à partir de la date de transaction lorsque vous l'omettez, ce qui explique pourquoi les messages d'erreur ci-dessus affichent une date sur chaque lot."lot-identifier"— un libellé de chaîne optionnel.
Bien que les trois soient optionnels, fournir au moins la base de coût est une pratique standard. Les accolades doivent rester sur une seule ligne, et les commentaires dans un registre commencent par ;, jamais par #.
Méthodes d’appariement
Lors de la réduction d'un inventaire (vente), vous utilisez la même syntaxe pour spécifier de quel(s) lot(s) vendre.
-
Correspondance par coût : C'est la méthode la plus courante.
Assets:Invest:STOCK -5 STOCK {100.00 USD} -
Correspondance par date : Si les coûts sont identiques, vous pouvez lever l'ambiguïté en utilisant la date d'acquisition.
Assets:Invest:STOCK -5 STOCK {2024-01-15} -
Correspondance par libellé : Les libellés offrent un moyen infaillible d'identifier un lot.
Assets:Invest:STOCK -5 STOCK {"lot-identifier"} -
Laisser le lot à la méthode d'affectation : Un ensemble vide d'accolades
{}ne nomme aucun lot, donc la méthode d'affectation du compte choisit. SousFIFO,LIFOouHIFO, c'est le lot correspondant le plus ancien, le plus récent ou le plus cher ; sous la méthode par défautSTRICT, c'est uneAmbiguousMatchErrorà moins que la réduction ne vide exactement les lots correspondants.Assets:Invest:STOCK -5 STOCK {}
Gestion des prix
Il est crucial de comprendre la différence entre la base de coût ({}) et le prix (@). Ils servent des objectifs différents et ne sont pas interchangeables.
Prix vs Coût
{cost}: Définit le coût d'acquisition d'un actif. Il fait partie du lot d'inventaire lui-même et est utilisé pour affecter les réductions et calculer les plus-values.@ price: Une annotation qui enregistre un prix de marché au moment d'une transaction. Elle est utilisée pour les conversions de devises ou pour noter la valeur de marché à une date particulière.
Voici les trois scénarios :
-
Annotation de prix (conversion) : Utilisez
@pour convertir d'une devise à une autre.Assets:Forex 1000 USD @ 0.85 EUR -
Base de coût (acquisition) : Utilisez
{}lors de l'achat d'un actif pour établir son coût.Assets:Invest 10 STOCK {100.00 USD} -
Les deux (vente avec enregistrement du prix) : Lors de la vente d'un actif, utilisez
{}pour identifier le lot vendu et@pour enregistrer le prix de vente. Cela permet un calcul automatisé des plus-values.Assets:Invest -10 STOCK {100.00 USD} @ 105.00 USDCette écriture vend 10
STOCKdu lot qui a coûté 100,00 USD chacun, à un prix de vente de 105,00 USD chacun.
Une directive price autonome fournit des données de référence pour l'évaluation de marché. Live Prices peut maintenir ces directives pour les actifs pris en charge dans les registres hébergés. Un rafraîchissement laisse vos lots, votre méthode d'affectation, vos coûts d'acquisition et vos produits de vente enregistrés inchangés.
Règles d'utilisation du prix
- Les annotations de prix (
@) **n'**affectent pas le lot qui est affecté. La correspondance des lots est gérée exclusivement par la base de coût ({}) et la méthode d'affectation du compte. - Le symbole
@est utilisé uniquement pour :
- Les conversions de devises.
- L'enregistrement de la valeur de marché d'un actif au moment d'une transaction.
- La fourniture du prix de vente pour les calculs de plus-values.
Configuration
Vous pouvez configurer les méthodes d'affectation globalement ou par compte.
Méthode d'enregistrement globale
Vous pouvez définir une méthode d'affectation par défaut pour l'ensemble de votre fichier Beancount en utilisant la directive option.
option "booking_method" "STRICT"Les valeurs acceptées sont "STRICT" (la valeur par défaut lorsque vous ne définissez rien), "STRICT_WITH_SIZE", "NONE", "FIFO", "LIFO", "HIFO" et "AVERAGE". Toute autre chaîne est rejetée au chargement avec Error for option 'booking_method'. "AVERAGE" est acceptée ici et sur open, mais affecter une réduction sous cette méthode échoue, comme le montre la section AVERAGE ci-dessus.
Surcharge par compte
Il est souvent utile d'avoir différentes méthodes pour différents comptes. Par exemple, vous pourriez vouloir FIFO pour un compte de retraite mais STRICT pour un compte de courtage imposable afin de vous assurer de vendre des lots fiscaux spécifiques. Vous pouvez définir la méthode d'affectation lors de l'ouverture du compte.
2024-01-01 open Assets:Retirement:401K "FIFO"
2024-01-01 open Assets:Taxable:Stock "STRICT"Meilleures pratiques
-
Organisation de l'inventaire : Pour garder votre registre propre et simple, il est vivement recommandé d'utiliser des comptes séparés pour chaque marchandise unique que vous détenez, et de contraindre chacun à cette marchandise sur sa directive
open.; BIEN : comptes séparés par marchandise, chacun contraint à une seule 2024-01-01 open Assets:Invest:VTSAX VTSAX 2024-01-01 open Assets:Invest:VFIAX VFIAXÉvitez de mélanger différentes actions ou fonds dans le même compte, car cela complique la gestion des stocks. La liste de marchandises sur
openfait que Beancount rejette une écriture égarée au lieu de mélanger silencieusement deux inventaires. -
Gestion des lots :
-
Utilisez des libellés significatifs pour les lots, en particulier pour des transactions spécifiques comme la récolte de moins-values fiscales ou les attributions d'actions aux employés.
Assets:Invest:STOCK 10 STOCK {100.00 USD, "tax-loss-harvest-2024"} -
Documentez vos transactions avec des commentaires. Cela rend votre registre plus facile à lire et à comprendre plus tard.
Assets:Invest:STOCK -10 STOCK {100.00 USD} @ 110.00 USD ; Gain : 10 %
- Débogage : Si vous rencontrez des erreurs ou un comportement inattendu, Beancount fournit des outils pour inspecter l'état de votre inventaire.
-
Examiner l'état de l'inventaire : Utilisez
bea doctor context main.beancount 42pour inspecter la transaction à la ligne 42, y compris ses écritures et les soldes des comptes affectés. Remplacez le nom de fichier et le numéro de ligne par la transaction que vous souhaitez inspecter.Remplacez
<LINENO>par le numéro de ligne juste après une transaction pour voir son effet. -
Vérifier la correspondance des lots : L'outil
bea checkvalide l'ensemble de votre fichier. Il détectera toute erreur d'affectation, telle que des correspondances de lots ambiguës en modeSTRICT.