weighted average in Balance Sheet (patch)
David G Hamblen
dhamblen at adelphia.net
Thu Mar 10 07:30:33 EST 2005
On Mon, 24 Jan 2005, David G Hamblen wrote:
> Christian Stimming wrote:
>
>> Derek Atkins schrieb:
>>
>>>> I usually use the "Nearest in Time" option; the weighted average is not
>>>> particularly informative. Weighted average is, however, the default; and
>>>> it appears that that it's used to determine the cost when computing the
>>>> unrealized gain. Since it's calculated using absolute values, it's not
>>>> even the correct number.
>>>
>>>
>>> Hmm, then that's definitely a bug..
>>
>> However, there is a particular reason to have "Weighted Average" the
>> default for any of the multi-currency report: GnuCash has two kinds of
>> prices. There are *explicit* prices with an entry in the Price Editor. And
>> there are *implicit* prices whenever a transaction with multiple currencies
>> is booked.
>> .........
>> Christian
>
> For the stock case, weighted average would work fine (at least for my test
> case) if the average were computed using the algebraic rather than the
> absolute values (with testing for 0/0 cases). I'm not sure I understand
> the impact on the implicit pricings. My example was buying 100 shares at $5,
> selling it at a later date at $5, and then at a still later date buying 10
> shares at $20. The weighted average appears to be calculated as
> (5*100+5*100+20*10)/(100+100+10)=$5.71/sh. I think it should be calculated
> as (5*100-5*100+20*10)/(100-100+10)=$20.00/sh. The individual prices are
> always positive, but the shares and the values can both be negative. Seems
> like this ought to work with the implicit prices as well. The gotcha in this
> is the after the second transaction I have zero shares with an undefined
> price ($0/0); so we need to test and skip the case where there's no current
> position in the asset.
>
> Dave
>
I finally got things working to my satisfaction (patches below) by
eliminating all the "gnc:numeric-abs" functions from
scm/commodity-utilities.scm (except the one's around the timepair-dates).
This created a divide-by-zero problem for commodities which I no longer
own ($0.00/0.0000 shares) which I temporarily fixed by "purchasing" 0.0001
share at $1/sh. A better(??) solution was to patch the function
"gnc:make-commodity-collector" in scm/report-utilities.scm to skip values
with a zero denominator.
I haven't done a thorough search to see where else these functions might
be used; so I don't know if this screws up the the computations with
multiple currencies.
---------------------------------------------------------------------
--- commodity-utilities.scm-src 2004-08-18 00:43:23.000000000 -0400
+++ commodity-utilities.scm 2005-03-08 11:06:20.000000000 -0500
@@ -125,10 +125,10 @@
(gnc:split-get-parent a)))
(account-comm (gnc:account-get-commodity
(gnc:split-get-account a)))
- (share-amount (gnc:numeric-abs
- (gnc:split-get-amount a)))
- (value-amount (gnc:numeric-abs
- (gnc:split-get-value a)))
+ (share-amount
+ (gnc:split-get-amount a))
+ (value-amount
+ (gnc:split-get-value a))
(transaction-date (gnc:transaction-get-date-posted
(gnc:split-get-parent a)))
(foreignlist
@@ -233,10 +233,10 @@
(gnc:split-get-parent a)))
(account-comm (gnc:account-get-commodity
(gnc:split-get-account a)))
- (share-amount (gnc:numeric-abs
- (gnc:split-get-amount a)))
- (value-amount (gnc:numeric-abs
- (gnc:split-get-value a)))
+ (share-amount
+ (gnc:split-get-amount a))
+ (value-amount
+ (gnc:split-get-value a))
(transaction-date (gnc:transaction-get-date-posted
(gnc:split-get-parent a)))
(foreignlist
@@ -547,10 +547,10 @@
(account-comm (gnc:account-get-commodity
(gnc:split-get-account a)))
;; Always use the absolute value here.
- (share-amount (gnc:numeric-abs
- (gnc:split-get-amount a)))
- (value-amount (gnc:numeric-abs
- (gnc:split-get-value a)))
+ (share-amount
+ (gnc:split-get-amount a))
+ (value-amount
+ (gnc:split-get-value a))
(tmp (assoc transaction-comm sumlist))
(comm-list (if (not tmp)
(assoc account-comm sumlist)
@@ -610,11 +610,11 @@
(map
(lambda (e)
(list (car e)
- (gnc:numeric-abs
+
(gnc:numeric-div ((cdadr e) 'total #f)
((caadr e) 'total #f)
GNC-DENOM-AUTO
- (logior (GNC-DENOM-SIGFIGS 8) GNC-RND-ROUND)))))
+ (logior (GNC-DENOM-SIGFIGS 8) GNC-RND-ROUND))))
(gnc:get-exchange-totals report-commodity end-date)))
--- report-utilities.scm-src 2004-08-18 00:43:23.000000000 -0400
+++ report-utilities.scm 2005-03-09 11:22:09.000000000 -0500
@@ -387,7 +387,8 @@
;; and add it to the alist
(set! commoditylist (cons pair commoditylist))))
;; add the value
- (gnc:numeric-collector-add (cadr pair) value)))
+ (if (not (= 0 (gnc:numeric-denom value))) ;;;dgh
+ (gnc:numeric-collector-add (cadr pair) value))) )
;; helper function to walk an association list, adding each
;; (commodity -> collector) pair to our list at the appropriate
--------------------------------------------------------------------
Dave
More information about the gnucash-devel
mailing list