Why does it never say buy or sell?
Because a recommendation hides the reasoning that produced it, and
because the reasoning is the part you can actually check. The app describes what
the stored numbers say and shows how it got there; the decision is yours. It is a
research tool, not advice, and nobody here is a licensed adviser.
Where does the data come from, and what does it cost?
Prices, fundamentals and headlines come from Yahoo Finance via
yfinance, cached locally with a source tag and timestamp on every row. That part
is free. The SWOT and the Bull vs Bear debate call an AI model — Claude, or
DeepSeek if that is the one configured — which is metered — roughly a fraction of a cent to a few cents per stock, and analyses are
cached for six hours. Without an API key everything else still works; the two AI
panels say plainly that synthesis is off.
Can a signal really win 70% of the time?
Almost certainly not, and the app is built to show you that. Every
signal is tested against the security's own history and reported with its sample
size and a 95% confidence interval, measured against that stock's own base rate
rather than against a coin flip. On real data most common indicators land between
45% and 55%. A backtest showing 70% is usually overfitting, look-ahead bias, or
twelve trades. There is a test in the suite that runs the whole indicator set over
a random walk and fails if any signal appears to win.
What can't it see?
Management quality, litigation, regulatory change, competitive
dynamics, accounting fraud that the statements don't reveal — and anything that
hasn't happened yet. It also can't see promoter pledge data or quarter-by-quarter
promoter holdings, which the price provider doesn't publish, so those two checks
return N/A on live data. Outside India the promoter concept doesn't exist at all
and the rules say so.
Does anything leave my computer?
The app runs locally. It makes price lookups to Yahoo Finance and,
if you've added a key, one call per analysis to the AI provider (Claude or
DeepSeek) carrying the
evidence pack. There is no telemetry. You sign in with an email address so your
watchlist and portfolio stay private to you; that address is used only for
verification codes and security notices, and everything sits in SQLite files
next to the code.
Why show analyst targets at all?
Because what the sell side currently thinks is a fact about the
market that you might want to know. It's shown as reported data, with the caveat
that targets skew optimistic, and it's deliberately excluded from the AI's
evidence pack — a price target in a prompt is an invitation for a model to repeat
it as though it were measured.
How do I trust the numbers?
Don't, initially — check them. Every panel prints its formula and
inputs, every red flag expands to show the comparison it made, and the score's
arithmetic is laid out line by line. The test suite has hundreds of tests covering rule
determinism, the scorecard's worked example, the citation auditor, the backtester's
refusal to manufacture edge, and hand-computed values for Piotroski, Altman,
Graham and beta.
What does the funds side do that a factsheet doesn't?
Three things. It looks through the fund to the companies
inside and scores each one by the same rules it applies to a stock. It measures
overlap between any two funds you hold, as the weight they have in common
— which is usually the answer to why four funds move together. And it computes
XIRR on your own dated instalments, so what you see is your return rather
than the fund's. It has no AI in it anywhere: there is nothing to switch off.
How do I get my existing mutual funds in?
The least work is a CAMS or KFintech consolidated statement — the
password-protected PDF they email you. It carries folios and every transaction,
and imports in one step. Otherwise: set up a monthly SIP by giving the amount,
the start date and the day of the month, and it generates each instalment priced
at the NAV on or before that date; or import a spreadsheet of transactions; or
type them in. Every import is idempotent on fund, date, kind and amount, so
running the same file twice does not double your holding.
Is my CAS password stored anywhere?
No. It is sent in a request header — never in a URL or a query
string, which is where passwords end up in server logs — used once to open the
PDF, and never written to disk. The statement itself is parsed in memory; only
the transactions it contained are saved.
Why is a fund's holdings list out of date?
Because that is how often it exists. Indian schemes publish holdings
monthly, so the best available answer is a photograph taken on the as-of date,
and a fund can turn over a good deal of its book since then. The page prints the
date and its age in days, and one of the seven checks fails outright once the
disclosure is too old to describe the fund. Automatic fetching helps, but it
reads AMC and issuer files at URLs nobody promised to keep stable — those
sources will break, and when one does the page shows an ageing date rather than
pretending.
Can the funds module damage my stock data?
It cannot write to it. Funds live in their own database file, and
the funds code opens the equity database through a read-only connection — set in
the connection string, asserted in the test suite. Deleting the funds database
loses no equity data.
The quality screen returns almost nothing. Is it broken?
Probably not — eight simultaneous thresholds at those defaults is a
very narrow gate, and profit growth above 50% alongside a P/E under 30 is a rare
combination by construction. That is why the page leads with the funnel rather
than the survivors: each step shows how many entered, cleared, failed and could
not be tested, and the step that emptied it is named. If a step shows a large
"could not be tested" column, you are filtering on a figure nobody published for
those names. Look at the near-miss list too — names that failed one or two tests
are often more interesting than the ones that passed all eight. Loosening a
threshold is the usual answer; there are also twelve further filters behind
More filters, all off until you switch them on.
Why is the size filter a percentile rather than an amount?
Because the screen covers three currencies. A floor of "5,000"
picks out a different company in Mumbai, New York and London, and converting
between them needs an exchange rate — which is one more number to keep current
and to be wrong about. Ranking inside each market needs no rate, cannot go
stale, and follows the rule the rest of the app already uses: compared within a
market, never across. "20" means bigger than the smallest fifth of the names
cached for that market, and the row prints the actual capitalisation beside the
rank so you can check it against something real. The same applies to the
liquidity filter, which ranks median daily traded value.
Why do some filters say "could not be tested" for so many names?
Because the figure is not stored for them, and a screen that
treated the unmeasured as clearing the bar would surface exactly the companies
nobody publishes numbers for. Two cases are worth knowing about. Interest
coverage has no value for a company with no debt — so the test drops the
companies that would most obviously clear it, which is a limitation of the test
rather than a finding. And the two filters under Against itself read a
stored analysis rather than the fundamentals table, so a name you have never
analysed comes back untested; scanning its exchange first gives it a figure.