lib: roi now supports --value/--infer-value
This commit is contained in:
parent
9869624c5c
commit
fc32f22f86
@ -1,6 +1,7 @@
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE ParallelListComp #-}
|
||||
{-# LANGUAGE TemplateHaskell #-}
|
||||
{-# LANGUAGE RecordWildCards #-}
|
||||
{-|
|
||||
|
||||
The @roi@ command prints internal rate of return and time-weighted rate of return for and investment.
|
||||
@ -18,6 +19,7 @@ import Data.Time.Calendar
|
||||
import Text.Printf
|
||||
import Data.Function (on)
|
||||
import Data.List
|
||||
import Data.Maybe (fromMaybe)
|
||||
import Numeric.RootFinding
|
||||
import Data.Decimal
|
||||
import qualified Data.Text as T
|
||||
@ -55,12 +57,21 @@ data OneSpan = OneSpan
|
||||
|
||||
|
||||
roi :: CliOpts -> Journal -> IO ()
|
||||
roi CliOpts{rawopts_=rawopts, reportspec_=rspec} j = do
|
||||
roi CliOpts{rawopts_=rawopts, reportspec_=rspec@ReportSpec{rsOpts=ReportOpts{..}}} j = do
|
||||
d <- getCurrentDay
|
||||
-- We may be converting posting amounts to value, per hledger_options.m4.md "Effect of --value on reports".
|
||||
let
|
||||
tvalue t@Transaction{..} = t{tpostings=map pvalue tpostings}
|
||||
where
|
||||
pvalue = maybe id
|
||||
(postingApplyValuation (journalPriceOracle infer_value_ j) (journalCommodityStyles j) periodlast (rsToday rspec))
|
||||
value_
|
||||
where
|
||||
periodlast = fromMaybe (rsToday rspec) $ reportPeriodOrJournalLastDay rspec j
|
||||
let
|
||||
ropts = rsOpts rspec
|
||||
showCashFlow = boolopt "cashflow" rawopts
|
||||
prettyTables = pretty_tables_ ropts
|
||||
prettyTables = pretty_tables_
|
||||
makeQuery flag = do
|
||||
q <- either usageError (return . fst) . parseQuery d . T.pack $ stringopt flag rawopts
|
||||
return . simplifyQuery $ And [queryFromFlags ropts{period_=PeriodAll}, q]
|
||||
@ -69,14 +80,14 @@ roi CliOpts{rawopts_=rawopts, reportspec_=rspec} j = do
|
||||
pnlQuery <- makeQuery "pnl"
|
||||
|
||||
let
|
||||
trans = dbg3 "investments" $ jtxns $ filterJournalTransactions investmentsQuery j
|
||||
trans = dbg3 "investments" $ map tvalue $ jtxns $ filterJournalTransactions investmentsQuery j
|
||||
|
||||
journalSpan =
|
||||
let dates = map transactionDate2 trans in
|
||||
DateSpan (Just $ minimum dates) (Just $ addDays 1 $ maximum dates)
|
||||
|
||||
requestedSpan = periodAsDateSpan $ period_ ropts
|
||||
requestedInterval = interval_ ropts
|
||||
requestedSpan = periodAsDateSpan period_
|
||||
requestedInterval = interval_
|
||||
|
||||
wholeSpan = spanDefaultsFrom requestedSpan journalSpan
|
||||
|
||||
@ -265,4 +276,6 @@ unMix :: MixedAmount -> Quantity
|
||||
unMix a =
|
||||
case (unifyMixedAmount $ mixedAmountCost a) of
|
||||
Just a -> aquantity a
|
||||
Nothing -> error' $ "Amounts could not be converted to a single cost basis: " ++ show (map showAmount $ amounts a)
|
||||
Nothing -> error' $ "Amounts could not be converted to a single cost basis: " ++ show (map showAmount $ amounts a) ++
|
||||
"\nConsider using --value to force all costs to be in a single commodity." ++
|
||||
"\nFor example, \"--value cost,<commodity> --infer-value\", where commodity is the one that was used to pay for the investment."
|
||||
|
||||
@ -230,13 +230,35 @@ hledger -f- roi -p 2019-11
|
||||
hledger -f- roi -p 2019-11 --inv Investment --pnl PnL
|
||||
<<<
|
||||
2019/11/01 Example
|
||||
Assets:Checking -1 A
|
||||
Assets:Checking -100 A
|
||||
Investment 10 B
|
||||
|
||||
2019/11/02 Example
|
||||
Investment -10 B @@ 1 A
|
||||
Assets:Checking 12 A
|
||||
Investment -10 B @@ 100 A
|
||||
Assets:Checking 101 A
|
||||
Unrealized PnL
|
||||
>>>2
|
||||
hledger: Amounts could not be converted to a single cost basis: ["10 B","-10 B @@ 1 A"]
|
||||
hledger: Amounts could not be converted to a single cost basis: ["10 B","-10 B @@ 100 A"]
|
||||
Consider using --value to force all costs to be in a single commodity.
|
||||
For example, "--value cost,<commodity> --infer-value", where commodity is the one that was used to pay for the investment.
|
||||
>>>=1
|
||||
|
||||
# 10. Forcing valuation via --value
|
||||
hledger -f- roi -p 2019-11 --inv Investment --pnl PnL --value cost,A --infer-value
|
||||
<<<
|
||||
2019/11/01 Example
|
||||
Assets:Checking -100 A
|
||||
Investment 10 B
|
||||
|
||||
2019/11/02 Example
|
||||
Investment -10 B @@ 100 A
|
||||
Assets:Checking 101 A
|
||||
Unrealized PnL
|
||||
>>>
|
||||
+---++------------+------------++---------------+----------+-------------+-----++----------+-------+
|
||||
| || Begin | End || Value (begin) | Cashflow | Value (end) | PnL || IRR | TWR |
|
||||
+===++============+============++===============+==========+=============+=====++==========+=======+
|
||||
| 1 || 2019-11-01 | 2019-11-30 || 0 | -1 | 0 | 1 || 3678.34% | 0.00% |
|
||||
+---++------------+------------++---------------+----------+-------------+-----++----------+-------+
|
||||
|
||||
>>>=0
|
||||
|
||||
Loading…
Reference in New Issue
Block a user