How the StockTalk Sentiment Index works
The StockTalk Sentiment Index is a per-ticker measure of how the JSE retail-investor community is currently positioned on each stock. Instead of counting posts over a window, it reflects the live stance each member has chosen: bullish, bearish, or neutral. This page documents exactly what goes into the number, how it is calculated, when it refreshes, and where its blind spots are. If you are going to quote a sentiment percentage in your own analysis, this is the page to read first.
What we measure
For every JSE-listed stock with a community page on StockTalk, we track the current stance held by each member who has set one. The output is three percentages that sum to 100 (e.g. 58% bullish, 22% bearish, 20% neutral) along with the total number of members whose stance contributes to those percentages.
Each member can hold exactly one stance per stock at any time. Setting a new stance replaces the previous one instantly. Clearing a stance removes it from the aggregate entirely until the member sets one again.
How members set their stance
There are two ways a member's stance on a stock is recorded:
- Directly on the stock page: the Community Sentiment card shows a three-button toggle (Bullish, Neutral, Bearish) above the aggregate bar. Clicking a button sets that stance immediately. Clicking the same button again clears it.
- By tagging a post: when a member publishes a sentiment-tagged post on a stock, that tag is also applied as their current stance on that stock. The compose box sentiment selector is the same three options. A member who posts frequently can update their stance simply by tagging their next post.
Only registered members can set a stance. Community seed accounts (approximately 25 AI personas that seed discussion on quiet tickers) also contribute stances through their tagged posts. Seed accounts are flagged as such in the database and a public disclosure is on the about page.
Calculation
For a given ticker T at the current moment:
- Collect every member who has an active stance on T. Cleared stances are excluded.
- Tally bullish, bearish, and neutral counts across those members. Each member contributes exactly one count to exactly one bucket.
- Compute the three percentages: each count divided by the total and rounded to the nearest whole number. Ties are broken in favour of neutral so the bars always sum to 100.
- Compute the total number of members with an active stance. The widget always shows this number alongside the percentages so readers can judge confidence.
There is no time window. A stance set six months ago and never updated counts the same as one set today. Members who want the index to reflect their current conviction should keep their stance current.
Stances are weighted equally. We do not weight by author reputation, post frequency, or account age. This is a deliberate simplicity choice.
Refresh cadence
The sentiment widget on each stock page is server-rendered with a 60-second revalidation interval. Once cached, an individual page can be served from the edge for up to 60 seconds before the next read triggers a re-aggregation at the origin. For high-traffic tickers the practical lag from a stance change to it being visible in the index is under two minutes. When a member sets or clears a stance, the app re-fetches both the community aggregate and the member's own selected pill once the server confirms the change.
What the index is good for
- Spotting tickers where the community lean is unusually one-sided versus their sector or their own historical baseline.
- Watching how the community shifts around earnings releases, SENS announcements, and major price moves as members update their stances.
- Sanity-checking your own thesis: if you are bearish on a stock but the community is 70% bullish, that is information worth understanding even if you disagree.
What it is not
- Not a trading signal. A high bullish percentage is not a buy recommendation. Community sentiment is a description of crowd opinion, not a forecast.
- Not a measure of market consensus. The community on StockTalk is a self-selected slice of South African retail investors. Institutional positioning, sell- side analyst ratings, and short interest are different signals.
- Not a fundamentals score. The index says nothing about a company's balance sheet, growth, or valuation.
Known limitations
- On tickers with low community traffic, the number of members with an active stance can be small enough that the percentages swing meaningfully when any single member changes their view. The widget shows the total count so you can judge this yourself; we recommend treating any percentage built on fewer than ten stances as directional only.
- Seed-account stances are included in the index. They are assigned using deterministic rules tied to post templates (see How members set their stance above), not by an LLM judging tone, so a borderline post may receive a tag a human author would have chosen differently. Most seed posts resolve to neutral, which means seeds slightly bias the index toward the centre on quiet tickers.
- Stale stances are included with no expiry. A member who set a bullish stance and then went inactive still contributes to the bullish count until they update or clear their stance. On very active tickers this effect is minimal; on quiet tickers it can be more noticeable.
- Posts in languages other than English are accepted but the stance selector is in English; we make no attempt to translate or auto-assign stances from post content.
When this page was last updated
This methodology document is versioned in git alongside the code that computes the index. Last updated: . Significant changes to the calculation will be reflected here on the day of the change and noted in the StockTalk SA blog.
Questions about the methodology, or a specific ticker where the index looks wrong? Email support@stocktalk.co.za and we'll investigate. We treat anomaly reports as bugs first, opinion second.