On Sat, Mar 19, 2016 at 8:33 PM, Jakob Mattsson <jakob.matts...@gmail.com> wrote:
> I spend money in two currencies, as I line and work in two places. I don't > want expenses in any of these to be revalued over time in terms of the > other and I don't want ledger to report a capital gain on transactions > between those two currencies. For this, the --historical flag makes perfect > sense. > Totally agree. I'm in a similar situation - multiple countries and currencies - and the correct treatment of currencies is as you describe. For actual investments, like my stock and my property, I very much want the > opposite. These should be revalued over time and there's a clean capital > gain/loss on every such transaction. > > The section in the docs called "complete control over commodity prices" > (or something like that) lists a lot of different ways to work with this, > many of which would solve my use case, but I can't get any of them to work > as I don't seem to have understood the valuation-function and the > market-function properly. > AFAICT the source of the problem here is that Ledger does not treat currency conversions differently than commodities which have a cost basis (e.g. stocks). I think this is an unfortunate design choice, which puts the onus on the user to dispatch between reporting currencies and stocks separately, because currencies retain a kind of cost basis from the time of their conversion. Beancount distinguishes between currency conversions and stock purchases explicitly, based on whether the units have a cost basis declared on a posting or not. The result of a conversion, after checking that a transaction balances with the given conversion rate, is just a simple deposit in another commodity, without any memory of the converted commodity's rate of conversion. For example, if you convert dollars into Euros, the resulting deposit in the Euro account is....well, just euros. >From there on, there's never a need to identify that this particular Euro in that account was one converted at that particular rate. The balances in such a system are of two kinds: - Simple commodities with no cost basis; these are your currencies. By default they can reported as themselves, with no conversion. - Commodities held with a cost basis value are usually most conveniently reported at their market value by using the current market price x the number of units held. For example, you might compute balances and obtain a list of balances like this: Assets:SBS:Checking 430.00 CHF Assets:DB:Checking 234.30 EUR Assets:BofA:Checking 600.45 USD Assets:Schwab:Investments 30 MSFT {93.40 USD} Assets:Schwab:Investments 20 MSFT {97.10 USD} Assets:Schwab:Investments 40 AAPL {182.11 USD} The first three are in simple commodities with no cost basis. The next two, are two lots of the same commodity (MSFT) at different cost basis. The final one is a single lot of another commodity. This is a perfectly fine report in itself. But say the current prices of the assets held at cost are: 2016-03-20 price MSFT 99.87 USD 2016-03-20 price AAPL 210.11 USD A slightly better report would convert those to their currency value (in this case USD): Assets:SBS:Checking 430.00 CHF Assets:DB:Checking 234.30 EUR Assets:BofA:Checking 600.45 USD Assets:Schwab:Investments 4993.50 USD Assets:Schwab:Investments 8404.40 USD Note that the cost basis is ignored here, and that the market prices were used. Also note that from an implementor's point-of-view it's very clear which balances should be converted or not. Furthermore, after obtaining the values of each of these in currencies, you might request a report to convert all of them to a single common reporting currency at the current rate to compare them. Say the current exchange rates are: 2016-03-20 price CHF 1.0342 USD 2016-03-20 price EUR 1.1323 USD You would obtain this result, all in USD: Assets:SBS:Checking 444.71 USD Assets:DB:Checking 265.29 USD Assets:BofA:Checking 600.45 USD Assets:Schwab:Investments 4744.00 USD Assets:Schwab:Investments 7284.40 USD There should never be a need to specify different dates for different commodities. This makes no sense to me. All we have is at a particular point in time, a list of commodities and their corresponding prices, and possible converted values, all rates at the same date. The system should be able to produce such reports automatically. Being able to distinguish between commodities held at cost and ones without a cost makes it possible to produce sensible reports automatically. Beancount balance reports have a few remaining flaws: (1) they do not currently use the market value to render the value of a lot directly; a plugin is used to insert the unrealized gains as transactions to produce the correct value; it works, and this has the advantage of automatically inserting the unrealized gains portion on the income statement, but I'd prefer to be more explicit about it and leave that to the reporting space (not sure), and (2) the conversion to a single reporting currency is not implemented (and people want it). Those reports stand to get improved a bit. But the more important issue to me is that the underlying representation si coherent with how these balances are represented in the real world and nothing in the representation prevents us from addressing the reporting shortfalls described in the previous paragraph. Your bank never maintains the rate of conversion of your deposited currency. And unless the gains are significant and the commodities are used for leveraged trading, noone bothers tracking and reporting capital gains on currency conversions on their tax filing. I've suggested in the past that Ledger adopt the same distinction. AFAICT Ledger's currency conversion syntax (@) and cost basis syntax ({}) are undifferentiated, they have the same effect. I don't understand how their semantics differ, and when I've used it, I've found it confusing that cost bases on converted currencies appear in some reports. I hope this helps clarify this discussion around market value. It doesn't have to be so complicated: there's a date, and a single set of conversion rates at a particular point in time. Then there's a choice about whether lots are converted to their currency value and perhaps further converted to another currency. (*) If it's needed to deal with gains resulting from currency conversions, the Trading Accounts (search the mailing-list for a link) method can be used; I'm already handling this automatically in Beancount but I'm planning to make this simpler and give the user more control over these by automating the insertion of Trading Accounts postings transaction by transaction. In any case, this is unlikely to be needed much. > > On Sat, 19 Mar 2016 at 22:13, Martin Blais <bl...@furius.ca> wrote: > >> Why are you trying to do this? >> Can you provide context... what's the use case? >> >> >> >> On Sat, Mar 19, 2016 at 3:58 PM, Jakob Mattsson <jakob.matts...@gmail.com >> > wrote: >> >>> Thanks, -H gives me the output I expected in this example! >>> >>> Now, the problem is that I don't want to value ALL commodities at >>> their acquisition price, only some of them. I'd like to control it per >>> commodity, per transaction or something like that. The docs makes it sound >>> like "VALUE::" should allow me to do it, but I can't seem to get it to work. >>> >> >>> On Thu, Mar 10, 2016 at 8:44 PM John Wiegley <jo...@newartisans.com> >>> wrote: >>> >>>> >>>>> Jakob Mattsson <jakob.matts...@gmail.com> writes: >>>> >>>> > The expense has clearly been computed using 1.2 rather than 1.4, >>>> which is >>>> > what I wanted, but it's 100 times too large! Why? I've been fiddling >>>> with >>>> > this for quite a while now and can't understand what is going on. >>>> >>>> I think what you want is to add --historical (or -H) to your -X report. >>>> >>>> -- >>>> John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F >>>> http://newartisans.com 60E1 46C4 BD1A 7AC1 >>>> 4BA2 >>>> >>> -- >>> >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "Ledger" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to ledger-cli+unsubscr...@googlegroups.com. >>> >> >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- >> >> --- >> You received this message because you are subscribed to a topic in the >> Google Groups "Ledger" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/ledger-cli/dc6F-HvZOyE/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> ledger-cli+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > -- > > --- > You received this message because you are subscribed to the Google Groups > "Ledger" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to ledger-cli+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- --- You received this message because you are subscribed to the Google Groups "Ledger" group. To unsubscribe from this group and stop receiving emails from it, send an email to ledger-cli+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.