* Runar Petursson <ru...@runar.net> [2020-05-17 11:00]:
> I've also rolled an OFX importer based on ofxtools, which were both
> so robust that they worked almost immediately on all of my banks.
What was the reason you built your own rather than using the one
shipped with beancount?
And yes, I hope you'll publish your scripts.
--
Martin Michlmayr
https://www.cyrius.com/
--
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 beancount+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/beancount/20200517030955.GB21479%40jirafa.cyrius.com.
Hey Everyone (and esp Martin!),After over 10 years on my TODO list I've finally gotten around to migrating to Beancount. It's Awesome! I'm glad I waited from those early versions, as the product has really come along and is a pleasure to work with.
Of course, I've fallen into most of the newbie traps, and will have to iterate the workflow the hard way. I'd like to describe my envisioned workflow, so someone can stop me before I go too far down the rabbit hole (though I'm already a week in).I have about 20 years worth of various data I'd eventually like to import/organize from various sources. These have existing Account tags and Categories etc.. For now, I'm starting with 2020.
Existing data is coming from sources including tons of OFX Files, Excel sheets, CSV, Google Sheets, PDF's, various trading exchanges and a bunch of crypto stuff. I'll tackle them one at a time, as those workflows are fairly well defined and you have great existing tooling. I'm using the full bean-file workflow.Importers are easy and intuitive. I've written a new IB importer based on the great ibflex library. I've also rolled an OFX importer based on ofxtools, which were both so robust that they worked almost immediately on all of my banks. The thing I'd like to explore here is configuring the importer on the account 'open' meta as well as rules integration. I think the current 'import.py' has already become difficult to manage as I have too many accounts.
My real mental block was around how to organize my beans. Single file?
Where do I put new transactions?
What about staging transactions from imports?
Auto-match/tag/payee?
What about other entities (wholly owned companies, partially owned companies).
How would I track passive income, trading income etc. There seem to be about as many workflows as users.
The general structure I've decided on is to have a yearly bean file-- "2020.bean", linked from a root file. The root file has all of the accounts 'open' and 'close', common commodities, options and all includes. This file is manually managed. There are some additional files (prices, trading transactions), but they tend to be verbose and simple formats.My yearly file is "round-trippable" in that I am able to read it, insert/modify entries and rewrite it using a simple CLI tool.
This allows me to inject new transactions in the right place from the importers. The tradeoff is I have a fixed sort order (mostly by date/type) and no comments. Because it's generated though, I can inject Folds which make the file quite easy to navigate. My big insight here was that I'd think of my year in chronological order and not on a per account basis (much like beancount internally).This file becomes my "Personal Journal" and I am mostly working at the end of the file (today). I also make use of transaction flags, so that once it's got a '*', I don't auto-do anything. Diff/git/balance are my friends for any batch changes. Are we free to add new flags--I've seen some conflicting assertions on that.
I've mostly handled the duplication with a combination of unique key (in meta-data) and obvious duplicate checking.Now that I have a fixed format and am able to modify en-mass the yearly file. I was able to start thinking about auto-tagging/matching in a more robust fashion. To that regard I'm building a regular expression rules engine. This is a similar path that many people seem to have gone down. Finding the magic sweet-spot between learning from existing transactions, having matching rules and a neural network/AI :-). I'm quite simple, so I just read a "rules.yaml" and modify the existing entries, applying the account modifications. It will also allow tagging, payee, even injection of meta-data (parsed from the Narration for example). I have lots of ideas here and am in danger of falling into a black hole of something super complicated that nobody else would find usable. But the workflow looks promising already in early alpha.
I also haven't quite figured out how best to handle assets held in companies. While it seems obvious that a separate legal entity needs its own set of books (and files its own taxes),
I have several companies where I'd like to integrate portions of the balance sheet/expenses into my personal bean file. An example is a legal entity that manages an AirBnB and owns the property. So, do I reflect those properties on my balance sheet? It becomes even more messy when there's a business partner involved.
I've kind of decided to keep each legal entity in its own bean project. I reflect advances to/from owner (there tend to be a lot of those) on each project as well as a "liquidation" value of the company (owner-equity).
Then I might just write some scripts to generate owner-equity/share as a price directives into my personal reports. And keep the personal bean simple.
The downside is my personal rolled up reports hide a fairly large part of my passive income/expenses. I can't answer a simple question like "What % of my investments are in Real Estate." or "How much money did I make from AirBnB" without perhaps combining multiple entities. This seems like a reporting issue and not a structural one though--and could be solved at a higher reporting level. Anyone have experience with this?
On the horizon I'd like to write:- Google Sheets Round-Trip. Be able to export simple transactions to a sheet, let my assistant tag them and read them back in. I saw some work on reporting to Google Sheets in the project already.
- Crypto -- Haven't even started thinking about this, though saw a few importers online. For now I just make note of the balances.
- VIM -- I've started some tools on this front, would like to be able to do most common tasks from within vim, like merging files, applying rules, and intelligently modifying entries. Seems that most of the python hooks are already in beancount (like parsing single entry etc.). I'm already using the existing VIM plugin, but would like to do so much more.
I'll release some of the code on github if anyone is interested in any of these sorts of features, but would want to make sure it's a complete usable workflow first.And Martin, if there's anything I can help with let me know, though I keep waiting for you to switch to GitHub!
Best,Runar
--
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 beancount+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/beancount/CACqcuWsWpqdVLdQs5m9Rkbv-NeCKMDySN5xPUQ8%3D6XRkO%3DPpsQ%40mail.gmail.com.
--
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 beancount+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/beancount/20200518064717.GE5179%40jirafa.cyrius.com.
On Sat, May 16, 2020 at 11:01 PM Runar Petursson <ru...@runar.net> wrote:Hey Everyone (and esp Martin!),After over 10 years on my TODO list I've finally gotten around to migrating to Beancount. It's Awesome! I'm glad I waited from those early versions, as the product has really come along and is a pleasure to work with.Whoa a blast from the pastA bit of history for everyone's benefit: Runar is the friend who introduced me to Quicken. We were colleagues at a company in California back and during a visit with some friends dropping by his place, he happened to be finishing updating his accounts on his personal computer and showed me how he was doing his bookkeeping using Quicken. This was the first mention ever I heard of "double-entry accounting." That demo was my first encounter with the methods. Without that chance demo I may have never walked this far down the bookkeeping rabbit hole...Runar, I still remember vividly in that discussion 13 years ago, you explained you were "using Quicken but it wasn't the right thing to do, that you ought to be using double-entry accounting instead." I didn't understand anything at the time and I got curious so I looked into it. This led me to try to replace my various hopeless incomplete spreadsheets and text files, and I found John Wiegley's Ledger, which is the original inspiration for a text-based accounting system. And then I had some ideas that required Python so I built Beancount v1t a, which at first was compatible with Ledger syntax and a few years thereafter I redesigned the syntax and rewrote the whole thing as Beancount v2 (today's version). Beancount v3 is in the works (more below).
Of course, I've fallen into most of the newbie traps, and will have to iterate the workflow the hard way. I'd like to describe my envisioned workflow, so someone can stop me before I go too far down the rabbit hole (though I'm already a week in).I have about 20 years worth of various data I'd eventually like to import/organize from various sources. These have existing Account tags and Categories etc.. For now, I'm starting with 2020.I think that's the right approach. Are you still using Quicken or have migrated to something else? There exist converters out there for a variety of formats, made by others. I think the best way to get going is to export in a parseable format and write a converter script.See this doc in which I list all the contributions I've come across and which are posted on this list, there might be something that fits the bill:One problem you will encounter for sure if that those 20 years will become slow to process. I'm in that situation too and I'm going to address this with a C++ rewrite (more at the end of this email).
Existing data is coming from sources including tons of OFX Files, Excel sheets, CSV, Google Sheets, PDF's, various trading exchanges and a bunch of crypto stuff. I'll tackle them one at a time, as those workflows are fairly well defined and you have great existing tooling. I'm using the full bean-file workflow.Importers are easy and intuitive. I've written a new IB importer based on the great ibflex library. I've also rolled an OFX importer based on ofxtools, which were both so robust that they worked almost immediately on all of my banks. The thing I'd like to explore here is configuring the importer on the account 'open' meta as well as rules integration. I think the current 'import.py' has already become difficult to manage as I have too many accounts.Thanks for the success reports. I haven't looked at ofxtools in a while and I wasn't aware of ibflex (I have to do that eventually, I mainly use another broker but started investing in commodities in IB, so far reconciling that one by hand). With all the regulations it seems IB is the only broker that offers a decent solution when moving between countries.
My real mental block was around how to organize my beans. Single file?That's what I do and recommend. I use beancount major mode and outline minor mode in Emacs to get around the file, and lots of i-search.Many people here use multiple files but make sure to define all your options in the top-level file.Where do I put new transactions?Depends on the account type. I tend to organize them in sections by account. See the large auto-generated example file in the source code.e.g. a credit card will have a dedicated section. Payments to it remain in the checking account (you have to choose one side).(v3 will likely offer a better solution for keeping all of a transaction's postings together.)What about staging transactions from imports?I copy-paste them manually. You can come up with a system (e.g., insert a tag and have your script automatically insert the imported transaction in your Ledger).Auto-match/tag/payee?That's really quite custom and you should write a plugin. Beancount doesn't include something reusable for this yet. Do that in your importer (have your importer load the contents of your ledger if desired).What about other entities (wholly owned companies, partially owned companies).I would use separate Ledgers for these. I go further: I even keep a separate Ledger for my kid's expenses.I outline some methods and tools here:Overall you'll have to design an account system that works the way you prefer.Techniques involve:- Keep a running account in your personal ledger for transfers and accruals with your other entities- Use scripts to ensure a subset of transactions match between ledgers- Import from and export to spreadsheets
How would I track passive income, trading income etc. There seem to be about as many workflows as users.For very large number of trades, you may find the system insufficient. I'd done some motions toward adding metadata to postings in order to be able to pick up buy/sell pairs in the past, here: https://bitbucket.org/blais/beancount/src/tip/beancount/plugins/book_conversions.py But this was done before the current booking code implementation. The v3 booking code will insert a reference to the augmenting posting from each reducing posting, and this should make it easy to scan the stream of reductions and join both legs to produce a table of trades (and a function will be provided that does that).For crypto, a lot of people are asking questions on this list, refer to the list, but you will find that it's difficult to use with Beancount if you want to think of those things *both* as currencies to spend and as investment simultaneously. I think tracking some set of coins as investments, and another set of coins to be spent, separately, fits the current model better. If crypto ever actually takes one (the criteria being: people actually use them routinely to buy and sell real goods & services, not speculate) I'll have to review the design so that the routine "sell investment to buy goods" scenario is easier to input and book.
The general structure I've decided on is to have a yearly bean file-- "2020.bean", linked from a root file. The root file has all of the accounts 'open' and 'close', common commodities, options and all includes. This file is manually managed. There are some additional files (prices, trading transactions), but they tend to be verbose and simple formats.My yearly file is "round-trippable" in that I am able to read it, insert/modify entries and rewrite it using a simple CLI tool.Make sure NOT to use the printer to output back transactions that have been read, because the parsing & plugins processing may insert a lot of details you don't want to have reproduced in the source. Work with the source. (The separation between parsed source and processed stream of directives will be more radical and better delineated in the next version.)
This allows me to inject new transactions in the right place from the importers. The tradeoff is I have a fixed sort order (mostly by date/type) and no comments. Because it's generated though, I can inject Folds which make the file quite easy to navigate. My big insight here was that I'd think of my year in chronological order and not on a per account basis (much like beancount internally).This file becomes my "Personal Journal" and I am mostly working at the end of the file (today). I also make use of transaction flags, so that once it's got a '*', I don't auto-do anything. Diff/git/balance are my friends for any batch changes. Are we free to add new flags--I've seen some conflicting assertions on that.Not at the moment. Only a small subset of characters are supportedCurrent limitation is due to syntax definition and lexer implementation.(v3 will have a better story around the flag syntax, this need to be tightened. Use metadata. v3 will also have a UTF8 parser beyond the strings - I've already prototyped something.)
- Crypto -- Haven't even started thinking about this, though saw a few importers online. For now I just make note of the balances.Like I mentioned, if you're going to hold these things at cost you can use the automated booking (e.g. FIFO) to spend, but in practice it may not reflect the real activity in the account (you'd have to match the booking algorithm of CoinBase or whatever other platform you're using). It's far from perfect. Best is to set aside some coins and spend them the way you would a currency and separate the currency usage from the speculation role (please don't call it "investing"), but then you won't have perfect / total returns. Not a huge deal though (IMO), it would be the same as if you were investing in ISK or EUR, you'd have a cash account attached to the investing account, but crypto fans tend to be maniacs about this.- VIM -- I've started some tools on this front, would like to be able to do most common tasks from within vim, like merging files, applying rules, and intelligently modifying entries. Seems that most of the python hooks are already in beancount (like parsing single entry etc.). I'm already using the existing VIM plugin, but would like to do so much more.Is VIM still around? *giggles*I'll release some of the code on github if anyone is interested in any of these sorts of features, but would want to make sure it's a complete usable workflow first.And Martin, if there's anything I can help with let me know, though I keep waiting for you to switch to GitHub!The plan is to hold off as long as possible and do it all at the last minute, hoping for a big green button I can push (or run a script) and have all my tickets move over.Looks like July 1st is the new deadline now.Still not 100% decided between Git and Heptapod but after all the complaining probably Git/Github (better just me complaining than 50% of the community?).About future development: for a good little while now I've refrained from changing anything too serious in the name of stability, but I've had some real annoyance around performance (it's too slow) and clear ideas about how to fix this and what the next version ought to be like that keep being confirmed. I sketched some of these in a thread about a year ago:I'm writing a doc now with the goals for the next version, outlining all the items to address.There have been some quiet developments in the background recently. The main thing that had been holding me back to slide into a v3 rewrite is to setup a solid & stable build platform for a C++ version with a reliable build system with minimal and versioned (fixed) dependencies, something for the ages, something that won't break regularly, and a severe lack of time (I've been working like an animal the past couple of years). But I've come up with another weird idea recently and I've been building another DSL over the last couple weekends, and that one requires a fast parser and a similar base of C++/Python/protobuf/UTF8 that I want for Beancount and I think I've resolved all the main hurdles in the process of doing that. A Bazel build for Beancount is in the works.
----Best,Runar
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 beancount+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/beancount/CACqcuWsWpqdVLdQs5m9Rkbv-NeCKMDySN5xPUQ8%3D6XRkO%3DPpsQ%40mail.gmail.com.
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 beancount+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/beancount/CAK21%2BhMDweBBxSzhV3%3DNM%2B4BRzmfck7rHOPSOfz_O2BR5WdoNw%40mail.gmail.com.
On Sun, May 17, 2020 at 11:59 PM Martin Blais <bl...@furius.ca> wrote:On Sat, May 16, 2020 at 11:01 PM Runar Petursson <ru...@runar.net> wrote:Hey Everyone (and esp Martin!),After over 10 years on my TODO list I've finally gotten around to migrating to Beancount. It's Awesome! I'm glad I waited from those early versions, as the product has really come along and is a pleasure to work with.Whoa a blast from the pastA bit of history for everyone's benefit: Runar is the friend who introduced me to Quicken. We were colleagues at a company in California back and during a visit with some friends dropping by his place, he happened to be finishing updating his accounts on his personal computer and showed me how he was doing his bookkeeping using Quicken. This was the first mention ever I heard of "double-entry accounting." That demo was my first encounter with the methods. Without that chance demo I may have never walked this far down the bookkeeping rabbit hole...Runar, I still remember vividly in that discussion 13 years ago, you explained you were "using Quicken but it wasn't the right thing to do, that you ought to be using double-entry accounting instead." I didn't understand anything at the time and I got curious so I looked into it. This led me to try to replace my various hopeless incomplete spreadsheets and text files, and I found John Wiegley's Ledger, which is the original inspiration for a text-based accounting system. And then I had some ideas that required Python so I built Beancount v1t a, which at first was compatible with Ledger syntax and a few years thereafter I redesigned the syntax and rewrote the whole thing as Beancount v2 (today's version). Beancount v3 is in the works (more below).Haha, I do as well. I think the discussion on the elegance of the accounting formula and the "Equity" account starting at zero struck a chord.Of course, I've fallen into most of the newbie traps, and will have to iterate the workflow the hard way. I'd like to describe my envisioned workflow, so someone can stop me before I go too far down the rabbit hole (though I'm already a week in).I have about 20 years worth of various data I'd eventually like to import/organize from various sources. These have existing Account tags and Categories etc.. For now, I'm starting with 2020.I think that's the right approach. Are you still using Quicken or have migrated to something else? There exist converters out there for a variety of formats, made by others. I think the best way to get going is to export in a parseable format and write a converter script.See this doc in which I list all the contributions I've come across and which are posted on this list, there might be something that fits the bill:One problem you will encounter for sure if that those 20 years will become slow to process. I'm in that situation too and I'm going to address this with a C++ rewrite (more at the end of this email).I eventually migrated to GnuCash but at some point during my last startup I fell too far behind. Now I'm trying to pick up the pieces and have a 7 year gap. I am worried about the performance, seems like a lot of things for historic data could be processed once and pickled/stored without re-evaluating.
How would I track passive income, trading income etc. There seem to be about as many workflows as users.For very large number of trades, you may find the system insufficient. I'd done some motions toward adding metadata to postings in order to be able to pick up buy/sell pairs in the past, here: https://bitbucket.org/blais/beancount/src/tip/beancount/plugins/book_conversions.py But this was done before the current booking code implementation. The v3 booking code will insert a reference to the augmenting posting from each reducing posting, and this should make it easy to scan the stream of reductions and join both legs to produce a table of trades (and a function will be provided that does that).For crypto, a lot of people are asking questions on this list, refer to the list, but you will find that it's difficult to use with Beancount if you want to think of those things *both* as currencies to spend and as investment simultaneously. I think tracking some set of coins as investments, and another set of coins to be spent, separately, fits the current model better. If crypto ever actually takes one (the criteria being: people actually use them routinely to buy and sell real goods & services, not speculate) I'll have to review the design so that the routine "sell investment to buy goods" scenario is easier to input and book.I agree it depends on the coin. BTC, ETH and a few others I look at as currencies in their own right and treat them as such. It makes no more sense to track lots or PnL against BTC/USD than it does CAD/USD. I'm as worried about USD exposure as I am EUR or BTC. I'm happy to just track the balance-sheet in USD over time. There are some exceptions to this, through derivative markets, but those tend to be easy to track in lots anyway (with their own symbol). Other Coins I would have very few buy/sell touch points and might be tempted to track in lots.The general structure I've decided on is to have a yearly bean file-- "2020.bean", linked from a root file. The root file has all of the accounts 'open' and 'close', common commodities, options and all includes. This file is manually managed. There are some additional files (prices, trading transactions), but they tend to be verbose and simple formats.My yearly file is "round-trippable" in that I am able to read it, insert/modify entries and rewrite it using a simple CLI tool.Make sure NOT to use the printer to output back transactions that have been read, because the parsing & plugins processing may insert a lot of details you don't want to have reproduced in the source. Work with the source. (The separation between parsed source and processed stream of directives will be more radical and better delineated in the next version.)ok, I'll make note of this. So far I'm using the printer and almost no plug-ins, but I'm guessing this will bite me. Thanks.
To view this discussion on the web visit https://groups.google.com/d/msgid/beancount/CACqcuWtx_p6%3DdJpaJ3DNL2TP8-rPhMPOGchAiBUWPPP9mrTDuQ%40mail.gmail.com.
My real mental block was around how to organize my beans. Single file? Where do I put new transactions? What about staging transactions from imports? Auto-match/tag/payee? What about other entities (wholly owned companies, partially owned companies). How would I track passive income, trading income etc. There seem to be about as many workflows as users.
I'm splitting up things quite a bit and it works quite well for
me.
I have lots of automatic price updates which get written into an own file each and also most importers use their own file.
Fava works very well with multiple files and it has support for automatically placing new transactions in the correct file.
Regards,
Patrick