My App is Live

Business, Technology

First things first – Ensymbol (ensymbol.com) is not a commercial product. It is a hobby project I developed to guide me in my personal investment decisions. On the way I got to remove a lot of rust from my tech skills too, and I really enjoyed that.

I am not an investment advisor. In fact I have little understanding of fundamental or technical analysis and I am learning as I build. The primer that follows is for folks who want to test the app and provide feedback. This short primer is enough if you just want to familiarize yourself with the features and their limitations.

What does Ensymbol mean?

Ensymbol is a combination of two words – Ensemble and Symbol. Ensemble refers to the various AI models being used in the app and Symbol refers to the stock symbol. I liked the name and since the domain was available, I grabbed it. Being hosted like this means I can access my app from anywhere and use it for my analysis needs. I want to use this app to clear out the information overload in screener apps in the market and present data in charts instead of tables. It is meant as a wholesome diet of fundamental indicators, news data, X chatter, and even Technical Analysis. While I am not much of a TA person, I do feel that it helps in identifying certain things. So I have kept it as a feature.

Appearance and Loading Speeds

The app displays best on desktop. While the UI components are responsive, they are not optimized for mobile. A stock analyzer app is typically dashboard heavy and many of the charts don’t look very good on mobiles, so Ensymbol has been developed primarily as a desktop app. Even in desktop there are some UI bugs that I have been struggling to eliminate. I will deal with them later.

The App is hosted in Hetzner Cloud, a service provider in Germany. Why Germany? My decision to go with Hetzner was their significantly lower hosting costs as compared to GCP, Azure or AWS, or even smaller players like Digital Ocean and Linode. Hetzner does have servers in Singapore, but they were costlier than the German ones. I am paying EUR 7.7 per month for Hetzner, while the same server specs would have cost 2-3 times more from the bigger providers. In hindsight it wasn’t a bad decision because as of now Ensymbol is based entirely on external data fetched from Yahoo Finance and API calls to OpenAI and Grok servers which are all in US, so closer to Germany than to India. To cut a long story short, there will be some latency, and unless the company you are looking up has been cached, the response will be slow.

Features

The App fetches financial data from IndianAPI and yfinance (a python library). News data is collected from IndianAPI, Mediastack and GNews API. These services return URLs which need to be scraped. The content is then run through a deduplicator, then a materiality checker algorithm and if it passes both filters, it is sent to OpenAI API service for sentiment scoring. You can also click on the link and read the news directly. Right now the filtering seems to be aggressive, so you may not find even a single article for a company, especially smaller companies. Moreover many links may have paywalled articles or require you to click on cookies consent, so these are dropped by the scraper. The sentiment scores may also not be accurate as I have not fine tuned the algo yet.

I have realised that free sources for financial data come with limitations. Keys are not consistent (eg. “Revenue” vs “Sales”) and not all data is available for all companies. So some charts do not render, or if some UI component depends on a data point that is missing, it will break. I have tried to programmatically manage some limitations, but it requires more work. Right now I have been focussed on getting all the wiring to work.

I have not done a full hygiene check of the data, so there might be nasty surprises. For example, Infosys shows a Debt-Equity Ratio of 8.0 which is obviously wrong because the company is almost debt free! Also Yahoo returns some data in USD and some in INR. I have a check for this, but it may not be working completely as intended. There might be many other such inconsistencies and I need to eliminate them.

What is the AI part in the App?

I am using LLMs for the following:

  • Open AI (Chat GPT) for returning analysis of raw financials and sentiment scoring of filtered news articles
  • Grok for summarization of latest chatter about the company on X. This may not return any data if the company is small and people are not talking about it.
  • The app has a feature where you can upload your own PDF and so a sentiment analysis and summarization. This also uses Open AI.

I have two other components that use LLM but are currently disabled:

  • Analysis of Reddit chatter – I removed this because a lot of irrelevant talk is being fetched.
  • Programmatic Analysis of Annual Reports using OpenAI – I removed this because the Annual Reports are hosted at BSE/NSE websites and they block requests if made frequently. I don’t want the IP blacklisted so I have disabled this currently. However you can download the reports locally on your computer and upload them on the analyzer bench on the App. The current limit I have set is 500 pages and 20 MB.

There are other bugs, probably due to how React works and my limited understanding of the framework. For example, some queries may return “Error loading fundamentals” because some broken lingering cache is still floating around. Refreshing the page 3-4 times makes this error go away. I have been trying to crush these bugs but like I said, my focus has been on getting the basics working.

Quering Stocks Costs Me Money 🙂

The App is heavily dependent on API calls at the moment. Every stock query costs me money if the request is not cached. Open AI, Grok, IndianAPI all are paid services. I have done aggressive caching at both server, client and CDN level to prevent duplicate API calls. Sometimes this also breaks the UI. I need to get my caching logic right.

The app also has an IPO section where you can see details of open IPOs. I do have list of all upcoming IPOs, but the data about them is very thin and not worth displaying. So go ahead and play around with the App. While you can query any company in Nifty500 right now, the ones I have listed below will load fastest as they are cached. Otherwise be prepared to wait 15-20 seconds for AI content to load. The Grok summary (applied in latest tweets) costs me the most money right now. If you query companies that are not from the list, remember my wallet balance is depleting 🙂

The AI summaries are not great, and may even be rubbish. The prompting needs to be vastly improved. For analysis of raw financial data, no amount of prompting may actually be useful at all.

That’s it! Thank you for your attention to this matter !!

List of companies you can get results for faster

Infosys, TCS, Tata Motors, HDFC Bank, ITC, ICICI Bank, Welspun, Reliance Ind, Adani Enterprises, Action Construction Equipment. The choice of these companies is totally random. If you analyze companies other than these, be prepared to wait, especially for Twitter sentiment analysis.

Over time I intend to create a DB and move the static data (like historical prices and financials) to it to minimise loading times. Certain components like Twitter analysis which depend on latest tweets will continue to take time and I need to figure out some way of optimizing it.