MoatCheck

N/A

Methodology

This page explains, in plain language, how the scores shown on the dashboard, the screener, and stock pages are calculated. The content is strictly descriptive: this is not investment advice, and this tool doesn't generate buy or sell signals.

Composite score

The composite score (0 to 100, shown as a badge everywhere in the tool) combines the fundamental score and the risk score with the following formula:

composite = 0.6 × fundamental + 0.4 × risk

If one of the two components is missing (for example, not enough price history yet to compute a risk score), the other counts for 100%: the composite score is never silently penalized by a missing data point.

0.6 / 0.4 is an adjustable weighting, not an absolute financial principle. It reflects a choice, giving more weight to a company's fundamental quality than to its stock price's historical stability, but a different trade-off (e.g. 50/50, or 70/30) would be just as defensible. Nothing in financial theory mandates this exact ratio.

Fundamental score

The fundamental score (0 to 100) measures a company's economic quality from 5 indicators, each normalized between 0 and 1 then weighted:

IndicatorWeight0 (worst) to 1 (best)Why
Revenue growth (YoY)25%0% → 0, ≥ 30% → 1A company whose revenue is stagnating or declining structurally has less long-term room to maneuver than a growing company.
Operating margin20%0% → 0, ≥ 35% → 1Measures the share of revenue that turns into operating profit: a high margin reflects pricing power or an efficient cost structure.
ROE (or ROIC)25%0% → 0, ≥ 30% → 1Return on equity over the trailing 12 months (TTM): how much profit the company generates with shareholders' money. ROIC would be preferred (it includes debt in invested capital) but isn't properly computable with the data available; ROE is used instead.
Net debt / EBITDA15%≤ 0 → 1, ≥ 4x → 0 (inverted)This ratio is inverted: the less debt relative to operating profits, the better. Zero or negative net debt (more cash than debt) gets the maximum score; from 4x annual EBITDA and above, the score drops to 0: the company is judged too indebted for its cash-generating capacity. Not scored for Banks and insurers are not scored on this measure. Their debt works differently from other companies, so this ratio is not useful for them. The other available measures receive adjusted weights instead.
Positive free cash flow15%Negative → 0, positive → 1 (binary)FCF (free cash flow) over the trailing 12 months, what's left after capital expenditures, counts only by its sign, not its magnitude. Positive FCF means the company self-funds without depending on new debt or share issuance; negative FCF is a warning sign, regardless of sector.

If data is missing for an indicator (field absent from the data provider), that indicator is simply dropped from the calculation and the remaining weights are re-proportioned, never replaced by a punitive 0.

Score of 100: every available indicator is at its most favorable level (growth ≥ 30%, operating margin ≥ 35%, ROE ≥ 30%, more cash than debt, positive FCF). Score of 0: every available indicator is at its most unfavorable level (zero or negative growth, zero margin, zero or negative ROE, debt ≥ 4x EBITDA, negative FCF). In practice, most companies fall somewhere in between: a pure 100 or 0 score is rare.

Risk score

The risk score (0 to 100) combines three metrics computed on price history (simple average of the available components):

  • Volatility: how much the stock price has moved, in either direction, over the last 5 years. A stock that swings a lot day to day (even if it ends up rising) has high volatility. 100 points if annualized volatility is ≤ 15%, 0 points if it's ≥ 60%.
  • Sharpe ratio: the return achieved per unit of risk taken. Two stocks can have the same return, but the one that achieved it with fewer bumps has a better Sharpe. It's a measure of past efficiency, not a prediction: 0 points if Sharpe is ≤ 0 (the return didn't compensate for the risk-free rate), 100 points if Sharpe is ≥ 2.
  • Max drawdown: the worst drop ever suffered from a historical peak (peak-to-trough) over the period. It's the most intuitive measure of "felt" risk: how much you would have lost, on paper, buying at the worst moment. 100 points if the worst drop is ≤ 10%, 0 points if it reaches 70% or more.

A fourth metric, the Sortino ratio, is also computed and shown on the stock page. It works like the Sharpe ratio (return per unit of risk), but only counts downside moves (price drops) as "risk," ignoring upside swings. Two stocks can have the same Sharpe ratio while one of them mostly swings upward and the other mostly downward: the Sortino ratio tells them apart. It is currently informational only and does not yet count toward the risk score.

A high risk score does NOT mean "safe stock."

It means that, historically, the price has been less turbulent and dropped less from its peaks than lower-rated stocks, over the observed period only. A company can have a high risk score (low past volatility) and collapse tomorrow for a reason that doesn't show up in any of these three metrics (fraud, technological disruption, macro event). These metrics describe past market behavior, not the company's soundness or a guarantee about the future.

Correlation between stocks

Correlation measures how much two stocks' prices tend to move together over time, on a scale from -1 to +1. A value close to +1 means the two prices tend to rise and fall together; a value close to 0 means they move mostly independently of each other; a value close to -1 means they tend to move in opposite directions.

Why it matters: holding several stocks that are all highly correlated does not reduce risk much, since they tend to fall together in a downturn. Picking stocks with lower correlation to each other spreads risk more effectively, even if each one individually looks similar in quality or volatility.

How it's computed: weekly price changes over the available history for each selected stock, compared pairwise. The result is shown as a colored grid (warmer colors for higher correlation), available both on the screener page for any group of tickers, and on the portfolio page for your own holdings, alongside the average correlation and the ticker most correlated to the rest of the group.

Position sizing (inverse-volatility weighting)

Once a set of stocks has been chosen, a separate question is how much of the portfolio to put into each one. One simple approach: give a larger share to the calmer, lower-volatility stocks and a smaller share to the more turbulent ones, so that a single very volatile position doesn't end up dominating the swings of the whole portfolio.

In plain terms: each stock's share is proportional to 1 divided by its volatility, and all the shares are then scaled so they add up to 100%. A stock whose volatility can't be measured (not enough price history, or a flat price with no movement at all) is simply left out of the calculation rather than forced into it with a made-up number.

This is one reasonable way to size positions, not the only one, and it says nothing about a stock's quality: a low-volatility stock isn't necessarily a better company, it just moves less.

Efficient frontier (Markowitz)

For any group of stocks, there is a whole range of possible portfolios depending on how much of each stock is held. Some combinations give more expected return for the same amount of risk than others; those are called "efficient." Plotting every efficient combination gives a curve, with expected return on one axis and volatility on the other.

How it's built: expected return, volatility, and correlation for each stock are estimated from historical weekly prices. The tool then picks a range of target return levels and, for each one, searches for the mix of stocks (no short selling allowed, each stock's share between 0% and 100%) that reaches that target return with the lowest possible volatility. Repeating this across many target returns traces the curve.

One point on the curve is highlighted separately: the portfolio with the best return-for-risk trade-off (its Sharpe ratio), sometimes called the "tangency" portfolio.

Like the risk score, this is a backward-looking estimate built from past prices, not a forecast. Past volatility and correlation between stocks are not guaranteed to hold in the future, and the curve can shift noticeably if a new stock is added or removed from the group.

Backtest and periodic rebalancing

A backtest picks a date in the past, selects a basket of stocks based on the composite score as it would have actually been known at that date (using only financial reports that were genuinely public by then, so the test never accidentally uses information from the future), builds an equally-weighted basket, and tracks its performance since then against a benchmark.

By default the basket is built once, at the chosen start date, and held unchanged until today. Optionally, the backtest can rebalance periodically instead, every month or every quarter. At each of these dates, the composite score is recalculated using only the information available at that date, and the top-ranked basket is rebuilt from scratch, which can change which stocks are held (a stock can drop out of the basket and later come back in, treated each time as a fresh purchase).

Every time the basket changes at a rebalancing date, a small transaction cost is subtracted, expressed in basis points (hundredths of a percent) of the value actually bought or sold; a position that doesn't change at that date is not charged anything. This approximates the real-world drag of trading fees on a strategy that adjusts its holdings more often. The backtest reports the performance net of these costs, how many rebalances took place, and the total cost accumulated over the whole period.

More frequent rebalancing keeps the basket closer to the current top-ranked stocks, at the price of paying transaction costs more often; the right frequency depends on how much that trade-off matters for a given strategy, there is no universally correct choice.

Qualitative tally (AI-classified events)

Alongside the quantitative scores, the tool surfaces a qualitative tally: a count of recent news/filing events, classified by an AI model into four categories: dated material contracts, regulatory or legal events, technical moat signals, and mergers & acquisitions. Each event is tagged with a sentiment (positive / negative / neutral), a severity, and a confidence level, and is shown in a chronological timeline on each stock page.

The compact badge on the dashboard and screener (🟢 / 🔴 / ⚪) is a count of events over the last 90 days, excluding low-confidence items from the count (those stay visible in the detailed timeline).

This tally is not a score.

  • It is a count of events, not a score. Three positive events do not mean a company is better by a set amount. They are simply three events.
  • It is not backtestable: events are collected going forward, not reconstructed point-in-time, so it can't be replayed historically like the composite score can.
  • It is never weighted into the composite score (nor the fundamental or risk scores). The quantitative and qualitative layers are strictly separate and never fused arithmetically.
  • The summaries are AI-generated and may contain extraction errors (a misread date, a misclassified event). Always verify against the linked source before acting on anything.

Data sources, freshness, and what to improve

MoatCheck updates its research data from time to time. The site shows the latest data it has saved, which may be older than current market data.

Prices and market history

Alpha Vantage supplies most price data. Free plan history is weekly, so short price moves may not appear. Prices include stock split adjustments but do not include dividends.

Company data

Most quarterly financial statements come from Alpha Vantage. Finnhub may fill selected fields when the reporting dates match. When a verified filing date is not available, the backtest uses an estimated reporting delay.

Company news and filings

SEC EDGAR and selected RSS feeds provide filing and news details. An AI model can group these events by topic and tone. Those labels may be wrong and do not affect the company score.

How we can improve the data

Better filing dates, dividend-inclusive returns, clearer update times, and a second data source could improve the analysis. Daily price history and verified filing dates may require a paid data plan.

Before using a result, check its observation date, source coverage, corporate-action treatment, and sample size. Provider estimates can be revised or incomplete.

Known limitations

  • Weekly prices, not daily. Price data comes from Alpha Vantage; 5-year daily history is a paid endpoint, the weekly version is free with full history. All risk metrics (volatility, Sharpe) are therefore annualized over 52 periods per year, not 252: they mechanically smooth out some intra-week noise compared to a calculation on daily closes.
  • Approximate publication delay (60 days). To prevent a backtest from using, at a given date, a financial report that wasn't yet public at that time ("look-ahead"), each quarterly snapshot is considered known as of its fiscal period end date plus 60 days. This 60-day delay is an approximation of the actual time between a quarter's close and the 10-Q/10-K publication: the data provider doesn't supply the exact filing date. For some companies this delay is too short, for others too long; it's not a publication date verified case by case.
  • The score itself has no qualitative input. The composite, fundamental, and risk scores model neither the strength of a competitive advantage ("moat"), nor management quality, nor regulatory or legal risk: only figures from financial statements and prices feed the scores. The separate qualitative tally adds an AI-classified event feed alongside the scores, but is a display-only count and is never mixed into any score.
  • Not a trading tool. No short-term buy/sell signal, no order execution: it's a screener for long-term selection, not an automated decision system.
  • Correlation and efficient frontier estimates rely on past prices only. A stock with a short price history gives noisier estimates than one with several years of data. Volatility and correlation between stocks can shift quickly, especially in stressed markets, so a portfolio that looked well diversified in the past isn't guaranteed to stay that way. The efficient frontier calculation also assumes no short selling, and doesn't account for taxes, minimum trade sizes, or how easily a position could actually be traded.
  • The transaction cost model is simplified. Rebalancing costs in the backtest are a flat rate in basis points applied to the value traded; real trading involves bid-ask spreads, slippage, and broker-specific fee schedules that this flat rate doesn't capture, so actual costs could be higher or lower depending on the stock and the broker.

This page describes the calculation as it currently runs; it may be refined over time as the methodology evolves.

← Back to dashboard