From 58492c67eff6043ec1b3a8c1abae314c6cf1d18a Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Mon, 15 Apr 2024 20:10:39 -1000 Subject: [PATCH] ;doc: move dev docs, mockups, investment features pages from site repo --- doc/MOCKUPS.md | 559 ++++++++++++++++++++++++++ doc/dev.md | 39 ++ doc/investment-accounting-features.md | 43 ++ 3 files changed, 641 insertions(+) create mode 100644 doc/MOCKUPS.md create mode 100644 doc/dev.md create mode 100644 doc/investment-accounting-features.md diff --git a/doc/MOCKUPS.md b/doc/MOCKUPS.md new file mode 100644 index 000000000..cb93c9582 --- /dev/null +++ b/doc/MOCKUPS.md @@ -0,0 +1,559 @@ +# Mockups + +
+ + +
+ +Mockups, draft docs and notes exploring possible future features. +See also + +## Lot terminology + +Some investment-related terminology, as we use it here and in the PTA world: + +- "Investment" - something whose value fluctuates while you hold it. + +- Acquiring, disposing - receiving and getting rid of investments, whether by purchase, + exchange, gift, stock options.. + +- Augmenting, reducing - the same thing; terminology used in Beancount docs. + Most often the investment is an asset and acquiring/augmenting increases a positive balance, + but with other kinds of investments (options..) it might decrease a negative balance. + Acquiring/augmenting increases your exposure (risk), disposing/reducing reduces it. + +- Lot - a quantity of an investment purchased at a specific time and cost. + It may also have descriptive note attached. + With many investments, lots must be tracked individually for tax reporting. + +- Cost basis - a lot's acquisition cost. More generally, the combination of acquisition + time, cost, and note if any. + +- Capital gain/loss - your net profit or loss arising from the change in value of an investment + since you acquired it. Some times abbreviated as "gains" in these docs. + While you are holding the investment, you have unrealised gains, which fluctuate along with the market value. + Once you dispose of it, you have realised gains. + Capital gain/loss has tax consequences. + +- Reduction strategy, lot selection - the order in which lots are reduced, eg when you are selling a stock + or gifting some cryptocurrency, which ones do you reduce first ? + Common strategies: FIFO (first in first out), LIFO (last in first out), + and Specific Order (a custom order, which should be recorded). + The reduction strategy affects capital gains now and later, and has tax consequences. + Sometimes you can choose it, at other times it is mandated by the tax authorities. + +## Lot ideas + +2023-01 Some examples/brainstorming of lot notations and functionality. + +I believe one could emulate most of ledger/beancount's lot tracking/selection with simpler syntax - +just @, with less or no need for {} (curly brace syntax). + +### Explicit lot accounts + +Eg here, using explicit subaccounts to track lots, no {} is needed.: + +```journal +2022-01-01 buy at 10 + assets:aaa:_20220101 10 AAA @ $10 + assets:cash $-100 + +2022-02-01 buy at 12 + assets:aaa:_20220201 10 AAA @ $12 + assets:cash $-120 + +2022-03-01 sell at 20 + assets:aaa:_20220101 -10 AAA @ $10 ; original cost basis + assets:aaa:_20220201 -5 AAA @ $12 + assets:cash $300 + revenues:gains $-140 +``` + +### Inferring cost from lot account + +Assuming each lot subaccount holds only one lot, the cost basis could be recalled automatically when selling, though it's less readable: + +```journal +2022-01-01 buy at 10 + assets:aaa:_20220101 10 AAA @ $10 + assets:cash $-100 + +2022-02-01 buy at 12 + assets:aaa:_20220201 10 AAA @ $12 + assets:cash $-120 + +2022-03-01 sell at 20 + assets:aaa:_20220101 -10 AAA ; @ $10 implied + assets:aaa:_20220201 -5 AAA ; @ $12 implied + assets:cash $300 + revenues:gains $-140 +``` + +### Cost in lot account name + +Cost basis could also be indicated in the subaccount name: + +```journal +2022-01-01 buy at 10 + assets:aaa:_20220101_$10 10 AAA @ $10 + assets:cash $-100 + +2022-02-01 buy at 12 + assets:aaa:_20220201_$12 10 AAA @ $12 + assets:cash $-120 + +2022-03-01 sell at 20 + assets:aaa:_20220101_$10 -10 AAA ; @ $10 implied, now more clear + assets:aaa:_20220201_$12 -5 AAA + assets:cash $300 + revenues:gains $-140 +``` + +### Automatic lot accounts + +Lot subaccounts could be created automatically, without having to write them; and could be used to select lots when withdrawing: + +```journal +2022-01-01 buy at 10 + assets:aaa 10 AAA @ $10 ; creates _20220101_$10 subaccount + assets:cash $-100 + +2022-02-01 buy at 12 + assets:aaa 10 AAA @ $12 ; creates _20220201_$12 + assets:cash $-120 + +2022-03-01 sell at 20 + assets:aaa:_20220201_$12 -10 AAA ; select lot by subaccount + assets:aaa:_20220101_$10 -5 AAA ; LIFO order here + assets:cash $300 + revenues:gains $-130 +``` + +### Implicit lots + +Or there could be no lot subaccounts, just lots tracked implictly by the tool, with special commands to view them, as in ledger/beancount: + +```journal +2022-01-01 buy at 10 + assets:aaa 10 AAA @ $10 ; creates an implicit lot + assets:cash $-100 + +2022-02-01 buy at 12 + assets:aaa 10 AAA @ $12 ; view lots with bal --lots + assets:cash $-120 +``` + +### Reduction strategy + +Whether explicit, automatic or implicit, lots could be selected automatically according to some reduction strategy, +specified eg with a tag: + +```journal +2022-03-01 sell at 20, FIFO + assets:aaa -15 AAA ; reduce lots FIFO by default + assets:cash $300 + revenue:gains ; $-140 calculated +``` + +```journal +2022-03-01 sell at 20, LIFO + assets:aaa -15 AAA ; reduce:LIFO + assets:cash $300 + revenue:gains ; $-130 calculated +``` + +The above are easy to enter but less informative and hard to calculate by eye; you could use the tool to convert to a more explicit entry: + +```journal +2022-03-01 sell at 20, FIFO + assets:aaa -10 AAA @ $10 + assets:aaa -5 AAA @ $12 + assets:cash $300 + revenue:gains $-140 +``` + +```journal +2022-03-01 sell at 20, LIFO + assets:aaa -10 AAA @ $12 + assets:aaa -5 AAA @ $10 + assets:cash $300 + revenue:gains $-130 +``` + +### Lot selection syntax + +If lots are implicit, ie there are no subaccounts by which to select them, +some special syntax is needed to allow identifying them individually by cost, date, and/or note. +This could be {}, [], tags, or something new. Eg: + +```journal +2022-03-01 sell at 20, taking 3 alternately from each lot + assets:aaa -3 AAA {@ $10} ; lot 1 + assets:aaa -3 AAA {2022-02-01} ; lot 2 + assets:aaa -3 AAA {buy at 10} ; lot 1 + assets:aaa -3 AAA {@ $10, 2022-02-01, buy at 12} ; lot 2 + assets:aaa -3 AAA ; lot-date:2022-01-01, lot-cost:$10, lot-note:buy at 10, (lot 1) + assets:cash $300 + revenue:gains $-138 +``` + +### Use of curly braces + +I don't see the need to use {} as much as Ledger/Beancount do. +In particular, Ledger/Beancount's {} syntax allows creating a lot with a cost basis +different from what it cost you in the transaction acquiring it. +What is the real need for this, and how often is it needed ? + +It's not needed eg when buying a commodity at a rate different from the market rate; you can do: + +```journal +2022-01-01 receive AAA, currently worth $10, with effective cost to us of ~$11 because of fees + revenues:usd -10 AAA @ $10 + expenses:fees 1 AAA + equity:basis adjustment -1 AAA + assets:cash 9 AAA @ $11.111 + +commodity $0.00 ; help hledger balance the above +``` + +### Investments vs one-time transactions + +Not yet mentioned: some commodities/balances fluctuate in value while +you hold them (eg an investment) and others are a one-time conversion +(eg buying foreign currency at the airport). + +@ can be used for both of these, it's essentially a matter of which cost you calculate with when disposing: + +```journal +2022-01-01 buy at 10, hold with fluctuating value + assets:aaa 10 AAA @ $10 ; today's acquisition cost + assets:cash $-100 + +2022-03-01 sell at 20, with capital gain/loss + assets:aaa -10 AAA @ $10 ; original acquisition cost + assets:cash $200 + revenue:gains $-100 +``` + +```journal +2022-01-01 exchange SEK for USD, one-time conversion + assets:cash -100 SEK + assets:cash 10 USD @ 10 SEK ; today's conversion cost + +2022-03-01 exchange back to SEK, one-time conversion + assets:cash -10 USD @ 11 SEK ; today's conversion cost + assets:cash 110 SEK +``` + +I believe @ and {} were intended to/can/do distinguish between these. +If using only @ there needs to be some other mechanism to indicate fluctuating value vs one-time conversion, or so it seems - +eg an annotation on the transaction, the account, or the commodity. + + + +## Price syntax + +### In Ledger and hledger + +- In the journal, a `P DATE COMMODITY AMOUNT` directive some commodity's market price in some other commodity on DATE. + (A timestamp may be added, but is ignored.) + +- In a posting, `AMT @ UNITPRICE` declares the per-unit price that was used to convert AMT into the price's commodity. + Eg: `2A @ 3B` records that 2A was posted, in exchange for 6B. + +- `@@ TOTALPRICE` is another form of `@`, sometimes more convenient. + Eg: `2A @@ 5.99B` records that 2A was posted in exchange for 5.99B. + +### In Ledger + +- `@ UNITPRICE` + Any use of `@` also generates an implicit `P` directive. + Eg: + + 2019/1/1 + a 2A @ 3B + b + + in the journal is equivalent to writing + + 2019/1/1 + a 2A @ 3B + b + + P 2019/1/1 A 1.5B + +- `{UNITPRICE}` + +- `{=FIXEDUNITPRICE}` + +The following are variants of the above; they work the same way except +that you write the total instead of the unit price: + +- `@@ TOTALPRICE` +- `{{TOTALPRICE}}` +- `{{=FIXEDTOTALPRICE}}` + +### In hledger + +- `@` does not generate a market price +- `{}` and `{=}` are ignored + +## Capital gains + +### A model for capital gains + +Capital gain/loss (when the value of assets you hold increases/decreases +due to market price fluctuations) - is an important topic, since it can +generate tax liability. + +Here is a description of how it works, intended for both users and +builders of accounting software (especially, plain text accounting +software). (I'm a software engineer, not an accountant. In places there +may be better accounting terms I'm not familiar with yet.) + +- lots/units - + A quantity of some commodity, acquired at a certain price on a certain date, + is called a *lot*, or *unit*. (I'm not sure which is the most standard term. Using lot for now.) + +- Since you might have purchased the lot on a stock exchange, received it as a gift, + or something else, we'll call this event *lot acquisition*, on the *acquisition date*. + +- Later you might sell the lot for cash, or exchange it for something else, or gift it. + We'll call this *lot disposal*. + +- You might have paid current market value for the lot, or you might have + paid less or more than that. We'll call what you paid/exchanged the *acquisition amount*. + +- I think the acquisition amount is also called the *basis* or *cost basis*. + Or possibly the current market value is the basis, regardless of what you paid. + Perhaps it depends. To be clarified. The basis at which you acquired a lot is important. + +- After acquisition, while you are still holding the lot, if the market value of that commodity goes up (or down), + your potential return from disposing of the lot increases (or decreases). + This is known as *capital gain (or loss)* (we'll just call it "capital gain"). + At this stage, the gain is only "on paper", so it is called *unrealised capital gain* (URG). + This is not considered revenue, or taxable. + +- It's common to be holding multiple lots, perhaps many, even in a single account. + Eg, say you buy a small amount of some stock or cryptocurrency each week. + Each purchase adds a new lot to your assets. We'll call this a *multi-lot balance*, or *balance*. + +- URG is calculated for a lot at a certain point in time. + Likewise for a multi-lot balance. + +- realised capital gain + +- lot withdrawal strategies + +- specific identification + +### Capital gains in hledger + +- postings can have multiple commodities and multiple prices; each of + these parts is a deposit or withdrawal to the account + +- + ```haskell + -- | Given a list of amounts all in the same commodity, interprets them + -- as a sequence of lot deposits (the positive amounts) and withdrawals + -- (the negative amounts), and applies them in order using the FIFO + -- strategy for withdrawals, then returns the resulting lot balance (as + -- another, shorter, list of amounts). + sumLots :: [Amount] -> [Amount] + ``` +## Ease of getting started + +What could make getting started substantially easier ? + +- Official CI-generated binaries for all major platforms +- Builtin access to docs in web format + +## Web docs + +Provide the embedded user manuals as HTML also. Eg: + +- hledger help --html # temporary static html files +- hledger help --web # serve from local hledger-web instance if installed +- hledger help --site # on hledger.org +- hledger-ui ? h/w/s # same as above +- hledger-web -> help # served from hledger-web + +## Config file + +Name: hledger.conf (and possibly ~/.hledger.conf as well). + +- easy to say and spell +- good highlighting support in editors + +Format: toml/ini-ish format, but customised for our needs (if necessary). + +Example: +``` +# hledger.conf + +[defaults] +# Set options/arguments to be always used with hledger commands. +# Each line is: HLEDGERCMD ARGS, or: hledger ARGS +hledger -f hledger.journal +bal -M --flat -b lastmonth +ui --watch +web -V +help --html + +[commands] +# Define aliases for custom hledger commands. +# Each line is: CMDALIAS = HLEDGERCMD ARGS +assets = bal -M ^assets\b +liab = bal -M ^liabilities\b + +# Or use colon, like make ? +bs2: bs --no-total date:thisyear + +# Or just whitespace, like hledger csv rules ? +smui ui ^sm\b + +# Allow arbitrary shell commands ? +2019: hledger -f 2019.journal +jstatus: git status -sb -- *.journal + +# Allow multi-command shell scripts, with optional help string ? +bsis: + "Show monthly balance sheet and income statement" + hledger bs -M + echo + hledger is -M + echo +``` + +Loaded: + +- at startup +and ideally: +- hledger-web: on each page load if changed, like journals +- hledger-ui --watch: on change, like journals + +Location: + +Search a number of locations in order. +Values from multiple files are combined, with later files taking precedence. + +User config file: should it be "modern" ~/.config/hledger.conf or "old/simple" ~/.hledger.conf ? +One or the other may be preferred/easier/more portable. +If we support both, should it be one or the other, or both ? + +Parent directory config files: we'd probably like to recognise config files in parent directories. +How far up should we look - +to the root dir ? +to the user's home dir ? and if not under the user's home dir, don't look up at all ? +to the nearest VCS working directory root ? + +This would be the simplest comprehensive scheme: use all of + +1. ~/.config/hledger.conf +2. ~/.hledger.conf +3. hledger.conf in all directories from / down to the current directory + +Eg: running hledger in /home/simon/project/finance would combine any of the following which exist: + +- ~/.config/hledger.conf +- ~/.hledger.conf +- /hledger.conf +- /home/hledger.conf +- /home/simon/hledger.conf +- /home/simon/project/hledger.conf +- /home/simon/project/finance/hledger.conf + + + +## 1353-related upgrade notes + +*Cf [#1353](https://github.com/simonmichael/hledger/issues/1353)* + +User-visible changes when going from 1.20.4 to master: + +| | | +|----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `-B/--cost` | Now a primary flag. | +| `--value=cost` | Now an alias for `-B/--cost`, and deprecated. | +| `--value=cost,COMM` | No longer supported, suggests `-B --value=X,COMM`. | +| `--value=end` | With `--change`, shows change of end values instead of end value of change.
`--value=then` approximates and hopefully is preferable to the old behaviour. | + +Meaning of the cost/valuation short flags in master: + +| Short flag | Equivalent to | +|-----------------------|----------------------------| +| `-B` | `--cost` | +| `-V` | `--value=then` (soon) | +| `-X/--exchange COMM` | `--value=then,COMM` (soon) | + +## Valuation examples + +Minimal example for testing some valuation behaviours discussed in +[#1353](https://github.com/simonmichael/hledger/issues/1353). +See [Balance report valuation](#balance-report-valuation) above. + +```journal +; every ~15 days: one A is purchased, and A's market price in B increases. + +2020-01-01 + (a) 1 A + +2020-01-15 + (a) 1 A + +2020-02-01 + (a) 1 A + +2020-02-15 + (a) 1 A + +P 2020-01-01 A 1 B +P 2020-01-15 A 2 B +P 2020-02-01 A 3 B +P 2020-02-15 A 4 B +``` + +Old `balance --change --value=end` behaviour: shows period-end value of period's balance change: + +```cli +$ hledger-1.20.4 bal -M --value=end # --change is the default +Balance changes in 2020-01-01..2020-02-29, valued at period ends: + + || Jan Feb +===++========== + a || 4 B 8 B +---++---------- + || 4 B 8 B +``` + +New `balance --change --value=end` behaviour in master: shows change between period-end-valued period-end balances: + +```cli +$ hledger-master bal -M --value=end +Period-end value changes in 2020-01-01..2020-02-29: + + || Jan Feb +===++=========== + a || 4 B 12 B +---++----------- + || 4 B 12 B +``` + +`balance --value=then` is also supported in master: shows sum of postings' then-values in each period: + +```cli +$ hledger-master bal -M --value=then +Balance changes in 2020-01-01..2020-02-29, valued at posting date: + + || Jan Feb +===++========== + a || 3 B 7 B +---++---------- + || 3 B 7 B +``` + + diff --git a/doc/dev.md b/doc/dev.md new file mode 100644 index 000000000..961054d84 --- /dev/null +++ b/doc/dev.md @@ -0,0 +1,39 @@ +# Developer docs + +Contributor, developer, and maintainer docs. +These aim to describe and communicate the structure, processes and +workflows of the hledger project - "the machine that makes the machine". + +These mostly are kept in doc/ in the main hledger repo, +and then symlinked into the hledger_site repo for rendering on hledger.org. + +- [README](dev-README.md) +- [ROADMAP](ROADMAP.md) + +- [ACHIEVEMENTS](ACHIEVEMENTS.md) +- [BENCHMARKS](BENCHMARKS.md) +- [CHANGELOGS](CHANGELOGS.md) +- [CODE](CODE.md) +- [COMMITS](COMMITS.md) +- [CONTRIBUTING](CONTRIBUTING.md) +- [CREDITS](CREDITS.md) +- [DECISIONS](DECISIONS.md) +- [DEVWORKFLOWS](DEVWORKFLOWS.md) +- [DOCS](DOCS.md) +- [ERRORS](ERRORS.md) +- [EXAMPLES](EXAMPLES.md) +- [FILES](FILES.md) +- [FINANCE](FINANCE.md) +- [Investment Accounting Feature Ladder](investment-accounting-features.md) +- [ISSUES](ISSUES.md) +- [LINKS](LINKS.md) +- [MAKE](MAKE.md) +- [MOCKUPS](MOCKUPS.md) +- [PULLREQUESTS](PULLREQUESTS.md) +- [REGRESSIONS](REGRESSIONS.md) +- [RELEASING](RELEASING.md) +- [REPOS](REPOS.md) +- [SHAKE](SHAKE.md) +- [TESTS](TESTS.md) +- [VERSIONNUMBERS](VERSIONNUMBERS.md) + diff --git a/doc/investment-accounting-features.md b/doc/investment-accounting-features.md new file mode 100644 index 000000000..8d73e1242 --- /dev/null +++ b/doc/investment-accounting-features.md @@ -0,0 +1,43 @@ +# Investment Accounting Feature Ladder + +
+ + +
+ +When trying to understand or build accounting software for investment, +for example in the context of Plain Text Accounting, +things get complicated rather fast. +The following ladder can be helpful when evaluating or building +investment-related features in accounting software. + +(hledger users: this is not documentation for hledger; +if you're looking for that, try [Cookbook > Investing and trading](cookbook.md#investing-and-trading).) + +Each rung of the ladder adds a new concept or feature, describing: + +- one small increment to user-visible functionality +- any new accounting/investing concepts needed +- any new simplifying assumptions and scope +- any new changes known to be needed in internal capabilities + +This is a start, suggestions welcome in #hledger or #plaintextaccounting matrix chats. + +## Assets +Track asset transactions and balances. +Initial assumptions/constraints: +assets are cash (in a single base currency) or simple investment commodities. +(In this doc we'll call those "cash" and "commodities" respectively.) + +## Asset costs +Track purchase costs, in the base currency, of assets. An asset balance can have more than one cost. Allow reporting total cost of assets. + +## Asset values +Track fluctuating market prices for individual commodities. Allow reporting current market value of asset balances. + +## Report unrealised gains +Allow reporting the unrealised gain or loss of asset balances. +Unrealised gains are the increase (gain) or decrease (loss) of the value of assets you are holding, since you acquired them. The difference between current value and your original cost. + +## Report realised gains +...