Resources
How our tools work
Last updated: October 14, 2026
Both of our products show you numbers about your own money. You should be able to find out where each number came from before you rely on it. This page sets out how the figures are produced, what the methods assume, and — the part most pages like this leave out — what the tools cannot see.
On this page
How it reads a statement
Portfolio Analysis does not connect to your brokerage. There is no account linking, no credentials and no aggregator. You give it the file your broker already gives you: a positions export, or the PDF statement you download.
| Input | What is accepted |
|---|---|
| CSV export | Fidelity and Schwab positions exports. |
| PDF statement | Dedicated readers for Fidelity, Schwab, Vanguard, Robinhood and Morgan Stanley, plus a general reader that is tried last and tells you on screen when it was the one that ran. |
| Several at once | Statements from more than one broker can be read together. Rows are tagged by the file they came from, so two accounts with the same name at different brokers cannot be merged into each other. |
| Not accepted | A scan or a photograph of a statement. If a PDF has no text layer, the app stops rather than guessing at the characters. |
The file is read on your own device, by a copy of the PDF reader served from our own site rather than fetched from somebody else's. The file itself is never uploaded. The company logos beside your holdings are drawn from an image that ships with the app, not requested one by one, so looking at your portfolio does not tell a third party which companies you own.
Signed in, the result is saved
The statement file itself is never uploaded. But if you are signed in, the holdings it read out of it are stored on our server against your account, so you do not have to import again. That happens on every import; there is no setting to turn it off. You can delete saved portfolios and planning figures from inside the app. Our Privacy Policy sets out exactly what is kept.
Why an import can be refused
A statement reader that quietly mis-reads a number is worse than one that fails, because you have no way of knowing. So the app checks its own work against the statement before it will show you anything.
Every market-value total the statement prints for itself is compared with the total it gets by adding up what it extracted. If they do not agree to the cent, the import is refused and you are shown the section, the column, both figures and the difference. Nothing partial is loaded on the strength of "close enough".
You can see the whole check either way. The review sheet lists every total it compared, what the statement printed, what it extracted, the difference, and one of four verdicts:
| Verdict | Meaning |
|---|---|
| Balanced | The statement's own total and ours agree to the cent. |
| Not summable | The statement printed a total, but some rows left that figure blank, so adding the rows up proves nothing either way. Shown as unprovable rather than counted as a match. |
| Proves nothing | There was no printed total to check against. |
| MISMATCH | The two figures differ. The import stops. |
The sheet is not editable, and it reads the same result the gate reads, so what you are shown and what the software decided cannot disagree.
Within an accepted import, a figure the app cannot stand behind is left blank rather than filled in. If a row's quantity times its price does not equal the value printed beside it, that figure is blanked and the review sheet tells you how many rows were treated that way. The same rule holds everywhere: a missing number renders as a dash. No figure is ever substituted from another holding or another period to fill a gap.
One known limit: option positions are read from Fidelity statements and by the general reader. An option row on a statement from another broker may cause the import to stop rather than be read.
What it computes
From one import, the app produces twenty-five analyses in seven groups. Each carries its own written note about what that particular analysis is not — twenty-seven separate caveats rather than one disclaimer repeated, because a sentence a reader has seen on every panel stops being read.
| Group | Analyses |
|---|---|
| What you own | Overview · Company Exposure · Sectors Exposure · Thematic Exposure |
| What it is doing | Ledger · Performance · Ratings · Income · Fee Drag |
| Risks | Thresholds · Overlap · Correlation · Stress Test |
| Planning | Reallocation · Tax-Loss Harvest · Roth Conversion · Pre-Buy Impact · Donate · Retirement · College |
| Outlook | Monte Carlo · Goal Calc · Projection |
| Tracking | Options |
| Insights | Summary Insights |
Company exposure adds three things that are usually reported separately: shares you hold directly, your share of the same company held inside your funds, and the net market value of any options you hold on it. They are kept apart in the display, so you can see which part of a position is direct and which arrived through a fund.
Fund look-through, and its blind spot
Looking through a fund to the companies inside it is the thing this software exists to do, and it is also the thing most likely to be incomplete. Here is exactly how far it reaches.
There are three ways a fund's holdings are resolved:
- A set that ships with the app. Fifty-three tickers resolving to forty-three distinct funds once share classes of the same fund are followed through. Six of those are cash and bond funds recorded deliberately as holding no equities. These are point-in-time snapshots, dated January to July 2026, and the app prints that date beside them.
- The fund's own public filing. For a fund not in that set, the app can look up the most recent portfolio holdings report the fund filed with the SEC and read it. These are filed quarterly, so they describe the fund as it was at a past date, not as it is today. When the lookup fails, it fails with a stated reason rather than silently.
- You can tell it. Any fund it could not resolve can have its holdings entered by hand, and what you entered takes precedence over both of the above.
What matters more than the coverage is what happens at its edge. A fund it cannot open is named on screen, with its dollar value and its percentage of your portfolio, under a heading saying it will not appear in company look-through until it is taught. It is not quietly dropped, and the portfolio total does not silently shrink.
Coverage inside a resolved fund is also partial, and the two kinds of exposure behave differently because of it. Where a fund's published holdings list covers only part of its assets, the remainder is distributed according to that fund's own sector profile. Sector exposure therefore stays complete; company look-through does not. A company held in the unlisted tail of a fund will not appear by name.
What PulseAlert measures
PulseAlert is in beta and open to a small number of people. Everything below describes what it does today.
Almost everything PulseAlert shows is its own arithmetic over daily price bars. The mathematics is textbook — these are standard measures, not proprietary ones — and the point is not that they are novel but that the exact parameters are published rather than described.
| Measure | Exactly what it is |
|---|---|
| RSI | Wilder’s RSI, period 14. Overbought and oversold thresholds default to 70 and 30 and can be set per symbol. |
| Moving averages | Six pairs, and only these six:
7/20 EMA, 10/20 EMA, 20 EMA / 50 SMA,
50/100 SMA, 50/200 SMA, 100/200 SMA. |
| MACD | 12, 26, 9. How strong a histogram reading is counted as is judged against that same stock's own previous twenty bars, never against other stocks, because the raw figure scales with the share price. |
| Bollinger Bands | 20 periods, two standard deviations. |
| ATR | Wilder, period 14. |
| Keltner Channels | 20-period EMA, plus and minus 1.5 × ATR(20). |
| Chandelier Exit | Three times ATR(14) below the highest high of the last twenty-two bars, reported as the cushion remaining. |
| Squeeze | The standard test of whether the Bollinger Bands sit inside the Keltner Channels. Where the data needed for that test is missing, a narrower substitute is used and the display says which one ran. |
| Signal | Three moving averages and nothing else. Buy when
EMA(10) > EMA(20) and the price is above EMA(50);
Sell when EMA(20) > EMA(10) and the price is below
EMA(50); otherwise a dash. |
| Conviction | A tally from −10 to +10 of that one stock's own readings: the six moving-average pairs, MACD, RSI, where the price sits in its Bollinger range, and any shift in analyst counts. |
| Market Mood | Our own 0–100 reading, the plain average of three breadth measures: the share of stocks up on the session, the share trading above their own 50-day average, and new highs as a proportion of new highs plus new lows. Below 25 reads Extreme Fear, to 45 Fear, to 55 Neutral, to 75 Greed, above that Extreme Greed. |
| Opinion | Twelve named moving-average rules, each voting buy or sell, netting from −12 to +12. One vote is eight per cent. The method is always in the market: a tie counts as a sell. |
| Weighted Alpha | 251 trading sessions of daily returns, weighted from 0.5 to 1.5 oldest to newest, with any single day capped at ±15%. |
| Support and resistance | Swing pivots clustered into levels over a 504-bar window, each touch weighted by how recent it is and by the volume on the day. A level needs at least two touches to be shown. |
Why 251 sessions and not 250 or 252: it was measured. Against published 52-week changes, a 251-session window differed by 0.56% at the median, against 3.4% at 250 and 4.1% at 252.
One rating on the page is not ours
A third-party rating appears in its own labelled column. It is never blended into Conviction, into the Signal or into any other figure on the page, and it is not read by the code that produces them. Where you see it, you are seeing somebody else's opinion presented as theirs.
Conviction is a tally, not a confidence level and not independent evidence agreeing. Six of its ten inputs are moving-average pairs computed from the same price history, and there is no neutral vote among them, so one steady trend can reach the alerting threshold on its own.
When PulseAlert emails you
PulseAlert re-reads your watchlist seven times each weekday — on the hour from 10:00 to 15:00 US Eastern, and again at 16:30 after the close. The ranked market screens are produced once each market morning, before the open.
Nothing here is real-time. Every figure is computed from completed bars on a schedule, and the schedule is the one printed above.
An email is sent when a reading changes state, not while it stays that way. A stock that is overbought on Monday and still overbought on Thursday produces one message, not four. More than thirty kinds of alert are grouped into twenty categories you can switch on and off independently, and you choose whether to receive them as they happen, as a digest at the start or end of the day, or both.
You hear from it when something changes, and not otherwise. There is no "all clear" message and no daily confirmation that it ran.
A watchlist holds up to fifty symbols.
What the tools refuse to print
The most useful thing we can tell you about either product is where it stops.
- It refuses an import it cannot reconcile against the statement's own totals, and refuses to restore a saved portfolio that does not rebuild to the figure it was saved with.
- Market Mood is not drawn at all when too few stocks have been counted to make it meaningful. An earlier version of that panel once printed a confident market-wide figure computed from a fraction of the index; the fix was to return nothing rather than something.
- Price levels distinguish three different answers — that the calculation could not be run, that it ran and the result was deliberately rejected with a reason, and that levels were found. "We have not worked this out" and "this stock has no levels" are different claims about the world.
- A figure we cannot stand behind renders as a dash. We removed a fallback that had been quietly serving one well-known fund's return in place of every holding we did not recognise, and there is now a test whose only job is to stop it coming back.
Several readings in PulseAlert are still being worked on, and we would rather say so than present them as settled: the way signal strength and direction are ranked, and the fundamentals score, whose comparison points are approximate style-box medians rather than live peer groups.
Where the data comes from
Company filings, share counts and insider transactions are read directly from the SEC's own public system. Consolidated short interest is read directly from FINRA's own public API. The list of listed securities comes from the exchanges' own published directories. Prices, fundamentals and related market data come from third-party market data providers under their respective terms.
Insider activity is deliberately narrow: only open-market purchases and sales, where an insider used or received their own money. Option exercises, share grants, restricted-stock settlements, tax-withholding sales and gifts are excluded, because they say little about what the insider thinks.
Neither product is affiliated with, endorsed by or sponsored by any broker, fund company, exchange or data provider. Where those names appear in our software they identify the source of a figure; they are not partners. Our Disclaimers set this out in full.
The full reference
PulseAlert publishes a section-by-section reference inside the product, covering every measure above with its formula and its thresholds. It sits behind the sign-in because it is part of the product rather than marketing material. It is available to every account at no cost.
Portfolio Analysis does not have a single reference page. Its explanations are written beside the figures they describe: each of the twenty-five analyses carries its own note about what that analysis does not tell you, and individual figures carry footnotes where a figure needs one. The statement review sheet described above is the most detailed of these, and you reach it from any import.
Important
Nothing produced by Tulir Systems is a recommendation. Investing involves risk, including the possible loss of principal, and past performance does not indicate future results. Decisions about your own money should be made with a licensed professional who knows your full situation. See our Disclaimers and Terms of Use.