Thank you Martin for the nice ideas.
I have some related questions (*underlined* to try to ease your
readability).
*First*: Here is an output example of the prices:
2017-11-20 price ETH
367.93000000000000682121026329696178436279296875 USD
2017-11-19 price EUR 1.173155 USD
2017-11-20 price GAS
23.3599999999999994315658113919198513031005859375 USD
2017-11-20 price GNT
0.2210999999999999909849890400437288917601108551025390625 USD
2017-11-20 price LTC
72.9899999999999948840923025272786617279052734375 USD
On my price source provider I have something like this at the end:
...
price = D(result[symbol][base_currency])
...
return source.SourcePrice(price, time, base_currency)
I wonder, *is there a way to limit the decimal places? *I tried with the
Python Decimal's get_context (if I remember correctly).
*Second*: In general the prices source I made seems to work, so I would
like to refactor it to a python module, so it is more maintainable and easy
to install for others to use, if needed. The big issue is *how do I use a
python package as a price source provider?*
Currently I have a file on the same folder of the beancount files called
cryptocompareusd.py and it works fine (I added to the PYTHONPATH env var),
however I have created a package using cookiecutter and the structure is as
follows:
.
├── beancount_cryptocompare
│ ├── cryptocompareusd.py
│ └── __pycache__
│ ├── cryptocompareusd.cpython-36.pyc
│ └── __init__.cpython-36.pyc
├── beancount_cryptocompare.egg-info
│ ├── dependency_links.txt
│ ├── not-zip-safe
│ ├── PKG-INFO
│ ├── requires.txt
│ ├── SOURCES.txt
│ └── top_level.txt
├── ...
├── setup.cfg
├── setup.py
I am not sure how to use the provider once on a python package. If I
install the package described with `pip install --editable .` and I `import
beancount_cryptocompare.cryptocompareusd` it works, however when I use the
namespace on the price attribute it doesn't work, example:
2017-11-19 commodity BTC
export: "Crypto:BTC"
name: "Bitcoin"
price: "USD:beancount_cryptocompare.cryptocompareusd/BTC"
*Third*: I*s there any way to parse within the `get_latest_price` of the
source.Source the external currency?* I mean the first part before the ":",
in the above example USD. (same as when using the command: `bean-price -e
USD:cryptocompareusd/ETH`).
I am using a pip egg that supports querying the price of a cryptocurrency
in another currency (USD, EUR, BTC, etc), so what I first thought is to
define multiple "price:" attributes for each currency, however I don't know
if that makes sense. I haven't yet tried that. What would be the right way
to do this?
*Fourth*: Related to the last issue, I have found a query to get the
current portfolio values using the prices:
bean-query portfolio.beancount "\
select account, convert(sum(position), 'USD') \
group by account \
order by account \
"
This works awesome as expected (thank you!):
account convert_su
----------------------------- ----------
Assets:Crypto:Exchange1:BTS 10 USD
Assets:Crypto:Exchange1:CVC 10 USD
Assets:Crypto:Exchange1:STRAT 10 USD
Assets:Crypto:Wallet1:ETH 10 USD
Assets:Crypto:Wallet1:LTC 10 USD
Assets:Crypto:Wallet2:ETH 10 USD
*Is there a way to get the "Assets:Crypto:*" sum?* Something like:
account convert_su
----------------------------- ----------
Assets:Crypto 60 USD
The more I use beancount (and I am barely scratching the surface), the more
I am amazed with the state of the art of software you created.
Congratulations indeed! Awesome contribution.
Thank you very much.
On Monday, November 20, 2017 at 11:58:29 AM UTC-2, Martin Blais wrote:
>
> If you want an overview, you can use an SQL query (using bean-query), use
> bean-web, use better: use Fava, or do like I do: export all your holdings
> to a CSV file and upload them to an existing sheet in a Google spreadsheet,
> where I have other sheets that feed upon that one and do various
> aggregations and plot graphs of pre and post tax amounts and
> exposure-per-asset-class and all that type of stuff.
>
> I have a little Makefile with these commands in it:
>
> #!/usr/bin/env make
> BEANCOUNT = <path-to-your-beancount-filename>
> ...
> upload:
> $(HOME)/beancount/experiments/upload/list_holdings.py $(BEANCOUNT)
> > $(PWD)/blais.assets.csv
> upload-to-sheets -v --docid="<your-document-id>"
> $(PWD)/blais.assets.csv:Upload
>
>
> Instead of "list_holdings.py" I could (probably) use an SQL query and
> export to CSV (haven't tried yet).
> "upload-to-sheets" comes with Beancount and replaces the contents of an
> existing sheet in a spreadsheet (in this case the "Upload" sheet).
>
> Enjoy,
>
>
>
> On Mon, Nov 20, 2017 at 6:14 AM, Vonpupp <[email protected] <javascript:>>
> wrote:
>
>> Thank you for your fast reply Martin,
>>
>> My objective by using beancount on crypto is to be able to track profit
>> and losses. Eventually I trade and I would like to be able to record that
>> also. I guess this falls into the speculative investment category. I have
>> looked up in the forum and in fact I build this test file from that.
>>
>> I could sketch a rough version of a module that is able to fetch the
>> values:
>>
>> (.env3) > $ bean-price -e USD:coinmarketcapsource/ETH --no-cache
>> 2017-11-20 price ETH
>> 358.93000000000000682121026329696178436279296875 USD
>>
>>
>> (.env3) > $ bean-price -e USD:coinmarketcapsource/NEO --no-cache
>> 2017-11-20 price NEO
>> 40.57000000000000028421709430404007434844970703125 USD
>>
>>
>> (.env3) > $ bean-price -e USD:coinmarketcapsource/GAS --no-cache
>> 2017-11-20 price GAS
>> 24.309999999999998721023075631819665431976318359375 USD
>>
>> What it is still not clear is how this ties up to have a general overview
>> of the portfolio. From what I understood on the the bean-price
>> documentation, I should be able to do something like:
>>
>> (.env3) > $ bean-price portfolio.beancount
>>
>> And expect something to happen but nothing happens. Could you please
>> point me into the right direction?
>>
>> Thank you very much.
>>
>>
>> On Monday, November 20, 2017 at 4:24:07 AM UTC-2, Martin Blais wrote:
>>>
>>> Search the mailing-list for bitcoin or BTC, you'll find related
>>> discussions.
>>>
>>> Generally the problem with tracking bitcoins with Beancount is that
>>> Bitcoins tend to be used BOTH as a speculative "investment" and as a
>>> currency (e.g., to buy things).
>>> If you want to think of it like an investment you want to track cost
>>> basis to compute returns... which makes it more difficult to use as a
>>> currency.
>>> If you use it like a currency, then you don't use cost basis but then
>>> you can't compute returns against USD (*) or your home currency.
>>> Anyhow, there's no great solution that buys you the best of both worlds.
>>> To be frank, there hasn't been much thought on making this a first-class
>>> use case, Bitcoin is still very much an experiment, and personally I think
>>> the blockchain has no future in its incarnation as a currency (but that is
>>> a much longer discussion). Beancount does work for it, but as mentioned,
>>> the best compromise is to segregate the accounts where you hold it for
>>> value speculation and the accounts where you might use it against
>>> expenses... separate accounts, one which tracks returns, the other which
>>> doesn't.
>>>
>>> As far as creating your own price fetcher, you have to use the source,
>>> there isn't much of it and it's all under here:
>>> https://bitbucket.org/blais/beancount/src/tip/beancount/prices/
>>>
>>>
>>>
>>>
>>> (*) Maybe one day I'll implement the "currency accounts" method
>>> automatically so you can have a bit of tracking of profits without
>>> explicitly entering cost basis, at least in aggregate. I mean this:
>>> http://www.mathstat.dal.ca/~selinger/accounting/tutorial.html
>>>
>>>
>>> On Sun, Nov 19, 2017 at 7:24 PM, Vonpupp <[email protected]> wrote:
>>>
>>>> Hi,
>>>>
>>>> Congratulations on beancount. I am new to it but I think it is an
>>>> amazing software, therefore I would like to take the most advantage of it.
>>>> This is actually my first message on the forum.
>>>>
>>>> I would like to use beancount with cryptocurrencies. I have may doubts
>>>> but I prefer to take one step at a time. What I would like to be able to
>>>> do
>>>> first is to be able to see the my portfolio value at the present time. For
>>>> instance, let's assume the following file:
>>>>
>>>> ; -*- mode: org; mode: beancount; coding: utf-8; fill-column: 400; -*-
>>>> ;
>>>> ; Cheatsheet
>>>> ;
>>>> https://docs.google.com/document/d/1M4GwF6BkcXyVVvj4yXBJMX7YFXpxlxo95W6CpU3uWVc/edit
>>>>
>>>> option "title" "Crypto"
>>>> option "operating_currency" "ETH"
>>>> option "operating_currency" "GAS"
>>>> option "operating_currency" "LTC"
>>>> option "operating_currency" "NEO"
>>>>
>>>> plugin "beancount.plugins.book_conversions"
>>>> "Assets:Crypto:ETH,Income:Capital-gains"
>>>>
>>>> ;* Equity
>>>> ;2017-11-01 open Equity:Opening-Balances
>>>>
>>>> * Account declarations
>>>> ; Account1
>>>> 2017-08-18 open Assets:Crypto:ETH:Account1 ETH
>>>> 2017-08-18 open Assets:Crypto:LTC:Account1 LTC
>>>> ; Account2
>>>> 2017-08-18 open Assets:Crypto:ETH:Account2 ETH
>>>> ; Exchange
>>>> 2017-08-18 open Assets:Crypto:GAS:Exchange GAS
>>>> 2017-08-18 open Assets:Crypto:NEO:Exchange NEO
>>>>
>>>> 2017-08-18 open Expenses:Crypto:ETH:Balance ETH
>>>> 2017-08-18 open Expenses:Crypto:GAS:Balance GAS
>>>> 2017-08-18 open Expenses:Crypto:LTC:Balance LTC
>>>> 2017-08-18 open Expenses:Crypto:NEO:Balance NEO
>>>>
>>>> * Income
>>>> 2017-08-18 open Income:Capital-gains
>>>>
>>>> * Expenses
>>>> 2017-08-18 open Expenses:Financial:Commisions:USD
>>>>
>>>> * Transactions
>>>> 2017-11-19 * "Opening balance: Account1"
>>>> Assets:Crypto:ETH:Account1 5.12561083 ETH
>>>> Assets:Crypto:LTC:Account1 7.58990978 LTC
>>>> Expenses:Crypto:ETH:Balance -5.12561083 ETH
>>>> Expenses:Crypto:LTC:Balance -7.58990978 LTC
>>>>
>>>> 2017-11-19 * "Opening balance: Account2"
>>>> Assets:Crypto:ETH:Account2 3.968560 ETH
>>>> Expenses:Crypto:ETH:Balance -3.968560 ETH
>>>>
>>>> 2017-11-19 * "Opening balance: Exchange"
>>>> Assets:Crypto:NEO:Exchange 4 NEO
>>>> Assets:Crypto:GAS:Exchange 0.18651499 GAS
>>>> Expenses:Crypto:NEO:Balance -4 NEO
>>>> Expenses:Crypto:GAS:Balance -0.18651499 GAS
>>>>
>>>> I am not experienced with accounting and english is not my primary
>>>> language, but I guess the file is in "accounting good shape" and it makes
>>>> sense somehow. If not please let me know.
>>>>
>>>> Now let's go to the point. Assuming that file I would like to be able
>>>> to issue a command on the command line and be able to see the portfolio in
>>>> USD or EUR at the present time value. I can query most of the coins using
>>>> a
>>>> pip package, the question is, how I do that? I have read the "Prices in
>>>> Beancount" [1] google docs file, however there is no example and it would
>>>> be very useful to grasp a bit better how everything ties up. Is there any
>>>> example of fetcher module so I can build mine on top of it? Or if you are
>>>> aware of any module for prices that works with crypto that I could use out
>>>> of the box it would be even better.
>>>>
>>>> Please note that each coin might be on an exchange account or in a
>>>> wallet (account1 or account2). I would like to get the overview of this
>>>> sum, for instance when I refer to "ETH" I would like to see as it appears
>>>> on the balance, but at the current USD or EUR price, and so for the other
>>>> currencies.
>>>>
>>>> From what I understood about the prices document, the prices will be
>>>> fetched and saved on the beancount file automatically. I would like to do
>>>> this automatically on a weekly basis, so I guess cron is my friend here. I
>>>> guess it is wise to use a separated file and link them together somehow.
>>>>
>>>> I would also like (if possible) to have this on a web interface like
>>>> fava or similar if possible. I guess this might work automatically once
>>>> the
>>>> prices are correctly fetched.
>>>>
>>>> Could you please point me into the right directions to get all these
>>>> things working properly?
>>>>
>>>> Thank you very much.
>>>>
>>>> [1]:
>>>> https://docs.google.com/document/d/1thYRAMell_QT1Da1F_laprSs6BlROZjyK_h3V8qHW9c/edit
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Beancount" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To post to this group, send email to [email protected].
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/beancount/88c1a28b-28ed-47fe-8a6d-489823f24bd0%40googlegroups.com
>>>>
>>>> <https://groups.google.com/d/msgid/beancount/88c1a28b-28ed-47fe-8a6d-489823f24bd0%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>> --
>> You received this message because you are subscribed to the Google Groups
>> "Beancount" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/beancount/a778178d-448e-4fed-a8c3-ffd29034e6ec%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/beancount/a778178d-448e-4fed-a8c3-ffd29034e6ec%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/beancount/12b6bfdc-73aa-4ed8-a321-b18f5e6b2112%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.