Lou Adams Studio · Native Mac software

Signalbook: data, calculations & AI agentic workflow

Signalbook is a native Mac application used for stock research. Deterministic calculations rank eligible companies on profitability, value and momentum. A separate AI news pipeline collects company context, classifies relevance, drafts cited briefings and reviews them against the original evidence.

For screenshots and navigation, see the Signalbook user guide.

The market-data path produces a completed local snapshot that the interface can read offline. News has its own collection schedule, persistent jobs and publication records.

Inputs and their roles
SourceUsed forTreatment
FMP market and financial dataPrices, capitalization, statements, ratios, corporate actions and fund metadataCached locally; daily price histories and dividend-adjusted histories remain distinct.
SEC submissions and Company FactsIssuer identity, SIC classification, accounting periods, common equity, earnings and cash-flow evidenceCorroborate supported inputs; retain missing-data reasons when evidence is incomplete.
Nasdaq public listing directoriesSecurity-type checks before common-equity universe selectionExclude preferred shares, debt, warrants, units and other ineligible listings.
FMP news, releases and profilesCompany context for the separate news pipelineSave original excerpts before relevance classification, drafting and review.

From provider records to a completed snapshot

  1. Load the existing snapshot. The app opens the last completed local database. A local reload reads saved data without requesting new provider data.
  2. Refresh when requested. A manual market update reuses cached records and usually fetches the recent price-history tail. Overlapping records are checked for changes; full-history reconciliation handles revisions.
  3. Validate sessions and accounting evidence. Forming daily rows are excluded. Intraday bars must agree with the completed session; incomplete or mismatched intraday data receives an explicit end-of-day fallback. Accounting checks retain dates and the supporting source evidence.
  4. Publish safely. Only one update can write to the archive at a time. If an update fails, the previous completed snapshot stays in place, and downloaded data can be reused.
  5. Calculate and display. Eligible inputs produce issuer-level ranks, peer comparisons and filter metrics. The interface applies the chosen conditions to that snapshot.

The archive, manifests, checksums, source evidence and news records are stored locally outside the application bundle. Provider estimates such as beta and P/E are distinguished from the SEC-supported research calculations.

All five chart horizons and the displayed price end at the same completed close. Charts show price returns; the momentum calculation uses a separate dividend-adjusted series.

Signalbook asks three complementary questions: how much gross profit does the business generate relative to its assets; how much common book equity is available for its market price; and how strongly has its stock performed over a defined historical window? Together, these measures help prioritize profitable businesses with relatively inexpensive shares and stronger past returns.

The production universe starts with the largest 1,000 US-domiciled listed common equities by market capitalization and adds current S&P 500 constituents. Security-type checks remove preferred shares, debt, warrants and similar instruments. Research ranking then excludes finance, insurance and real-estate businesses with SEC SIC codes beginning with 6, along with unknown classifications, because the chosen accounting comparisons are not applied to those issuers.

Two parallel paths feed human investment research: verified and dated market/accounting inputs produce ranks and filtered candidates; a separate news workflow produces cited company context. News does not alter the numerical ranks.
Two separate paths feed the research workspace: quantitative screening and AI news analysis.

The Promising candidates preset applies the following starting conditions. Every threshold is adjustable.

Default candidate screen: every condition must pass
QuestionStarting requirement
Is gross profitability relatively strong?Q rank ≥ 70
Is book-to-price at least around the middle?V rank ≥ 50
Is historical momentum at least around the middle?M rank ≥ 50
Are reported earnings and free cash flow positive?Both SEC-based trailing measures > 0
Is the company large and liquid enough for this screen?Market capitalization ≥ $2 billion; average daily trading value ≥ $5 million
Is it eligible for these accounting comparisons?Known SEC classification outside SIC 6
Does the current price meet the selected trend condition?Latest completed close above both 50- and 200-session moving averages

Passing companies can be sorted by the average of their Q, V and M ranks. Five charts expose a recent reversal, an uneven advance or differences across horizons, while the news reader supplies company-specific developments and their sources.

The research basis includes Robert Novy-Marx’s analysis of combining gross profitability, book-to-price and momentum, and Kenneth French’s documented convention of using prior months 2–12 for momentum. Signalbook adapts these ideas to its available data and current screening workflow. [1] [2]

Q: gross profitability

qi = annual gross profiti / fiscal-year-end total assetsi

A higher value means that the company produces more gross profit per dollar of assets. The accounting evidence must support a comparable annual gross-profit subtotal. If a direct SEC subtotal is unavailable, a matched-period revenue-minus-cost calculation is accepted only when it also reconciles to the provider record. Ambiguous or unsupported inputs remain unranked.

V: common book equity relative to market value

vi = positive common book equityi / dated company market capitalizationi

Higher book-to-price means more reported common equity for each dollar of market value. Common equity must be supported by SEC evidence, either directly or through an appropriate reconciliation that accounts for preferred equity. Missing preferred-equity information is not silently treated as zero.

The current implementation uses dated current capitalization with lagged annual accounts. It lacks the Compustat deferred-tax and investment-credit adjustments used in the research definition, so this is a book-to-price proxy.

M: momentum, with the latest month skipped

mi = adjusted pricei, end / adjusted pricei, start − 1

The window is set at a completed month-end. Its start is twelve months before formation and its end is one month before formation, leaving out the latest month. For a September 30, 2026 formation, the example window runs from September 30, 2025 through August 31, 2026; September 2026 is skipped. The calculation uses the separate dividend-adjusted price series, with trading-date and history-completeness checks.

Momentum captures the accumulated return between two dates. It cannot distinguish a smooth advance from a jagged path with the same endpoints. The five charts and the trend filter show what this single number can’t.

Timing is part of the calculation

Annual accounts become eligible on June 30 of the calendar year following the year in which the fiscal period ended, and the relevant filings must predate the price snapshot. A fiscal year ending February 1, 2025 therefore becomes eligible on June 30, 2026. This deliberately retains the research-oriented accounting lag; the latest quarterly report does not automatically replace it.

Two timing examples: annual accounts ending February 1, 2025 become eligible June 30, 2026; September 30, 2026 momentum formation uses the return from September 30, 2025 to August 31, 2026 and skips September 2026.
Accounting availability and momentum use different clocks.

Convert each measure into a comparable rank

Each measure is ranked among valid, eligible, unique issuers in the loaded database, before the user’s filters. CIK issuer identity prevents multiple share classes from receiving extra weight in the reference population. Because inputs can be missing, Q, V and M can have different population sizes.

R(x) = round[100 × (L(x) + 0.5 × E(x)) / N]

Here, L(x) is the number of reference values below x, E(x) is the number equal to it and N is the reference population size. Ties use their midpoint; at least two valid issuers are required. A rank of 80 indicates roughly the top 20% on that measure.

SQVM = (Q + V + M) / 3

The combined score requires all three component ranks. Q + V mode averages those two instead. A missing input remains missing rather than becoming zero or receiving a guessed replacement.

Supporting filters answer separate questions

Trailing earnings and free cash flow
For a supported, aligned reporting period, TTM = latest fiscal-year total + current year-to-date total − comparable prior-year-to-date total. Free cash flow is operating cash flow less capital expenditure. Missing periods or spending remain missing. Reported non-recurring items are included; this is not a normalized-earnings estimate.
Current trend
SMAn = the sum of the latest n completed-session closes divided by n. The default screen requires the latest completed close to exceed both SMA50 and SMA200. This is an adjustable condition distinct from M.
Trading liquidity
Average daily trading value = the mean of daily close × share volume over the latest 20 completed sessions. The preset requires at least $5 million per day.
Industry-relative P/E
The company’s P/E is divided by the median P/E of its profitable industry peer issuers. At least two other profitable peers are required; fewer than ten is marked “thin.” The broader peer reference extends beyond the displayed stock universe. P/E and beta remain provider estimates, rather than SEC-verified research ranks.

A worked example

Consider a hypothetical eligible company with Q = 90, V = 60 and M = 75. Its combined score is (90 + 60 + 75) / 3 = 75. If it also has an $8 billion market capitalization, $20 million of average daily trading value, positive trailing earnings and free cash flow, and a completed close above both moving averages, it passes the starting screen.

If its market capitalization were only $1 billion, it would fail that preset even with the same score. The screen applies every condition; a strong average does not cancel a failed requirement.

Some company-specific accounting items aren’t in SEC’s standard dataset. When that happens, Signalbook shows why the value is missing instead of guessing. [3]

The company-news system separates collection, relevance classification, drafting and independent review. Each company moves through persistent queues, so collection can continue while earlier stories are being analyzed. The selected company and visible rows receive priority, and a slow company does not hold up every other company.

Collection saves original excerpts; a relevance agent publishes related news and passes evidence to a drafting agent; a structural check precedes independent semantic review. Approval publishes a reviewed briefing. The first rejection returns full feedback for revision. A second rejection publishes the revised draft as unapproved with the reviewer’s reason.
The implemented review loop. Separate model calls perform relevance classification, drafting and review; Swift coordinates storage, integrity checks, retries and publication.
How the news jobs are divided
StageExecutorConcurrencySaved result
A · CollectionSwift collectorUp to eight company collectionsOriginal records and collection progress
B · RelevanceGPT-6.1-sol, high effortTwo independent single-company workersRelevant, irrelevant or uncertain, with reasons
C · DraftingGPT-6-astra, high effortTwo independent single-company workersCited draft and evidence limitations
D · ReviewGPT-6-astra, high effort; separate callTwo independent single-company workersDecision and full review feedback

“Independent review” means a separate model call with the draft and original evidence. Drafting and review currently use the same model family.

A. Collect and preserve the source material

The collector saves FMP news excerpts, press releases and company profiles. Scheduled collection begins at 5:00 am, 8:30 am, 10:00 am, noon, 3:00 pm, 6:00 pm and 9:00 pm New York time, every day. Those are collection start times; downstream queues run continuously. Collection continues in the background while the app is closed, as long as you are logged in to your Mac.

B. Decide whether the story concerns the company

The relevance agent receives the company name, ticker, aliases, business context and original candidate records. It classifies each record as relevant, irrelevant or uncertain, with a reason. This catches ambiguous company names and mis-tagged stories that a simple name or ticker match would let through. Relevant stories appear in Related news as soon as classification finishes.

C. Draft a briefing grounded in excerpts

A separate agent summarizes material developments from the relevant original excerpts, attaching source IDs to each claim and identifying evidence limitations. It normally receives relevant material from the last 14 days; if none exists in that window, it uses the latest publication day. A narrow code check validates the company identity, response structure, nonempty claims and valid source references. Semantic support is assessed by the reviewer.

D. Review, revise and make status visible

The reviewer receives the draft and the same immutable evidence. It checks support, numbers, units, periods, attribution, qualifications and important omissions. Approval publishes the briefing immediately. A first rejection sends the complete draft and full feedback back for revision, followed by another independent review.

A second rejection publishes the revised draft as unapproved, with the reviewer’s full reason displayed above it. Formatting errors and failed requests are retried separately and do not consume these two semantic reviews. Briefings are based on provider excerpts, not full articles.

Persistent jobs, retries and publication order

Jobs retain original evidence, classification decisions, drafts, reviews, feedback and their stage. Interrupted work resumes from saved progress. Prompts, responses and run measurements remain available in private audit records. Completed newer generations cannot be overwritten by older jobs that finish late; each briefing retains its own citation snapshot and distinct generation, review and publication times.

Each news agent runs as a separate, restricted model call with no web, browser or system access. Article text is treated as source material, never as instructions. Their role is to contextualize the candidates; they do not calculate Q/V/M, modify ranks or place trades.

Signalbook uses Swift 6, SwiftUI controls, AppKit’s NSTableView and Core Graphics. The table reuses visible cells, while cached paths and backing surfaces reduce repeated chart drawing. Ordinary idle charts do not run a continuous animation loop.

Filtering, sorting and data processing run away from the main thread. Updates are applied in batches, and rapid filter changes cancel superseded requests or discard stale results. Row membership and order are updated separately from visible-cell content, preserving selection by company identity.

The GUI and the scheduled news service use the same installed executable and durable local storage. Favorites and named filter presets persist locally; unsaved filter adjustments do not survive a relaunch.

These choices keep the interface fast enough for quick visual scanning with fewer repeated clicks in navigation and screening.

Signalbook is a screening and research tool. It doesn’t backtest strategies, connect to a broker, execute trades or size positions, and the research it draws on doesn’t predict its results. Passing a screen is a starting point, not an investment decision.

Signalbook is currently being used in-house for investment purposes. It is not yet available on app stores.

  1. Robert Novy-Marx, The Quality Dimension of Value Investing. See “Incorporating Momentum” and Appendix A for the combined measures and variable definitions.
  2. Kenneth R. French Data Library, Detail for Monthly Momentum Factor (Mom). Documents the prior (2–12) return convention.
  3. US Securities and Exchange Commission, EDGAR Application Programming Interfaces. Describes submissions, Company Facts and the scope of standard-taxonomy XBRL data.