Last week, I decided to share my progress each week in the form of weekly updates on my blog (later I would also like to set up a Portfolio List blog). There are two reasons for doing so. First I would like to share the progress I made and second it will hopefully make me accountable and keep shipping. So, below there are highlights of what I did over the last week.
Added each ETF's share classes and their listings with corresponding symbols, currencies and the exchanges where they're traded
One of the main problems I had after choosing the portfolio that I want to invest in (in my case it's three fund portfolio) was deciding which ETFs to buy to achieve my desired asset class allocation. There are plenty of different ETF issuers, a lot of different ETFs that track similar but different indices, and each ETF usually has multiple share classes that are denominated in different currencies, hedged or unhedged and accumulating or distributing. Furthermore, each share class is usually listed on multiple exchanges and often traded in different currencies and sometimes even traded in multiple currencies at the same exchange. And to make it even more confusing, the same ETF might have different symbols at each exchange. And if the same ETF is listed in different currencies at the same exchange it sometimes has the same symbol for all currencies and sometimes different symbols for each currency. It's quite a mess 🤯.
As an example, iShares Core MSCI World UCITS ETF is traded on London Stock Exchange (XLON) as SWDA in GBP and as IWDA in USD, on Euronext Amsterdam (XAMS) as IWDA in EUR, on SIX Swiss Exchange (XSWX) as SWDA in USD and as EUNL on Deutsche Boerse (XFRA). So each exchange has a different combination of ticker/currency for this given ETF.
If you look at the Bogleheads wiki, for example, they just give you a long list of all the ETFs and their listings but don't tell you which ones to choose and why. So when I was deciding for the three fund portfolio, I had no idea which symbol at which exchange in which currency to choose. So I just picked them somehow randomly without thinking about it and hoped for the best. But in the end, I ended up with quite a weird combination of ETFs bought on different exchanges in different currencies that is far from optimal and it would be cheaper if I bought a different set of them.
So for each ETF, I wrote down all the share classes, whether they are hedged/unhedged against currency risk, accumulating/distributing, their total expense ratios (TER) and their listings together with the symbol, exchange and in which currency it's traded. Since there are many possible combinations of those share classes and listings, I looked at the different options, compared them and bundled them together for investors from different countries and with different preferences/requirements. This way it's easy to pick a bundle of ETFs to get the lowest total TER, reduce/avoid exchange fees and to buy them all at one exchange to avoid exchange connection fees (if your brokerage charges them). Also, only useful information is showed. So, for example, the currency in which the ETF is denominated is not shown because it influences neither the performance nor its costs and hence is not relevant.
Shared the site on Twitter
Last Thursday, I was scrolling through Twitter and I saw @marckohlbrugge's tweet where he was asking what are others working on right now. That was a perfect chance to get the word out so I made few minor updates and replied to the tweet. That was actually my first tweet ever (when I am not counting the automatically generated tweets with the articles I liked). And I was really surprised! I immediately got some likes, retweets, some traffic to the site (150 unique visitors as of now) and also got some positive feedback on GitHub. I was also asked if there's a way to get notified when there are some new portfolios or updates so I set up a mailing list via Mailchimp and already have three subscribers. I know those are not huge numbers but I was really excited anyway since I did not plan to share it yet and this was a nice bonus. And also the positive feedback keeps me motivated and makes me feel that I might be on a good track.
Moved to JAMstack and made the site mobile friendly
From a technical point of view, I also made some changes. When I was thinking about how I will promote the site I realized that I will have to move it to a paid Heroku plan. However, at the same time, I realized I don't need a Flask app to serve the content to begin with. I could just generate a static HTML page with the portfolios and host it somewhere for free. So I got rid of the Flask app and wrote a little script that takes the data and a Jinja template and generates an HTML with all the portfolios. (I later found out that a fancy name for this set up is JAMstack.) Then I just published it via surge.sh and pointed the domain at it.
To make the deployment easier, I again set up continuous deployment using GitHub Actions so it's deployed to surge.sh with each push to GitHub.
As for the data, I decided to switch from YAML to JSON. Below, there are some reasons why I decided to do so:
- JSON is more widely used on the web.
- JSON schema can be used to validate the schema.
- The data can be served via a CDN and consumed as a JSON API with no effort.
- YAML does not support decimals (by default). On the other hand, all numbers in JSON can be parsed as decimals in Python.
- Later, I would like to interlink the data with other sources using JSON-LD.
Besides that, I also added Financial Instrument Global Identifiers (FIGI) to all share classes, listings, and benchmarks (if available) so that they can be referenced.
Finally, I update the look/design of the site and made it mobile-friendly.
I gave up time tracking since it sucks but I wanted to give it a try (again).
What's up for the next week?
Next week, I would like to finally add more portfolios and create a calculator that would tell you how many shares of which ETFs you need to buy to fulfill your portfolio given the amount you want to invest, your citizenship, the number of shares you already hold/own and so on.