← Quantery Blog

Piotroski F-score: eight signals, one number

September 15, 2026 · 9 min readfundamentalscomposite-scoreseducation

The Piotroski F-score turns a set of filing-based questions into a small integer. Did return on assets improve? Did operating cash flow exceed net income? Did leverage fall? Each answer earns either one point or zero, then the points are added. That compression makes a broad first pass possible without pretending that a percentage change in one industry means the same thing in another.

Quantery's bundled Piotroski F-Score template uses eight signals, scored from zero to eight, with a gate at seven. Piotroski's 2000 paper defines the original F-score as the sum of nine binary signals. This version leaves out the gross-margin check because the historical data needed for a consistent comparison is not available across the lake. It doesn't substitute a lookalike input and call it the same signal. The omission is visible in the template, which matters whenever you compare a score with a description of the original framework.

The number is useful because the questions are plain. It is incomplete because eight passed checks do not explain what caused them. A company can reach seven through cash-backed earnings and balance-sheet repair, while another gets there through steady profitability, no dilution, and faster asset turnover. You'll want the total for triage, then the individual checks and the underlying filing for an explanation.

The score is eight plain questions

A binary signal gives every company the same test: it either clears the condition or it doesn't. That is a feature when the raw values have very different natural ranges. A two-point improvement in a grocer's current ratio and a two-point improvement in a software company's current ratio may mean wildly different things. The F-score asks only whether the direction improved from the comparable period last year.

The bundled template arranges its eight checks in four pairs:

  1. Profitability: return on assets is positive, and trailing operating cash flow is positive.
  2. Earnings quality: quarterly return on assets improved, and trailing operating cash flow exceeds trailing net income.
  3. Balance sheet: debt-to-assets declined, and the current ratio improved.
  4. Efficiency and dilution: diluted shares stayed within a stated tolerance, and revenue relative to assets improved.

That list is a compact recap of the financial statements. Positive return on assets starts with income and a balance-sheet denominator. Cash flow versus income asks whether reported profit was accompanied by cash. The balance-sheet pair follows borrowings and short-term obligations. The final pair asks whether each owner's claim was diluted and whether the asset base produced more revenue.

Eight binary Piotroski F-score signals add together to produce an eight-point total in Quantery's bundled template.
Eight binary Piotroski F-score signals add together to produce an eight-point total in Quantery's bundled template.

The point is deliberately small. Positive operating cash flow earns one point whether it is barely positive or very large. A falling debt-to-assets ratio earns one point whether it fell a little or a lot. That prevents a single extreme value from dominating the composite, but it also means the magnitude has not disappeared from the work. It has moved to the next step: read the inputs before drawing a conclusion.

A binary rule also makes the rule's boundary visible. If you think two percent of share growth should be tolerated for stock compensation, write two percent. If you think it should not, change the parameter and test the effect. You aren't asked to accept an opaque weight assigned to a percentage change that you cannot inspect.

Four pairs make the total legible

The profitability pair starts with return on assets and operating cash flow. ROA is trailing net income divided by assets, so it asks whether the asset base produced a profit. Operating cash flow asks whether cash moved through the business over the same trailing period. Neither check tells you whether the business is cheap, and neither tells you what the next quarter will bring. They do establish a basic floor.

The earnings-quality pair adds direction and cash backing. The return-on-assets comparison matches the newest quarter with the same fiscal quarter one year earlier. That avoids treating a seasonal change as an improvement. The cash-backing test uses trailing operating cash flow greater than trailing net income. As operating cash flow versus net income explains, depreciation, working capital, and industry structure can make that comparison easy for one company and hard for another. It is more useful as one documented input among several than as a complete theory of earnings quality.

The balance-sheet pair asks whether leverage and liquidity improved. Leverage is total debt divided by reconstructed assets. Liquidity is the current ratio, current assets divided by current liabilities. A falling leverage ratio does not say the company has little debt. It says the ratio is lower than it was one year ago. A rising current ratio does not prove that inventory is saleable or receivables are collectible. Both tests are prompts to inspect the balance sheet, especially when the change drives a high total score.

The final pair handles claims on the business and the use of its asset base. The share check compares diluted shares with the same quarter a year earlier. The template allows a small, explicit dilution_tolerance, so a minor increase needn't erase the point. Its treatment and tradeoffs are covered in share count and dilution. The turnover check compares revenue divided by assets with the prior year's same-quarter ratio. Faster turnover can reflect better execution, a change in pricing, or a temporary spike in sales. It needs context too.

Quantery's eight Piotroski F-score signals are grouped into profitability, earnings quality, balance sheet, and efficiency and dilution, with each group worth up to two points.
Quantery's eight Piotroski F-score signals are grouped into profitability, earnings quality, balance sheet, and efficiency and dilution, with each group worth up to two points.

The four pairs give the total a useful shape. A score of six does not mean six identical kinds of strength. It could be two points in three groups and zero in the fourth, or one point in every group plus two more somewhere else. The per-signal record lets you see the difference. Without it, a composite can make two businesses with different weaknesses look interchangeable.

Missing information must stay unearned

A score only means what its failure policy means. In the bundled template, a direct missing value or a comparison that evaluates to null cannot earn a point. That rule prevents many filing gaps from becoming favorable defaults, but trailing calculations need a separate caveat: ttm() sums whichever values are available among the newest four quarterly rows and returns null only if all four are missing.

Its balance-sheet features show why period choice matters:

# Excerpt from the bundled Piotroski F-Score template
assets:       newest(total_liabilities) + newest(total_equity)
assets_prior: lag(total_liabilities, 4) + lag(total_equity, 4)

lev:       if(assets > 0, newest(total_debt) / assets, null)
lev_prior: if(assets_prior > 0, lag(total_debt, 4) / assets_prior, null)
f_lev:     lev < lev_prior or (lev == 0 and lev_prior == 0)

This excerpt shows the bundled template's structure. The bundled template and the DSL reference are the exact reference. newest() means the most recently filed period. The assets calculation uses liabilities and equity from that same filing, so the accounting identity describes a balance sheet that actually existed. If a template searched backward for one missing component while using a newer value for the other, it could assemble a balance sheet from two different dates. That would make a ratio that no filing reported.

lag(field, 4) reaches four observed filing rows back, which is intended to compare the same fiscal quarter one year earlier. It is a positional operation. If a filing series has gaps, the fourth prior row can be a different comparison period. The template's short-history safeguards and its null policy therefore matter as much as the formula itself. A score that pretends every gap is a pass will look better because it knows less.

The cash and return signals need closer inspection. ttm(net_income) and ttm(operating_cash_flow) sum the available values among the four newest quarterly rows. If one or more quarters are missing, the result can still be non-null, so f_cfo_pos or f_accrual can earn a point from an incomplete trailing series. Only when all four values for a field are missing does ttm() return null. A division by zero still produces no usable ratio, and a comparison involving null is false. The component inputs therefore matter: a zero signal may reflect missing direct data, while a point based on ttm() may rest on fewer than four reported quarters.

A total is the beginning of the investigation

Imagine two companies with an F-score of seven. The first misses the share-count point after issuing equity, but passes every operating and balance-sheet check. The second misses the liquidity point, perhaps because current liabilities rose faster than current assets, but passes the dilution check. The same total points to two different follow-up questions. One sends you to the financing and equity footnotes. The other sends you to receivables, inventory, and short-term obligations.

The score also hides distance from the cutoff. A company whose debt-to-assets ratio fell from 51 percent to 50 percent gets the same leverage point as one whose ratio fell from 51 percent to 20 percent. That is intentional. It keeps the composite from rewarding a single dramatic movement with extra weight. But it means you shouldn't treat seven as a complete summary of financial strength.

The right workflow is modest. Use the score to organize where to look. Open the component values. Compare the new filing with the year-ago filing. Read the notes when a passed signal is driven by a sharp change. Then decide whether the rule describes something durable, temporary, or misread. A score can prioritize work. It can't perform the work for you.

Read the rule, then test it

The value of a composite lies in its explicit construction. You can inspect the eight conditions, see the dropped gross-margin signal, adjust a tolerance, and preserve the comparison period. That makes disagreements productive. If you believe share growth should never earn a point, change the parameter. If you want a stricter score gate, write it down and test it on data that would have been available at the time.

Testing matters because a plausible bundle of accounting checks can still be redundant, too sensitive to industry composition, or dependent on one period. Keep the individual signals in the result set, test parameter changes sparingly, and separate a rule you designed from a result you happened to like. Testing a thesis walk-forward is how you find out whether the rule held up before you knew the answer.

The F-score is a compact way to ask eight useful questions of a filing. Its total gives you a place to start. Its components, data policy, and test record determine whether it deserves any confidence after that.

Want to try this on your own rules? Quantery is free for 14 days: the full app, no card required.

← All articles